batch: executable autonomy caps, and three planner bugs found by use - #320
Merged
Conversation
…found by use Running `batch plan` against the live backlog and reading what it picked found three faults, all of which would have made the first real batch deliver nothing. 1. IT PROPOSED WORK THAT WOULD PARK. `Unattended: ready` says a task FITS one unattended run; it says nothing about whether the run may FINISH it. That is `Autonomy:` capped by work-type — and until now `min(header, cap)` existed ONLY as prose in AUTONOMY.md, applied by whichever agent happened to read the doctrine. Nothing could compute it, so the planner could not see that both its picks were `bug` prompts capped at `supervised` and would stop at the ship checkpoint the moment they got there. `autonomy_cap` and `effective_autonomy` now live in the sizing faculty beside `effective_difficulty`, which carries the same lesson: a rule every consumer re-applies by hand is a rule each of them applies differently. Of 101 `ready` prompts, 31 resolve to `safe`. Those are what a batch can actually dispatch. 2. IT PROPOSED WORK ALREADY DONE. A prompt whose own `Status:` says shipped or superseded but which still sits in draft/ is a recorded failure mode, and it renders as pickable backlog until someone retires it. Dispatching one wastes a whole shift re-doing finished work. Now excluded, mirroring intake's DONE_STATUSES. 3. IT PROPOSED EPIC PHASES OUT OF ORDER. One-slice-per-epic caps how many members run; it does not decide WHICH. An epic now offers only its lowest un-shipped phase, so phase 6 cannot be proposed while phase 3 is open. Also: `batch plan` now prints the exact dispatch payloads. The launch is the human's act, so what they perform should carry no decisions left in it — everything decided was decided when they approved the batch. The conductor's AGENTS.md gains "Running a batch by hand", because phase 5 is deliberately unbuilt: the manual loop works today, costs two minutes of tapping, and is the honest way to learn what a dispatcher needs before writing one. It includes the leg that must not be skipped — the independent adversary, run in a session using a different model from the one that wrote the branch. 9 new tests, 691 pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RQeMJZznA3xTQXX4PqWg1v
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What it takes to run the first real batch tomorrow. Found by running
batch planagainst the live backlog and reading what it picked — all three faults would have made batch 1 deliver nothing.1. It proposed work that would park
Unattended: readysays a task fits one unattended run. It says nothing about whether the run may finish it — that isAutonomy:capped by work-type, and until nowmin(header, cap)existed only as prose inAUTONOMY.md, applied by whichever agent happened to read the doctrine. Nothing could compute it, so the planner could not see that both its picks werebugprompts capped atsupervised, which stop at the ship checkpoint the moment they get there.autonomy_capandeffective_autonomynow live in the sizing faculty besideeffective_difficulty, which carries the same lesson: a rule every consumer re-applies by hand is a rule each of them applies differently.Of 101
readyprompts, 31 resolve tosafe. That is what a batch can actually dispatch, and it is the number that decides whether tomorrow works.2. It proposed work already done
A prompt whose own
Status:says shipped or superseded but which still sits indraft/is a recorded failure mode — it renders as pickable backlog until someone retires it. Dispatching one wastes a whole shift re-doing finished work. Now excluded, mirroring intake'sDONE_STATUSES.3. It proposed epic phases out of order
One-slice-per-epic caps how many members run; it does not decide which. An epic now offers only its lowest un-shipped phase, so phase 6 cannot be proposed while phase 3 is open.
Also
batch planprints the exact dispatch payloads. The launch is the human's act (AUTONOMY.md, "What a batch launch is"), so what they perform should carry no decisions left in it.The conductor's
AGENTS.mdgains "Running a batch by hand". Phase 5 — automatic fan-out — is deliberately unbuilt: the manual loop works today, costs about two minutes of tapping, and is the honest way to learn what a dispatcher needs before writing one. It includes the leg that must not be skipped: the independent adversary, run in a session using a different model from the one that wrote the branch.Validation
691 tests pass, 9 new. Each of the three bugs has a test naming how it was found, so the next person reads the failure mode rather than the rule.
Generated by Claude Code