Repository navigation
Process incidents
The incidents that produced the rules in build-process.md. The document keeps the rules and cites an incident by number as "(incident N)". This page is append-only: numbers are cited, so an entry is never renumbered or removed. Each entry says when, what happened, and which rule it produced. Moved here from the process document on 2026-09-28, so that every agent's cold read carries the rules and not the stories.
The first corrections to merged rules code (T31–T35, T38–T40) all came from a reviewer re-deriving a constant from its report, or from a research pass, never from the implementer noticing. Rule: §1 item 4, a pipeline that merges wrong constants quickly is worse than a slow one, and the [designed] tag is only valid when the entry says what was searched.
T38 and T42 each carried a per-task permission to regenerate tests/fixtures/cli/demo.golden.txt. T35's quarterly loyalty draws then became a second random consumer beside weather, so GameSessionTests' seed-sensitivity list had to become weather and loyalty, never a looser check. Rule: §2.3, any task whose change alters the demo's output may regenerate the golden by running the demo, and the seed test still names exactly which lines a different seed may change.
T87's rebirth ruleset keys were the first fields added after T26's reflection test began asserting that docs/scenario-authoring.md names every public field of World, Ruleset and Scenario. A task that adds a field could no longer avoid editing a document under docs/. Rule: §2.3, the one exception to the documentation rule: a task that adds, renames or removes such a field edits that file's entries for those fields only.
T10's Haiku implementer did not converge on integration design across the engine's seams and the task moved to Sonnet. T18 moved on 2026-09-19. T26's Haiku implementer wrote outside its Owns list instead of stopping as its brief required, produced a reflection test that found zero properties and could never fail, and documented a victory type that does not exist. Rule: §3.3, Haiku is never assigned; a task small enough for Haiku is cheap enough on Sonnet. T36 and T77 were merged on Haiku before the retirement.
Invoked from inside a reviewer agent without an explicit target, the skill forks, and the fork starts in the main checkout rather than the reviewer's worktree. There origin/main...HEAD is empty, so it fell back to HEAD~1..HEAD and reviewed whatever main had merged last. That wasted four review passes and twice produced nine confident findings about an unrelated commit, caught only because the main session noticed the findings named files outside the PR. Rules: §3.5, reviewers sweep the diff inline and the skill is never invoked bare; §4.2 gate 0, the reviewer proves its HEAD and file list match the PR's; §7, every agent states where it worked in its first tool call and its final report, and nothing an agent spawns inherits its shell directory.
T12's domination win was dead code that shipped: the condition was never reachable from the state the game produced, and no test visited it. T43 made it reachable and added the round-tick check. Rule: §4.2 gate 5, hunt the branch that can never be taken.
T14's fleet-to-fleet transfer and T39's mercenary desertion were both blocked by the same defect class: an entity removed from GameState while something still referenced it. The symptom each time was a dangling id that GameDataValidation.ValidateState rejects, so the game wrote a save it could not reload, and every code path in between degraded silently until the load. T46 was specified from the first with the three questions. FleetState.CarriedArmyId, the model's one cross-reference to an army id, was the usual culprit. Rule: §4.2 gate 5 and Appendices A and B: every delete asks whether anything still references the entity, whether its resources are conserved and whether a cap still holds, probed with one deleted and one surviving entity.
T22 shipped five false comments, caught by three different readers across an agent review, a rework round and the user's own ultra pass. Three of the five described edges the played fixtures never reach: expansionDrive = 0, an empty treasury, a fleet beside a stronger enemy, which is exactly why none of them failed a test. T20's cleanup comment (#286) was covered by a mutation on one path while a second path also reached it. Rule: §4.2 gate 5, a comment asserting behaviour at an edge arrives with the test that visits that edge or is not written, and a comment is covered only if a test visits every path that reaches it.
On T22, git status was clean and grep showed the correct source while a mutated assembly was still under test: restoring a mutated file gave the source an mtime older than the DLL built from the mutated version, so MSBuild's up-to-date check skipped the rebuild. T22's implementer diagnosed its own unreproducible flake rather than waving it away, and its reviewer re-took the one negative result that mattered. On T55 (#245) a shared mutation helper whose target path pointed at another worktree mutated one checkout and tested another. Rule: §4.2 gate 5, a mutation result is admissible only after touch and an explicit clean rebuild; a helper lives in the worktree it mutates; a negative result carries the same burden as a positive one and is re-taken rather than read.
The after-merge step that re-synced narrative, counts and "where the build stands" across the documents was the step that kept drifting. It was retired, the living pages moved to this wiki, and the after-merge Docs: commit was limited to claims that would otherwise be factually wrong. Rule: §4.7 step 3.
Briefs told agents to expect "90 skipped without assets.local.ini". Since T53, CI fetches the fixtures from the private ic2-test-fixtures repository and runs IC2.Data.Tests for real, so the figure had stopped being true, while a worktree without the file still skips them. Rule: §7, a brief never quotes a skip count.
On 2026-09-28 the repository held about 125 plan and process PRs against about 75 task PRs, each plan PR waiting for the user, and about half of the catalogue's tasks were corrections whose fix fit in one or two files while carrying the full task ceremony. Rules: §4.9, two tiers of plan PR, the routine tier merged by the session that opened it; §4.10, the fix lane.
The orchestrator layer and the per-merge documentation agent were retired on 2026-09-14 as more overhead than value for serial execution. Their labels (docs:pending, orchestrator:pause, triage:scheduled, triage:deferred, blocking) stay on old issues as history and are never applied; tracking issue #29 is closed. Rule: §6's label list, and §9 Q-C.
Before T61 split the catalogue into one file per task, a brief that pointed at the task's entry made every agent, on every round, read the index, the entry and whatever the entry linked to: about 85,000 tokens to reach about 1,450 of contract. Rule: CLAUDE.md rule 15 and Appendix C, the brief carries the extracted entry.
In a sibling repository (harness_imperial#15, 2026-10-02), an OpenCode reviewer told to pass git -C <worktree> on every git command mistyped the 90-character path in its second -C (one extra character in a UUID). OpenCode rejected the path as external_directory, which ends opencode run, and the review was lost after 17 s. This repository's reviewer had the same instruction, with a path of about 60 characters ending in a random suffix. The -C bought nothing: scripts/external-review.ps1 already starts OpenCode inside the worktree (--dir and its working directory). What it was for, staying in the right tree, is covered by a tree proof instead: the first command prints the top level, HEAD and the diff, and the reviewer stops (header on line 1, no verdict) unless they match the worktree and commit the prompt names. The prompt states the top level as git prints it, with forward slashes, because the review of the fix found that a backslash path would never have matched. Rule: .opencode/agents/external-reviewer.md and the script's prompt, fix #590 (PR #592): the OpenCode reviewer runs git in place, without -C, and never types its worktree's path. Its permissions deny the plain git commit, git stash and git worktree forms as well as the -C ones, and -SelfTest checks all of it. The implementer and the Claude reviewer (build-process.md Appendix B) keep git -C, because a Claude agent's shell returns to the main checkout on every call.