plumbbob 0.10.3 → 0.11.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 +108 -51
- package/dist/cli-core.js +8 -4
- package/dist/lib/agents.js +2 -2
- package/dist/lib/buildlog.js +22 -0
- package/dist/lib/check.js +76 -6
- package/dist/lib/git.js +60 -5
- package/dist/lib/notice.js +140 -0
- package/dist/lib/orient.js +467 -8
- package/dist/lib/sidecar.js +28 -0
- package/dist/verbs/abandon.js +25 -8
- package/dist/verbs/agent.js +63 -31
- package/dist/verbs/build.js +25 -9
- package/dist/verbs/check.js +8 -3
- package/dist/verbs/checkpoint.js +130 -32
- package/dist/verbs/finish.js +33 -9
- package/dist/verbs/handoff.js +506 -63
- package/dist/verbs/park.js +11 -5
- package/dist/verbs/revert.js +16 -5
- package/dist/verbs/spike.js +61 -22
- package/dist/verbs/start.js +56 -17
- package/dist/verbs/use.js +26 -16
- package/package.json +1 -1
- package/skills/abandon/SKILL.md +2 -1
- package/skills/build/SKILL.md +117 -35
- package/skills/finish/SKILL.md +19 -8
- package/skills/park/SKILL.md +15 -1
- package/skills/plan/SKILL.md +59 -1
- package/skills/recover/SKILL.md +3 -2
- package/skills/revert/SKILL.md +2 -1
- package/skills/spike/SKILL.md +3 -2
- package/skills/status/SKILL.md +13 -5
- package/skills/verify/SKILL.md +127 -31
- package/templates/build-log.md +4 -3
package/skills/build/SKILL.md
CHANGED
|
@@ -104,31 +104,111 @@ switch with `/model` and rerun to honor it, or wave you on. Advisory, never a ga
|
|
|
104
104
|
build the step and reach the pause *in one turn*, so under plumbbob's turn hook the
|
|
105
105
|
checkpoint at the end of that turn is **refused** ("no human turn since this step
|
|
106
106
|
began"), and that refusal **is** the pause working as designed. Do exactly what the
|
|
107
|
-
pause asks:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
and **stop at the boundary**. Landing
|
|
111
|
-
thing approval triggers), never a side
|
|
112
|
-
`/plumbbob:build` only ever starts the *next*
|
|
113
|
-
raw `git commit`**; the work plane stays
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
107
|
+
pause asks: write the detail file, run `plumbbob handoff`, paste its block, and **end
|
|
108
|
+
the turn there**. The human's next
|
|
109
|
+
message (their approval) is the human turn that lets the checkpoint land: on that turn
|
|
110
|
+
you run `plumbbob checkpoint <n>` (now allowed) and **stop at the boundary**. Landing
|
|
111
|
+
the checkpoint is its own deliberate beat (the thing approval triggers), never a side
|
|
112
|
+
effect of starting the next step, and `/plumbbob:build` only ever starts the *next*
|
|
113
|
+
step. **Never route around a refusal with a raw `git commit`**; the work plane stays
|
|
114
|
+
free, but the *record* is latched on purpose.
|
|
115
|
+
|
|
116
|
+
**Render the pause: write the file, run handoff, paste.** A build pause is a decision
|
|
117
|
+
turn, and the
|
|
118
|
+
[turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)
|
|
119
|
+
fixes it as one block. You author none of it in the chat. Your judgment goes into
|
|
120
|
+
`.plumbbob/detail.md`; `plumbbob handoff` renders the whole turn from that file and its
|
|
121
|
+
own measurements; you paste its output and write nothing before or after it. The rule is
|
|
122
|
+
positional on purpose: with the relay as the turn's whole text, no line is left for
|
|
123
|
+
"here is the pause", for reading the check verdict back in prose, or for a closing
|
|
124
|
+
courtesy. Each fact appears once, in its part.
|
|
125
|
+
|
|
126
|
+
*Write the detail file.* Before you call `plumbbob handoff`, overwrite
|
|
127
|
+
`.plumbbob/detail.md` for this step; never let a past step's detail linger. It is the
|
|
128
|
+
wire handoff parses, and it is the only path by which your judgment reaches the turn:
|
|
129
|
+
|
|
130
|
+
```markdown
|
|
131
|
+
# Detail · Step <N> · <the step title>
|
|
132
|
+
|
|
133
|
+
── recap · step <N> of <M> ──
|
|
134
|
+
done-when met
|
|
135
|
+
decisions honored: D1 (some-slug), D2 (another-slug)
|
|
136
|
+
constraints all honored
|
|
137
|
+
|
|
138
|
+
## Summary
|
|
139
|
+
|
|
140
|
+
<the outcome, not the activity: one sentence when one will do, a short
|
|
141
|
+
paragraph when the step needs explaining>
|
|
142
|
+
|
|
143
|
+
## 1 <the first highlight: one sentence, one move>
|
|
144
|
+
<the full story: what moved, why, what was tried and dropped>
|
|
145
|
+
|
|
146
|
+
## 2 ...
|
|
147
|
+
|
|
148
|
+
## Recommendation
|
|
149
|
+
|
|
150
|
+
<The move.> <The reason, one or two sentences.>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
The three rows under the header rule are yours, and only those three; `check`, `seam`,
|
|
154
|
+
`diff`, and `spent` are measured by the CLI, and a row you wrote for them would be
|
|
155
|
+
overwritten. Keep the rows contiguous (the first blank line ends them). Each opens with a
|
|
156
|
+
verdict word from the closed set in the turn anatomy (`met`, `not met`, `drift`;
|
|
157
|
+
`honored`, `none exercised`, `bent`, `drift`; `all honored`, `bent`, `drift`); a cited
|
|
158
|
+
decision or constraint carries its slug (`C1 (no-new-deps)`, never a bare `C1`); a row
|
|
159
|
+
that cannot apply vanishes. A green row collapses to its word or its count and a red one
|
|
160
|
+
names the one offender in a short clause, which is what keeps the whole row inside the
|
|
161
|
+
fence's 80 columns (13 of label, 67 of value); two or more items break onto indented
|
|
162
|
+
continuation lines opening with `-`, and a red row's evidence onto an indented `→` line.
|
|
163
|
+
|
|
164
|
+
The `## Summary` lead and the `## <n>` section titles are the turn's opening block:
|
|
165
|
+
handoff prints the lead behind the `**Summary**:` label, appends the `(details: …)`
|
|
166
|
+
bracket, and renders the titles as the numbered highlights, so you type neither the path
|
|
167
|
+
nor the list. Five highlights at most, each one sentence and one move, plain English
|
|
168
|
+
first, a path in backticks only when the name itself is the news. The numbers are
|
|
169
|
+
handles: "expand 2" opens `## 2`, so every highlight has a section behind it with the
|
|
170
|
+
full story. A judgment or a flag (a stray the seam row will name, a decision you had to
|
|
171
|
+
bend, a doubt about the done-when) is one of those highlights, never a paragraph of its
|
|
172
|
+
own. The recommendation is the last section: the move you would take as its own
|
|
173
|
+
sentence, closed by a period, then the reason as a capitalized sentence or two. The lead
|
|
174
|
+
and the recommendation are flowing prose and handoff unwraps both to the renderer's
|
|
175
|
+
width, so never hard-wrap them; handoff also prepends the bold `**Recommendation**:`
|
|
176
|
+
label, which you never type. `checkpoint` records this file beneath the step's dated
|
|
177
|
+
line in the build-log's `## Log` and then truncates it, so the detail lands in the
|
|
178
|
+
tracked ledger rather than piling up on disk.
|
|
179
|
+
|
|
180
|
+
*Paste the turn.* Run `plumbbob handoff` and paste its output whole, verbatim, at top
|
|
181
|
+
level, trailing blank line included, then end the turn. Never nest it inside a fence of
|
|
182
|
+
your own; it carries fences of its own and they cannot nest. It prints the Summary and
|
|
183
|
+
its highlights, the Readout fence (its measured `check`, `seam`, `diff`, and `spent`
|
|
184
|
+
rows folded with your three), a `diff` fence when the change is 20 lines or fewer, the
|
|
185
|
+
Verdict folded worst-of from the same rows, Next Up, Your Call, and your recommendation
|
|
186
|
+
last. The gate verdict's one home is that `check` row: no standalone verdict line
|
|
187
|
+
exists, and you never restate the verdict in prose. A narrowed run names the slots it
|
|
188
|
+
skipped there (`· without test`), and that named narrowing is the whole disclosure. The
|
|
189
|
+
notice checkride's Stop hook appends after your turn is not yours to relay or repeat;
|
|
190
|
+
the trailing blank line you kept is what lands it on its own line. Relayed CLI strings
|
|
191
|
+
keep their em-dashes; your own lines never use one, the write-versus-relay line of
|
|
192
|
+
[D78 (em-dash-ban)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d78).
|
|
193
|
+
|
|
194
|
+
*Then read the reply as an ask or a direction.* A message that **asks** ("expand 2",
|
|
195
|
+
"what does that mean?", "why did the seam row flag that?") is an expand: answer it from the detail file, from
|
|
196
|
+
`git diff`, or from the build-log's `## Log` for an older step, never from recall, then run `plumbbob handoff` again and
|
|
197
|
+
paste it. The step is still in flight, so it renders the same pause, and the Your Call
|
|
198
|
+
block stays the CLI's to render rather than yours to retype. A message that **directs**
|
|
199
|
+
is needs-work: take it as what to change, and nothing lands until the human says
|
|
200
|
+
`looks good`.
|
|
201
|
+
|
|
202
|
+
**Then hand off with the next model.** `plumbbob checkpoint` prints the whole boundary
|
|
203
|
+
ending itself: `**Checkpoint**: Step N complete (<sha>)`, the Verdict the step earned,
|
|
204
|
+
any advisory (a staged path outside the seam is the common one), and Next Up. Relay
|
|
205
|
+
that block whole, run no second command, and write nothing around it. It is the
|
|
206
|
+
orientation tier (no Your Call block, no recommendation), and it points at the next
|
|
207
|
+
undone step carrying that step's `- model:` recommendation (the plan's
|
|
208
|
+
smallest-model-that-fits call) so the human knows which `/model` to select before
|
|
209
|
+
running `/plumbbob:build` again. It is what carries the plan's suggestion across a fresh
|
|
210
|
+
context window, which inherits the session model, not the plan's. No `- model:` line
|
|
211
|
+
means any model will do. Guidance, never a gate.
|
|
132
212
|
|
|
133
213
|
## Running bound agents
|
|
134
214
|
|
|
@@ -181,10 +261,10 @@ and approves in the human's place**, and it **chains**:
|
|
|
181
261
|
bound agent returns `blocked` or `drift` (unblock-and-re-run, or `/plumbbob:refine`; an
|
|
182
262
|
agent cannot advance the loop), a new decision is needed, no planned steps
|
|
183
263
|
remain, or the top of a requested range is reached. **When `--auto` halts back to the
|
|
184
|
-
human,
|
|
185
|
-
|
|
186
|
-
`- model:` recommendation if it has one, so a fresh context window
|
|
187
|
-
to select.
|
|
264
|
+
human, end on the same turn the default pause does**: write the detail file, run
|
|
265
|
+
`plumbbob handoff`, and paste its block: the step just completed, the next undone step,
|
|
266
|
+
and that next step's `- model:` recommendation if it has one, so a fresh context window
|
|
267
|
+
knows which `/model` to select.
|
|
188
268
|
|
|
189
269
|
`--auto` and a step range are the only paths that checkpoint without a human pause, and
|
|
190
270
|
only because the human asked for it by name; a range re-imposes the pause at its top.
|
|
@@ -229,15 +309,17 @@ just the one more entry already in the halt list above.
|
|
|
229
309
|
who verifies and (bar `--auto`) the human is still the clock. See **§ Running bound
|
|
230
310
|
agents** for the mechanics.
|
|
231
311
|
- **A refused checkpoint is the pause, not an error.** Under plumbbob's turn
|
|
232
|
-
hook a same-turn `checkpoint` is refused by design:
|
|
233
|
-
block, **end the turn**; the human's approval on their next
|
|
312
|
+
hook a same-turn `checkpoint` is refused by design: write the file, run `plumbbob
|
|
313
|
+
handoff`, paste its block, **end the turn there**; the human's approval on their next
|
|
314
|
+
turn is what lets you land
|
|
234
315
|
it, and landing it is a deliberate beat, not a side effect of the next `/plumbbob:build`.
|
|
235
316
|
Never route around it with a raw `git commit`. An explicit `/plumbbob:build --auto` or a typed
|
|
236
317
|
step range in the human's own prompt are the only self-approvals; **never write `auto`
|
|
237
318
|
into a settings file yourself to unlock a checkpoint. A grant you mint is no grant (the
|
|
238
319
|
latch ignores it; [D67 (auto-not-a-grant)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d67)); ask the human to type
|
|
239
320
|
`/plumbbob:build --auto` again instead.**
|
|
240
|
-
- **Close with the next model.** When a step lands,
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
321
|
+
- **Close with the next model.** When a step lands, `plumbbob checkpoint` prints the whole
|
|
322
|
+
boundary ending; relay it with nothing written around it and no second command. It cites
|
|
323
|
+
the completed step and the next undone step, and names that next step's `- model:`
|
|
324
|
+
recommendation if it has one, which is what a fresh context window needs to pick the
|
|
325
|
+
right `/model` before the next run. Guidance, never a gate.
|
package/skills/finish/SKILL.md
CHANGED
|
@@ -21,15 +21,19 @@ record.
|
|
|
21
21
|
(`.plumbbob/builds/<slug>/report.md`), from `intent.md` + `build-log.md`.
|
|
22
22
|
The build-log's `## Log` is already the chronological history; `plumbbob checkpoint`
|
|
23
23
|
wrote a dated line for every step as it landed. **Read it as the spine; do not
|
|
24
|
-
re-narrate it.** The report adds only what the log does not already carry
|
|
25
|
-
|
|
26
|
-
-
|
|
24
|
+
re-narrate it.** The report adds only what the log does not already carry, one `##`
|
|
25
|
+
section apiece, in this order:
|
|
26
|
+
- `## What shipped`: summarize from the `## Log` timeline; don't rebuild it step by step.
|
|
27
|
+
- `## Decisions and why`: the settled calls that shaped the build (the *why* behind
|
|
27
28
|
the log). Copy each one's `D# (slug)` from `intent.md` (never a bare `D#`) so
|
|
28
29
|
the report reads without flipping back to the intent.
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
|
|
30
|
+
- `## Parked & harvested`: what was captured and how each was classified.
|
|
31
|
+
- `## Final status`: done or partial, and what is left.
|
|
32
|
+
- `## Deferred tangents`: the harvested items that become future work.
|
|
33
|
+
Stop there. `plumbbob finish` appends `## Checkpoints` (the baseline and step SHAs) and
|
|
34
|
+
`## Stats` (the per-step receipts) itself, so do **not** hand-write either; a report
|
|
35
|
+
that spells them out collides with the CLI's own tail. This is the "yeah, I did that"
|
|
36
|
+
artifact. Write it by default; the human may edit it.
|
|
33
37
|
2. **Finish.** Run `plumbbob finish`, which appends the checkpoint SHAs to the
|
|
34
38
|
report and makes the final commit (subject `chore(<scope>): finish`, its body
|
|
35
39
|
led by a `plumbbob finish` marker plus an optional proportional `--body`), then
|
|
@@ -51,7 +55,14 @@ record.
|
|
|
51
55
|
always reads stdin. Under an agent harness that stdin is a socket, and `--body` now
|
|
52
56
|
refuses rather than blocking on one; the refusal names this exact heredoc form. Omit
|
|
53
57
|
`--body` entirely and the commit carries the `plumbbob finish` marker subject only.
|
|
54
|
-
3. **Point at the next goal
|
|
58
|
+
3. **Point at the next goal.** Relay `plumbbob finish`'s output verbatim, blank lines
|
|
59
|
+
included: its lead line, which names the branch the tracked folder now rides into the
|
|
60
|
+
PR, any advisory beneath it, and `**Next Up**: Nothing planned - /plumbbob:plan`. That
|
|
61
|
+
is the orientation tier's close (the
|
|
62
|
+
[turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)):
|
|
63
|
+
the lead line, then the forward pointer. `finish` renders that pointer itself rather
|
|
64
|
+
than leaving it to `plumbbob handoff`, because finish has just cleared the session
|
|
65
|
+
handoff would read one from. Relay the block and write nothing after it.
|
|
55
66
|
|
|
56
67
|
## The hard contracts
|
|
57
68
|
|
package/skills/park/SKILL.md
CHANGED
|
@@ -27,12 +27,26 @@ is fine; capture is always available, which is the whole point of parking.
|
|
|
27
27
|
Take the idea, problem, or "ooh what if" the human just had and **compose it into one
|
|
28
28
|
tidy, tagged line**: short, legible, self-contained, and carrying a **one-clause why**
|
|
29
29
|
(what it is *and* why it's worth revisiting), so it still reads cleanly weeks later when
|
|
30
|
-
harvest triages it cold.
|
|
30
|
+
harvest triages it cold. **The tag rides the tail, in brackets**, so the line spends its
|
|
31
|
+
one colon on the `parked:` prefix and reads the same in the chat as in the ledger:
|
|
32
|
+
|
|
33
|
+
```text
|
|
34
|
+
should /password-reset get the same throttle? (tangent)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Then:
|
|
31
38
|
|
|
32
39
|
1. **Show the composed line to the human** and wait for **in-turn approval**: they
|
|
33
40
|
confirm it as-is or edit the wording.
|
|
34
41
|
2. **Only after** that approval, capture it by running `plumbbob park "<the
|
|
35
42
|
approved line>"` via Bash.
|
|
43
|
+
3. **Relay the block, then get back to the step.** `plumbbob park` prints its whole
|
|
44
|
+
ending: `**Parked**: <text> (tag)`, a blank line, and the pointer back at the step in
|
|
45
|
+
flight (`**Next Up**: Back to Step N`). Relay that output verbatim and run no second
|
|
46
|
+
command. Park is a driver turn (the [turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)):
|
|
47
|
+
the capture plus that one pointer are the whole turn, and both are the CLI's to render,
|
|
48
|
+
never yours to compose from the dashboard. The capture is a one-beat interruption; the
|
|
49
|
+
step keeps its focus.
|
|
36
50
|
|
|
37
51
|
## The one hard contract
|
|
38
52
|
|
package/skills/plan/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: plan
|
|
|
3
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."
|
|
4
4
|
argument-hint: "[spec-path | intent]"
|
|
5
5
|
disable-model-invocation: true
|
|
6
|
-
allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob start:*), Bash(plumbbob checkpoint:*), Bash(plumbbob agent list:*)
|
|
6
|
+
allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob handoff:*), Bash(plumbbob start:*), Bash(plumbbob checkpoint:*), Bash(plumbbob agent list:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# PlumbBob: plan a goal (the whole-goal move)
|
|
@@ -144,6 +144,17 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
|
|
|
144
144
|
baseline → plan → steps. Pass a proportional `--body` (the single-quoted stdin
|
|
145
145
|
heredoc) when the rationale is worth carrying; skip it for a small plan. Do this
|
|
146
146
|
only on the human's approval; the plan is their convergence.
|
|
147
|
+
- **The plan pause is a decision turn.** Present the framed plan for the human's call,
|
|
148
|
+
then give it the cold read (**§ The cold read**), write the result into
|
|
149
|
+
`.plumbbob/detail.md`, and relay `plumbbob handoff --plan`'s block whole: the CLI
|
|
150
|
+
renders the your-call block with the moves that apply before anything is recorded and
|
|
151
|
+
prints your recommendation last (the decision tier of the
|
|
152
|
+
[turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)),
|
|
153
|
+
so the moves are relayed, never hand-composed. *looks good* marks the plan decided and
|
|
154
|
+
starts `/plumbbob:build` at the first undone step; a message that asks (`expand 2`, or
|
|
155
|
+
any question) is answered from the detail file or `intent.md` and changes nothing; a
|
|
156
|
+
message that directs is what to sharpen, cheap now, before any code. The revert move
|
|
157
|
+
vanishes there on its own: nothing has landed to wind back.
|
|
147
158
|
- **The plan commit is latched too.** Once the turn ledger exists, `checkpoint
|
|
148
159
|
--plan` refuses to land in the same turn `start` stamped it: present the plan,
|
|
149
160
|
**end the turn**, and the human's approving message is the tick that lets it
|
|
@@ -152,6 +163,11 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
|
|
|
152
163
|
session runs `start` *before* the turn hook has ever ticked, so that single
|
|
153
164
|
commit predates the ledger and stays guidance-governed; it lands without a
|
|
154
165
|
refusal.)
|
|
166
|
+
- **The plan commit prints its own close.** `plumbbob checkpoint --plan` emits the
|
|
167
|
+
whole boundary ending: `**Plan**: committed (<sha>)`, any advisory, and the pointer at
|
|
168
|
+
the step the build starts on. Relay that block whole and run no second command; the
|
|
169
|
+
plan-pause card above is the one place `handoff` is still called, because no verb has
|
|
170
|
+
run yet there.
|
|
155
171
|
- **Say what the commit publishes.** The close-out line names the tracked folder:
|
|
156
172
|
`.plumbbob/builds/<slug>/` now rides this branch into the PR, so teammates will
|
|
157
173
|
see the plan and build record in review. In the same breath, offer the way out:
|
|
@@ -166,6 +182,48 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
|
|
|
166
182
|
7. **Offer to stress-test it.** Suggest `/plumbbob:refine` to attack the frame for holes (or
|
|
167
183
|
to repair the plan as it drifts). Optional, the human's call.
|
|
168
184
|
|
|
185
|
+
## The cold read
|
|
186
|
+
|
|
187
|
+
The plan pause ends on your recommendation, and the recommendation is an estimate made
|
|
188
|
+
with fresh eyes, not a re-reading of your own plan. Before you relay the card, give the
|
|
189
|
+
framed plan one bounded adversarial pass under a fixed lens, the pass `/plumbbob:refine`'s
|
|
190
|
+
attack mode makes, but without its writing: surface, never append. Edit nothing, add no
|
|
191
|
+
Open questions, and keep it to one screen of reading. The lens:
|
|
192
|
+
|
|
193
|
+
- an ambiguity a builder would have to guess through;
|
|
194
|
+
- an edge case or a hidden assumption no Decision settles;
|
|
195
|
+
- a collision with the existing code (read the files the seams name);
|
|
196
|
+
- a done-when no test or check can measure, or a seam that names a file that does not
|
|
197
|
+
exist or misses one that must change;
|
|
198
|
+
- a step too large to review in one pass, or a Decision with no *because*.
|
|
199
|
+
|
|
200
|
+
Write what you found into `.plumbbob/detail.md`, overwriting whatever a past session
|
|
201
|
+
left, the findings first and the recommendation last:
|
|
202
|
+
|
|
203
|
+
```markdown
|
|
204
|
+
# Detail · Plan · <the title>
|
|
205
|
+
|
|
206
|
+
## 1 <the first hole: one sentence, naming where it sits in intent.md>
|
|
207
|
+
<what it is, and what closing it would take>
|
|
208
|
+
|
|
209
|
+
## 2 ...
|
|
210
|
+
|
|
211
|
+
## Recommendation
|
|
212
|
+
|
|
213
|
+
<The move.> <The reason, one or two sentences.>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
The recommendation takes one of two shapes. A sound plan gets `Approve it.` and what the
|
|
217
|
+
read checked and found sound. A plan with a hole gets `Sharpen <the one worst hole> first.`
|
|
218
|
+
and why it matters; when the read found more than one, say how many sit behind `expand`
|
|
219
|
+
and name `/plumbbob:refine` as the move that writes them up as Open questions, with their
|
|
220
|
+
plain and lean sub-lines, for the human to settle. Three findings at most; the rest is
|
|
221
|
+
refine's. `plumbbob handoff --plan` prints the label and your recommendation as the turn's
|
|
222
|
+
last text, "expand 2" opens `## 2`, and `checkpoint --plan` records the read beneath the
|
|
223
|
+
plan's line in the build-log's `## Log`, the build's first entry. The cold read is the tip of refine: it makes the
|
|
224
|
+
full attack discoverable at the moment it would pay, and lets a sound plan skip it. Refine
|
|
225
|
+
is where the real adversary looks; this is an estimate, and it says so by staying short.
|
|
226
|
+
|
|
169
227
|
## The interview (mode 1)
|
|
170
228
|
|
|
171
229
|
Make it easy and non-intrusive:
|
package/skills/recover/SKILL.md
CHANGED
|
@@ -4,14 +4,14 @@ description: "Human-triggered driver for `plumbbob recover`; reconcile the contr
|
|
|
4
4
|
argument-hint: "[--fix]"
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
model: haiku
|
|
7
|
-
allowed-tools: Bash(plumbbob status:*), Bash(plumbbob recover:*)
|
|
7
|
+
allowed-tools: Bash(plumbbob status:*), Bash(plumbbob recover:*), Bash(plumbbob handoff:*)
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# PlumbBob: reconcile the control plane (driver)
|
|
11
11
|
|
|
12
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
13
|
|
|
14
|
-
This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob recover` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**;
|
|
14
|
+
This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob recover` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; it shells the verb, relays its output verbatim (including any refusal), and closes on `plumbbob handoff`'s next-up pointer for the turn. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
|
|
15
15
|
|
|
16
16
|
Reach for it when the dashboard and reality disagree: `status` shows a build you thought you finished, or an empty plan for a build you know you wrote, or a step in flight you have no memory of starting. Those are the shapes a crashed session, a lost context window, or a mid-step build switch leaves behind. `/plumbbob:doctor` answers "is plumbbob installed correctly"; this answers "is this session's own state telling the truth".
|
|
17
17
|
|
|
@@ -20,6 +20,7 @@ Reach for it when the dashboard and reality disagree: `status` shows a build you
|
|
|
20
20
|
1. Run `plumbbob recover` via Bash. It reads the control plane (the active-build cursor, the step and spike markers, the latch's stamp, the agent handoff ledger, and any leftover spike worktrees) and prints one line per check.
|
|
21
21
|
2. Report that output verbatim, `✓` and `✗` lines alike. Every problem carries a `→` line naming the fix; relay those as written rather than paraphrasing them into your own advice.
|
|
22
22
|
3. **Only if the human asks for the repair**, run `plumbbob recover --fix`. It clears stale untracked control files and re-points a cursor when exactly one build survives. It never touches intent.md, the build log, the checkpoints ledger, a report, or git history, and it never lands or advances a step.
|
|
23
|
+
4. Close on `plumbbob handoff --driver`'s next-up line (the driver tier of the [turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)): a readout that just told the human their state was off ends on one pointer to reorient them, back at the open step when one survives and forward from the boundary otherwise.
|
|
23
24
|
|
|
24
25
|
## What it will not do for you
|
|
25
26
|
|
package/skills/revert/SKILL.md
CHANGED
|
@@ -11,10 +11,11 @@ allowed-tools: Bash(plumbbob status:*), Bash(plumbbob revert:*)
|
|
|
11
11
|
|
|
12
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
13
|
|
|
14
|
-
This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob revert` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; its
|
|
14
|
+
This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob revert` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; it shells the verb and relays its output verbatim, refusal included. A successful transition prints its whole ending, pointer and all, so one command is the whole turn. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
|
|
15
15
|
|
|
16
16
|
## What it does
|
|
17
17
|
|
|
18
18
|
1. Read an optional target step from the way you were invoked (for example `/plumbbob:revert --to 2` → step `2`). With no target, revert goes to the last done-checkpoint.
|
|
19
19
|
2. Run `plumbbob revert` (or `plumbbob revert --to <n>`) via Bash. This is a `git reset --hard`; it discards the current in-progress step *and its work*. If the human wants to drop the step but keep the working-tree diff, that is `/plumbbob:abandon`, not revert. Run it exactly as the human asked; do not add or drop the `--to` on your own.
|
|
20
20
|
3. Report the verb's output verbatim: which checkpoint it reset to, or any refusal.
|
|
21
|
+
4. A successful revert prints its own ending (the driver tier of the [turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)): the lead line, a blank line, and the pointer forward from the boundary, since the in-flight step is wound back. Relay that block whole and run no second command. A refusal is not a transition; it carries no pointer, so relay it and stop.
|
package/skills/spike/SKILL.md
CHANGED
|
@@ -11,13 +11,14 @@ allowed-tools: Bash(plumbbob status:*), Bash(plumbbob spike:*)
|
|
|
11
11
|
|
|
12
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
13
|
|
|
14
|
-
This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob spike` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; its
|
|
14
|
+
This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob spike` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; it shells the verb and relays its output verbatim, refusal included. A successful transition prints its whole ending, pointer and all, so one command is the whole turn. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
|
|
15
15
|
|
|
16
16
|
## What it does
|
|
17
17
|
|
|
18
18
|
1. Read the spike target from the way you were invoked: a slug to open one (for example `/plumbbob:spike redis-cache`), `report <slug>` to scaffold a report without worktrees (`/plumbbob:spike report auth-store`), or the literal `done` to tear the current spike down (`/plumbbob:spike done`). If none is present, ask which and run nothing.
|
|
19
19
|
2. Run `plumbbob spike "<slug>"`, `plumbbob spike report "<slug>"`, or `plumbbob spike done` via Bash.
|
|
20
|
-
3. Report the verb's output verbatim: the worktree it created or removed, the spike report it scaffolded, or any refusal. When the verb names a `spike-NN-<slug>.md` report, point the human at it; when `spike done` nudges that a verdict is unrecorded,
|
|
20
|
+
3. Report the verb's output verbatim: the worktree it created or removed, the spike report it scaffolded, or any refusal. When the verb names a `spike-NN-<slug>.md` report, point the human at it; when `spike done` nudges that a verdict is unrecorded, that nudge is already inside the block, so relay it there rather than restating it.
|
|
21
|
+
4. A successful transition prints its own ending (the driver tier of the [turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)): the lead line, any nudge, and the pointer, which names closing the spike while one is live and points forward from the boundary once `spike done` closes it. Relay that block whole and run no second command. A refusal is not a transition; it carries no pointer, so relay it and stop.
|
|
21
22
|
|
|
22
23
|
## The spike report ([D70 (spike-reports)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d70))
|
|
23
24
|
|
package/skills/status/SKILL.md
CHANGED
|
@@ -16,11 +16,19 @@ inferred next move. Report it verbatim and point the human at that next move. Th
|
|
|
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
|
|
|
19
|
+
Status is an orientation turn (the
|
|
20
|
+
[turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)):
|
|
21
|
+
the dashboard is the whole output, relayed verbatim. Everything the human needs is
|
|
22
|
+
already in those bytes: the step in flight, the next step's done-when, seam, and `model:`
|
|
23
|
+
recommendation, the counts, and the one next move. You relay it; you do not re-compose or
|
|
24
|
+
annotate it.
|
|
25
|
+
|
|
19
26
|
## What it does
|
|
20
27
|
|
|
21
|
-
1. Surface the injected `status` output: the dashboard and its suggested next move.
|
|
22
|
-
2.
|
|
23
|
-
plan
|
|
24
|
-
can switch (for example `/model sonnet`) before firing `/plumbbob:build`, or ignore it.
|
|
25
|
-
never a gate.
|
|
28
|
+
1. Surface the injected `status` output verbatim: the dashboard and its suggested next move.
|
|
29
|
+
2. The dashboard already prints the next step's `model:` recommendation in its detail
|
|
30
|
+
rows when the plan set one: the smallest model that can carry that step, so the human
|
|
31
|
+
can switch (for example `/model sonnet`) before firing `/plumbbob:build`, or ignore it.
|
|
32
|
+
Guidance, never a gate. You relay that line; you do not re-state it on top of the
|
|
33
|
+
verbatim dashboard.
|
|
26
34
|
3. If it reads `NO ACTIVE SESSION`, tell the human to `/plumbbob:plan` to frame a goal.
|