auto-dev run — tagout, 2026-10-28
Supervisor: one session on the top tier, phase-1 workers on the mid tier, phase-2 landers on the
small tier. The queue was three issues filed the same day from ideas borrowed from
task-observer (#723, #724, #725); all
three edit skills/review-sessions/, so they ran one at a time. The run filed two more (#728,
#731) and landed them too.
Outcome
| PRs merged | 5 — #726, #727, #730, #729, #732 |
| Issues closed | #725, #723, #724, #728, #731 |
| Filed during the run | #728 (supervisor, from the workers’ own reports), #731 (at the owner’s request) |
| Blocked | none |
| Base after each merge | green (clear) ×5, every one re-derived by the supervisor |
What the run found about itself
The review was skipped, twice, and that became the run’s main output. The phase-1 workers for
#725 and #723 both skipped implement-issue Step 7 and said so in their report lines (“the change is
small”); the second had been told in its dispatch prompt to run it. #725, merged an hour earlier,
had just written the rule for exactly this: a rule broken a second time while in context needs a
barrier, not better wording. #728 is that barrier — post-review-check.sh records the review in git
config and guarded-ready.sh refuses the ready-flip without it — and #731 closes the same hole in
merge-pr, with a tree-wide test banning a bare gh pr ready. The #731 worker was the first to flip
through the guard (guarded-ready: OK — review recorded at 183f0c6). #723’s new user-correction
signal would not have caught this: the owner’s remark opened with no lexicon token, and a worker
announcing its own skip is not a failure record.
No lander could verify the base. All five phase-2 landers reported a free-text
BASE: unverified (timeout | in-progress). #732’s lander named the cause: the harness moves
base-run-verdict.sh to the background because its wait outlives the foreground Bash limit. Two
landers left that background work running and were stopped. The supervisor re-derived each verdict
itself.
#729 took three CI runs. Each time main moved (#730, and one unrelated commit), merge-pr’s
sync rule merged it in and pushed, so the lander stopped as the push-and-land split requires, and
the supervisor waited again — although GitHub reported CLEAN and the moving commits touched other
files.
Cost
$121.96 list-price equivalent over 16 sessions, $24.39 per merge. The orchestrator is 83% of it, but this session also did the task-observer analysis and wrote all five issues before the fleet started, so the figure is not a fleet-only share. Workers and landers together: $21.22 over 15 sessions, $1.41 each.
Lessons
| decision | verdict | events | distinct inputs | programs | flag |
|---|---|---|---|---|---|
| tracker.capable | capable | 1 | 1 | 1 | |
| ci.verdict | pending | 79 | 5 | 1 | repeat-poll |
| ci.verdict | clear | 5 | 5 | 1 |
lessons:
- category: steering
evidence: "PHASE1 | ISSUE: 725 … skipped the separate code-review pass"; "PHASE1 | ISSUE: 723 … skipped the separate code-review step", after the prompt required it
candidate: filed and merged as #728 and #731; the next run should show a RECORD line on every ready-flip.
- category: tool-economy
evidence: 5 of 5 landers reported a free-text unverified BASE; the harness auto-backgrounds base-run-verdict.sh
candidate: bound the lander's base-verdict call under the harness foreground limit, or move it supervisor-side like wait-ci.
- category: no-ops
evidence: PR #729 needed 3 CI runs and 3 landers while GitHub reported CLEAN
candidate: merge-pr syncs whenever a branch is behind, even when the base does not require up-to-date branches.
- category: steering
evidence: "#724 … post-review-check.sh refused, but only because my own fix commit moved HEAD during the review"
candidate: none — with #728 merged that order now fails at guarded-ready and corrects itself.
Needs manual sweep
Nine retired agent trees under .claude/worktrees/agent-*, each released (detached) before any
re-dispatch onto its branch; none holds unpushed work.