/build-fix
What
The kit's autonomous iteration-loop skill. It drives a broken dotnet build
(or failing dotnet test) to green by looping: run, parse failures,
categorize by root cause, apply targeted fixes, re-run. It repeats until
green or a guard fires — the same way an experienced developer works through
a wall of red, but with hard limits that stop it from thrashing.
This is not a single-pass fix. It handles cascading errors where fixing one
issue reveals the next.
When
- The build is broken and there are multiple compiler errors
- Tests are failing after code changes or a build-fix pass
- After a major refactor that touched type names, namespaces, or signatures
- After updating NuGet packages (especially major version bumps)
- After merging a branch with conflicts resolved but not compiled
- After scaffolding or code generation that needs manual adjustments
- User says: "fix the build", "make it compile", "make the tests pass",
"keep going until it works", "keep fixing"
How
Loop Discipline (applies to every loop)
- Bounded iteration, always — Default max 5 iterations, hard cap 10
(user "keep going" extends by 3, never past 10). If 5 iterations cannot
solve it, the problem needs human judgment, not a 6th identical attempt.
- Progress or exit — Each iteration must reduce the error/failure count.
Same errors after a fix attempt = STUCK: stop, report, and re-plan with a
different approach. Never retry the same fix that already failed.
- Categorize before fixing — Group errors by root cause and fix the
highest-leverage first (one missing
using can erase a dozen downstream
errors).
- Transparency per iteration — Report what changed and why:
Iteration 3/5: fixed CS0246 by adding using System.Text.Json, 2 remain.
Never modify files silently.
- Atomicity — Each iteration leaves the codebase no worse than before.
If iteration 3 fails, the code stays in iteration 2's state.
Primary Flow: Build-Fix Loop (max 5 iterations)
Build — Run dotnet build, capture full error output
Parse — Extract every error CS#### with file, line, and message
Categorize — Group by root cause:
| Category |
Codes |
Fix strategy |
| Missing using/reference |
CS0246, CS0234 |
Add using, package, or project ref |
| Type mismatch |
CS0029, CS1503 |
Check expected type, cast or convert |
| API change |
CS0117, CS7036 |
Check new signature, update call sites |
| Nullability |
CS8600–CS8604 |
Add null check, ?. or ?? |
| Ambiguity / duplicate |
CS0104, CS0121, CS0111 |
Qualify namespace, remove dupe |
| Missing member |
CS1061 |
Check spelling, verify member exists |
| Missing implementation |
CS0535 |
Implement interface/abstract members |
| Obsolete API |
CS0618 |
Replace with recommended alternative |
Fix — Apply targeted fixes, root-cause/highest-leverage errors first
Rebuild — Run dotnet build again, compare error count
Evaluate — Zero errors: run dotnet test as a sanity check, report
success. Fewer errors: continue. Same errors: STUCK — exit and re-plan.
More errors: revert the iteration, report REGRESSION.
Variant: Test-Fix Loop (max 5; 3 if it follows a build-fix pass)
Same loop, same guards, with dotnet test --no-build as the runner and one
critical extra step — diagnose before fixing:
- Read the test — understand the assertion and setup
- Read the production code — understand the actual behavior
- Decide where the bug lives: wrong expectation → fix the test; production
bug → fix the code; incomplete setup → fix the setup; contract changed →
update the test to match
- Never weaken an assertion to make a test pass.
BAD:
Assert.Equal(expected, actual) → Assert.NotNull(actual).
GOOD: fix the production code so the original assertion passes.
Fail-Safe Guards (immediate exit)
- STUCK — same errors/failures after a fix, or count oscillates
(3 → 2 → 3): report what could not be fixed and what a human should check
- REGRESSION — an iteration introduced more errors than it fixed: revert
its changes, report
- Cascading failures — fixing one error spawns 3+ new ones twice in a
row: the approach is wrong, stop
- Critical error — wrong SDK, missing project file, corrupted solution,
or the test runner itself fails: human intervention needed, stop
- User interruption — finish the current iteration, report progress, ask
how to proceed
Other Loops
The same discipline — bounded iterations, progress detection, fail-safe
guards — governs refactor passes (/de-sloppify: verify build + tests after
each target, revert on failure) and scaffolding (/scaffold: generate, then
run nested build-fix and test-fix loops). Nested loops get a smaller budget
(parent 5 → nested 3), max nesting depth 2, total budget 15.
Invokes
| Type |
Name |
Purpose |
| Skill |
instinct-system |
Capture fix patterns in MEMORY.md |
| Agent |
dotnet-architect |
Consulted for architectural error patterns |
MCP Tools Used
get_diagnostics — Compiler errors/warnings scoped to file or project
find_symbol — Locate moved or renamed types
find_references — Assess blast radius of a broken API change
get_project_graph — Dependency order for fixing reference errors
Example
User: /build-fix
Claude: Running dotnet build...
Found 12 errors across 4 files.
Iteration 1/5:
- 6 errors: Missing namespace (CS0246) — adding using directives
- 3 errors: Type mismatch (CS1503) — updating method signatures
- 3 errors: Interface not implemented (CS0738) — package API changed
Rebuilding... 3 errors remaining.
Iteration 2/5:
- 3 errors: CS0738 after xunit.v3 upgrade
- IAsyncLifetime.InitializeAsync now returns ValueTask (was Task in v2),
and DisposeAsync comes from IAsyncDisposable
- Updating 3 test fixtures to the ValueTask signatures
Rebuilding... 0 errors. Build is green.
Running dotnet test... All 47 tests passed.
Added to Memory > Packages: "xunit.v3 IAsyncLifetime uses ValueTask signatures"
Related
/verify — Full verification pass (build + test + format + diagnostics)
/tdd — Red-green-refactor when building new features test-first
/de-sloppify — Clean up code quality issues after the build is green
1---2name: build-fix3description: Autonomous iteration loops for .NET: drive a broken build or failing test suite to green with bounded iterations, progress detection, and fail-safe guards that prevent infinite retries and wasted tokens. The build-fix loop (dotnet build, parse, categorize, fix, rebuild) is the primary flow; the test-fix loop is a first-class variant. Invoke when the build is broken, after a major refactor or dependency update, or when the user says "fix the build", "build is broken", "make it compile", "make the tests pass", "fix failing tests", "keep going until it works", "autonomous", "loop", "auto-fix", or "keep fixing".4---5
6# /build-fix
7
8## What
9
10The kit's autonomous iteration-loop skill. It drives a broken `dotnet build`
11(or failing `dotnet test`) to green by looping: run, parse failures,
12categorize by root cause, apply targeted fixes, re-run. It repeats until
13green or a guard fires — the same way an experienced developer works through
14a wall of red, but with hard limits that stop it from thrashing.
15
16This is not a single-pass fix. It handles cascading errors where fixing one
17issue reveals the next.
18
19## When
20
21- The build is broken and there are multiple compiler errors
22- Tests are failing after code changes or a build-fix pass
23- After a major refactor that touched type names, namespaces, or signatures
24- After updating NuGet packages (especially major version bumps)
25- After merging a branch with conflicts resolved but not compiled
26- After scaffolding or code generation that needs manual adjustments
27- User says: "fix the build", "make it compile", "make the tests pass",
28 "keep going until it works", "keep fixing"
29
30## How
31
32### Loop Discipline (applies to every loop)
33
341. **Bounded iteration, always** — Default max 5 iterations, hard cap 10
35 (user "keep going" extends by 3, never past 10). If 5 iterations cannot
36 solve it, the problem needs human judgment, not a 6th identical attempt.
372. **Progress or exit** — Each iteration must reduce the error/failure count.
38 Same errors after a fix attempt = STUCK: stop, report, and re-plan with a
39 different approach. Never retry the same fix that already failed.
403. **Categorize before fixing** — Group errors by root cause and fix the
41 highest-leverage first (one missing `using` can erase a dozen downstream
42 errors).
434. **Transparency per iteration** — Report what changed and why:
44 `Iteration 3/5: fixed CS0246 by adding using System.Text.Json, 2 remain`.
45 Never modify files silently.
465. **Atomicity** — Each iteration leaves the codebase no worse than before.
47 If iteration 3 fails, the code stays in iteration 2's state.
48
49### Primary Flow: Build-Fix Loop (max 5 iterations)
50
511. **Build** — Run `dotnet build`, capture full error output
522. **Parse** — Extract every `error CS####` with file, line, and message
533. **Categorize** — Group by root cause:
54
55 | Category | Codes | Fix strategy |
56 |---|---|---|
57 | Missing using/reference | CS0246, CS0234 | Add using, package, or project ref |
58 | Type mismatch | CS0029, CS1503 | Check expected type, cast or convert |
59 | API change | CS0117, CS7036 | Check new signature, update call sites |
60 | Nullability | CS8600–CS8604 | Add null check, `?.` or `??` |
61 | Ambiguity / duplicate | CS0104, CS0121, CS0111 | Qualify namespace, remove dupe |
62 | Missing member | CS1061 | Check spelling, verify member exists |
63 | Missing implementation | CS0535 | Implement interface/abstract members |
64 | Obsolete API | CS0618 | Replace with recommended alternative |
65
664. **Fix** — Apply targeted fixes, root-cause/highest-leverage errors first
675. **Rebuild** — Run `dotnet build` again, compare error count
686. **Evaluate** — Zero errors: run `dotnet test` as a sanity check, report
69 success. Fewer errors: continue. Same errors: STUCK — exit and re-plan.
70 More errors: revert the iteration, report REGRESSION.
71
72### Variant: Test-Fix Loop (max 5; 3 if it follows a build-fix pass)
73
74Same loop, same guards, with `dotnet test --no-build` as the runner and one
75critical extra step — **diagnose before fixing**:
76
771. Read the test — understand the assertion and setup
782. Read the production code — understand the actual behavior
793. Decide where the bug lives: wrong expectation → fix the test; production
80 bug → fix the code; incomplete setup → fix the setup; contract changed →
81 update the test to match
824. **Never weaken an assertion to make a test pass.**
83 BAD: `Assert.Equal(expected, actual)` → `Assert.NotNull(actual)`.
84 GOOD: fix the production code so the original assertion passes.
85
86### Fail-Safe Guards (immediate exit)
87
88- **STUCK** — same errors/failures after a fix, or count oscillates
89 (3 → 2 → 3): report what could not be fixed and what a human should check
90- **REGRESSION** — an iteration introduced more errors than it fixed: revert
91 its changes, report
92- **Cascading failures** — fixing one error spawns 3+ new ones twice in a
93 row: the approach is wrong, stop
94- **Critical error** — wrong SDK, missing project file, corrupted solution,
95 or the test runner itself fails: human intervention needed, stop
96- **User interruption** — finish the current iteration, report progress, ask
97 how to proceed
98
99### Other Loops
100
101The same discipline — bounded iterations, progress detection, fail-safe
102guards — governs refactor passes (`/de-sloppify`: verify build + tests after
103each target, revert on failure) and scaffolding (`/scaffold`: generate, then
104run nested build-fix and test-fix loops). Nested loops get a smaller budget
105(parent 5 → nested 3), max nesting depth 2, total budget 15.
106
107## Invokes
108
109| Type | Name | Purpose |
110|-------|------------------------|--------------------------------------------|
111| Skill | `instinct-system` | Capture fix patterns in MEMORY.md |
112| Agent | `dotnet-architect` | Consulted for architectural error patterns |
113
114### MCP Tools Used
115
116- `get_diagnostics` — Compiler errors/warnings scoped to file or project
117- `find_symbol` — Locate moved or renamed types
118- `find_references` — Assess blast radius of a broken API change
119- `get_project_graph` — Dependency order for fixing reference errors
120
121## Example
122
123```
124User: /build-fix
125
126Claude: Running dotnet build...
127 Found 12 errors across 4 files.
128
129 Iteration 1/5:
130 - 6 errors: Missing namespace (CS0246) — adding using directives
131 - 3 errors: Type mismatch (CS1503) — updating method signatures
132 - 3 errors: Interface not implemented (CS0738) — package API changed
133
134 Rebuilding... 3 errors remaining.
135
136 Iteration 2/5:
137 - 3 errors: CS0738 after xunit.v3 upgrade
138 - IAsyncLifetime.InitializeAsync now returns ValueTask (was Task in v2),
139 and DisposeAsync comes from IAsyncDisposable
140 - Updating 3 test fixtures to the ValueTask signatures
141
142 Rebuilding... 0 errors. Build is green.
143
144 Running dotnet test... All 47 tests passed.
145 Added to Memory > Packages: "xunit.v3 IAsyncLifetime uses ValueTask signatures"
146```
147
148## Related
149
150- `/verify` — Full verification pass (build + test + format + diagnostics)
151- `/tdd` — Red-green-refactor when building new features test-first
152- `/de-sloppify` — Clean up code quality issues after the build is green