plumbbob 0.13.0 → 0.13.2

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.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: order
3
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]"
4
+ argument-hint: "[steps in the sequence to build them, such as 1, 6, 2-4, 7, 5]"
5
5
  disable-model-invocation: true
6
6
  model: haiku
7
7
  allowed-tools: Bash(plumbbob status:*), Bash(plumbbob order:*)
@@ -27,20 +27,30 @@ after the step in flight is the usual reason to run it.
27
27
  ## What this skill does
28
28
 
29
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.
30
+ dashboard. Take the human's instruction, whether a full list (`7 8 5 10 6`, or
31
+ `1, 6, 2-4, 7, 5` with spans and commas) or a relative one ("7 and 8 before 5", "10
32
+ last"), and turn it into **every undone step, in the sequence to build them**. Never
33
+ renumber a step and never move one inside `## Steps`; the sequence lives in this one
34
+ line.
34
35
  2. **Show the sequence and get the human's OK in-turn.** When the human's own message states
35
36
  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.
37
+ 3. **Write it by shelling `plumbbob order 7 8 5 10 6`** via Bash. The verb reads spans and
38
+ commas, with or without a space after one, so a list typed as `1, 6, 2-4, 7, 5` goes to it
39
+ as typed, and the line it writes spells the span out. `plumbbob order --reset` drops the
40
+ line, and the plan reads in document order again.
38
41
  4. **Relay the ending verbatim, then stop.** The verb prints its whole ending: the
39
42
  `**Build order**: 7, 8, 5, 10, 6` line, a blank line, and the `**Next Up**` pointer (back
40
43
  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
+ command but the one in step 5. A refusal (a number the plan lacks, a repeat, a step
45
+ already checkpointed) is the CLI's call: report it verbatim, never retry or work around
46
+ it, and ask the human which number they meant.
47
+ 5. **Read the ranges when the plan has them.** If the dashboard injected above shows a
48
+ `ranges` block, run `plumbbob status` after the verb and read that block again. A `⚠`
49
+ row that was not there before means the new sequence broke a range (most often
50
+ `the build order puts step 11 inside it`). This skill edits nothing, so it cannot re-cut
51
+ one: open the turn with one line naming the range, its drift words, and
52
+ `/plumbbob:refine` as the move that re-cuts it, then the verb's ending, whole, as the
53
+ turn's last text. With no new `⚠` row, or no ranges block, relay the ending alone.
44
54
 
45
55
  ## The one hard contract
46
56
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: plan
3
- description: "Frame a fresh goal and author the whole plan (Frame, Decisions, Constraints, and all Steps) before any code. Three input modes: no arg interviews you; a file path (or @-mention) absorbs a spec; any other text expands your inline intent."
3
+ description: "Frame a fresh goal and author the whole plan (Frame, Decisions, Constraints, all Steps, and the build ranges) before any code. Three input modes: no arg interviews you; a file path (or @-mention) absorbs a spec; any other text expands your inline intent."
4
4
  argument-hint: "[spec-path | intent]"
5
5
  disable-model-invocation: true
6
6
  allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob handoff:*), Bash(plumbbob start:*), Bash(plumbbob checkpoint:*), Bash(plumbbob agent list:*)
@@ -12,9 +12,11 @@ Current session state (injected when this skill runs): !`plumbbob status 2>/dev/
12
12
 
13
13
  `/plumbbob:plan` is the **whole-goal** move; it opens a session and gets the deciding out
14
14
  of your head and onto `intent.md` *before* any code. By default it authors the
15
- **complete plan, including all the Steps**, so the happy path afterward is just
16
- `/plumbbob:build` until done. (Revising a single increment later is the separate `/plumbbob:step`
17
- move; do not confuse the two.)
15
+ **complete plan, including all the Steps and the build ranges**, so the happy path
16
+ afterward is `/plumbbob:run` until done: each run lands one range and stops where the plan
17
+ says a human call is due. A plan without ranges is driven with `/plumbbob:build`, a step
18
+ at a time, and `/plumbbob:build` stays the granular move inside any plan. (Revising a
19
+ single increment later is the separate `/plumbbob:step` move; do not confuse the two.)
18
20
 
19
21
  A model note: this skill **inherits the session model**; nothing pins or switches
20
22
  it. Planning is where frontier-class judgment pays for itself, so if the session is
@@ -42,7 +44,8 @@ Look at the argument the human gave and pick the mode yourself:
42
44
  genuinely ambiguous.
43
45
 
44
46
  All three modes converge on the **same artifact**: a complete, standalone `intent.md`
45
- an agent can follow with `/plumbbob:build`. The argument only seeds how you get there.
47
+ an agent can follow with `/plumbbob:run`, or with `/plumbbob:build` when it cuts no ranges.
48
+ The argument only seeds how you get there.
46
49
 
47
50
  ## What this skill does
48
51
 
@@ -117,7 +120,58 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
117
120
  It is advisory metadata for the human (`/plumbbob:status` surfaces it before each build),
118
121
  never a gate, and nothing switches models automatically. Write it plain (no
119
122
  backticks) and omit it when any model would do.
120
- 5. **Offer harness bindings** *(optional)*. If the build will lean on
123
+ 5. **Cut the build ranges.** With the steps written, say where the build stops for a
124
+ human call, under `## Build ranges`
125
+ ([D92 (build-ranges)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d92)):
126
+ one sentence on how to drive the build, a `/plumbbob:run` per range, then one numbered
127
+ item per range, in the format the parser reads:
128
+
129
+ ```markdown
130
+ 1. `/plumbbob:build 1`, **stop:** at step 1's pause, approve the schema before anything writes to it
131
+ - model: opus
132
+ 2. `/plumbbob:build 2-5`, **stop:** review the parser before the renderers build on it
133
+ - model: sonnet
134
+ - note: <optional; what the range should watch for>
135
+ ```
136
+
137
+ **A range ends where a human call is due, and nowhere else.** Three things make a
138
+ call: a decision the plan leaves open (an Open question, or a fork only a spike can
139
+ settle), a review before later steps build on what landed, and a thing only the human
140
+ can do, such as a push, a live key, or spending money. A range that runs through one
141
+ has the model make the human's call; a stop that marks none of them is a pause nobody
142
+ needed. The command's form says what kind of stop it is
143
+ ([D85 (range-top-lands)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d85)).
144
+ A span such as `2-5` lands every step it names and stops at the boundary after the
145
+ last, so its stop is a review of what landed, or a decision the next steps need before
146
+ they build. A bare `N` builds step N to its pause, so write one for a call that has to
147
+ be made before its step lands, on the step's own work: approving the wording it
148
+ drafted, or the rule it found. Write each stop as what the human decides or reviews
149
+ there, in words they can act on cold.
150
+
151
+ Name every step in exactly one range, by its plan number. A fresh plan has no build
152
+ order, so the ranges follow the numbering. Give each range a `- model:` line naming the
153
+ strongest model any step inside it recommends, written plain the way a step's is,
154
+ because that is the `/model` the human picks before typing the run; any other
155
+ sub-line (a `- note:` on what to watch for) is the reader's, and the CLI leaves it
156
+ alone. Replace the template's placeholder item rather than writing beside it: an item
157
+ still holding its `<...>` fill-ins reads as no range at all.
158
+
159
+ **Size the ranges to the work.** A plan of two or three steps may carry one range, or
160
+ none. When every step would be its own bare range, delete the section: the default
161
+ loop already stops at each step's pause, and `/plumbbob:build` drives a plan without
162
+ ranges a step at a time.
163
+
164
+ **The card names the run, not the item.** The item's command is the range's
165
+ definition: the form the parser reads, and the kind of stop it makes. The card names
166
+ `/plumbbob:run` beneath Next Up for the range holding the next step, with the steps it
167
+ will land beside it, and `/plumbbob:run 3` runs range 3 by its item number
168
+ ([D95 (run-verb)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d95)).
169
+ A range grants nothing until the human types the run that names it, and then the turn
170
+ hook mints the grant from the plan as it stands
171
+ ([D96 (plan-names-the-grant)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d96)),
172
+ so a range you cut is never a grant you mint
173
+ ([D67 (auto-not-a-grant)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d67)).
174
+ 6. **Offer harness bindings** *(optional)*. If the build will lean on
121
175
  user-authored agents, author `harness.json` in the build folder (beside `intent.md`)
122
176
  and review it at the **same plan pause**, alongside the steps; bindings are
123
177
  plan-adjacent configuration, so they converge with the plan. It binds agents to a
@@ -138,7 +192,7 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
138
192
  `note` and decides when to run one mid-build. Skip the file entirely when no step
139
193
  uses an agent; the loop runs identically without it. The plan commit picks it
140
194
  up automatically (it lives in the build folder).
141
- 6. **Commit the plan.** Once the human approves the frame and steps, run
195
+ 7. **Commit the plan.** Once the human approves the frame and steps, run
142
196
  `plumbbob checkpoint --plan` to commit the scaffold on its own: subject
143
197
  `chore(<scope>): plan` (with a `plumbbob plan` body marker), only `.plumbbob/builds/<slug>/`,
144
198
  a `plan <sha>` line in
@@ -148,16 +202,19 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
148
202
  rationale is worth carrying; skip it for a small plan. Do this
149
203
  only on the human's approval; the plan is their convergence.
150
204
  - **The plan pause is a decision turn.** Present the framed plan for the human's call,
151
- then give it the cold read (**§ The cold read**), write the result into
152
- `.plumbbob/detail.md`, and relay `plumbbob handoff --plan`'s block whole: the CLI
205
+ its build ranges with it (each range's command and its stop, since a stop is where
206
+ the human will be asked, and moving one is cheapest now), then give it the cold
207
+ read (**§ The cold read**), write the result into `.plumbbob/detail.md`, and relay `plumbbob handoff --plan`'s block whole: the CLI
153
208
  renders the your-call block with the moves that apply before anything is recorded and
154
209
  prints your recommendation last (the decision tier of the
155
210
  [turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)),
156
- so the moves are relayed, never hand-composed. *looks good* marks the plan decided and
157
- starts `/plumbbob:build` at the first undone step; a message that asks (`expand 2`, or
158
- any question) is answered from the detail file or `intent.md` and changes nothing; a
159
- message that directs is what to sharpen, cheap now, before any code. The revert move
160
- vanishes there on its own: nothing has landed to wind back.
211
+ so the moves are relayed, never hand-composed. *looks good* marks the plan decided, and
212
+ its row names the move the human types next: `/plumbbob:run` for the range holding
213
+ Step 1 when the plan declares ranges, `/plumbbob:build` for Step 1 when it does not;
214
+ a message that asks (`expand 2`, or any question) is answered from the detail file or
215
+ `intent.md` and changes nothing; a message that directs is what to sharpen, cheap
216
+ now, before any code. The revert move vanishes there on its own: nothing has landed
217
+ to wind back.
161
218
  - **The plan commit is latched too.** Once the turn ledger exists, `checkpoint
162
219
  --plan` refuses to land in the same turn `start` stamped it: present the plan,
163
220
  **end the turn**, and the human's approving message is the tick that lets it
@@ -168,7 +225,8 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
168
225
  refusal.)
169
226
  - **The plan commit prints its own close.** `plumbbob checkpoint --plan` emits the
170
227
  whole boundary ending: `**Plan**: committed (<sha>)`, any advisory, and the pointer at
171
- the step the build starts on. Relay that block whole and run no second command; the
228
+ the step the build starts on, with the run that lands its range named beneath it when
229
+ the plan declares ranges. Relay that block whole and run no second command; the
172
230
  plan-pause card above is the one place `handoff` is still called, because no verb has
173
231
  run yet there.
174
232
  - **Say what the commit publishes.** The close-out line names the tracked folder:
@@ -182,7 +240,7 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
182
240
  (the `--body` earns its keep here), the files staying untracked. Say that
183
241
  instead: the rationale is published in `git log`, not the folder, so pass a
184
242
  fuller `--body` than you otherwise would, since the message is the whole record.
185
- 7. **Offer to stress-test it.** Suggest `/plumbbob:refine` to attack the frame for holes (or
243
+ 8. **Offer to stress-test it.** Suggest `/plumbbob:refine` to attack the frame for holes (or
186
244
  to repair the plan as it drifts). Optional, the human's call.
187
245
 
188
246
  ## The cold read
@@ -198,7 +256,9 @@ Open questions, and keep it to one screen of reading. The lens:
198
256
  - a collision with the existing code (read the files the seams name);
199
257
  - a done-when no test or check can measure, or a seam that names a file that does not
200
258
  exist or misses one that must change;
201
- - a step too large to review in one pass, or a Decision with no *because*.
259
+ - a step too large to review in one pass, or a Decision with no *because*;
260
+ - a range that runs through a call the plan leaves open, so the model would make it;
261
+ - a range that stops where no call is due, a pause the human did not need.
202
262
 
203
263
  Write what you found into `.plumbbob/detail.md`, overwriting whatever a past session
204
264
  left, the findings first and the recommendation last:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: refine
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
- argument-hint: "[focus]"
3
+ description: "Keep intent.md true: attack the plan for holes (append as Open questions) and refine or repair the Frame, Decisions, Constraints, Steps, and build ranges to match reality (`ranges` re-cuts the whole section). Usable at any point; you propose, the human approves."
4
+ argument-hint: "[focus | ranges]"
5
5
  disable-model-invocation: true
6
6
  allowed-tools: Read, Edit, Bash(plumbbob status:*), Bash(plumbbob order:*)
7
7
  ---
@@ -22,7 +22,7 @@ it is `NO ACTIVE SESSION`, **refuse** in one line and tell the human to run
22
22
  `plumbbob start "<title>"` (or `/plumbbob:plan`) first, and edit nothing. Every active state
23
23
  is fine; refining is always available.
24
24
 
25
- ## Two modes
25
+ ## Two modes, and a re-cut
26
26
 
27
27
  - **Attack (diverge in the problem space).** Hand the **Frame**, **Decisions**, and
28
28
  **Architecture sketch** a cold, adversarial read and surface holes: ambiguities,
@@ -57,6 +57,27 @@ is fine; refining is always available.
57
57
  sequence to build them, and the `## Build order` line it writes is what every next-step
58
58
  pick follows. Never renumber, and never edit that line by hand.
59
59
 
60
+ **A repair keeps the build ranges true.** When the plan carries `## Build ranges`, a
61
+ step the repair adds goes into a range (the one it builds with, or a bare range of its
62
+ own when it brings a call the human has to make before it lands), never a range that
63
+ has landed, since that range's call was made and the step would reopen it. A new range
64
+ takes the next free item number, and no item is renumbered, because the stop card's
65
+ stamp, the detail file's header, and `plumbbob harvest` find a landed range by its
66
+ number. A range the repair breaks is re-cut in the same before/after
67
+ ([D92 (build-ranges)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d92)).
68
+ Read `plumbbob status` once the edits are written: its ranges block carries a `⚠` row
69
+ for a range naming a step the plan lacks, a step two ranges name, a step the build order
70
+ puts inside a range that does not name it, and an undone step no range names, and none
71
+ once the section is sound.
72
+ - **Re-cut the ranges (`/plumbbob:refine ranges`).** On request, re-cut the whole
73
+ `## Build ranges` section against the plan as it stands, by the rule `/plumbbob:plan`
74
+ cuts it with: a range ends where a human call is due (a decision the plan leaves open,
75
+ a review before later steps build on what landed, or a thing only the human can do)
76
+ and nowhere else, a bare build for a call made on a step's own work before it lands,
77
+ every undone step in exactly one range, walked in build order, and a `- model:` line
78
+ per range. A landed range stays as written, since its call was made. Show the section
79
+ before and after, and write only what the human approves.
80
+
60
81
  ## The hard contracts
61
82
 
62
83
  - **You propose; the human converges.** Surface holes and draft repairs, but the human
@@ -0,0 +1,256 @@
1
+ ---
2
+ name: run
3
+ description: "Run what is left of the range holding the next step, or of range N: the plan's `## Build ranges` names the steps, the turn hook mints their grant from the plan, and the run walks them the way a typed range is walked, then ends on the stop card, the range's review with every open park proposed, which one reply settles. A bare range builds its one step to its pause. Reads the build skill beside it for the per-step loop."
4
+ argument-hint: "[range-number]"
5
+ disable-model-invocation: true
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:*), Bash(plumbbob harvest:*), Bash(plumbbob order:*), Bash(git log:*)
7
+ ---
8
+
9
+ # PlumbBob: run a range
10
+
11
+ Current session state (injected when this skill runs): !`plumbbob status --run "$ARGUMENTS" 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."`
12
+
13
+ A run is one range of the plan being built. `/plumbbob:run` runs what is left of the range
14
+ holding the next undone step in build order, the step in flight counted undone, and
15
+ `/plumbbob:run 3` runs range 3, by the item number the plan's `## Build ranges` gives it
16
+ ([D95 (run-verb)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d95)).
17
+ The plan names the steps, so you never work them out from the chat: the run header above the
18
+ dashboard names them, and the turn hook minted their grant from the plan when the human typed
19
+ the run
20
+ ([D96 (plan-names-the-grant)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d96)).
21
+
22
+ This skill carries only what is the run's own: reading the header, refusing, how a run
23
+ starts, and the stop card it ends on. The loop that builds each step belongs to the build
24
+ skill, and the classes a park settles as belong to the harvest skill; you read both rather
25
+ than recall them
26
+ ([D99 (one-loop)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d99)).
27
+
28
+ ## 1. Read the build skill first
29
+
30
+ Before anything else, read `../build/SKILL.md` from this skill's base directory: the path
31
+ printed above this skill as its base directory, so `<base directory>/../build/SKILL.md`.
32
+ Read the file every run, whole; a copy of it from memory drifts. The parts a run follows are
33
+ its sections **What this skill does, in order** (steps 2 to 5: entering a step, reading the
34
+ plan, implementing within the seam, parking a tangent, and the verify tick with its pause),
35
+ **`--auto`: let the agent be the clock (opt-in)** with its halt list, **A step range (`N-M`,
36
+ or a list like `20,5-9`) is a bounded `--auto`**, **Running bound agents** when the dashboard
37
+ shows a `harness bindings:` block, and **The hard contracts**.
38
+
39
+ Its rules about its own invocation are about `/plumbbob:build` and do not apply here: its
40
+ first step (picking the step from its arguments) and its rule that the invocation outranks
41
+ its injected dashboard. For a run, this skill's invocation and the run header take their
42
+ place, below. Its rule for a clean halt (relay the top step's checkpoint block and end the
43
+ turn) gives way to the stop card here, below.
44
+
45
+ At the stop card you also read `../harvest/SKILL.md` from the same base directory, for its
46
+ three classes, its default, and its rules for folding a confirmed blocker into the plan.
47
+
48
+ ## 2. Read the run header
49
+
50
+ The injected state opens on the run header when the run names a range it can walk:
51
+
52
+ ```text
53
+ run range 3 of 5 · steps 6-9 · ends at step 9's boundary
54
+ stop: review the card on a live boundary before the skills teach it
55
+ grant: steps 6-9
56
+ ```
57
+
58
+ The first line is the range, what is left of it in the order the run builds it, and where
59
+ the run ends: at the boundary after its last step for a range that lands its steps, or at
60
+ the pause of its one step for a bare range. The `stop:` line is the call the plan reserved
61
+ for the end of the range. The `grant:` line is what the turn hook minted at the keystroke,
62
+ and the dashboard beneath marks the run's first step `← requested`.
63
+
64
+ A fourth line, `waiting: range 2 of 5's stop card, recorded before the run`, means the last
65
+ range's stop card is still waiting for its reply. The run typed at it is that reply: settle
66
+ the card first (section 6, below), then walk the run.
67
+
68
+ **The typed number and the grant outrank the header.** The hook read the plan the human
69
+ typed against, so its grant is the run. When the human typed a number and the header names
70
+ another range (the host never passed the number through), or the grant line says
71
+ `unlike the run`, walk exactly the steps the grant names and say so in one line. A
72
+ `range M` grant, from a hook older than step lists, lands the steps up to M.
73
+
74
+ `grant: none` beside a range that lands its steps means the hook minted nothing, because
75
+ the plugin's hook is older than the run or the prompt was not a typed `/plumbbob:run`, so
76
+ no step could land without a pause. Report that in a sentence or two, name the range's own
77
+ command from the plan's `## Build ranges` (`/plumbbob:build 6-9`) as the way to land it by
78
+ hand, and stop without building. **Never write a grant yourself to get past it: a grant you
79
+ mint is no grant, and the latch ignores it
80
+ ([D67 (auto-not-a-grant)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d67)).**
81
+
82
+ ## 3. Refuse what the run cannot walk
83
+
84
+ No run header above the dashboard means the run names nothing it can walk, and the hook
85
+ minted nothing for it
86
+ ([D97 (run-refuses)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d97)).
87
+ The dashboard's `next →` line carries the refusal and the move that unblocks it: a plan
88
+ without ranges (`/plumbbob:refine ranges`, or `/plumbbob:build` for the next step alone), a
89
+ next step no range names or a flagged range (`/plumbbob:refine ranges`), a range that has
90
+ landed or a number the plan lacks (the run the card names instead), nothing left
91
+ (`/plumbbob:finish`), a step in flight outside the range typed (`/plumbbob:verify` or
92
+ `/plumbbob:abandon` it), or a spike open (`plumbbob spike done`). A span or a list of ranges
93
+ (`/plumbbob:run 2-4`) is a form no run defines, and it refuses the same way.
94
+
95
+ Report the refusal in a sentence or two, quoting the move from that line, and stop: enter
96
+ no step, build nothing, and run no checkpoint. `NO ACTIVE SESSION` refuses too, with
97
+ `/plumbbob:plan` as the move.
98
+
99
+ ## 4. Run the range
100
+
101
+ **A step waiting at its pause.** When the dashboard's phase reads `[BUILD]`, a step is in
102
+ flight, and the header's first step is that step. A run typed there is that pause's
103
+ `looks good`: land it the way the build skill lands an approved pause, with
104
+ `plumbbob checkpoint <n> --body <<'BODY'` and a body proportional to the step, and do not
105
+ enter it again with `plumbbob build`. The checkpoint runs the check, so the step lands only
106
+ on green. When the checkpoint refuses on a red check, the step stays at its pause: write the
107
+ detail file, run `plumbbob handoff`, paste its block, and end the turn. When the step is not
108
+ finished (its done-when unmet, and no pause card for it in this conversation), finish
109
+ building it first, then verify and land it the same way. Once it lands, a bare range's run
110
+ ends there: relay the checkpoint's block whole and end the turn. A run whose landing range
111
+ that step completed ends on the stop card, below, even when the paused step was the range's
112
+ last. Otherwise carry on through what is left, below. A halt the human approves with
113
+ `looks good` lands its step the same way, and when that landing completes the run's range
114
+ (its checkpoint block carries the `**Stop**:` part for it), the run ends on the stop card
115
+ too.
116
+
117
+ **A range that lands its steps.** Walk it exactly as the build skill walks a typed range,
118
+ in its section on step ranges: start at the header's first undone step, build each step the
119
+ grant names in build order, check, self-review, and checkpoint it on green, and take the
120
+ next undone step in build order after each landing. A step the grant does not name halts the
121
+ walk before it, since the checkpoint would refuse it. The halt list is the build skill's: a
122
+ red check, a self-review mismatch, a bound agent's `blocked` or `drift`, or a new decision
123
+ ends at that step's pause card. `plumbbob build` names the top step as the top of the range
124
+ you granted when it enters it. Once that step lands, its checkpoint prints the boundary
125
+ with the Stop part (`**Stop**: Range 3 of 5 landed - <its stop>`); relay none of it, and end
126
+ the run on the stop card, below, in the same turn.
127
+
128
+ **A bare range.** `grant: none, as a bare range builds to its pause`: build the range's one
129
+ step to its pause exactly as the build skill's default path does for `/plumbbob:build <n>`:
130
+ enter it, implement it, verify it, write the detail file, run `plumbbob handoff`, paste its
131
+ block, and end the turn. The plan reserved this pause for a call, and the header's `stop:`
132
+ line names it, so your recommendation speaks to that call.
133
+
134
+ ## 5. End on the stop card
135
+
136
+ A run that lands its range ends on the stop card
137
+ ([D100 (stop-card)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d100)):
138
+ the review the plan's stop asked for, with every open park on it and a lean proposed for
139
+ each. The checkpoint that landed the range's last step marked its ending as owing the card,
140
+ and the turn will not close on that boundary
141
+ ([D103 (stop-latched)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d103)).
142
+
143
+ *Write the range's detail file.* Overwrite `.plumbbob/detail.md` in the range's shape:
144
+
145
+ ```markdown
146
+ # Detail · Range <N> · <the stop, as the plan words it>
147
+
148
+ ── recap · range <N> of <M> ──
149
+ done-when met
150
+ decisions honored: D1 (some-slug), D2 (another-slug)
151
+ constraints all honored
152
+
153
+ ## Summary
154
+
155
+ <what the whole range built, in a sentence or a short paragraph>
156
+
157
+ ## 1 <the first highlight across the range: one sentence, one move>
158
+
159
+ <the full story>
160
+
161
+ ## Harvest
162
+
163
+ - P<handle> → <blocker, tangent, or pivot>: <the reason, one clause>
164
+
165
+ ## Recommendation
166
+
167
+ <The move.> <The reason, one or two sentences.>
168
+ ```
169
+
170
+ The header names the range by its item number, and that is how `checkpoint` and
171
+ `plumbbob harvest` tell the file from a step's. The three rows judge the whole range: every
172
+ step's done-when, the decisions any step exercised, and the constraints. The Summary and the
173
+ highlights are the range's, not its last step's, and you draw them from the range's
174
+ checkpoint bodies (`git log` over its commits) and their entries in the build-log's `## Log`,
175
+ never from recall, since a long run can compact its context partway through and lose its
176
+ early steps. A step that landed a hair off comes first among the highlights; five at most.
177
+
178
+ The `## Harvest` section carries one line for every open park in the build-log's
179
+ `## Park list`. A park's handle is `P` and its place in that list, counting the harvested
180
+ lines too, which is the count the note sizes as `parked 3 of 8 open`: the third line ever
181
+ parked is `P3` whether or not the two above it are flipped, and the card, the detail file,
182
+ and the human's reply all name it `P3`
183
+ ([D105 (park-handles)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d105)).
184
+ Propose one class per park by the harvest skill's rules, `tangent` for anything uncertain,
185
+ with the reason in one clause; the card prints it as the park's lean
186
+ (`→ lean: tangent, <the reason>`), so write the class and the reason alone and leave the
187
+ punctuation to handoff. A park you leave out reads `no lean proposed` on the card and stays
188
+ open. The section vanishes when no park is open, and so does the card's Harvested part
189
+ ([D100 (stop-card)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d100)).
190
+ The recommendation speaks to the plan's stop, the header's `stop:` line, and to the
191
+ proposals: the move you would take on both, then why.
192
+
193
+ *Render it and stop.* Run `plumbbob handoff --stop` and paste its output whole, verbatim, at
194
+ top level, trailing blank line included, then end the turn. Write nothing before it or after
195
+ it, and record nothing in this turn: `plumbbob harvest` refuses in the turn the card printed,
196
+ because the human has not read it yet. If the turn is held with a reason saying the stop card
197
+ is still owed, do exactly what the reason says.
198
+
199
+ ## 6. The reply at a stop
200
+
201
+ The card's proposals are settled in one reply
202
+ ([D102 (settle-in-one-reply)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d102)),
203
+ and the Your Call block names the replies. Read the human's message as one of them:
204
+
205
+ - **`looks good`** confirms the review and locks in every lean as proposed, as the line
206
+ beneath the card's Your Call label says. Fold each confirmed blocker into `intent.md` by
207
+ the harvest skill's rules first, then run `plumbbob harvest`, which flips the parks,
208
+ writes the Harvest lines, and writes the range's review beneath a dated line in the Log.
209
+ A blocker that becomes a step goes into a range still to come, or a bare range of its
210
+ own, never into the range this card reviews: that range has landed, its call is the one
211
+ being made, and the step would reopen it. Relay the record's ending whole and end the
212
+ turn. It commits nothing; the record rides the next step's checkpoint.
213
+ - **A change** (`make P7 a tangent`, or a change to the review) is direction. Rewrite the
214
+ detail file's line or section, run `plumbbob handoff --stop`, paste the whole card it
215
+ prints, and end the turn. Nothing is recorded until `looks good`.
216
+ - **A question**, or `expand 2`, is answered from the detail file, the range's commits, or
217
+ the Log, never from recall; then run `plumbbob handoff --stop` and paste what it prints
218
+ beneath your answer, which is the one-line reminder while the stop is unchanged.
219
+ `show the stop`, or a session without the card in front of it, takes
220
+ `plumbbob handoff --stop --full`.
221
+ - **`/plumbbob:run`** typed at the card confirms everything the way `looks good` does, and
222
+ runs the next range. Record first: fold the blockers and run `plumbbob harvest`, then read
223
+ `plumbbob status --run "<the same argument>"` again. When its grant line says
224
+ `unlike the run`, the record re-cut the range the run would walk (a blocker added or moved a
225
+ step in it), and the grant the hook minted before the record no longer covers it: relay
226
+ the record's ending whole and end the turn there, where its note names the re-cut run for
227
+ the human to type
228
+ ([D102 (settle-in-one-reply)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d102)).
229
+ Otherwise relay the record's ending and walk the run from section 4.
230
+ - **`/plumbbob:finish`** at the plan's last range is the finish skill's to settle: it
231
+ records the card the way `looks good` would before it writes the report.
232
+
233
+ `plumbbob harvest` refuses a proposal naming a handle the list lacks (`P9` with eight
234
+ parked) and a class outside the three, and it refuses a detail file no card showed; fix what the refusal names, run
235
+ `plumbbob handoff --stop` again, and end the turn on the card. One refusal takes another
236
+ path: `step 13 joined it after it landed` means a blocker went into the range the card
237
+ reviews. Move that step to a range still to come, or a bare range of its own, leave
238
+ `.plumbbob/detail.md` as it is, fold nothing again, and run `plumbbob harvest` once more in
239
+ the same turn, which records; `plumbbob handoff --stop` would refuse there.
240
+
241
+ ## The hard contracts
242
+
243
+ - **The human types the run.** You never start one: `looks good` lands a step and never
244
+ starts the next range, and nothing chains ranges. A run ends where its range does, on the
245
+ stop card, or at a pause for a bare range or a halt, and the next run waits for the human's
246
+ next prompt.
247
+ - **The plan names the steps.** Walk what the header and the grant name, never a range
248
+ worked out from the chat, and never a step beyond the grant.
249
+ - **The latch holds the record.** A refused checkpoint is a pause, never an error to route
250
+ around: write the detail file, run `plumbbob handoff`, paste its block, and end the turn.
251
+ Never land a step with a raw `git commit`, and never write a grant into a settings or
252
+ control file; ask the human to type the run again instead.
253
+ - **The reply records the stop.** Never run `plumbbob harvest` in the turn the stop card
254
+ printed; the human's reply to the card is what records it, and the classes stay their call.
255
+ - **One loop.** Read `../build/SKILL.md` every run; the build skill is the engine both verbs
256
+ drive, and two copies of it would drift apart.
@@ -11,8 +11,8 @@ allowed-tools: Bash(plumbbob status:*)
11
11
  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."`
12
12
 
13
13
  This is a **thin driver** for `plumbbob status`. The dashboard above is your
14
- orientation: the intent, the step list, the parked/open-question counts, and the
15
- inferred next move. Report it verbatim and point the human at that next move. This
14
+ orientation: the intent, the step list, the build ranges when the plan has them, the
15
+ parked/open-question counts, and the inferred next move. Report it verbatim and point the human at that next move. This
16
16
  skill carries **no Edit and no Write tool**: the CLI is the source of truth, so
17
17
  **never retry**, and never edit a file to change what the orientation says.
18
18
 
@@ -31,4 +31,11 @@ annotate it.
31
31
  can switch (for example `/model sonnet`) before firing `/plumbbob:build`, or ignore it.
32
32
  Guidance, never a gate. You relay that line; you do not re-state it on top of the
33
33
  verbatim dashboard.
34
- 3. If it reads `NO ACTIVE SESSION`, tell the human to `/plumbbob:plan` to frame a goal.
34
+ 3. When the plan carries `## Build ranges`, the dashboard lists them beneath the steps:
35
+ `ranges 2 of 5 done`, `✓` on a landed range and `▸` on the one holding the next step,
36
+ each undone range's stop on the line beneath it, and a `⚠` row for any range the plan
37
+ has outgrown. A landed range whose stop card still waits for its reply reads
38
+ `← stop card waiting`, and the `next →` names that card first. Each row keeps the command the plan wrote, the range's definition, while
39
+ the `next →` names the run to type, `/plumbbob:run` with the steps it will land beside
40
+ it. You relay the block with the rest; a `⚠` row is `/plumbbob:refine`'s to fix.
41
+ 4. If it reads `NO ACTIVE SESSION`, tell the human to `/plumbbob:plan` to frame a goal.
@@ -53,6 +53,27 @@ grew, but its everyday job is to sharpen, not to invent.
53
53
  renumbering: shell `plumbbob order 7 8 5` with every undone step in the sequence to
54
54
  build them, and the `## Build order` line it writes is what `status`, a bare
55
55
  `/plumbbob:build`, and the card's Next Up then follow.
56
+
57
+ **Keep the build ranges true.** When the plan carries `## Build ranges`, a step you add
58
+ goes into a range: the one it builds with (`/plumbbob:build 6-9` becomes `6-10`, or
59
+ `6-9,14` for a step numbered past the next range), or a bare range of its own when it
60
+ brings a call the human has to make before it lands
61
+ ([D92 (build-ranges)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d92)).
62
+ Either way it is a range still to come, never a range that has landed, since that
63
+ range's call was made and the step would reopen it. A new range takes the next free
64
+ item number, and no item is renumbered, because the stop card's stamp, the detail
65
+ file's header, and `plumbbob harvest` find a landed range by its number.
66
+ A step the build order places between two of a range's steps belongs to that range. A
67
+ split or re-cut that moves where a call falls moves the stop with it, so re-cut any
68
+ range the edit breaks, and show the range edit in the same before/after, since it
69
+ changes where the human will be asked. The edit lands on the item's command, the
70
+ range's definition, not on the command the card names: the card names `/plumbbob:run`
71
+ for the range, and the turn hook mints a run's grant from the plan as the human types
72
+ the run, so the next run lands the range as you re-cut it, while a run already typed
73
+ keeps the grant it minted
74
+ ([D96 (plan-names-the-grant)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d96)).
75
+ Then read `plumbbob status`: its ranges block carries a `⚠` row for any range still
76
+ broken, and none once every undone step sits in exactly one range.
56
77
  4. **Revise the step's harness bindings if they drifted too** *(optional)*. If the
57
78
  build carries a `harness.json` (beside `intent.md`) and the reality that moved the
58
79
  step also changed which agents it wants, sharpen that step's slot bindings
@@ -66,9 +87,10 @@ grew, but its everyday job is to sharpen, not to invent.
66
87
 
67
88
  - **One verifiable increment.** Each step carries a done-when `/plumbbob:verify` can check
68
89
  and a seam small enough to review in one pass.
69
- - **Edit `## Steps` only**, in the standard format `status` and `build` parse: never
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.
90
+ - **Edit `## Steps` only**, in the standard format `status` and `build` parse, plus the
91
+ `## Build ranges` items a step edit moves: never the Roadmap, never loose prose. A done
92
+ step (`[x]`) is history; do not rewrite it. The `## Build order` line is
93
+ `plumbbob order`'s to write, never yours to edit.
72
94
  - **Cite the plan's own numbers in the linked form.** A `D`/`C`/`Q` you write into a
73
95
  step's done-when, seam, or notes reads `[D4 (default-waves)](#d4)`; the slug travels
74
96
  with the number, and the link lands on the `<a id="d4">` anchor minted where the item
@@ -58,7 +58,11 @@ this skill verifies it the same way: **it reads the diff, not the author**
58
58
  "here is the pause", for reading the check verdict back in prose, or for a closing
59
59
  courtesy. Each fact appears once, in its part.
60
60
 
61
- *Write the detail file.* Before you call `plumbbob handoff`, overwrite
61
+ *Write the detail file.* If `.plumbbob/detail.md` opens on a `# Detail · Range <N>`
62
+ header and the dashboard above marks that range `← stop card waiting`, that card is still
63
+ waiting: **refuse**, since writing this skill's detail file would overwrite the range's
64
+ review, and point the human at the card's own reply (`looks good`, or a change to a
65
+ lean). Otherwise, before you call `plumbbob handoff`, overwrite
62
66
  `.plumbbob/detail.md`. It is the wire handoff parses, and it is the only path by which
63
67
  the judgment you formed in steps 2 through 4 reaches the turn:
64
68
 
@@ -220,7 +224,7 @@ the checkpoint land when you run it again. **Never reach for a raw `git commit`
220
224
  land**; that forges the very record the latch exists to keep honest, and the
221
225
  commit-ask hook asks the human about it anyway. The refusal is a healthy latch doing its
222
226
  job on the *record* while the *work* plane stays free; a `/plumbbob:build --auto` or
223
- a typed step range in the human's own prompt is the only self-approval; **never write
227
+ a typed step range (`1-3`, or a list like `20,5-9`) in the human's own prompt is the only self-approval; **never write
224
228
  `auto` into a settings file to unlock the land; the latch ignores a model-minted grant
225
229
  ([D67 (auto-not-a-grant)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d67)), so ask the human to type `/plumbbob:build --auto` again
226
230
  instead.**