plumbbob 0.11.3 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +4 -4
  3. package/dist/cli-core.js +11 -0
  4. package/dist/lib/latch.js +1 -1
  5. package/dist/lib/orient.js +233 -18
  6. package/dist/verbs/build.js +51 -12
  7. package/dist/verbs/checkpoint.js +17 -10
  8. package/dist/verbs/handoff.js +64 -13
  9. package/dist/verbs/order.js +102 -0
  10. package/dist/verbs/recover.js +31 -1
  11. package/dist/verbs/turn.js +7 -6
  12. package/node_modules/checkride/.claude-plugin/plugin.json +1 -1
  13. package/node_modules/checkride/CHANGELOG.md +117 -0
  14. package/node_modules/checkride/dist/adapters.d.ts.map +1 -1
  15. package/node_modules/checkride/dist/adapters.js +14 -10
  16. package/node_modules/checkride/dist/adapters.js.map +1 -1
  17. package/node_modules/checkride/dist/baseline/fallow.d.ts +4 -3
  18. package/node_modules/checkride/dist/baseline/fallow.d.ts.map +1 -1
  19. package/node_modules/checkride/dist/baseline/fallow.js +15 -8
  20. package/node_modules/checkride/dist/baseline/fallow.js.map +1 -1
  21. package/node_modules/checkride/dist/gate.d.ts.map +1 -1
  22. package/node_modules/checkride/dist/gate.js +62 -44
  23. package/node_modules/checkride/dist/gate.js.map +1 -1
  24. package/node_modules/checkride/dist/init.js +3 -3
  25. package/node_modules/checkride/dist/init.js.map +1 -1
  26. package/node_modules/checkride/dist/orchestrator.d.ts.map +1 -1
  27. package/node_modules/checkride/dist/orchestrator.js +53 -8
  28. package/node_modules/checkride/dist/orchestrator.js.map +1 -1
  29. package/node_modules/checkride/dist/pack.js +3 -3
  30. package/node_modules/checkride/dist/security.d.ts +4 -2
  31. package/node_modules/checkride/dist/security.d.ts.map +1 -1
  32. package/node_modules/checkride/dist/security.js +42 -8
  33. package/node_modules/checkride/dist/security.js.map +1 -1
  34. package/node_modules/checkride/dist/triage/render.js +1 -1
  35. package/node_modules/checkride/dist/triage/render.js.map +1 -1
  36. package/node_modules/checkride/package.json +10 -10
  37. package/node_modules/checkride/skills/check/SKILL.md +4 -3
  38. package/node_modules/checkride/templates/shared/cspell.json +3 -24
  39. package/package.json +3 -3
  40. package/skills/build/SKILL.md +48 -26
  41. package/skills/finish/SKILL.md +5 -2
  42. package/skills/harvest/SKILL.md +4 -1
  43. package/skills/order/SKILL.md +50 -0
  44. package/skills/plan/SKILL.md +5 -2
  45. package/skills/refine/SKILL.md +6 -2
  46. package/skills/step/SKILL.md +8 -3
  47. package/skills/verify/SKILL.md +14 -8
  48. package/templates/intent.md +9 -0
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: build
3
- description: "The default engine: read the next planned step from intent, implement it (its done-when, seam, Decisions, Constraints), then verify it through to the approval pause. Swappable: build by hand/vibed/another harness and run /plumbbob:verify instead. `--auto` self-approves and chains to done; a step range like `1-3` self-approves through step 3, then pauses."
3
+ description: "The default engine: read the next planned step from intent, implement it (its done-when, seam, Decisions, Constraints), then verify it through to the approval pause. Swappable: build by hand/vibed/another harness and run /plumbbob:verify instead. `--auto` self-approves and chains to done; a step range like `1-3` self-approves through step 3, then stops."
4
4
  argument-hint: "[step-number | step-range] [--auto]"
5
5
  disable-model-invocation: true
6
6
  allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob build:*), Bash(plumbbob handoff:*), Bash(plumbbob check:*), Bash(plumbbob checkpoint:*), Bash(plumbbob park:*), Bash(plumbbob agent:*), Bash(plumbbob spike:*), Bash(git diff:*)
@@ -24,7 +24,7 @@ the diff appeared. When you do run it, it reads the plan, writes the step, and
24
24
  carries straight through to the verify pause.
25
25
 
26
26
  Since `/plumbbob:plan` lays down the whole step list up front, the happy path is to run
27
- `/plumbbob:build` once per step until done: each run builds the next undone step and stops
27
+ `/plumbbob:build` once per step until done: each run builds the next undone step in build order and stops
28
28
  at the pause for your approval. **Running `/plumbbob:build` again is itself the clock tick.**
29
29
 
30
30
  A model note: this skill **inherits the session model**; nothing pins or switches
@@ -36,9 +36,10 @@ switch with `/model` and rerun to honor it, or wave you on. Advisory, never a ga
36
36
 
37
37
  1. **Pick the step.** Use the number you were invoked with (for example `/plumbbob:build 4`), or,
38
38
  if you were given a range like `/plumbbob:build 1-3`, start at the first number and treat
39
- the second as the auto-approve ceiling (see the range note under `--auto`). With no
40
- argument, don't resolve the next step yourself; the CLI does: bare `plumbbob build`
41
- (step 2) enters the next undone step and refuses with a `/plumbbob:step` nudge when every
39
+ the second as the last step you approve and land yourself (see the range note under
40
+ `--auto`). With no argument, don't resolve the next step yourself; the CLI does: bare `plumbbob build`
41
+ (step 2) enters the next undone step in build order (the `## Build order` line when the
42
+ plan has one, else the numbering) and refuses with a `/plumbbob:step` nudge when every
42
43
  step is checkpointed.
43
44
  2. **Enter the step.** Run `plumbbob build <n>`, or bare `plumbbob build` to enter the
44
45
  next undone step (records the in-flight STEP + SEAM so `/plumbbob:status` shows the step in
@@ -87,7 +88,9 @@ switch with `/model` and rerun to honor it, or wave you on. Advisory, never a ga
87
88
  <<'BODY'`). Do **not** pass it as an argument value (`--body "$(cat <<'BODY'…)"`):
88
89
  `--body` ignores an argument and always reads stdin. Under an agent harness that
89
90
  stdin is a socket, and `--body` now refuses rather than blocking on one; the
90
- refusal names this exact heredoc form.
91
+ refusal names this exact heredoc form. End that line at `<<'BODY'`, with no `2>&1`
92
+ after it: Claude Code's permission checker cannot analyze the extra redirect, so it
93
+ blocks the command or stops to ask instead of letting this skill's allowance cover it.
91
94
  - **A drifted subject is reconciled at the pause, never silently.** The planned
92
95
  title *is* the checkpoint subject ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)). If the diff drifted
93
96
  from it, **present** a corrected subject at the pause (`planned title → proposed
@@ -256,30 +259,45 @@ and approves in the human's place**, and it **chains**:
256
259
  self-review finds no done-when / Decision / Constraint mismatch, checkpoint** and move
257
260
  straight on to the next planned step. Repeat. `--auto` adds no new machinery; the
258
261
  `after`-agent output simply feeds the *existing* self-review halt condition.
259
- - **Stop and hand back to the human** the moment any of these is true: the check is red,
260
- the self-review finds a mismatch (surface exactly what, and do not checkpoint it), a
261
- bound agent returns `blocked` or `drift` (unblock-and-re-run, or `/plumbbob:refine`; an
262
- agent cannot advance the loop), a new decision is needed, no planned steps
263
- remain, or the top of a requested range is reached. **When `--auto` halts back to the
264
- human, end on the same turn the default pause does**: write the detail file, run
265
- `plumbbob handoff`, and paste its block: the step just completed, the next undone step,
266
- and that next step's `- model:` recommendation if it has one, so a fresh context window
267
- knows which `/model` to select.
262
+ - **Stop and hand back to the human** the moment a halt arrives, and end the turn by the
263
+ kind of halt it is
264
+ ([D85 (range-top-lands)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d85)):
265
+ - **A halt on trouble leaves a step unlanded.** The check is red, the self-review finds
266
+ a mismatch (surface exactly what, and do not checkpoint it), a bound agent returns
267
+ `blocked` or `drift` (unblock-and-re-run, or `/plumbbob:refine`; an agent cannot
268
+ advance the loop), or a new decision is needed. The step is still in flight and the
269
+ human has a call to make about it, so end on the same turn the default pause does:
270
+ write the detail file, run `plumbbob handoff`, and paste its block.
271
+ - **A clean halt lands its step first.** The top of a requested range is reached, or no
272
+ planned steps remain, and `plumbbob build` names that step as it enters it (for
273
+ example `step 3 is the last undone step in the plan`). That step checkpoints like
274
+ every step before it, and its
275
+ checkpoint's block is the whole ending: relay it with nothing written around it, then
276
+ end the turn. Write no detail file and run no `handoff`, because nothing is pending.
277
+ The block already carries the Verdict the step earned and a Next Up pointing at what
278
+ comes next (the next undone step and its `- model:` recommendation, or the finish),
279
+ which is what a fresh context window needs to pick the right `/model`.
268
280
 
269
281
  `--auto` and a step range are the only paths that checkpoint without a human pause, and
270
- only because the human asked for it by name; a range re-imposes the pause at its top.
271
- The default (no flag, no range) always ends at the pause.
282
+ only because the human asked for it by name. A range hands the clock back once its top
283
+ step has landed: the step after it waits for the human's next run. The default (no flag,
284
+ no range) always ends at the pause.
272
285
 
273
286
  ### A step range (`N-M`) is a bounded `--auto`
274
287
 
275
- `/plumbbob:build 1-3` self-approves steps 1 through 3 exactly as `--auto` does, then **pauses
276
- after step 3** instead of chaining to done. The range *is* the opt-in; you do not also
277
- pass `--auto`. Run it as the `--auto` loop with one extra halt: **stop before building
278
- any next step whose plan number is past the top of the range.** It adds no machinery:
279
- just the one more entry already in the halt list above.
280
-
281
- - **`N-M` with N ≤ M**: build N…M, self-approving and checkpointing each, then pause at
282
- M. `N-N` is just the single step `N` (which already ends at the pause).
288
+ `/plumbbob:build 1-3` self-approves steps 1 through 3 exactly as `--auto` does, then **stops
289
+ once step 3 has landed** instead of chaining to done. The range *is* the opt-in; you do not
290
+ also pass `--auto`. Run it as the `--auto` loop with one extra halt: **stop before building
291
+ any next step whose plan number is past the top of the range.** It adds no machinery: just
292
+ the one more entry already in the halt list above, and it is a clean halt, so the top step
293
+ is never held back for approval. The human approved it by typing the range, and
294
+ `plumbbob build` says so as it enters that step:
295
+ `step 3 is the top of the range you granted`, or, when the plan ends first,
296
+ `the last undone step in the range you granted`.
297
+
298
+ - **`N-M` with N ≤ M**: build N…M, self-approving and checkpointing each, M included, then
299
+ relay M's checkpoint block and end the turn. `N-N` is a range like any other: it builds
300
+ and lands the single step `N`. Only a bare `/plumbbob:build N` ends at the pause.
283
301
  - **N > M** (for example `3-1`): that is not a range you can walk; report it and stop rather
284
302
  than guess the intent.
285
303
  - **M past the last planned step** (for example `1-9` with three steps): build through the
@@ -291,6 +309,10 @@ just the one more entry already in the halt list above.
291
309
  - **N is above the next undone step**: you are jumping over earlier planned work; note
292
310
  that you are skipping the steps before N, then proceed (the same latitude as a
293
311
  single-number jump like `/plumbbob:build 4`).
312
+ - **The build order puts a number past the top ahead of the rest** (the order reads
313
+ `1, 4, 2, 3` under `/plumbbob:build 1-3`): a range names plan numbers, so the halt above
314
+ fires before step 4 and `plumbbob build` names step 1 as the last undone step in the
315
+ range. Build a re-sequenced stretch step by step, or grant `--auto`.
294
316
 
295
317
  ## The hard contracts
296
318
 
@@ -302,7 +324,7 @@ just the one more entry already in the halt list above.
302
324
  - **Default ends at the pause.** Implement → verify → wait for approval; never
303
325
  checkpoint without it. Only an explicit `--auto` or a step range lets the agent approve
304
326
  in your place, and it still halts on a red check or any mismatch; a range also stops
305
- at its top.
327
+ once its top step lands.
306
328
  - **Agents feed the beat; they never advance it**. `before` loads context,
307
329
  `build` writes the diff, `after` is advisory; none can checkpoint, flip a step, or
308
330
  chain. `blocked` → unblock and re-run; `drift` → `/plumbbob:refine`. You are still the one
@@ -53,8 +53,11 @@ record.
53
53
  Redirect the heredoc *into* the command (`--body <<'BODY'`). Do **not** pass it as
54
54
  an argument value (`--body "$(cat <<'BODY'…)"`): `--body` ignores an argument and
55
55
  always reads stdin. Under an agent harness that stdin is a socket, and `--body` now
56
- refuses rather than blocking on one; the refusal names this exact heredoc form. Omit
57
- `--body` entirely and the commit carries the `plumbbob finish` marker subject only.
56
+ refuses rather than blocking on one; the refusal names this exact heredoc form. End
57
+ that line at `<<'BODY'`, with no `2>&1` after it: Claude Code's permission checker
58
+ cannot analyze the extra redirect, so it blocks the command or stops to ask instead of
59
+ letting this skill's allowance cover it. Omit `--body` entirely and the commit carries
60
+ the `plumbbob finish` marker subject only.
58
61
  3. **Point at the next goal.** Relay `plumbbob finish`'s output verbatim, blank lines
59
62
  included: its lead line, which names the branch the tracked folder now rides into the
60
63
  PR, any advisory beneath it, and `**Next Up**: Nothing planned - /plumbbob:plan`. That
@@ -2,7 +2,7 @@
2
2
  name: harvest
3
3
  description: "Triage the park list at a step boundary: propose one class (blocker/tangent/pivot) per parked item, write only after the human confirms each, record under ## Harvest, and fold a confirmed blocker into intent."
4
4
  disable-model-invocation: true
5
- allowed-tools: Read, Edit, Bash(plumbbob status:*)
5
+ allowed-tools: Read, Edit, Bash(plumbbob status:*), Bash(plumbbob order:*)
6
6
  ---
7
7
 
8
8
  # PlumbBob: harvest the park list
@@ -45,5 +45,8 @@ one line of reasoning, then **wait for the human to confirm or override**. Write
45
45
  - A confirmed **blocker** also folds its decision into `intent.md`, slugged at birth
46
46
  like any Decision, anchored the same way
47
47
  (`- <a id="d5"></a>**D5 (retry-cap)**: <the call>, *because* <why>`), never a bare `D5`.
48
+ A blocker that becomes a new step takes the next free number under `## Steps` and,
49
+ when it has to land before an existing undone step, its place in the sequence through
50
+ `plumbbob order 7 8 5` (the `## Build order` line), never by renumbering.
48
51
  - Never reclassify or resolve an item the human hasn't confirmed, and default every
49
52
  uncertain item to **tangent**, never to blocker.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: order
3
+ description: "Set the build order: turn the human's sequence (or a relative one, such as 7 and 8 before 5) into the full list of undone steps and write it by shelling `plumbbob order`, never by editing intent.md. A step keeps its number; the sequence moves."
4
+ argument-hint: "[steps in the sequence to build them]"
5
+ disable-model-invocation: true
6
+ model: haiku
7
+ allowed-tools: Bash(plumbbob status:*), Bash(plumbbob order:*)
8
+ ---
9
+
10
+ # PlumbBob: set the build order (the sequence, not the numbering)
11
+
12
+ Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
13
+
14
+ A step keeps its number for life, so once `/plumbbob:step` or `/plumbbob:refine` appends a step
15
+ that has to land before an existing one, the sequence to build them stops being the
16
+ numbering (`4, 7, 8, 5, 10, 6`). This skill writes that sequence down where every other move
17
+ reads it: the `## Build order` line in `intent.md`, which `plumbbob status`, a bare
18
+ `/plumbbob:build`, `plumbbob checkpoint`, and the card's Next Up all follow.
19
+
20
+ ## Wrong-state refusal
21
+
22
+ Ordering needs an **active session** with a plan. Read the dashboard injected above: if it
23
+ is `NO ACTIVE SESSION`, **refuse** and tell the human to run `plumbbob start "<title>"` (or
24
+ `/plumbbob:plan`) first. Any live state is fine, mid-step included: re-sequencing what comes
25
+ after the step in flight is the usual reason to run it.
26
+
27
+ ## What this skill does
28
+
29
+ 1. **Compose the full sequence.** Read the step list and the `build order` row on the
30
+ dashboard. Take the human's instruction, whether a full list (`7 8 5 10 6`) or a relative
31
+ one ("7 and 8 before 5", "10 last"), and turn it into **every undone step, in the sequence
32
+ to build them**. Never renumber a step and never move one inside `## Steps`; the sequence
33
+ lives in this one line.
34
+ 2. **Show the sequence and get the human's OK in-turn.** When the human's own message states
35
+ the full sequence, that message **is** the approval: run the verb directly.
36
+ 3. **Write it by shelling `plumbbob order 7 8 5 10 6`** via Bash. `plumbbob order --reset`
37
+ drops the line, and the plan reads in document order again.
38
+ 4. **Relay the ending verbatim, then stop.** The verb prints its whole ending: the
39
+ `**Build order**: 7, 8, 5, 10, 6` line, a blank line, and the `**Next Up**` pointer (back
40
+ at the step in flight, or forward to the first step in the new sequence). Run no second
41
+ command. A refusal (a number the plan lacks, a repeat, a step already checkpointed) is the
42
+ CLI's call: report it verbatim, never retry or work around it, and ask the human which
43
+ number they meant.
44
+
45
+ ## The one hard contract
46
+
47
+ The line is written by the **dumb CLI**, never by an edit. This skill carries **no Edit and
48
+ no Write tool** on purpose: you may not touch `intent.md` yourself. Compose, get approval,
49
+ then shell `plumbbob order`; that is the only write path, and it is the one that validates
50
+ every number against the plan.
@@ -85,7 +85,9 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
85
85
  Every step needs a **done-when** `/plumbbob:verify` can check and a **seam** (the exact
86
86
  paths it touches). Later steps may be fuzzier than the first (that's fine); they get
87
87
  sharpened just-in-time when you reach them with `/plumbbob:step`. Keep each small enough to
88
- verify in one review pass.
88
+ verify in one review pass. Number them in the sequence you expect to build them and
89
+ leave `## Build order` alone: it is for later, when a refine appends a step that has to
90
+ land before an existing one (`plumbbob order`).
89
91
 
90
92
  **The title *is* the commit subject; author it as one**
91
93
  ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)): write each
@@ -142,7 +144,8 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
142
144
  a `plan <sha>` line in
143
145
  `checkpoints`. This keeps the first step's diff clean, so history reads
144
146
  baseline → plan → steps. Pass a proportional `--body` (the single-quoted stdin
145
- heredoc) when the rationale is worth carrying; skip it for a small plan. Do this
147
+ heredoc, with nothing after `<<'BODY'` on its line, not even `2>&1`) when the
148
+ rationale is worth carrying; skip it for a small plan. Do this
146
149
  only on the human's approval; the plan is their convergence.
147
150
  - **The plan pause is a decision turn.** Present the framed plan for the human's call,
148
151
  then give it the cold read (**§ The cold read**), write the result into
@@ -3,7 +3,7 @@ name: refine
3
3
  description: "Keep intent.md true: attack the plan for holes (append as Open questions) and refine or repair the Frame, Decisions, Constraints, and Steps to match reality. Usable at any point; you propose, the human approves."
4
4
  argument-hint: "[focus]"
5
5
  disable-model-invocation: true
6
- allowed-tools: Read, Edit, Bash(plumbbob status:*)
6
+ allowed-tools: Read, Edit, Bash(plumbbob status:*), Bash(plumbbob order:*)
7
7
  ---
8
8
 
9
9
  # PlumbBob: refine the plan
@@ -51,7 +51,11 @@ is fine; refining is always available.
51
51
  load-bearing detail (file paths, module names) in `seam` and `done-when`,
52
52
  **never jammed into the title**; the checkpoint body pass then reconciles and lands
53
53
  that subject at the verify pause.
54
- Show the before/after for each, and **write only what the human approves**.
54
+ Show the before/after for each, and **write only what the human approves**. A repair
55
+ that inserts a step, or moves one ahead of another, keeps every number where it is and
56
+ writes the sequence instead: shell `plumbbob order 7 8 5` with the undone steps in the
57
+ sequence to build them, and the `## Build order` line it writes is what every next-step
58
+ pick follows. Never renumber, and never edit that line by hand.
55
59
 
56
60
  ## The hard contracts
57
61
 
@@ -3,7 +3,7 @@ name: step
3
3
  description: "Revise the next increment just-in-time: sharpen the next undone step against what's now true, or (with input) re-cut, split, or add a step. Empty input runs an automatic sharpen. One at a time; the human approves."
4
4
  argument-hint: "[what-changed]"
5
5
  disable-model-invocation: true
6
- allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob agent list:*)
6
+ allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob order:*), Bash(plumbbob agent list:*)
7
7
  ---
8
8
 
9
9
  # PlumbBob: revise the next step (the single-increment move)
@@ -48,7 +48,11 @@ grew, but its everyday job is to sharpen, not to invent.
48
48
  `**Scope:**` header; drop the scope and it falls back to that default → build slug →
49
49
  bare, and the type to `feat` ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)). Aim for a soft
50
50
  ≤72 chars, no gate. Revise the existing step in place; only append when you are
51
- genuinely adding an increment.
51
+ genuinely adding an increment. An appended step keeps the next free number for life;
52
+ when it has to land before an existing undone step, place it by sequence, never by
53
+ renumbering: shell `plumbbob order 7 8 5` with every undone step in the sequence to
54
+ build them, and the `## Build order` line it writes is what `status`, a bare
55
+ `/plumbbob:build`, and the card's Next Up then follow.
52
56
  4. **Revise the step's harness bindings if they drifted too** *(optional)*. If the
53
57
  build carries a `harness.json` (beside `intent.md`) and the reality that moved the
54
58
  step also changed which agents it wants, sharpen that step's slot bindings
@@ -63,7 +67,8 @@ grew, but its everyday job is to sharpen, not to invent.
63
67
  - **One verifiable increment.** Each step carries a done-when `/plumbbob:verify` can check
64
68
  and a seam small enough to review in one pass.
65
69
  - **Edit `## Steps` only**, in the standard format `status` and `build` parse: never
66
- the Roadmap, never loose prose. A done step (`[x]`) is history; do not rewrite it.
70
+ the Roadmap, never loose prose. A done step (`[x]`) is history; do not rewrite it. The
71
+ `## Build order` line is `plumbbob order`'s to write, never yours to edit.
67
72
  - **Cite the plan's own numbers in the linked form.** A `D`/`C`/`Q` you write into a
68
73
  step's done-when, seam, or notes reads `[D4 (default-waves)](#d4)`; the slug travels
69
74
  with the number, and the link lands on the `<a id="d4">` anchor minted where the item
@@ -113,8 +113,11 @@ this skill verifies it the same way: **it reads the diff, not the author**
113
113
  `## Log` and then truncates it (the detail plane in the
114
114
  [turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)).
115
115
 
116
- *Paste the turn.* Run `plumbbob handoff` and paste its output whole, verbatim, at top
117
- level, trailing blank line included, then end the turn. Never nest it inside a fence of
116
+ *Paste the turn.* Run `plumbbob handoff <n>`, naming the step you reviewed, and paste
117
+ its output whole, verbatim, at top level, trailing blank line included, then end the
118
+ turn. The number is what lets a diff built outside `/plumbbob:build` reach its pause:
119
+ nothing is in flight for that diff, and a bare `handoff` would read the moment as a
120
+ boundary and render no Your Call block. Never nest it inside a fence of
118
121
  your own; it carries fences of its own and they cannot nest. It prints the Summary and
119
122
  its highlights, the Readout fence (its measured `check`, `seam`, `diff`, and `spent`
120
123
  rows folded with your three), a `diff` fence when the change is 20 lines or fewer, the
@@ -130,8 +133,8 @@ this skill verifies it the same way: **it reads the diff, not the author**
130
133
 
131
134
  *Then read the reply as an ask or a direction.* A message that **asks** ("expand 2",
132
135
  "what does that mean?", "why did the seam row flag that?") is an expand: answer it from the detail file, from
133
- `git diff`, or from the build-log's `## Log` for an older step, never from recall, then run `plumbbob handoff` again and
134
- paste it. The step is still in flight, so it renders the same pause, and the Your Call
136
+ `git diff`, or from the build-log's `## Log` for an older step, never from recall, then run `plumbbob handoff <n>` again and
137
+ paste it. The step has not landed, so it renders the same pause, and the Your Call
135
138
  block stays the CLI's to render rather than yours to retype. A message that **directs**
136
139
  is needs-work: take it as what to change, and nothing lands until the human says
137
140
  `looks good`.
@@ -163,7 +166,10 @@ this skill verifies it the same way: **it reads the diff, not the author**
163
166
  Redirect the heredoc *into* the command (`--body <<'BODY'`). Do **not** pass it as
164
167
  an argument value (`--body "$(cat <<'BODY'…)"`): `--body` ignores an argument and
165
168
  always reads stdin. Under an agent harness that stdin is a socket, and `--body` now
166
- refuses rather than blocking on one; the refusal names this exact heredoc form.
169
+ refuses rather than blocking on one; the refusal names this exact heredoc form. End
170
+ that line at `<<'BODY'`, with no `2>&1` after it: Claude Code's permission checker
171
+ cannot analyze the extra redirect, so it blocks the command or stops to ask instead of
172
+ letting this skill's allowance cover it.
167
173
 
168
174
  Do **not** run a TIL scan or reach for a separate commit skill; the body is yours to
169
175
  write in one breath. Omit `--body` entirely and the CLI writes a deterministic body
@@ -191,7 +197,7 @@ When this session runs under plumbbob's turn hook, `plumbbob checkpoint` **refus
191
197
  land a step in the same turn it was entered**, and that refusal **is** this pause, not
192
198
  an error to route around. If the checkpoint prints `checkpoint refused — no human turn
193
199
  since this step began`, you have reached the pause the hard way: write the file, run
194
- `plumbbob handoff`, paste its block as step 5 says, **end the turn there**, and the
200
+ `plumbbob handoff <n>`, paste its block as step 5 says, **end the turn there**, and the
195
201
  human's next message is the tick that lets
196
202
  the checkpoint land when you run it again. **Never reach for a raw `git commit` to force the
197
203
  land**; that forges the very record the latch exists to keep honest, and the
@@ -217,8 +223,8 @@ instead.**
217
223
  self-review; checkride gates, the human approves. `blocked` → unblock and re-run;
218
224
  `drift` → `/plumbbob:refine` before checkpointing. No code path makes them blocking.
219
225
  - **A refused checkpoint is the pause, never a workaround.** Under the turn
220
- hook a same-turn checkpoint is refused *by design*: write the file, run `plumbbob
221
- handoff`, paste its block, **end the turn there**, and let the human's next message
226
+ hook a same-turn checkpoint is refused *by design*: write the file, run
227
+ `plumbbob handoff <n>`, paste its block, **end the turn there**, and let the human's next message
222
228
  re-tick it. Never route around it with a
223
229
  raw `git commit`; the latch guards the record, not the work.
224
230
  - **Close with the next model.** When the checkpoint lands it prints the whole boundary
@@ -79,6 +79,15 @@ auto-syncs it), and use `/plumbbob:refine` to repair the whole plan when a block
79
79
  2. [ ] <step>, **done when:** <criterion>
80
80
  - seam: `<file>`
81
81
 
82
+ ## Build order
83
+
84
+ *(Optional. The sequence to build the steps in once it stops being their numbering: one
85
+ line of comma-separated step numbers, such as `7, 8, 5, 10, 6`; empty means document
86
+ order. `plumbbob order 7 8 5 10 6` (`/plumbbob:order`) writes it, and `status`, `build`,
87
+ `checkpoint`, and `handoff` all read it, so the dashboard's `← next`, a bare
88
+ `/plumbbob:build`, and the card's Next Up agree. A step keeps its number for life; this
89
+ line is where the sequence lives.)*
90
+
82
91
  ## Open questions
83
92
 
84
93
  *(Holes you could NOT resolve on paper: the one section that expands rather than