plumbbob 0.4.11 → 0.4.13
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 +81 -237
- package/dist/lib/orient.js +1 -1
- package/dist/verbs/start.js +1 -1
- package/package.json +1 -1
- package/skills/pb-build/SKILL.md +14 -13
- package/skills/pb-doctor/SKILL.md +1 -1
- package/skills/pb-harvest/SKILL.md +4 -4
- package/skills/pb-park/SKILL.md +3 -2
- package/skills/pb-plan/SKILL.md +10 -9
- package/skills/pb-refine/SKILL.md +8 -7
- package/skills/pb-revert/SKILL.md +3 -2
- package/skills/pb-spike/SKILL.md +3 -2
- package/skills/pb-status/SKILL.md +2 -2
- package/skills/pb-step/SKILL.md +9 -8
- package/skills/pb-verify/SKILL.md +3 -3
- package/skills/pb-wrap/SKILL.md +3 -3
- package/templates/build-log.md +8 -8
- package/templates/intent.md +7 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plumbbob",
|
|
3
3
|
"displayName": "PlumbBob",
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.13",
|
|
5
5
|
"description": "Attention-first build process — driver skills + a CLI that keep you the decider; guidance, not enforcement.",
|
|
6
6
|
"author": { "name": "Rob McLarty", "email": "hello@robmclarty.com", "url": "https://robmclarty.com" },
|
|
7
7
|
"homepage": "https://github.com/robmclarty/plumbbob#readme",
|
package/README.md
CHANGED
|
@@ -4,272 +4,116 @@
|
|
|
4
4
|
<img src="hero.jpg" alt="A row of plumb bobs of varying shapes hanging from strings" width="600">
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
|
-
A guidance-first build process for working
|
|
8
|
-
behind one. It's the layer below Ridgeline:
|
|
9
|
-
without you,
|
|
10
|
-
that doesn't justify a full autonomous build — a feature,
|
|
11
|
-
staying deliberate rather than vibing. You decide on a surface
|
|
12
|
-
|
|
13
|
-
advance** — the human is the clock, not a lock.
|
|
7
|
+
A [guidance-first build process](docs/attention-first-development.md) for working
|
|
8
|
+
*with* an LLM instead of being dragged behind one. It's the layer below [Ridgeline](https://github.com/robmclarty/ridgeline):
|
|
9
|
+
where Ridgeline runs autonomously without you, PlumbBob keeps you in the driver's seat
|
|
10
|
+
for the small-to-medium work that doesn't justify a full autonomous build — a feature,
|
|
11
|
+
a bug, a refactor — while staying deliberate rather than vibing. You decide on a surface
|
|
12
|
+
outside the chat; PlumbBob orients you, runs each step's labor, and then **stops and
|
|
13
|
+
waits for you to advance** — the human is the clock, not a lock.
|
|
14
|
+
|
|
15
|
+
> Establish *plumb* before you build. The LLM is a hand, not a head.
|
|
16
|
+
|
|
17
|
+
The name is the method. A plumb bob is a weight on a string — gravity pulls it into
|
|
18
|
+
a perfectly straight vertical line, the builder's oldest reference for *true*: the
|
|
19
|
+
fixed mark you hold the work against so it never drifts out of square. PlumbBob hangs
|
|
20
|
+
your **intent** as that line and keeps every step aligned to it, so the build stays
|
|
21
|
+
plumb with what you decided instead of wandering off behind the model.
|
|
22
|
+
|
|
23
|
+
Its one law is **vibe to execute, never vibe to decide**: the human owns every
|
|
24
|
+
decision, the LLM owns the labor, and the boundary between them is a **pause you
|
|
25
|
+
advance**, not a wall that refuses you. The *why* behind that — attention as the
|
|
26
|
+
scarce resource — is the subject of the guidance-first article above; the *how* of
|
|
27
|
+
each method is in [`docs/techniques.md`](docs/techniques.md). This repository was
|
|
28
|
+
built using PlumbBob, dogfooded on its own build under its own loop.
|
|
14
29
|
|
|
15
|
-
|
|
16
|
-
> The LLM is a hand, not a head.
|
|
17
|
-
|
|
18
|
-
This repository was built using Plumbbob v2, dogfooded on its own build under its
|
|
19
|
-
own loop.
|
|
20
|
-
|
|
21
|
-
## The one law
|
|
22
|
-
|
|
23
|
-
**Vibe to execute, never vibe to decide.**
|
|
24
|
-
|
|
25
|
-
Vibing is fine — *once every decision being carried out was already made on a
|
|
26
|
-
surface outside the chat.* It becomes a slot machine only when the deciding happens
|
|
27
|
-
inside the stream while code is flowing. The whole job of Plumbbob is to keep
|
|
28
|
-
decisions and execution from fusing:
|
|
29
|
-
|
|
30
|
-
- The **human** owns convergence. You decide, choose, pick the branch.
|
|
31
|
-
- The **LLM** owns divergence in design (finding holes, generating options) and
|
|
32
|
-
convergence *only* in build (executing a decided step).
|
|
33
|
-
- The **boundary** between deciding and executing is held by a **pause you
|
|
34
|
-
advance**, not a wall that refuses you.
|
|
35
|
-
|
|
36
|
-
If you feel tired and lost, those two activities have fused again. The fix is never
|
|
37
|
-
"prompt better." It's "stop, leave the chat, go decide, come back."
|
|
38
|
-
|
|
39
|
-
## Why it works: get the plan out of your head
|
|
40
|
-
|
|
41
|
-
The exhaustion is a working-memory problem. You can't *produce* intent and
|
|
42
|
-
*consume* the model's output at once — consuming overwrites producing. So Plumbbob
|
|
43
|
-
externalizes your plan onto durable surfaces that survive the flood:
|
|
44
|
-
|
|
45
|
-
- `intent.md` — what you decided, before any code. Your canonical intent.
|
|
46
|
-
- `build-log.md` — the live ledger of steps, parked ideas, and decisions.
|
|
47
|
-
|
|
48
|
-
When the model floods you, you read the page, not your memory. The chat is
|
|
49
|
-
ephemeral; the docs persist. **The chat is a hand; the docs are the head.**
|
|
50
|
-
|
|
51
|
-
## The shift: a clock, not a lock
|
|
52
|
-
|
|
53
|
-
Plumbbob v1 enforced the deciding/executing boundary with a hard file lock — a
|
|
54
|
-
pre-edit muzzle that *refused* code edits unless you were in the right state. It
|
|
55
|
-
provided no real security (a determined model routed around it), so its only product
|
|
56
|
-
was forced ritual.
|
|
57
|
-
|
|
58
|
-
v2 replaces the lock with a **clock**. Nothing blocks your edits. Instead, the
|
|
59
|
-
system does a step's work, then pauses at a verify gate for your approval before it
|
|
60
|
-
checkpoints. You stay the decider not because a wall refuses you, but because the
|
|
61
|
-
loop pulls up to a line — the verify pause — and idles there until you approve.
|
|
62
|
-
Pull, not block. The pause *is* the product; it is the moment your judgment enters,
|
|
63
|
-
and it cannot be skipped.
|
|
64
|
-
|
|
65
|
-
## The eight skills
|
|
66
|
-
|
|
67
|
-
You drive the whole loop from your IDE with eight `/plumbbob:*` skills — no step numbers to
|
|
68
|
-
remember, no raw CLI to type. Each is `disable-model-invocation`, so *you* fire
|
|
69
|
-
every move, and `/plumbbob:pb-status` always names your next one.
|
|
70
|
-
|
|
71
|
-
| Skill | Does |
|
|
72
|
-
|-------|------|
|
|
73
|
-
| `/plumbbob:pb-plan` | plan the whole goal — scaffold the session + author intent's Frame, Decisions, Constraints, **and all Steps** |
|
|
74
|
-
| `/plumbbob:pb-step` | revise/sharpen the next step (empty input auto-syncs it to reality) |
|
|
75
|
-
| `/plumbbob:pb-build` | *(optional)* implement the next planned step, then verify it to the pause — `--auto` self-approves and chains to done |
|
|
76
|
-
| `/plumbbob:pb-verify` | the tick — check → self-review → validate → **PAUSE** → checkpoint |
|
|
77
|
-
| `/plumbbob:pb-park` | capture an idea without chasing it |
|
|
78
|
-
| `/plumbbob:pb-status` | orient — where you are, the next step's done-when + seam, and the next move |
|
|
79
|
-
| `/plumbbob:pb-harvest` | triage parked ideas at a boundary (blocker / tangent / pivot) |
|
|
80
|
-
| `/plumbbob:pb-wrap` | wrap up — write the report, archive safely, clear for a fresh goal |
|
|
81
|
-
|
|
82
|
-
Three optional power moves survive for when you need them: `/plumbbob:pb-revert` (recover to
|
|
83
|
-
a checkpoint), `/plumbbob:pb-spike` (throwaway worktree experiment), and `/plumbbob:pb-refine` (attack
|
|
84
|
-
the frame for holes, or repair the plan when it drifts — usable at any point).
|
|
85
|
-
|
|
86
|
-
## The loop
|
|
87
|
-
|
|
88
|
-
The happy path is **plan the whole thing up front, then drive `/plumbbob:pb-build` until
|
|
89
|
-
done** — approving each step at its verify pause:
|
|
90
|
-
|
|
91
|
-
```text
|
|
92
|
-
/plumbbob:pb-plan author the whole plan (incl. all steps) (once)
|
|
93
|
-
└ per step:
|
|
94
|
-
/plumbbob:pb-status review the next step (done-when + seam)
|
|
95
|
-
/plumbbob:pb-step (optional) sharpen/revise it first if needed
|
|
96
|
-
/plumbbob:pb-build (or DIY) implement it → verify → PAUSE → checkpoint
|
|
97
|
-
/plumbbob:pb-park capture strays mid-build
|
|
98
|
-
/plumbbob:pb-harvest triage them at a boundary
|
|
99
|
-
/plumbbob:pb-wrap report + archive + clear (once)
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Each `/plumbbob:pb-build` builds the next undone step and stops at the pause for your
|
|
103
|
-
approval — re-firing it is itself the clock tick. (`/plumbbob:pb-build --auto` is the opt-in
|
|
104
|
-
that lets the agent self-approve and chain to done, halting on a red check or any
|
|
105
|
-
mismatch.) For a worked example that walks one goal end to end — planning, building
|
|
106
|
-
each step, wrapping up, archiving, and starting the next task — see
|
|
107
|
-
[`docs/happy-path.md`](docs/happy-path.md).
|
|
108
|
-
|
|
109
|
-
**Three ways to plan.** `/plumbbob:pb-plan` produces the same artifact — a complete, standalone
|
|
110
|
-
`intent.md` — from whichever seed you give it: **no argument** runs a short interview;
|
|
111
|
-
**a file path** absorbs an out-of-band spec (retaining its detail so the plan stands on
|
|
112
|
-
its own); **any other text** expands your inline intent. No quotes required — it
|
|
113
|
-
disambiguates the mode itself.
|
|
114
|
-
|
|
115
|
-
**The pluggable executor.** `/plumbbob:pb-build` is one way to turn a planned step into code
|
|
116
|
-
— it is *optional*. Implement by hand, in a vibe session, or with another harness,
|
|
117
|
-
and run `/plumbbob:pb-verify` instead: it reads the *diff, not the author*. Plumbbob is the
|
|
118
|
-
harness-agnostic spine; how the diff appears is a slot you fill however you like.
|
|
119
|
-
|
|
120
|
-
## Calibration: size everything to the work
|
|
121
|
-
|
|
122
|
-
The fastest way to abandon this is ceremony on a one-liner. The discipline is
|
|
123
|
-
*decisions before code*, not *always produce three files*.
|
|
124
|
-
|
|
125
|
-
- **Tiny** (typo, one-liner): no session. Just fix it.
|
|
126
|
-
- **Small** (a contained bug/change): `/plumbbob:pb-plan` a frame + 2–3 decisions; one or two
|
|
127
|
-
steps; build → verify → checkpoint.
|
|
128
|
-
- **Medium** (a feature touching a few modules): the full loop above.
|
|
129
|
-
- **Large / architectural**: that's Ridgeline's job, not Plumbbob's.
|
|
130
|
-
|
|
131
|
-
Calibration is the skill. When in doubt, smaller.
|
|
132
|
-
|
|
133
|
-
## What ships
|
|
134
|
-
|
|
135
|
-
- A `plumbbob` CLI (TypeScript, run natively by Node ≥ 22.18, zero runtime
|
|
136
|
-
dependencies) — the dumb mechanical verbs the skills shell out to. You never type
|
|
137
|
-
it by hand (beyond `plumbbob --help` and `plumbbob --version`). The marketplace
|
|
138
|
-
plugin carries it on PATH via `bin/` shims; `npm i -g` installs it globally.
|
|
139
|
-
- The eight `/plumbbob:*` skills plus the optional power moves, each
|
|
140
|
-
`disable-model-invocation` so *you* fire every move.
|
|
141
|
-
- One session-gated Claude Code hook — `post-edit.sh`, a non-blocking light-feedback
|
|
142
|
-
pass that injects file-scoped lint into the model's context so it self-corrects in
|
|
143
|
-
flow. (v1's pre-edit muzzle, seam-guard, and bash-guard are gone — guidance, not
|
|
144
|
-
enforcement.)
|
|
145
|
-
- A `.plumbbob/` sidecar of flat files: `STATE` (the session sentinel — its presence
|
|
146
|
-
means a session is live), `intent.md`, `build-log.md`, `checkpoints`, and `archive/`.
|
|
147
|
-
|
|
148
|
-
## Gates — two tiers, different jobs
|
|
149
|
-
|
|
150
|
-
- **Light** — the non-blocking `post-edit` feedback above. Per changed file. Never
|
|
151
|
-
blocks an edit. It exists only because Claude can't see your editor's LSP, so the
|
|
152
|
-
light tier *serves the model*.
|
|
153
|
-
- **Heavy** — the full `pnpm check` (tsc, oxlint, ast-grep, vitest, knip,
|
|
154
|
-
markdownlint). Not a hook: it runs *inside* `/plumbbob:pb-verify`, which refuses to
|
|
155
|
-
checkpoint while red. The hard gate lives on the deliberate boundary, not the
|
|
156
|
-
keystroke.
|
|
157
|
-
|
|
158
|
-
## Position is derived, not stored
|
|
159
|
-
|
|
160
|
-
There is no stored state machine. The dashboard's phase — `DESIGN`, `BUILD`, or `SPIKE` —
|
|
161
|
-
is *derived* from what's on disk: a `STEP` file means a step is in flight (BUILD), the
|
|
162
|
-
`SPIKE` marker means a fork is open (SPIKE), otherwise you're at a boundary (DESIGN). The
|
|
163
|
-
position gates nothing — it's a label on a map, read by `/plumbbob:pb-status` to tell you
|
|
164
|
-
where you are and what to do next, never a locked door. `.plumbbob/STATE` is just the
|
|
165
|
-
session sentinel: its presence means a session is live, and the post-edit hook is gated on
|
|
166
|
-
it, so a repo with no `.plumbbob/STATE` behaves exactly like plain Claude Code.
|
|
167
|
-
|
|
168
|
-
## Git footprint — additive only
|
|
30
|
+
## Install
|
|
169
31
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
baseline HEAD; `revert [--to n]` does `git reset --hard` to a recorded SHA; `wrap`
|
|
174
|
-
archives plain markdown under `.plumbbob/archive/` and never touches git.
|
|
32
|
+
PlumbBob installs **once, globally** — like `gh` or your dotfiles — in one of two
|
|
33
|
+
co-equal, mutually-exclusive ways (both register a Claude Code plugin named
|
|
34
|
+
`plumbbob`).
|
|
175
35
|
|
|
176
|
-
|
|
36
|
+
**Marketplace plugin** — self-contained; ships the skills *and* the CLI on PATH, so
|
|
37
|
+
it needs neither `npm` nor `init`:
|
|
177
38
|
|
|
178
39
|
```text
|
|
179
|
-
|
|
180
|
-
STATE # session sentinel — its presence means a session is live
|
|
181
|
-
SEAM # the in-flight step's declared paths (awareness, not a lock)
|
|
182
|
-
STEP # the in-flight step number (its presence is the BUILD phase)
|
|
183
|
-
SPIKE # marker — present while a spike fork is open
|
|
184
|
-
config # key=value; check=<heavy-check command> (defaults to pnpm run check)
|
|
185
|
-
checkpoints # "baseline <sha>" then "step N <sha>", one per verified step
|
|
186
|
-
intent.md # canonical intent
|
|
187
|
-
build-log.md # live ledger
|
|
188
|
-
archive/
|
|
189
|
-
<date>-<slug>/
|
|
190
|
-
intent.md
|
|
191
|
-
build-log.md
|
|
192
|
-
report.md
|
|
40
|
+
/plugin install plumbbob@<marketplace>
|
|
193
41
|
```
|
|
194
42
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
Plumbbob installs **once, globally** — like `gh` or your dotfiles. There are two co-equal,
|
|
198
|
-
mutually-exclusive ways to do it (both register a Claude Code plugin named `plumbbob`;
|
|
199
|
-
running both collides over the `/plumbbob:*` namespace).
|
|
200
|
-
|
|
201
|
-
**npm global + `init`** — the npm package ships the CLI, the skills, and the hook; `plumbbob
|
|
202
|
-
init` links them into Claude Code as an in-place plugin:
|
|
43
|
+
**npm global + `init`** — installs the CLI, then links the skills and hook into
|
|
44
|
+
Claude Code in place:
|
|
203
45
|
|
|
204
46
|
```sh
|
|
205
47
|
npm i -g plumbbob # the CLI (also a `pb` shorthand)
|
|
206
48
|
plumbbob init # link it into Claude Code; --uninstall to undo
|
|
207
49
|
```
|
|
208
50
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
**The marketplace plugin** — self-contained: it ships the skills *and* the `plumbbob`/`pb`
|
|
214
|
-
CLI on PATH (via its `bin/` shims), so it needs neither `npm i -g` nor `plumbbob init`:
|
|
215
|
-
|
|
216
|
-
```text
|
|
217
|
-
/plugin install plumbbob@<marketplace>
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
Either way, Claude Code namespaces the skills as `/plumbbob:<skill>`, so they appear as
|
|
221
|
-
`/plumbbob:pb-plan`, `/plumbbob:pb-status`, and the rest. Nothing else under `~` is touched
|
|
222
|
-
and `settings.json` is left alone — restart Claude Code (or `/reload-plugins`) to activate.
|
|
223
|
-
If a marketplace plumbbob is already installed, `plumbbob init` refuses rather than create
|
|
224
|
-
the collision (`--force` overrides), and `plumbbob doctor` flags a double-install.
|
|
51
|
+
Restart Claude Code (or `/reload-plugins`) to activate, then run `plumbbob doctor`
|
|
52
|
+
(or `/pb-doctor` in-session) to confirm the wiring. The full guide — namespacing,
|
|
53
|
+
per-project sessions, the agent-neutral roadmap — is in
|
|
54
|
+
[`docs/install.md`](docs/install.md).
|
|
225
55
|
|
|
226
|
-
|
|
227
|
-
tool once, but each goal lives in its own repo — `plumbbob start "<goal>"` writes a
|
|
228
|
-
`.plumbbob/` sidecar there, independent of the one global link.
|
|
56
|
+
## Features
|
|
229
57
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
58
|
+
You drive the whole loop from your IDE with `/plumbbob:*` skills — no step numbers to
|
|
59
|
+
remember, no raw CLI to type. Each is `disable-model-invocation`, so *you* fire every
|
|
60
|
+
move, and `/pb-status` always names your next one. (For readability these docs write
|
|
61
|
+
the short form: `/pb-plan` means `/plumbbob:pb-plan`.)
|
|
233
62
|
|
|
234
|
-
|
|
63
|
+
| Skill | Does |
|
|
64
|
+
|-------|------|
|
|
65
|
+
| `/pb-plan` | plan the whole goal — scaffold the session and author intent's Frame, Decisions, Constraints, **and all Steps** |
|
|
66
|
+
| `/pb-step` | revise/sharpen the next step (empty input auto-syncs it to reality) |
|
|
67
|
+
| `/pb-build` | *(optional)* implement the next planned step, then verify it to the pause — `--auto` self-approves and chains to done |
|
|
68
|
+
| `/pb-verify` | the tick — check → self-review → validate → **PAUSE** → checkpoint |
|
|
69
|
+
| `/pb-park` | capture an idea without chasing it |
|
|
70
|
+
| `/pb-status` | orient — where you are, the next step's done-when + seam, and the next move |
|
|
71
|
+
| `/pb-harvest` | triage parked ideas at a boundary (blocker / tangent / pivot) |
|
|
72
|
+
| `/pb-wrap` | wrap up — write the report, archive safely, clear for a fresh goal |
|
|
73
|
+
|
|
74
|
+
Three power moves round it out — `/pb-revert` (recover to a checkpoint), `/pb-spike`
|
|
75
|
+
(throwaway worktree experiment), and `/pb-refine` (attack the frame for holes or
|
|
76
|
+
repair a drifted plan) — plus `/pb-doctor` to check your install.
|
|
77
|
+
|
|
78
|
+
Under the skills ships a zero-dependency `plumbbob` CLI (the mechanical verbs the
|
|
79
|
+
skills shell out to), one session-gated post-edit hook (non-blocking lint feedback in
|
|
80
|
+
flow), and a `.plumbbob/` sidecar of flat files (`intent.md`, `build-log.md`,
|
|
81
|
+
checkpoints, archive). `/pb-build` is just one executor — implement a step by hand or
|
|
82
|
+
in any other harness and run `/pb-verify` instead; it reads the *diff, not the author*.
|
|
83
|
+
|
|
84
|
+
## Getting started
|
|
85
|
+
|
|
86
|
+
The happy path is **plan the whole thing up front, then drive `/pb-build` until
|
|
87
|
+
done** — approving each step at its verify pause:
|
|
235
88
|
|
|
236
|
-
```
|
|
237
|
-
|
|
89
|
+
```text
|
|
90
|
+
/pb-plan author the whole plan (incl. all steps) (once)
|
|
91
|
+
└ per step:
|
|
92
|
+
/pb-status review the next step (done-when + seam)
|
|
93
|
+
/pb-step (optional) sharpen/revise it first if needed
|
|
94
|
+
/pb-build (or DIY) implement it → verify → PAUSE → checkpoint
|
|
95
|
+
/pb-park capture strays mid-build
|
|
96
|
+
/pb-harvest triage them at a boundary
|
|
97
|
+
/pb-wrap report + archive + clear (once)
|
|
238
98
|
```
|
|
239
99
|
|
|
240
|
-
`
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
it first if a `/plumbbob:*` skill ever opens with an empty dashboard;
|
|
246
|
-
[`docs/troubleshooting.md`](docs/troubleshooting.md) covers the rest.
|
|
247
|
-
|
|
248
|
-
## Development
|
|
249
|
-
|
|
250
|
-
```sh
|
|
251
|
-
pnpm install
|
|
252
|
-
pnpm check # tsc, oxlint, ast-grep, vitest, knip, markdownlint
|
|
253
|
-
pnpm build # emit dist/ (what the published bin runs)
|
|
254
|
-
```
|
|
100
|
+
Each `/pb-build` builds the next undone step and stops at the pause for your
|
|
101
|
+
approval — re-firing it is itself the clock tick. (`/pb-build --auto` is the opt-in
|
|
102
|
+
that lets the agent self-approve and chain to done, halting on a red check or any
|
|
103
|
+
mismatch.) For one goal walked end to end — planning, building each step, wrapping
|
|
104
|
+
up, and starting the next — see [`docs/happy-path.md`](docs/happy-path.md).
|
|
255
105
|
|
|
256
106
|
## Documentation
|
|
257
107
|
|
|
108
|
+
- [`docs/install.md`](docs/install.md) — the full install guide and the agent-neutral roadmap.
|
|
258
109
|
- [`docs/techniques.md`](docs/techniques.md) — the methods behind the loop, each on its own.
|
|
259
110
|
- [`docs/happy-path.md`](docs/happy-path.md) — one goal walked end to end.
|
|
260
|
-
- [`docs/cli-reference.md`](docs/cli-reference.md) — every verb, flag, and
|
|
111
|
+
- [`docs/cli-reference.md`](docs/cli-reference.md) — every verb, flag, exit code, and the `.plumbbob/` sidecar.
|
|
261
112
|
- [`docs/troubleshooting.md`](docs/troubleshooting.md) — fixes for the common snags.
|
|
262
113
|
- [`docs/decisions.md`](docs/decisions.md) — the `D#` / `C#` design-decision key.
|
|
263
114
|
- [`docs/attention-first-development.md`](docs/attention-first-development.md) — the philosophy: attention as the scarce resource.
|
|
264
115
|
- [`CONTRIBUTING.md`](CONTRIBUTING.md) — setup, conventions, and how to submit changes.
|
|
265
116
|
|
|
266
|
-
## The shape, in one line
|
|
267
|
-
|
|
268
|
-
The human owns convergence; the LLM owns divergence in design and convergence only
|
|
269
|
-
in implementation; and the boundary between deciding and executing is a **pause you
|
|
270
|
-
advance**, not a lock you fight — the system does the labor and waits for you to be
|
|
271
|
-
the clock.
|
|
272
|
-
|
|
273
117
|
## License
|
|
274
118
|
|
|
275
119
|
Licensed under the [Apache License 2.0](LICENSE).
|
package/dist/lib/orient.js
CHANGED
|
@@ -161,7 +161,7 @@ export function formatOrientation(o) {
|
|
|
161
161
|
const cp = o.lastCheckpoint;
|
|
162
162
|
const cpLine = cp === null ? 'last checkpoint none yet' : `last checkpoint step ${cp.n} · ${cp.sha.slice(0, 7)}`;
|
|
163
163
|
return [
|
|
164
|
-
`
|
|
164
|
+
`PlumbBob — ${o.title ?? '(untitled)'} [${o.phase}]`,
|
|
165
165
|
'',
|
|
166
166
|
stepsBlock,
|
|
167
167
|
'',
|
package/dist/verbs/start.js
CHANGED
|
@@ -16,7 +16,7 @@ export function start(cwd, args) {
|
|
|
16
16
|
}
|
|
17
17
|
const root = findRepoRoot(cwd);
|
|
18
18
|
if (root === null) {
|
|
19
|
-
process.stderr.write('plumbbob: not a git repository.
|
|
19
|
+
process.stderr.write('plumbbob: not a git repository. PlumbBob records a baseline commit — run `git init` and make an initial commit first.\n');
|
|
20
20
|
return 1;
|
|
21
21
|
}
|
|
22
22
|
if (!hasCommit(root)) {
|
package/package.json
CHANGED
package/skills/pb-build/SKILL.md
CHANGED
|
@@ -1,42 +1,43 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pb-build
|
|
3
3
|
description: The optional engine — read the next planned step from intent, implement it (its done-when, seam, Decisions, Constraints), then verify it through to the approval pause. Skip it to build by hand/vibed/another harness. `--auto` self-approves and chains to done.
|
|
4
|
+
argument-hint: "[step-number] [--auto]"
|
|
4
5
|
disable-model-invocation: true
|
|
5
6
|
model: opus
|
|
6
7
|
allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob build:*), Bash(plumbbob check:*), Bash(plumbbob checkpoint:*), Bash(git diff:*)
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
#
|
|
10
|
+
# PlumbBob — build a step (the optional engine)
|
|
10
11
|
|
|
11
12
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
13
|
|
|
13
14
|
This is the **bundled executor** — one way to turn a planned step into code. It is
|
|
14
15
|
**optional** (D3): you can implement any step by hand, in a vibe session, or with
|
|
15
|
-
another harness and go straight to `/
|
|
16
|
+
another harness and go straight to `/pb-verify` instead — plumbbob does not care how
|
|
16
17
|
the diff appeared. When you do run it, it reads the plan, writes the step, and
|
|
17
18
|
carries straight through to the verify pause.
|
|
18
19
|
|
|
19
|
-
Since `/
|
|
20
|
-
`/
|
|
21
|
-
at the pause for your approval. **Re-firing `/
|
|
20
|
+
Since `/pb-plan` lays down the whole step list up front, the happy path is to fire
|
|
21
|
+
`/pb-build` once per step until done — each run builds the next undone step and stops
|
|
22
|
+
at the pause for your approval. **Re-firing `/pb-build` is itself the clock tick.**
|
|
22
23
|
|
|
23
24
|
## What this skill does, in order
|
|
24
25
|
|
|
25
|
-
1. **Pick the step.** Use the number you were invoked with (e.g. `/
|
|
26
|
+
1. **Pick the step.** Use the number you were invoked with (e.g. `/pb-build 4`), else
|
|
26
27
|
the next undone, planned step in `.plumbbob/intent.md`. If there is no planned step
|
|
27
|
-
to build, stop and tell the human to `/
|
|
28
|
+
to build, stop and tell the human to `/pb-step` first.
|
|
28
29
|
2. **Enter the step.** Run `plumbbob build <n>` (records the in-flight STEP +
|
|
29
|
-
SEAM so `/
|
|
30
|
+
SEAM so `/pb-status` shows the step in flight; in v2 the seam is awareness, not a
|
|
30
31
|
lock).
|
|
31
32
|
3. **Read the plan.** Read the step's **done-when**, its **seam**, and the
|
|
32
33
|
**Decisions** and **Constraints** in `intent.md`. Build to *that* — the deciding
|
|
33
34
|
already happened, off the chat.
|
|
34
35
|
4. **Implement** the step, and only that step, staying within the declared seam. A
|
|
35
|
-
new problem or "ooh what if" that surfaces mid-build is a `/
|
|
36
|
+
new problem or "ooh what if" that surfaces mid-build is a `/pb-park`, **not** an
|
|
36
37
|
edit — capture it and stay on the step. If you genuinely cannot finish without
|
|
37
38
|
touching more than the seam, that is scope drift: surface it to the human rather
|
|
38
39
|
than sprawling.
|
|
39
|
-
5. **Verify, through to the pause.** Run the verify tick exactly as `/
|
|
40
|
+
5. **Verify, through to the pause.** Run the verify tick exactly as `/pb-verify`
|
|
40
41
|
does: `plumbbob check` → self-review the diff against the done-when, the
|
|
41
42
|
Decisions, and the Constraints (a single structured read, D16) → validate → **PAUSE
|
|
42
43
|
for the human's approval** → only on approval, checkpoint with
|
|
@@ -46,7 +47,7 @@ at the pause for your approval. **Re-firing `/plumbbob:pb-build` is itself the c
|
|
|
46
47
|
|
|
47
48
|
## `--auto` — let the agent be the clock (opt-in)
|
|
48
49
|
|
|
49
|
-
`/
|
|
50
|
+
`/pb-build --auto` is the explicit escape hatch when the human wants unattended
|
|
50
51
|
progress instead of approving each step. It does the same work, but **the agent reviews
|
|
51
52
|
and approves in the human's place**, and it **chains**:
|
|
52
53
|
|
|
@@ -62,10 +63,10 @@ human asked for it by name. The default — no flag — always ends at the pause
|
|
|
62
63
|
|
|
63
64
|
## The hard contracts
|
|
64
65
|
|
|
65
|
-
- **Optional, never required.** The loop works without this skill; `/
|
|
66
|
+
- **Optional, never required.** The loop works without this skill; `/pb-verify`
|
|
66
67
|
checkpoints a hand-built or vibed diff just the same (D3).
|
|
67
68
|
- **Build the decided step, not a new one.** Implement what `intent.md` settled. A
|
|
68
|
-
new idea mid-build is a `/
|
|
69
|
+
new idea mid-build is a `/pb-park`, not an edit.
|
|
69
70
|
- **Default ends at the pause.** Implement → verify → wait for approval; never
|
|
70
71
|
checkpoint without it. Only an explicit `--auto` lets the agent approve in your place,
|
|
71
72
|
and it still halts on a red check or any mismatch.
|
|
@@ -6,7 +6,7 @@ model: haiku
|
|
|
6
6
|
allowed-tools: Bash(plumbbob doctor:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
#
|
|
9
|
+
# PlumbBob — doctor (the is-it-installed-right move)
|
|
10
10
|
|
|
11
11
|
Install diagnostic (injected when this skill runs): !`if command -v plumbbob >/dev/null 2>&1; then plumbbob doctor 2>&1; else 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."; fi`
|
|
12
12
|
|
|
@@ -6,11 +6,11 @@ model: opus
|
|
|
6
6
|
allowed-tools: Read, Edit, Bash(plumbbob status:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
#
|
|
9
|
+
# PlumbBob — harvest the park list
|
|
10
10
|
|
|
11
11
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
12
|
|
|
13
|
-
`/
|
|
13
|
+
`/pb-harvest` is the complement of `/pb-park` (D7): you parked ideas as seeds during a
|
|
14
14
|
build; now, at a boundary, you harvest them — decide what each one is.
|
|
15
15
|
|
|
16
16
|
## When to run it — boundary only
|
|
@@ -20,7 +20,7 @@ DESIGN boundary, not mid-step. Read the dashboard injected above:
|
|
|
20
20
|
|
|
21
21
|
- `NO ACTIVE SESSION` — **refuse**; tell the human to `plumbbob start "<title>"` first.
|
|
22
22
|
- A step in flight (the dashboard reads `[BUILD]`, and `next →` points at finishing the
|
|
23
|
-
step) — **refuse** and suggest finishing it with `/
|
|
23
|
+
step) — **refuse** and suggest finishing it with `/pb-verify` before harvesting.
|
|
24
24
|
Chasing parked items mid-step is the disease parking prevents.
|
|
25
25
|
- At the boundary (the dashboard reads `[DESIGN]`) — go ahead.
|
|
26
26
|
|
|
@@ -41,7 +41,7 @@ one line of reasoning, then **wait for the human to confirm or override**. Write
|
|
|
41
41
|
**only after** per-item confirmation:
|
|
42
42
|
|
|
43
43
|
- Record each confirmed class in `build-log.md`'s `## Harvest` section.
|
|
44
|
-
- **Flip the harvested item** from `- [ ]` to `- [x]` in the Park list, so `/
|
|
44
|
+
- **Flip the harvested item** from `- [ ]` to `- [x]` in the Park list, so `/pb-status`
|
|
45
45
|
stops counting it as open.
|
|
46
46
|
- A confirmed **blocker** also folds its decision into `intent.md`.
|
|
47
47
|
- Never reclassify or resolve an item the human hasn't confirmed, and default every
|
package/skills/pb-park/SKILL.md
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pb-park
|
|
3
3
|
description: Compose one tidy tagged park line, get the human's OK in-turn, then capture it by shelling `plumbbob park` — never by editing a file. The capture half of the park/harvest loop.
|
|
4
|
+
argument-hint: "[idea]"
|
|
4
5
|
disable-model-invocation: true
|
|
5
6
|
model: haiku
|
|
6
7
|
allowed-tools: Bash(plumbbob status:*), Bash(plumbbob park:*)
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
#
|
|
10
|
+
# PlumbBob — park an idea (capture, don't chase)
|
|
10
11
|
|
|
11
12
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
13
|
|
|
13
|
-
`/
|
|
14
|
+
`/pb-park` is the **capture** half of the loop; `/pb-harvest` is where parked items
|
|
14
15
|
get triaged later (D7). Capturing the instant an idea arrives — instead of acting on
|
|
15
16
|
it — is the whole point: it protects the step in flight.
|
|
16
17
|
|
package/skills/pb-plan/SKILL.md
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pb-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 absorbs a spec; any other text expands your inline intent."
|
|
4
|
+
argument-hint: "[spec-path | intent]"
|
|
4
5
|
disable-model-invocation: true
|
|
5
6
|
model: opus
|
|
6
7
|
allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob start:*)
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
#
|
|
10
|
+
# PlumbBob — plan a goal (the whole-goal move)
|
|
10
11
|
|
|
11
12
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
13
|
|
|
13
|
-
`/
|
|
14
|
+
`/pb-plan` is the **whole-goal** move — it opens a session and gets the deciding out
|
|
14
15
|
of your head and onto `intent.md` *before* any code. By default it authors the
|
|
15
16
|
**complete plan, including all the Steps**, so the happy path afterward is just
|
|
16
|
-
`/
|
|
17
|
+
`/pb-build` until done. (Revising a single increment later is the separate `/pb-step`
|
|
17
18
|
move; do not confuse the two.)
|
|
18
19
|
|
|
19
20
|
## Three input modes (disambiguated for you — no quotes needed)
|
|
@@ -33,7 +34,7 @@ Look at the argument the human gave and pick the mode yourself:
|
|
|
33
34
|
genuinely ambiguous.
|
|
34
35
|
|
|
35
36
|
All three modes converge on the **same artifact**: a complete, standalone `intent.md`
|
|
36
|
-
an agent can follow with `/
|
|
37
|
+
an agent can follow with `/pb-build`. The argument only seeds how you get there.
|
|
37
38
|
|
|
38
39
|
## What this skill does
|
|
39
40
|
|
|
@@ -55,11 +56,11 @@ an agent can follow with `/plumbbob:pb-build`. The argument only seeds how you g
|
|
|
55
56
|
- seam: `<file>`, `<file>`
|
|
56
57
|
```
|
|
57
58
|
|
|
58
|
-
Every step needs a **done-when** `/
|
|
59
|
+
Every step needs a **done-when** `/pb-verify` can check and a **seam** (the exact
|
|
59
60
|
paths it touches). Later steps may be fuzzier than the first — that's fine; they get
|
|
60
|
-
sharpened just-in-time when you reach them with `/
|
|
61
|
+
sharpened just-in-time when you reach them with `/pb-step`. Keep each small enough to
|
|
61
62
|
verify in one review pass.
|
|
62
|
-
5. **Offer to stress-test it.** Suggest `/
|
|
63
|
+
5. **Offer to stress-test it.** Suggest `/pb-refine` to attack the frame for holes (or
|
|
63
64
|
to repair the plan as it drifts). Optional, the human's call.
|
|
64
65
|
|
|
65
66
|
## The interview (mode 1)
|
|
@@ -72,11 +73,11 @@ Make it easy and non-intrusive:
|
|
|
72
73
|
without typing** ("done-when: the 6th request in 60s returns 429 — good?"), while
|
|
73
74
|
taking arbitrary detail when they want to give it, including pointers to other files.
|
|
74
75
|
- **Let them double back.** They will revise as the picture sharpens; that's expected.
|
|
75
|
-
They can also edit `intent.md` by hand at any time, or call `/
|
|
76
|
+
They can also edit `intent.md` by hand at any time, or call `/pb-refine` to repair it.
|
|
76
77
|
|
|
77
78
|
## The hard contracts
|
|
78
79
|
|
|
79
|
-
- **Deciding before code.** `/
|
|
80
|
+
- **Deciding before code.** `/pb-plan` writes `intent.md` only — never source.
|
|
80
81
|
- **The human converges.** You surface options and draft wording; the human picks.
|
|
81
82
|
An unresolved hole is an Open question, not a guessed Decision.
|
|
82
83
|
- **Stands on its own.** Whatever the input mode, the finished `intent.md` carries
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pb-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
|
+
argument-hint: "[focus]"
|
|
4
5
|
disable-model-invocation: true
|
|
5
6
|
model: opus
|
|
6
7
|
allowed-tools: Read, Edit, Bash(plumbbob status:*)
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
#
|
|
10
|
+
# PlumbBob — refine the plan
|
|
10
11
|
|
|
11
12
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
13
|
|
|
13
|
-
`/
|
|
14
|
+
`/pb-refine` keeps `intent.md` honest. Use it at **any point** — right after `/pb-plan`
|
|
14
15
|
to stress-test a fresh frame, or mid-build to repair a plan that drifted from what the
|
|
15
|
-
code is actually doing. It is the document-level complement to `/
|
|
16
|
-
sharpens the *next* step): `/
|
|
16
|
+
code is actually doing. It is the document-level complement to `/pb-step` (which only
|
|
17
|
+
sharpens the *next* step): `/pb-refine` works the *whole* plan.
|
|
17
18
|
|
|
18
19
|
## No-session refusal
|
|
19
20
|
|
|
20
21
|
This skill refines an existing plan, so it needs one. Read the state injected above: if
|
|
21
22
|
it is `NO ACTIVE SESSION`, **refuse** in one line and tell the human to run
|
|
22
|
-
`plumbbob start "<title>"` (or `/
|
|
23
|
+
`plumbbob start "<title>"` (or `/pb-plan`) first, and edit nothing. Every active state
|
|
23
24
|
is fine — refining is always available.
|
|
24
25
|
|
|
25
26
|
## Two modes
|
|
@@ -41,5 +42,5 @@ is fine — refining is always available.
|
|
|
41
42
|
approves every change to `intent.md`. Never guess a hole into a Decision.
|
|
42
43
|
- **Open questions for holes, edits for drift.** New uncertainty goes to
|
|
43
44
|
`## Open questions`; settled drift gets repaired in place once the human OKs it.
|
|
44
|
-
- **Refine the plan, not the code.** `/
|
|
45
|
-
decision into a diff is `/
|
|
45
|
+
- **Refine the plan, not the code.** `/pb-refine` touches `intent.md` only — turning a
|
|
46
|
+
decision into a diff is `/pb-build` or your own hands, never this skill.
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pb-revert
|
|
3
3
|
description: Human-triggered driver for `plumbbob revert` — git reset --hard to a checkpoint SHA (discarding the half-done step) and return to the boundary.
|
|
4
|
+
argument-hint: "[--to <step>]"
|
|
4
5
|
disable-model-invocation: true
|
|
5
6
|
model: haiku
|
|
6
7
|
allowed-tools: Bash(plumbbob status:*), Bash(plumbbob revert:*)
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
#
|
|
10
|
+
# PlumbBob — revert to a checkpoint (driver)
|
|
10
11
|
|
|
11
12
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
13
|
|
|
@@ -14,6 +15,6 @@ This is a **driver skill** — a chat-side trigger for the mechanical `plumbbob
|
|
|
14
15
|
|
|
15
16
|
## What it does
|
|
16
17
|
|
|
17
|
-
1. Read an optional target step from the way you were invoked (e.g. `/
|
|
18
|
+
1. Read an optional target step from the way you were invoked (e.g. `/pb-revert --to 2` → step `2`). With no target, revert goes to the last done-checkpoint.
|
|
18
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. Run it exactly as the human asked; do not add or drop the `--to` on your own.
|
|
19
20
|
3. Report the verb's output verbatim — which checkpoint it reset to, or any refusal.
|
package/skills/pb-spike/SKILL.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pb-spike
|
|
3
3
|
description: Human-triggered driver for `plumbbob spike` — open a throwaway worktree experiment for a genuine fork, or tear it down with `spike done`.
|
|
4
|
+
argument-hint: "<slug> | done"
|
|
4
5
|
disable-model-invocation: true
|
|
5
6
|
model: haiku
|
|
6
7
|
allowed-tools: Bash(plumbbob status:*), Bash(plumbbob spike:*)
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
#
|
|
10
|
+
# PlumbBob — spike an experiment (driver)
|
|
10
11
|
|
|
11
12
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
13
|
|
|
@@ -14,6 +15,6 @@ This is a **driver skill** — a chat-side trigger for the mechanical `plumbbob
|
|
|
14
15
|
|
|
15
16
|
## What it does
|
|
16
17
|
|
|
17
|
-
1. Read the spike target from the way you were invoked: a slug to open one (e.g. `/
|
|
18
|
+
1. Read the spike target from the way you were invoked: a slug to open one (e.g. `/pb-spike redis-cache`), or the literal `done` to tear the current spike down (`/pb-spike done`). If neither is present, ask which and run nothing.
|
|
18
19
|
2. Run `plumbbob spike "<slug>"` or `plumbbob spike done` via Bash.
|
|
19
20
|
3. Report the verb's output verbatim — the worktree it created or removed, or any refusal.
|
|
@@ -6,7 +6,7 @@ model: haiku
|
|
|
6
6
|
allowed-tools: Bash(plumbbob status:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
#
|
|
9
|
+
# PlumbBob — orient (the where-am-I move)
|
|
10
10
|
|
|
11
11
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
12
|
|
|
@@ -19,4 +19,4 @@ skill carries **no Edit and no Write tool**: the CLI is the source of truth, so
|
|
|
19
19
|
## What it does
|
|
20
20
|
|
|
21
21
|
1. Surface the injected `status` output — the dashboard and its suggested next move.
|
|
22
|
-
2. If it reads `NO ACTIVE SESSION`, tell the human to `/
|
|
22
|
+
2. If it reads `NO ACTIVE SESSION`, tell the human to `/pb-plan` to frame a goal.
|
package/skills/pb-step/SKILL.md
CHANGED
|
@@ -1,30 +1,31 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pb-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
|
+
argument-hint: "[what-changed]"
|
|
4
5
|
disable-model-invocation: true
|
|
5
6
|
model: opus
|
|
6
7
|
allowed-tools: Read, Edit, Bash(plumbbob status:*)
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
#
|
|
10
|
+
# PlumbBob — revise the next step (the single-increment move)
|
|
10
11
|
|
|
11
12
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
13
|
|
|
13
|
-
`/
|
|
14
|
+
`/pb-plan` authors the **whole** step list up front, so `/pb-step` is the
|
|
14
15
|
**just-in-time revision** move: it keeps the *next* undone step honest against what the
|
|
15
|
-
build has actually taught you, right before you `/
|
|
16
|
-
is the separate `/
|
|
16
|
+
build has actually taught you, right before you `/pb-build` it. (Framing the whole goal
|
|
17
|
+
is the separate `/pb-plan` move.) It can also add or re-cut a step when scope genuinely
|
|
17
18
|
grew — but its everyday job is to sharpen, not to invent.
|
|
18
19
|
|
|
19
20
|
## Two ways to fire it
|
|
20
21
|
|
|
21
|
-
- **`/
|
|
22
|
+
- **`/pb-step` (no input) → automatic sharpen.** Re-examine the next undone step
|
|
22
23
|
against the completed code, the Decisions, the Constraints, and the build-log, then
|
|
23
24
|
make the obvious revisions to its **done-when** and **seam** so it matches reality —
|
|
24
25
|
e.g. a file moved, a decision narrowed the scope, an earlier step already did part of
|
|
25
26
|
it. This is the zero-effort "keep my next step in sync" move: if the human does
|
|
26
27
|
nothing else, the next step stays current.
|
|
27
|
-
- **`/
|
|
28
|
+
- **`/pb-step <what changed>` → directed revision.** Take the human's input and propose
|
|
28
29
|
the matching change: tighten the done-when, adjust the seam, split the step in two, or
|
|
29
30
|
add a new increment the plan was missing.
|
|
30
31
|
|
|
@@ -33,7 +34,7 @@ grew — but its everyday job is to sharpen, not to invent.
|
|
|
33
34
|
1. **Read the plan and the reality.** Read `intent.md`'s Frame, Decisions, Constraints,
|
|
34
35
|
and the steps already done, plus the next undone step, to see what it *should* now be.
|
|
35
36
|
2. **Propose the revision** (or the new/split step): a one-line **title**, a **done-when**
|
|
36
|
-
`/
|
|
37
|
+
`/pb-verify` can validate, and a **seam** (exact paths, or a `dir/` grant). Keep it
|
|
37
38
|
small enough to verify in one review pass. Show the before/after so the human can see
|
|
38
39
|
what you changed and why.
|
|
39
40
|
3. **Get the human's OK**, then write it into `## Steps` in the standard format —
|
|
@@ -42,7 +43,7 @@ grew — but its everyday job is to sharpen, not to invent.
|
|
|
42
43
|
|
|
43
44
|
## The hard contracts
|
|
44
45
|
|
|
45
|
-
- **One verifiable increment.** Each step carries a done-when `/
|
|
46
|
+
- **One verifiable increment.** Each step carries a done-when `/pb-verify` can check
|
|
46
47
|
and a seam small enough to review in one pass.
|
|
47
48
|
- **Edit `## Steps` only**, in the standard format `status` and `build` parse — never
|
|
48
49
|
the Roadmap, never loose prose. A done step (`[x]`) is history; do not rewrite it.
|
|
@@ -6,12 +6,12 @@ model: opus
|
|
|
6
6
|
allowed-tools: Read, Bash(plumbbob status:*), Bash(plumbbob check:*), Bash(plumbbob checkpoint:*), Bash(git diff:*), Bash(git status:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
#
|
|
9
|
+
# PlumbBob — verify a step (the tick)
|
|
10
10
|
|
|
11
11
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
12
|
|
|
13
13
|
This is the **tick** — the one beat where the human is the clock. Whatever produced
|
|
14
|
-
the current diff — `/
|
|
14
|
+
the current diff — `/pb-build`, your own hands, a vibe session, another harness —
|
|
15
15
|
this skill verifies it the same way: **it reads the diff, not the author** (D3).
|
|
16
16
|
|
|
17
17
|
## What this skill does, in order
|
|
@@ -40,7 +40,7 @@ this skill verifies it the same way: **it reads the diff, not the author** (D3).
|
|
|
40
40
|
- **Never skip the pause.** Check → self-review → validate, then wait. Approval is
|
|
41
41
|
the only thing that triggers the checkpoint.
|
|
42
42
|
- **Read the diff, not the author** (D3). Verify identically whether the code was
|
|
43
|
-
built by `/
|
|
43
|
+
built by `/pb-build`, by hand, vibed, or by another harness.
|
|
44
44
|
- **Red means stop, not pause.** A failing check is not an approval decision; report
|
|
45
45
|
it and end your turn.
|
|
46
46
|
- **You review; you do not build.** If the self-review finds a problem, surface it
|
package/skills/pb-wrap/SKILL.md
CHANGED
|
@@ -6,11 +6,11 @@ model: opus
|
|
|
6
6
|
allowed-tools: Read, Write, Bash(plumbbob status:*), Bash(plumbbob wrap:*)
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
#
|
|
9
|
+
# PlumbBob — wrap the build (the close-out)
|
|
10
10
|
|
|
11
11
|
Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not found - install the dep and re-run: npm i -g plumbbob && plumbbob init"`
|
|
12
12
|
|
|
13
|
-
`/
|
|
13
|
+
`/pb-wrap` ends the build: it captures what happened, archives it, and clears the
|
|
14
14
|
sidecar for the next goal. **Report by default** (D9) — no refuse-without-report gate,
|
|
15
15
|
and no separate docs phase.
|
|
16
16
|
|
|
@@ -30,7 +30,7 @@ and no separate docs phase.
|
|
|
30
30
|
to the report, archives intent + build-log + report to
|
|
31
31
|
`.plumbbob/archive/<date>-<slug>/`, and clears the sidecar (STATE last). Git is not
|
|
32
32
|
touched.
|
|
33
|
-
3. **Point at the next goal** — `/
|
|
33
|
+
3. **Point at the next goal** — `/pb-plan` to frame the next one.
|
|
34
34
|
|
|
35
35
|
## The hard contracts
|
|
36
36
|
|
package/templates/build-log.md
CHANGED
|
@@ -6,7 +6,7 @@ step boundaries. The antidote to "my plan got lost in the noise."
|
|
|
6
6
|
Park list : where ideas go so you do not chase them. CAPTURE, never act inline.
|
|
7
7
|
Harvest : the boundary ritual that keeps you on one branch.
|
|
8
8
|
Log : the build's history. `plumbbob checkpoint` appends a line per step as it
|
|
9
|
-
lands; feeds the /
|
|
9
|
+
lands; feeds the /pb-wrap report, then gets archived.
|
|
10
10
|
-->
|
|
11
11
|
|
|
12
12
|
# Build log — {{TITLE}}
|
|
@@ -17,8 +17,8 @@ step boundaries. The antidote to "my plan got lost in the noise."
|
|
|
17
17
|
## Steps
|
|
18
18
|
|
|
19
19
|
*(Mirror of intent.md's Steps, with live status. Only ONE step is in flight. A step
|
|
20
|
-
is done only after a checkpoint — check green + checkpoint taken, via `/
|
|
21
|
-
`/
|
|
20
|
+
is done only after a checkpoint — check green + checkpoint taken, via `/pb-verify` or
|
|
21
|
+
`/pb-build`.)*
|
|
22
22
|
|
|
23
23
|
- ☐ 1. <step>
|
|
24
24
|
|
|
@@ -26,16 +26,16 @@ is done only after a checkpoint — check green + checkpoint taken, via `/plumbb
|
|
|
26
26
|
|
|
27
27
|
> Mid-step, every new problem / idea / "ooh what if" lands HERE, untouched, and you
|
|
28
28
|
> go straight back to the step. Acting the instant an idea arrives is the disease.
|
|
29
|
-
> Capture is one line (`/
|
|
29
|
+
> Capture is one line (`/pb-park` composes it). Harvest happens only at the boundary.
|
|
30
30
|
|
|
31
|
-
## Harvest *(run `/
|
|
31
|
+
## Harvest *(run `/pb-harvest` at each step boundary, after green)*
|
|
32
32
|
|
|
33
33
|
Classify each parked item as exactly ONE. Naming it before acting is what keeps you
|
|
34
34
|
from sprawling across branches.
|
|
35
35
|
|
|
36
36
|
| Class | Meaning | Action |
|
|
37
37
|
|------------------|-------------------------------------------|---------------------------------|
|
|
38
|
-
| **blocker** | Plan was wrong/incomplete; can't proceed | `/
|
|
38
|
+
| **blocker** | Plan was wrong/incomplete; can't proceed | `/pb-revert`, fold into intent |
|
|
39
39
|
| **tangent** | A different path, not clearly better | Defer or kill. Default here. |
|
|
40
40
|
| **pivot signal** | Evidence the whole approach is wrong | Stop. Replan deliberately. |
|
|
41
41
|
|
|
@@ -49,8 +49,8 @@ Harvest results this boundary:
|
|
|
49
49
|
## Log
|
|
50
50
|
|
|
51
51
|
*(The build's history, oldest first. `plumbbob checkpoint` appends a dated line here
|
|
52
|
-
every time a step lands — via `/
|
|
52
|
+
every time a step lands — via `/pb-build` or `/pb-verify` — so this
|
|
53
53
|
fills in as you go, not at the end. Add your own decision/event lines too: this is what
|
|
54
54
|
you point at to say "I did that — the LLM helped, but those were my calls."
|
|
55
|
-
`/
|
|
55
|
+
`/pb-wrap` reads this for the report; `plumbbob wrap` archives it under
|
|
56
56
|
`.plumbbob/archive/`.)*
|
package/templates/intent.md
CHANGED
|
@@ -32,24 +32,24 @@ open. If the implementor (you-later, or the LLM) has to guess, the doc failed.
|
|
|
32
32
|
## Decisions
|
|
33
33
|
|
|
34
34
|
*(One line each. Settled, not re-litigated in the chat. Grows as you resolve the
|
|
35
|
-
holes `/
|
|
35
|
+
holes `/pb-refine` surfaces, and as blockers fold in during BUILD.)*
|
|
36
36
|
|
|
37
37
|
- D1: <decision> — *because* <the one reason that mattered>
|
|
38
38
|
|
|
39
39
|
## Constraints
|
|
40
40
|
|
|
41
|
-
*(Hard rules the build must honor. `/
|
|
41
|
+
*(Hard rules the build must honor. `/pb-verify` and `/pb-refine` read against these.)*
|
|
42
42
|
|
|
43
43
|
- C1: <e.g. functional/procedural only; no new dependencies>
|
|
44
44
|
|
|
45
45
|
## Steps
|
|
46
46
|
|
|
47
|
-
*(The build plan. `/
|
|
47
|
+
*(The build plan. `/pb-plan` authors the **whole list up front** — each step a small,
|
|
48
48
|
verifiable increment with its own **done-when** and **seam** (the paths it will touch,
|
|
49
|
-
which `/
|
|
50
|
-
in v2). Then drive `/
|
|
51
|
-
sharpen the next one just-in-time with `/
|
|
52
|
-
`/
|
|
49
|
+
which `/pb-build` records in `.plumbbob/SEAM` for orientation — awareness, not a lock
|
|
50
|
+
in v2). Then drive `/pb-build` until done. Later steps may be fuzzier than the first;
|
|
51
|
+
sharpen the next one just-in-time with `/pb-step` (empty input auto-syncs it), and use
|
|
52
|
+
`/pb-refine` to repair the whole plan when a blocker rewrites it.)*
|
|
53
53
|
|
|
54
54
|
1. [ ] <step> — **done when:** <criterion, ideally a test or check result>
|
|
55
55
|
- seam: `<file>`, `<file>`
|