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/verify/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: verify
|
|
3
3
|
description: "The verify tick: run the check, self-review the diff against intent, validate the step's done-when, pause for your approval, then checkpoint. Executor-agnostic: it reads the diff, not who wrote it."
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
-
allowed-tools: Read, Bash(plumbbob status:*), Bash(plumbbob handoff:*), Bash(plumbbob check:*), Bash(plumbbob checkpoint:*), Bash(plumbbob agent:*), Bash(git diff:*), Bash(git status:*)
|
|
5
|
+
allowed-tools: Read, Write, Bash(plumbbob status:*), Bash(plumbbob handoff:*), Bash(plumbbob check:*), Bash(plumbbob checkpoint:*), Bash(plumbbob agent:*), Bash(git diff:*), Bash(git status:*)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# PlumbBob: verify a step (the tick)
|
|
@@ -40,20 +40,109 @@ this skill verifies it the same way: **it reads the diff, not the author**
|
|
|
40
40
|
- the **Decisions**: does anything contradict a settled call?
|
|
41
41
|
- the **Constraints**: are any violated?
|
|
42
42
|
- any **`after`-agent findings** from step 2: advisory, weigh them, don't defer to them.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
A mismatch surfaces in exactly two places: as the failing word in its recap row, and
|
|
44
|
+
as one highlight with its full story in a detail section, never as a freeform
|
|
45
|
+
paragraph. When you cite a Decision or Constraint, carry its slug from `intent.md`
|
|
46
|
+
(`C1 (no-new-deps)`, never a bare `C1`) so each finding reads on its own. You are
|
|
47
|
+
reviewing, not building; do not fix anything.
|
|
48
|
+
4. **Validate.** Decide, yes or no, whether the step's done-when is met. That verdict and
|
|
49
|
+
its evidence become the recap's `done-when` row, stated there and nowhere else.
|
|
50
|
+
5. **PAUSE.** Write the file, run handoff, paste, then **stop and wait for the human's
|
|
51
|
+
explicit approval**. This is the convergence beat; the human is the clock. Never
|
|
52
|
+
checkpoint without it. A verify pause is a decision turn, and the
|
|
53
|
+
[turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)
|
|
54
|
+
fixes it as one block. You author none of it in the chat. Your judgment goes into
|
|
55
|
+
`.plumbbob/detail.md`; `plumbbob handoff` renders the whole turn from that file and its
|
|
56
|
+
own measurements; you paste its output and write nothing before or after it. The rule
|
|
57
|
+
is positional on purpose: with the relay as the turn's whole text, no line is left for
|
|
58
|
+
"here is the pause", for reading the check verdict back in prose, or for a closing
|
|
59
|
+
courtesy. Each fact appears once, in its part.
|
|
60
|
+
|
|
61
|
+
*Write the detail file.* Before you call `plumbbob handoff`, overwrite
|
|
62
|
+
`.plumbbob/detail.md`. It is the wire handoff parses, and it is the only path by which
|
|
63
|
+
the judgment you formed in steps 2 through 4 reaches the turn:
|
|
64
|
+
|
|
65
|
+
```markdown
|
|
66
|
+
# Detail · Step <N> · <the step title>
|
|
67
|
+
|
|
68
|
+
── recap · step <N> of <M> ──
|
|
69
|
+
done-when met
|
|
70
|
+
decisions honored: D1 (some-slug), D2 (another-slug)
|
|
71
|
+
constraints all honored
|
|
72
|
+
|
|
73
|
+
## Summary
|
|
74
|
+
|
|
75
|
+
<what the diff does, not the activity: one sentence when one will do, a
|
|
76
|
+
short paragraph when the step needs explaining>
|
|
77
|
+
|
|
78
|
+
## 1 <the first highlight: one sentence, one move>
|
|
79
|
+
<the full story: what moved, why, what was tried and dropped>
|
|
80
|
+
|
|
81
|
+
## 2 ...
|
|
82
|
+
|
|
83
|
+
## Recommendation
|
|
84
|
+
|
|
85
|
+
<The move.> <The reason, one or two sentences.>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The three rows under the header rule are yours, and only those three; `check`, `seam`,
|
|
89
|
+
`diff`, and `spent` are measured by the CLI, and a row you wrote for them would be
|
|
90
|
+
overwritten. Keep the rows contiguous (the first blank line ends them). Each opens with
|
|
91
|
+
a verdict word from the closed set in the turn anatomy (`met`, `not met`, `drift`;
|
|
92
|
+
`honored`, `none exercised`, `bent`, `drift`; `all honored`, `bent`, `drift`); a cited
|
|
93
|
+
decision or constraint carries its slug (`C1 (no-new-deps)`, never a bare `C1`); a row
|
|
94
|
+
that cannot apply vanishes. A green row collapses to its word or its count and a red one
|
|
95
|
+
names the one offender in a short clause, which is what keeps the whole row inside the
|
|
96
|
+
fence's 80 columns (13 of label, 67 of value); two or more items break onto indented
|
|
97
|
+
continuation lines opening with `-`, and a red row's evidence onto an indented `→` line.
|
|
98
|
+
|
|
99
|
+
The `## Summary` lead and the `## <n>` section titles are the turn's opening block:
|
|
100
|
+
handoff prints the lead behind the `**Summary**:` label, appends the `(details: …)`
|
|
101
|
+
bracket, and renders the titles as the numbered highlights, so you type neither the path
|
|
102
|
+
nor the list. Five highlights at most, each one move in plain English, drawn from the
|
|
103
|
+
self-review. The numbers are handles: "expand 2" opens `## 2`, so every highlight has a
|
|
104
|
+
section behind it. A judgment or a flag (a stray the seam row will name, a decision the
|
|
105
|
+
diff bent, a doubt about the done-when) is one of those highlights, never a paragraph of
|
|
106
|
+
its own. The recommendation is the last section: the move you would take as its own
|
|
107
|
+
sentence, closed by a period, then the reason as a capitalized sentence or two. The lead
|
|
108
|
+
and the recommendation are flowing prose and handoff unwraps both to the renderer's
|
|
109
|
+
width, so never hard-wrap them; handoff also prepends the bold `**Recommendation**:`
|
|
110
|
+
label, which you never type. This is the **one** file `/plumbbob:verify` writes, and it
|
|
111
|
+
is turn presentation, never the diff under review; the author-blind contract below still
|
|
112
|
+
holds. `checkpoint` records this file beneath the step's dated line in the build-log's
|
|
113
|
+
`## Log` and then truncates it (the detail plane in the
|
|
114
|
+
[turn anatomy](https://github.com/robmclarty/plumbbob/blob/main/docs/presentation.md)).
|
|
115
|
+
|
|
116
|
+
*Paste the turn.* Run `plumbbob handoff` and paste its output whole, verbatim, at top
|
|
117
|
+
level, trailing blank line included, then end the turn. Never nest it inside a fence of
|
|
118
|
+
your own; it carries fences of its own and they cannot nest. It prints the Summary and
|
|
119
|
+
its highlights, the Readout fence (its measured `check`, `seam`, `diff`, and `spent`
|
|
120
|
+
rows folded with your three), a `diff` fence when the change is 20 lines or fewer, the
|
|
121
|
+
Verdict folded worst-of from the same rows, Next Up, Your Call, and your recommendation
|
|
122
|
+
last. At the pause the check row reads green, since a red one stopped you back at step
|
|
123
|
+
1. The gate verdict's one home is that row: no standalone verdict line exists, and you
|
|
124
|
+
never restate the verdict in prose. A narrowed run names the slots it skipped there
|
|
125
|
+
(`· without test`), and that named narrowing is the whole disclosure. The notice
|
|
126
|
+
checkride's Stop hook appends after your turn is not yours to relay or repeat; the
|
|
127
|
+
trailing blank line you kept is what lands it on its own line. Relayed CLI strings keep
|
|
128
|
+
their em-dashes; your own lines never use one, the write-versus-relay line of
|
|
129
|
+
[D78 (em-dash-ban)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d78).
|
|
130
|
+
|
|
131
|
+
*Then read the reply as an ask or a direction.* A message that **asks** ("expand 2",
|
|
132
|
+
"what does that mean?", "why did the seam row flag that?") is an expand: answer it from the detail file, from
|
|
133
|
+
`git diff`, or from the build-log's `## Log` for an older step, never from recall, then run `plumbbob handoff` again and
|
|
134
|
+
paste it. The step is still in flight, so it renders the same pause, and the Your Call
|
|
135
|
+
block stays the CLI's to render rather than yours to retype. A message that **directs**
|
|
136
|
+
is needs-work: take it as what to change, and nothing lands until the human says
|
|
137
|
+
`looks good`.
|
|
138
|
+
|
|
51
139
|
- **Reconcile a drifted subject here, in the open.** The planned title *is* the
|
|
52
140
|
checkpoint subject ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)). If the diff drifted from it (the
|
|
53
141
|
step landed something the title no longer describes), the body pass may propose a
|
|
54
|
-
corrected subject, but it **presents** it at this pause for explicit approval:
|
|
55
|
-
`planned title → proposed subject`,
|
|
56
|
-
|
|
142
|
+
corrected subject, but it **presents** it at this pause for explicit approval: one
|
|
143
|
+
highlight reading `planned title → proposed subject`, part of what the human OKs.
|
|
144
|
+
That highlight is a `## <n>` section title in the detail file like any other.
|
|
145
|
+
This is the exception, not the default: with **nothing presented**, the deterministic
|
|
57
146
|
title-derived subject lands untouched. A silent `-m` swap is exactly the
|
|
58
147
|
agent-authored subject [D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68) refuses, so a reconcile is
|
|
59
148
|
*only ever* the visible, approved kind.
|
|
@@ -67,7 +156,7 @@ this skill verifies it the same way: **it reads the diff, not the author**
|
|
|
67
156
|
|
|
68
157
|
```bash
|
|
69
158
|
plumbbob checkpoint <n> --body <<'BODY'
|
|
70
|
-
<your proportional body
|
|
159
|
+
<your proportional body: what changed and why, no ceremony>
|
|
71
160
|
BODY
|
|
72
161
|
```
|
|
73
162
|
|
|
@@ -84,22 +173,26 @@ this skill verifies it the same way: **it reads the diff, not the author**
|
|
|
84
173
|
overriding the title-derived default for this one commit; unpresented, the CLI's
|
|
85
174
|
deterministic subject stands.
|
|
86
175
|
7. **Hand off with the next model** *(once the checkpoint lands)*. `plumbbob checkpoint`
|
|
87
|
-
returns to DESIGN
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
176
|
+
returns to DESIGN and prints the whole boundary ending itself: `**Checkpoint**: Step N
|
|
177
|
+
complete (<sha>)`, the Verdict the step earned, any advisory (a staged path outside the
|
|
178
|
+
seam is the common one), and Next Up. Relay that block whole, run no second command,
|
|
179
|
+
and write nothing around it. It is the orientation tier (no Your Call block, no
|
|
180
|
+
recommendation), and it points at the **next undone step**, carrying that step's
|
|
181
|
+
`- model:` recommendation (the plan's smallest-model-that-fits call) so the human knows
|
|
182
|
+
which `/model` to select before running `/plumbbob:build` again. This matters most across a
|
|
183
|
+
context boundary: a fresh window inherits the *session's* model, not the plan's
|
|
184
|
+
suggestion, so this line is what carries the recommendation over. The CLI owns the
|
|
185
|
+
block, so it can't drift from what `plumbbob status` reports; no `- model:` line means
|
|
186
|
+
any model will do. Guidance, never a gate.
|
|
95
187
|
|
|
96
188
|
## The latch makes the pause real
|
|
97
189
|
|
|
98
190
|
When this session runs under plumbbob's turn hook, `plumbbob checkpoint` **refuses to
|
|
99
191
|
land a step in the same turn it was entered**, and that refusal **is** this pause, not
|
|
100
192
|
an error to route around. If the checkpoint prints `checkpoint refused — no human turn
|
|
101
|
-
since this step began`, you have reached the pause the hard way:
|
|
102
|
-
|
|
193
|
+
since this step began`, you have reached the pause the hard way: write the file, run
|
|
194
|
+
`plumbbob handoff`, paste its block as step 5 says, **end the turn there**, and the
|
|
195
|
+
human's next message is the tick that lets
|
|
103
196
|
the checkpoint land when you run it again. **Never reach for a raw `git commit` to force the
|
|
104
197
|
land**; that forges the very record the latch exists to keep honest, and the
|
|
105
198
|
commit-ask hook asks the human about it anyway. The refusal is a healthy latch doing its
|
|
@@ -118,15 +211,18 @@ instead.**
|
|
|
118
211
|
- **Red means stop, not pause.** A failing check is not an approval decision; report
|
|
119
212
|
it and end your turn.
|
|
120
213
|
- **You review; you do not build.** If the self-review finds a problem, surface it
|
|
121
|
-
and stop; fixing is a new build beat, not part of verify.
|
|
214
|
+
and stop; fixing is a new build beat, not part of verify. The one file the tick writes
|
|
215
|
+
is `.plumbbob/detail.md`, the turn's presentation; it never edits the diff under review.
|
|
122
216
|
- **`after`-agents advise; they never gate**. Their output feeds the
|
|
123
217
|
self-review; checkride gates, the human approves. `blocked` → unblock and re-run;
|
|
124
218
|
`drift` → `/plumbbob:refine` before checkpointing. No code path makes them blocking.
|
|
125
219
|
- **A refused checkpoint is the pause, never a workaround.** Under the turn
|
|
126
|
-
hook a same-turn checkpoint is refused *by design*:
|
|
127
|
-
turn**, and let the human's next message
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
220
|
+
hook a same-turn checkpoint is refused *by design*: write the file, run `plumbbob
|
|
221
|
+
handoff`, paste its block, **end the turn there**, and let the human's next message
|
|
222
|
+
re-tick it. Never route around it with a
|
|
223
|
+
raw `git commit`; the latch guards the record, not the work.
|
|
224
|
+
- **Close with the next model.** When the checkpoint lands it prints the whole boundary
|
|
225
|
+
ending; relay it with nothing written around it and no second command. It cites the
|
|
226
|
+
completed step and the next undone step, and surfaces that next step's `- model:`
|
|
227
|
+
recommendation when it has one, which is what a fresh context window needs to pick the
|
|
228
|
+
right `/model`. Guidance, never a gate.
|
package/templates/build-log.md
CHANGED
|
@@ -51,9 +51,10 @@ Harvest results this boundary:
|
|
|
51
51
|
|
|
52
52
|
## Log
|
|
53
53
|
|
|
54
|
-
*(The build's history, oldest first. `plumbbob checkpoint` appends
|
|
55
|
-
every time a step lands (via `/plumbbob:build` or `/plumbbob:verify`)
|
|
56
|
-
|
|
54
|
+
*(The build's history, oldest first. `plumbbob checkpoint` appends an entry here
|
|
55
|
+
every time a step lands (via `/plumbbob:build` or `/plumbbob:verify`): the dated line,
|
|
56
|
+
and beneath it the pause as you approved it, so this fills in as you go, not at the
|
|
57
|
+
end, and an older step's detail is a scroll away. Add your own decision/event lines too: this is what
|
|
57
58
|
you point at to say "I did that: the LLM helped, but those were my calls."
|
|
58
59
|
`/plumbbob:finish` reads this for the report; `plumbbob finish` commits it with the build
|
|
59
60
|
folder, so it rides the branch into the PR.)*
|