Rendered from docs/process/obligations/0224-thirteen-run-tooling-gaps-from-run-20260928-1109-filed-together.md in the Headwater
corpus. Every document on this half of the site is typed by the taxonomy
the descriptor names: corpus.json.
Thirteen run-tooling gaps from run 20260928-1109, filed together
Context
hw-run-policy caps what one pass sends to the register as full records. Past the cap, one record lists the rest. Run 20260928-1109 wrote thirteen intake lines about the build order, its tooling and this repository's CI. The product owner ruled each one RECORD, on passes 2 to 9 of that run. None names a reader outside this repository. Each item below gives the stage that found it and the issue in hand at the time.
Obligation
The agents of the build order.
hw-queuecannot writequeue.mdinto the run directory from a worktree-isolated session, because the harness refuses the path under the common directory.tools/run/run-dir.shhas noqueue <dir> <file>verb, so the parent copied the file with a script. (parent, no issue).claude/agents/hw-build.md("Before you open the pull request") tells a builder to rebase ontoorigin/main. After a push, the rebased branch cannot land without the force-push that the same definition forbids. #1311 mergedorigin/maininstead. (build, #1311)hw-adjudicateswitched the parent worktree toorigin/mainand back, and leftHEADdetached. An adjudicator must not move a checkout that it did not make. (adjudicate, #978)- The mergeable wait in
.claude/agents/hw-verify.md,[ "$(gh pr view <N> --json mergeable -q .mergeable)" != UNKNOWN ], is met on an error.gh pr view 1364failed on this repository with "Could not resolve to a PullRequest", and the empty string is notUNKNOWN.gh pr list --head <branch> --json mergeable,mergeStateStatusworks. (hw-verify, #1357)
The run scripts and hooks.
.claude/hooks/write.sh(about lines 227-232) refuses a rawWriteonly on the "no document written there yet" answer ofheadwater explain. After #1367, a path through a dangling link out of the root gets the outside answer, so the hook advises there and does not refuse. No document says whether that is intended. (build, #1367)tools/site/render-tutorial.pyandtools/site/render-tutorial-fixtures.share in the governed scope,headwater routesays that nothing governs them, and no document names them. (hw-build, #1348)
Parallel branches and CI.
- The engine's check rule registry holds a hand-kept
RULEScount that each new rule bumps. Two branches that each add a rule compile alone and fail together. This cost two extra rounds and one queue ejection (#1311 against #1213, then against #1232). (integrate, #1311) - Seven transcripts under
docs/probe-results/record digests that nearly every merge moves. They are the campaign-pilot and second-campaign-pilot discovery arms of 2026-09-28, and the regression-probe transcripts of 2026-09-16 and 2026-09-17. Two branches that regenerate them conflict. In this run they caused four ejections or refusals (#1328 twice, #1349, #1356, #1362). They behave as a derived fold, and they carry no merge driver. (integrate, #1328) headwater routeranks HW-DR-0052 fifth of 445, the last slot of the default budget, by a margin of 12%. One new decision on identifiers or pull requests with a heavy summary moves it out and turns the route fixture red. The recorder case matches an exact phrase of the probe's task, and nothing holds a probe's expected value against the prose (PR #1362). (verify, #1294)- The ten documents that govern
.github/workflows/ci.ymlreportrelation.target.suspectonorigin/mainbefore #978 changed anything: 32 warnings on both trees. They are HW-OBL-0173, HW-PD-0013 to HW-PD-0020 and the evaluation of the two triggers. Each owes a new reading against the workflow. (build, #978)
Discharge
Each item discharges alone, when the file it names says or does what the item asks, or when a change records why it stays. The record discharges when every item has. An item that grows a reader outside this repository leaves this record for an issue, and the record says where it went.
One item is discharged by #1419, which merged as 16eecca0:
CLAUDE.mdtells every session to callEnterWorktree. A worktree-isolated parent passes that isolation tohw-integrate, and the harness then refuses its commands in the shared checkout. So the move, rebuild, regenerate and bless step of.claude/agents/hw-integrate.mdcould not run in a/next-runsession. The item named two fixes, and #1419 took the second. The integrator now does the rebuild, regenerate, check and bless in a detached tree of its own under.claude/worktrees/atorigin/main. It names the fast-forward of the shared checkout in itsLEFTline for the owner. The shared checkout still does not move, and HW-OBL-0221 holds that half. (parent, #764, seen on #1299)
Two items are discharged by #1518, the pull request for #1484:
tools/run/queue-done.shprintedUNMERGEABLEfor #1328 for about nine minutes before the merge queue ejected it withmerge_conflict. At the same timegh pr viewshowed CLEAN and green. Nothing recordedUNMERGEABLEas a sign of a coming ejection. The script now ends at once on anUNMERGEABLEentry withunmergeable: the queue will eject it with merge_conflict, and.claude/agents/hw-integrate.mdreads that line as an ejection. (hw-iterate, #1348)tools/run/queue-done.shprinted "ejected: merged" for PR #1353, which merged as284e056b. An integrator that trusts it reports a false ejection. The script now reads the last queue event on the timeline, and a removal with reasonmergedholds the wait until the merge is recorded. (integrate, #1334)