Decompose a Capability
Decompose a capability into requirements
Section titled “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
Section titled “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.
-
Start the run. It reads the parent and runs the sourcing gate:
Terminal window bob 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:{"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"}]}Terminal window bob 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:
Terminal window bob 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:
Terminal window bob 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).Terminal window bob 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:Terminal window bob 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:
Terminal window bob 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
Section titled “Check or stop a run”bob decompose status # phase, the last refusal, the children and their numbersbob decompose stop # end the run; anything already filed stays filedAdd --json to any command for a bob-decompose/1 document.
What it never does
Section titled “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.