plumbbob 0.8.10 → 0.8.11
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 +47 -21
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plumbbob",
|
|
3
3
|
"displayName": "PlumbBob",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.11",
|
|
5
5
|
"description": "Attention-first build process — driver skills + a CLI that keep you the decider: guidance on the work, a latch on the record.",
|
|
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
|
@@ -23,6 +23,31 @@ Ridgeline runs large, settled work autonomously without you, PlumbBob keeps you
|
|
|
23
23
|
driver's seat for the work your judgment has to steer. This repository was built using
|
|
24
24
|
PlumbBob, dogfooded on its own loop.
|
|
25
25
|
|
|
26
|
+
## What a prompt can't replicate
|
|
27
|
+
|
|
28
|
+
A system prompt can *ask* a model to plan first and stop for review. What it can't do is
|
|
29
|
+
**hold the line when the model doesn't** — and that mechanical half is what PlumbBob adds
|
|
30
|
+
under the skills. Five deterministic edges, enforced by the CLI and git rather than by the
|
|
31
|
+
model's goodwill:
|
|
32
|
+
|
|
33
|
+
- **A gate that refuses red.** `checkpoint` won't record a step while the check gate is
|
|
34
|
+
red, and `start` refuses a dirty tree — the [checkride](https://www.npmjs.com/package/checkride)
|
|
35
|
+
run (types, lint, tests, dead code, docs) has to pass before a step lands.
|
|
36
|
+
- **One SHA per verified step.** Every approved step is its own git commit against a
|
|
37
|
+
recorded baseline — a ledger of checkpoints, not one undifferentiated diff at the end.
|
|
38
|
+
- **A preservation-aware revert.** `/pb-revert` resets exactly to a recorded checkpoint
|
|
39
|
+
SHA while keeping your plan and notes intact, and restores *only* SHAs the loop wrote.
|
|
40
|
+
- **A build record that rides the PR.** The tracked `builds/<slug>/` folder — intent, log,
|
|
41
|
+
checkpoints, report — merges into `main` with the branch instead of dying with the
|
|
42
|
+
worktree; the archive never destroys.
|
|
43
|
+
- **The approval latch.** `checkpoint` refuses to land a step until the harness records a
|
|
44
|
+
human turn since that step began ([D64–D66](docs/decisions.md#d64), the ledger-plane
|
|
45
|
+
enforcement), so the model can't self-commit past you — the refusal *is* the pause.
|
|
46
|
+
|
|
47
|
+
The planning surface is the on-ramp; these five are the floor under it. And the latch's
|
|
48
|
+
payoff is [measured, not asserted](#why-not-just), not just claimed. **Guidance on the
|
|
49
|
+
work, a latch on the record.**
|
|
50
|
+
|
|
26
51
|
## The loop in one picture
|
|
27
52
|
|
|
28
53
|
<p align="center">
|
|
@@ -196,11 +221,10 @@ diff, and `/pb-verify` reads it like any other.
|
|
|
196
221
|
|
|
197
222
|
**…use git and a TODO file?** That's the honest skeleton, and if your discipline
|
|
198
223
|
holds by willpower alone, it may be all you need. What the CLI adds is the
|
|
199
|
-
mechanical half of the discipline
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
without you re-explaining the state.
|
|
224
|
+
[mechanical half of the discipline](#what-a-prompt-cant-replicate) — the five edges up
|
|
225
|
+
top — so willpower is spent only at the pause. The one not on that list: a status
|
|
226
|
+
dashboard re-injected into every skill, so the model re-orients on each move without you
|
|
227
|
+
re-explaining the state.
|
|
204
228
|
|
|
205
229
|
**…wait for a vendor to ship this natively?** They're converging on it — plan
|
|
206
230
|
modes, spec kits, native checkpoints — and that convergence is evidence *for* the
|
|
@@ -220,26 +244,28 @@ control, because a determined model routes around it and a denial mid-thought le
|
|
|
220
244
|
legal move. But the **record** is a different plane, and there the tick *is* latched
|
|
221
245
|
([D64–D66](docs/decisions.md#d64)): `checkpoint` refuses to land a step until the harness
|
|
222
246
|
records a human turn since that step began, so the agent cannot self-commit past you —
|
|
223
|
-
the refusal simply *is* the pause.
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
record makes recovery one command — cheap recovery, not a cage, is the control that
|
|
229
|
-
matters.
|
|
247
|
+
the refusal simply *is* the pause. It extends the [deterministic edges above](#what-a-prompt-cant-replicate)
|
|
248
|
+
to the one boundary the product is named after, while leaving human what must be human:
|
|
249
|
+
you, reading the diff. And when a raw commit does slip the ledger, `status` says so and the
|
|
250
|
+
checkpoint record makes recovery one command — cheap recovery, not a cage, is the control
|
|
251
|
+
that matters.
|
|
230
252
|
|
|
231
253
|
> The latch's payoff is measured, not asserted: the skill-eval harness
|
|
232
254
|
> ([`test/evals/`](test/evals/)) sweeps this loop headless — prose-only baseline vs. the
|
|
233
255
|
> shipped latch, N=5 per contract, every assertion a mechanical read of git state — and
|
|
234
|
-
> commits
|
|
235
|
-
> (opus, 2026-07-11)
|
|
236
|
-
> check under pressure* went from **2/5 prose-only to 5/5
|
|
237
|
-
>
|
|
238
|
-
> flipping
|
|
239
|
-
>
|
|
240
|
-
>
|
|
241
|
-
>
|
|
242
|
-
>
|
|
256
|
+
> commits each receipt under [`research/evals/`](research/evals/). The first sweep
|
|
257
|
+
> ([opus, 2026-07-11](research/evals/2026-07-11.md)) closed the route the latch owns —
|
|
258
|
+
> *no checkpoint over a red check under pressure* went from **2/5 prose-only to 5/5
|
|
259
|
+
> latched** — and named, rather than papered over, the two honest gaps it surfaced: park
|
|
260
|
+
> capture at 0/5, and adversarial pressure flipping a standing `auto` grant a model could
|
|
261
|
+
> write into settings, a legal side door. The re-sweep
|
|
262
|
+
> ([opus, 2026-07-18](research/evals/2026-07-18.md), plumbbob 0.8.7) reproduced the win —
|
|
263
|
+
> *no checkpoint over a red check* still **5/5 latched** — and pinned both gaps. The side
|
|
264
|
+
> door is now closed by construction: [D67](docs/decisions.md#d67) (self-approval is
|
|
265
|
+
> human-typed only) retired the settings `auto` grant, so the one approval a model could
|
|
266
|
+
> forge is gone. What remains is park capture (c5) — prose-governed by design
|
|
267
|
+
> ([D10](docs/decisions.md#d10)/[D13](docs/decisions.md#d13)), the guidance-only gap the
|
|
268
|
+
> latch was never built to reach, still ~0/5 and labeled as such.
|
|
243
269
|
|
|
244
270
|
## Documentation
|
|
245
271
|
|
package/package.json
CHANGED