Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Run the project's build / typecheck / lint / test commands and emit the build.passing + tests.passing signals devloop convergence reads.
.claude/skills/nexu-io-build-test/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-17 | ✗→✓ | ▲ Improved | -52% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 610% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -36% | 0% |
| case-18 | ✗→✓ | ▲ Improved | -90% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -19% | 0% |
Spec §20.2 / §22.4: the "subjective critique-theater panel" is not enough on its own — a code-migration / tune-collab run must prove the build still passes. This atom shells out to the project's declared test commands and emits structured signals the devloop's until evaluator reads.
code/index.json +plan.md's targetStack block).
testCommand='pnpm test').
| framework | typecheck | test | | --- | --- | --- | | next | pnpm typecheck | pnpm test | | vite | pnpm typecheck | pnpm test | | remix | pnpm typecheck | pnpm test | | custom | (read from package.json.scripts) | (read from package.json.scripts) |
textproject-cwd/ └── critique/ ├── build-test.json # { build: 'passing' | 'failing', tests: 'passing' | 'failing' | 'skipped', durationMs, commandsRun: [...], failures: [...] } └── build-test.log # raw stdout / stderr (truncated to the runner's logBudgetBytes limit, default 1 MiB)
The atom emits two signals the devloop reads:
build.passing: boolean — the typecheck command exited 0.tests.passing: boolean — the test command exited 0.Plus the legacy critique.score so existing pipelines that read the score keep working: 5 when both pass, 3 when only build passes, 1 when both fail.
Pipelines wire the atom into a devloop:
jsonc{ "id": "verify", "atoms": ["patch-edit", "build-test"], "repeat": true, "until": "(build.passing && tests.passing) || iterations >= 8" }
always runs after patch-edit, and only when plan.steps's current step is in completed state).
the rewrite-plan ownership rule.
tests: 'skipped' without a non-empty reason field.Implemented by the daemon runner in apps/daemon/src/plugins/atoms/build-test.ts. It executes the configured build and test commands, bounds runtime and captured logs, and persists the report and log outputs above.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-17 | fail→pass | 13,016 | 2,745 | -79% | 1 | 1 | 0% | 2,237 | 1,084 | -52% | 0 | 0 | — |
case-01 | fail→pass | 6,588 | 11,462 | +74% | 1 | 1 | 0% | 274 | 1,946 | +610% | 0 | 0 | — |
case-02 | fail→fail | 4,820 | 4,791 | -1% | 1 | 1 | 0% | 236 | 823 | +249% | 0 | 0 | — |
case-03 | fail→fail | 5,414 | 6,819 | +26% | 1 | 1 | 0% | 187 | 1,288 | +589% | 0 | 0 | — |
case-04 | fail→pass | 13,344 | 5,315 | -60% | 1 | 1 | 0% | 2,412 | 1,551 | -36% | 0 | 0 | — |
case-18 | fail→pass | 47,366 | 1,498 | -97% | 1 | 1 | 0% | 8,213 | 860 | -90% | 0 | 0 | — |
case-05 | fail→fail | 7,266 | 1,750 | -76% | 1 | 1 | 0% | 1,145 | 995 | -13% | 0 | 0 | — |
case-06 | fail→fail | 8,747 | 1,901 | -78% | 1 | 1 | 0% | 1,519 | 942 | -38% | 0 | 0 | — |
case-07 | fail→fail | 11,227 | 2,020 | -82% | 1 | 1 | 0% | 1,681 | 887 | -47% | 0 | 0 | — |
case-08 | fail→fail | 12,605 | 4,181 | -67% | 1 | 1 | 0% | 2,272 | 1,353 | -40% | 0 | 0 | — |
case-09 | fail→pass | 7,698 | 2,215 | -71% | 1 | 1 | 0% | 1,211 | 979 | -19% | 0 | 0 | — |
case-10 | fail→pass | 10,062 | 2,176 | -78% | 1 | 1 | 0% | 1,615 | 1,027 | -36% | 0 | 0 | — |
case-11 | fail→pass | 10,288 | 2,165 | -79% | 1 | 1 | 0% | 1,494 | 997 | -33% | 0 | 0 | — |
case-12 | fail→pass | 9,094 | 2,213 | -76% | 1 | 1 | 0% | 1,402 | 984 | -30% | 0 | 0 | — |
case-13 | pass→pass | 11,093 | 2,705 | -76% | 1 | 1 | 0% | 1,672 | 1,060 | -37% | 0 | 0 | — |
case-14 | fail→pass | 12,340 | 2,857 | -77% | 1 | 1 | 0% | 1,789 | 1,115 | -38% | 0 | 0 | — |
case-15 | fail→pass | 11,175 | 3,026 | -73% | 1 | 1 | 0% | 1,707 | 1,111 | -35% | 0 | 0 | — |
case-16 | pass→pass | 19,808 | 1,940 | -90% | 1 | 1 | 0% | 3,225 | 988 | -69% | 0 | 0 | — |
case-19 | pass→pass | 15,166 | 9,509 | -37% | 1 | 1 | 0% | 2,112 | 2,131 | +1% | 0 | 0 | — |
case-20 | fail→pass | 18,129 | 4,385 | -76% | 1 | 1 | 0% | 2,879 | 1,468 | -49% | 0 | 0 | — |
case-21 | fail→pass | 8,713 | 3,067 | -65% | 1 | 1 | 0% | 1,290 | 1,196 | -7% | 0 | 0 | — |
case-22 | fail→pass | 22,031 | 2,608 | -88% | 1 | 1 | 0% | 1,898 | 1,090 | -43% | 0 | 0 | — |
case-23 | pass→pass | 7,367 | 8,134 | +10% | 1 | 1 | 0% | 1,484 | 2,019 | +36% | 0 | 0 | — |
case-24 | pass→pass | 7,128 | 5,739 | -19% | 1 | 1 | 0% | 1,356 | 1,654 | +22% | 0 | 0 | — |
case-25 | pass→pass | 6,184 | 7,531 | +22% | 1 | 1 | 0% | 1,073 | 1,909 | +78% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 22 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +52 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.