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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +4 -4
- package/dist/cli-core.js +11 -0
- package/dist/lib/latch.js +1 -1
- package/dist/lib/orient.js +233 -18
- package/dist/verbs/build.js +51 -12
- package/dist/verbs/checkpoint.js +17 -10
- package/dist/verbs/handoff.js +64 -13
- package/dist/verbs/order.js +102 -0
- package/dist/verbs/recover.js +31 -1
- package/dist/verbs/turn.js +7 -6
- package/node_modules/checkride/.claude-plugin/plugin.json +1 -1
- package/node_modules/checkride/CHANGELOG.md +117 -0
- package/node_modules/checkride/dist/adapters.d.ts.map +1 -1
- package/node_modules/checkride/dist/adapters.js +14 -10
- package/node_modules/checkride/dist/adapters.js.map +1 -1
- package/node_modules/checkride/dist/baseline/fallow.d.ts +4 -3
- package/node_modules/checkride/dist/baseline/fallow.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/fallow.js +15 -8
- package/node_modules/checkride/dist/baseline/fallow.js.map +1 -1
- package/node_modules/checkride/dist/gate.d.ts.map +1 -1
- package/node_modules/checkride/dist/gate.js +62 -44
- package/node_modules/checkride/dist/gate.js.map +1 -1
- package/node_modules/checkride/dist/init.js +3 -3
- package/node_modules/checkride/dist/init.js.map +1 -1
- package/node_modules/checkride/dist/orchestrator.d.ts.map +1 -1
- package/node_modules/checkride/dist/orchestrator.js +53 -8
- package/node_modules/checkride/dist/orchestrator.js.map +1 -1
- package/node_modules/checkride/dist/pack.js +3 -3
- package/node_modules/checkride/dist/security.d.ts +4 -2
- package/node_modules/checkride/dist/security.d.ts.map +1 -1
- package/node_modules/checkride/dist/security.js +42 -8
- package/node_modules/checkride/dist/security.js.map +1 -1
- package/node_modules/checkride/dist/triage/render.js +1 -1
- package/node_modules/checkride/dist/triage/render.js.map +1 -1
- package/node_modules/checkride/package.json +10 -10
- package/node_modules/checkride/skills/check/SKILL.md +4 -3
- package/node_modules/checkride/templates/shared/cspell.json +3 -24
- package/package.json +3 -3
- package/skills/build/SKILL.md +48 -26
- package/skills/finish/SKILL.md +5 -2
- package/skills/harvest/SKILL.md +4 -1
- package/skills/order/SKILL.md +50 -0
- package/skills/plan/SKILL.md +5 -2
- package/skills/refine/SKILL.md +6 -2
- package/skills/step/SKILL.md +8 -3
- package/skills/verify/SKILL.md +14 -8
- package/templates/intent.md +9 -0
package/skills/build/SKILL.md
CHANGED
|
@@ -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
|
|
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
|
|
40
|
-
argument, don't resolve the next step yourself; the CLI does: bare `plumbbob build`
|
|
41
|
-
(step 2) enters the next undone step
|
|
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
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
|
271
|
-
|
|
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 **
|
|
276
|
-
|
|
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
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
-
|
|
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
|
package/skills/finish/SKILL.md
CHANGED
|
@@ -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.
|
|
57
|
-
|
|
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
|
package/skills/harvest/SKILL.md
CHANGED
|
@@ -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.
|
package/skills/plan/SKILL.md
CHANGED
|
@@ -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
|
|
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
|
package/skills/refine/SKILL.md
CHANGED
|
@@ -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
|
|
package/skills/step/SKILL.md
CHANGED
|
@@ -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
|
package/skills/verify/SKILL.md
CHANGED
|
@@ -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
|
|
117
|
-
level, trailing blank line included, then end the
|
|
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
|
|
134
|
-
paste it. The step
|
|
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
|
|
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
|
|
221
|
-
handoff
|
|
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
|
package/templates/intent.md
CHANGED
|
@@ -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
|