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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "plumbbob",
3
3
  "displayName": "PlumbBob",
4
- "version": "0.8.10",
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, so willpower is spent only at the pause: a
200
- recorded baseline, one SHA per verified step, a revert that returns exactly to
201
- those SHAs while preserving your notes, an archive that never destroys, and a
202
- dashboard re-injected into every skill so the model re-orients on each move
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. That extends the deterministic edge PlumbBob already
224
- holds — `checkpoint` refuses a red check, `start` refuses a dirty tree, `revert` restores
225
- only recorded SHAs — to the one boundary the product is named after, while leaving human
226
- what must be human: you, reading the diff. **Guidance on the work, a latch on the
227
- record.** And when a raw commit does slip the ledger, `status` says so and the checkpoint
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 the receipt to [`research/evals/`](research/evals/2026-07-11.md). The first sweep
235
- > (opus, 2026-07-11): the latch closes the route it owns — *no checkpoint over a red
236
- > check under pressure* went from **2/5 prose-only to 5/5 latched** — while the honest
237
- > numbers it also surfaced (park capture 0/5, and adversarial pressure consistently
238
- > flipping the `auto` standing grant in settings — a legal, model-writable side door)
239
- > are the next iteration's work, named in the report rather than papered over. The
240
- > current sweep ([opus, 2026-07-18](research/evals/2026-07-18.md), plumbbob 0.8.7)
241
- > reproduces the win — *no checkpoint over a red check* still holds **5/5 latched** —
242
- > and confirms both gaps stand at 0.8.7, now the target of the hardening build.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plumbbob",
3
- "version": "0.8.10",
3
+ "version": "0.8.11",
4
4
  "description": "Attention-first build process: 12 skills + a CLI that keep you the decider — guidance on the work, a latch on the record.",
5
5
  "keywords": [
6
6
  "claude-code",