Appearance
Decompose a capability into requirements
bob decompose takes one approved parent (a cap or a use-case) and files its child requirements through six phases. Every phase has a gate, and the run only moves on when the gate passes. It writes issues, never files, so you can run it while a warp-drive session is working in the same checkout. For why it is built this way, see The decomposition machine.
Before you start
- The parent is open and labelled
approved.bob decomposerefuses anything else. - You are in the project's checkout. The run's state lives in
.claude/.decompose-state.json.
Steps
Start the run. It reads the parent and runs the sourcing gate:
bashbob decompose 2973Exit 0 means the run is now in
drafting. Exit 3 means the gate refused: the message names the reason (missing,closed,not-approved,not-a-parent), andbob decompose statusshows it again.Draft the children. Follow the
/capability(or/use-case) decomposition guidance: carve by slice, not by layer — the first child is a thin end-to-end path and each later child extends it with another behaviour, never "schema / API / UI" (#2739). Write the draft as JSON. Each child is a full requirement body with## Acceptance Criteriacheckboxes, areqlabel, andPart of #N(orRealizes #Nfor a use case) in its Notes:json{"children": [ {"title": "…", "labels": ["req", "p2-high"], "body": "## Description\n\n…\n\n## Acceptance Criteria\n\n- [ ] The CLI prints … when …\n\n## Notes\n\nPart of #2973\n"} ]}bashbob decompose transition drafted --file draft.jsonNothing is filed yet. Each child picks up the parent's
area:*label, and thetracerlabel when the parent has it (#2739).Clear duplicates. Every candidate is checked against the open backlog:
bashbob decompose transition dedupedWhen a candidate duplicates an existing issue, the refusal names it. Drop the candidate, or merge it into the existing issue. A merge posts one comment on that issue with the candidate's criteria:
bashbob decompose transition deduped --data '{"resolve":{"c2":"merge #2681"}}'Pass the testability gate. Every acceptance criterion must be observable: an actor, an action and a result someone can check. The Docs criterion
/requirementprescribes passes by rule, and the judge asks about each distinct criterion text once per run, so the same sentence gets the same verdict in every child (#3579).bashbob decompose transition judgedA refused criterion is named with its child and number. Reword it (
bob decompose transition redraft, then draft again), or have a person override it. The override is written onto the child with who and why:bashbob decompose transition judged --data '{"override":{"child":"c1","n":2,"by":"<your login>","why":"<reason>"}}'If the judge had no opinion, the child is not blocked. It is filed with a visible
<!-- decide:abstained decompose-testability -->marker instead.File and trace. This files every child, adds each one to the parent's Requirements (or Decomposition) checklist, and then reads everything back from GitHub:
bashbob decompose transition filedExit 0 means the run is
filed. Every child exists, carriesreq, the parent's area label and itstracerlabel when it has one, and links the parent, and the parent lists every child. If a read-back check fails, the run stays intracingand the check is named. Fix it on GitHub and run the same command again. Children that are already filed are never filed a second time.
Check or stop a run
bash
bob decompose status # phase, the last refusal, the children and their numbers
bob decompose stop # end the run; anything already filed stays filedAdd --json to any command for a bob-decompose/1 document.
What it never does
It never writes a chunk or session report, makes a commit, or touches a branch. The filed issues are the whole artifact.