plumbbob 0.12.0 → 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 (46) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +3 -3
  3. package/dist/cli-core.js +11 -0
  4. package/dist/lib/orient.js +223 -18
  5. package/dist/verbs/build.js +45 -22
  6. package/dist/verbs/checkpoint.js +4 -4
  7. package/dist/verbs/handoff.js +64 -13
  8. package/dist/verbs/order.js +102 -0
  9. package/dist/verbs/recover.js +31 -1
  10. package/dist/verbs/turn.js +7 -6
  11. package/node_modules/checkride/.claude-plugin/plugin.json +1 -1
  12. package/node_modules/checkride/CHANGELOG.md +117 -0
  13. package/node_modules/checkride/dist/adapters.d.ts.map +1 -1
  14. package/node_modules/checkride/dist/adapters.js +14 -10
  15. package/node_modules/checkride/dist/adapters.js.map +1 -1
  16. package/node_modules/checkride/dist/baseline/fallow.d.ts +4 -3
  17. package/node_modules/checkride/dist/baseline/fallow.d.ts.map +1 -1
  18. package/node_modules/checkride/dist/baseline/fallow.js +15 -8
  19. package/node_modules/checkride/dist/baseline/fallow.js.map +1 -1
  20. package/node_modules/checkride/dist/gate.d.ts.map +1 -1
  21. package/node_modules/checkride/dist/gate.js +62 -44
  22. package/node_modules/checkride/dist/gate.js.map +1 -1
  23. package/node_modules/checkride/dist/init.js +3 -3
  24. package/node_modules/checkride/dist/init.js.map +1 -1
  25. package/node_modules/checkride/dist/orchestrator.d.ts.map +1 -1
  26. package/node_modules/checkride/dist/orchestrator.js +53 -8
  27. package/node_modules/checkride/dist/orchestrator.js.map +1 -1
  28. package/node_modules/checkride/dist/pack.js +3 -3
  29. package/node_modules/checkride/dist/security.d.ts +4 -2
  30. package/node_modules/checkride/dist/security.d.ts.map +1 -1
  31. package/node_modules/checkride/dist/security.js +42 -8
  32. package/node_modules/checkride/dist/security.js.map +1 -1
  33. package/node_modules/checkride/dist/triage/render.js +1 -1
  34. package/node_modules/checkride/dist/triage/render.js.map +1 -1
  35. package/node_modules/checkride/package.json +10 -10
  36. package/node_modules/checkride/skills/check/SKILL.md +4 -3
  37. package/node_modules/checkride/templates/shared/cspell.json +3 -24
  38. package/package.json +3 -3
  39. package/skills/build/SKILL.md +12 -4
  40. package/skills/harvest/SKILL.md +4 -1
  41. package/skills/order/SKILL.md +50 -0
  42. package/skills/plan/SKILL.md +3 -1
  43. package/skills/refine/SKILL.md +6 -2
  44. package/skills/step/SKILL.md +8 -3
  45. package/skills/verify/SKILL.md +10 -7
  46. package/templates/intent.md +9 -0
@@ -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
@@ -38,7 +38,8 @@ switch with `/model` and rerun to honor it, or wave you on. Advisory, never a ga
38
38
  if you were given a range like `/plumbbob:build 1-3`, start at the first number and treat
39
39
  the second as the last step you approve and land yourself (see the range note under
40
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 and refuses with a `/plumbbob:step` nudge when every
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
@@ -268,7 +269,9 @@ and approves in the human's place**, and it **chains**:
268
269
  human has a call to make about it, so end on the same turn the default pause does:
269
270
  write the detail file, run `plumbbob handoff`, and paste its block.
270
271
  - **A clean halt lands its step first.** The top of a requested range is reached, or no
271
- planned steps remain. That step checkpoints like every step before it, and its
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
272
275
  checkpoint's block is the whole ending: relay it with nothing written around it, then
273
276
  end the turn. Write no detail file and run no `handoff`, because nothing is pending.
274
277
  The block already carries the Verdict the step earned and a Next Up pointing at what
@@ -289,7 +292,8 @@ any next step whose plan number is past the top of the range.** It adds no machi
289
292
  the one more entry already in the halt list above, and it is a clean halt, so the top step
290
293
  is never held back for approval. The human approved it by typing the range, and
291
294
  `plumbbob build` says so as it enters that step:
292
- `step 3 is the top of the range you granted`.
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`.
293
297
 
294
298
  - **`N-M` with N ≤ M**: build N…M, self-approving and checkpointing each, M included, then
295
299
  relay M's checkpoint block and end the turn. `N-N` is a range like any other: it builds
@@ -305,6 +309,10 @@ is never held back for approval. The human approved it by typing the range, and
305
309
  - **N is above the next undone step**: you are jumping over earlier planned work; note
306
310
  that you are skipping the steps before N, then proceed (the same latitude as a
307
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`.
308
316
 
309
317
  ## The hard contracts
310
318
 
@@ -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
@@ -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`.
@@ -194,7 +197,7 @@ When this session runs under plumbbob's turn hook, `plumbbob checkpoint` **refus
194
197
  land a step in the same turn it was entered**, and that refusal **is** this pause, not
195
198
  an error to route around. If the checkpoint prints `checkpoint refused — no human turn
196
199
  since this step began`, you have reached the pause the hard way: write the file, run
197
- `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
198
201
  human's next message is the tick that lets
199
202
  the checkpoint land when you run it again. **Never reach for a raw `git commit` to force the
200
203
  land**; that forges the very record the latch exists to keep honest, and the
@@ -220,8 +223,8 @@ instead.**
220
223
  self-review; checkride gates, the human approves. `blocked` → unblock and re-run;
221
224
  `drift` → `/plumbbob:refine` before checkpointing. No code path makes them blocking.
222
225
  - **A refused checkpoint is the pause, never a workaround.** Under the turn
223
- hook a same-turn checkpoint is refused *by design*: write the file, run `plumbbob
224
- 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
225
228
  re-tick it. Never route around it with a
226
229
  raw `git commit`; the latch guards the record, not the work.
227
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