chore(release): bump to 0.32.0

Ships two things that belong in one bump because they are one plugin.

`board.sh --voyage` (85cd628, 2026-08-31) sat one commit past v0.31.0,
unreleased and unpushed. Every entry point on this machine runs the
version-pinned plugin cache, so the feature existed in git and did not
exist for anyone using it.

`route.sh --last-model` learned "Fable 5.1" (2bec7fe) with both boundary
decisions taken and written down: "Fable 5" is kept because the row table
itself spells rows 5-6 with it, and the set was widened rather than
replaced by form validation because only a closed set catches a version
that never shipped.

Version sites, enumerated rather than swept - a blank sed would rewrite
the historical prose in CLAUDE.md that deliberately keeps its old number:
plugin.json, package.json, the README badge, and four SKILL.md
(coord-send, board, route, dispatch). CHANGELOG entry added.

Selftest counts corrected where they are asserted as prose: route 69 ->
73 in CLAUDE.md and README.

npm test: 11/11. coord 242, board 360, route 73, orders 110, guard 54.

Order: 20260901T185028Z-3612729538-from-.claude

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-01 21:47:33 +02:00
commit 39cb6538e3
9 changed files with 121 additions and 10 deletions

View file

@ -897,7 +897,7 @@ marketplace plugin. Three components, one boundary:
rationale, and prints one block of `key=value` lines: the rubric row, the rule
that fired, the `next-cost` value, a pasteable startup command, the one-row
cheaper fallback, and the STATE.md comment lines. Pinned by
`route-selftest.sh` (69 checks).
`route-selftest.sh` (73 checks).
**It is here because it is the WRITER for the field `board.sh` already reads.**
`next-cost` had a reader and no writer, so it was hand-typed every session and
@ -957,6 +957,53 @@ marketplace plugin. Three components, one boundary:
startup command. Corollary pinned by section 13: `skills/route/SKILL.md` must
never declare an `effort:` frontmatter field, because frontmatter overrides the
session effort and the reading would then measure the skill, not the session.
**Order 20260901T185028Z-3612729538 (2026-09-01): `--last-model` was a closed
set of three, Fable 5.1 shipped that day, and the refusal turned a
measurement into a lie.** A session that genuinely ran Fable 5.1 could not
record what it ran, so its record was either omitted or written as a name
already in the set - and a lied record reads back months later as a
measurement rather than as the gap it is. The whole point of the four
`--last-*` fields is to be readable evidence, so this is the field's own
failure mode, not a cosmetic one. Both edit sites moved, never one: the usage
block and the validating case, because fixing the case alone is the
two-copies-of-one-policy defect this file names repeatedly.
**"Fable 5" is KEPT, and the reason is NOT backward compatibility.** The
nevner was measured rather than assumed - exactly 1 of 45 `route-last` lines
across the machine carries it - which is thin enough that a future session
would happily "clean up" the one stale line and then drop the value. The
load-bearing reason is that `route.sh`'s own row table spells rows 5-6
`Fable 5/high` and `Fable 5/xhigh`. Dropping the value would make the script
refuse to record a name its own spec writes.
**The set is WIDENED, never replaced by form validation, and the selftest is
what makes that a fact rather than a paragraph.** A pattern like
`<family> <digits>[.<digits>]` would still catch a misspelled family and a
drifted case (`opus 5`), and would stop catching **a version that does not
exist**: `Fable 5.2` and `Opus 7` would both pass and read back as evidence
that a model ran when it never shipped - the positive-looking null this repo
refuses everywhere else, in the one field whose entire purpose is to be
believed later. Section 8b therefore rejects `Fable 5.2` / `Fable 6` /
`Fable 5.10` beside the accept case, so a later switch to form validation
fails here instead of silently widening what the record can claim. The cost
of the closed set is real and was paid before the choice was made, so the die
message now names the repair - a newly shipped model is ADDED to the list,
never approximated to a value already in it.
Untouched, deliberately: the row table (still six rows; `route.sh` still
emits only 1-4, and Fable remains a hand-written override), and the note that
a Fable session runs without an advisor because the CLI does not enforce it.
**Bounded gap, stated rather than closed:** `Fable 5.1/xhigh` is 15
characters and overflows `board.sh`'s `%-14s` KOST column, shifting the rest
of that row one column right. Parsing is unaffected - `next-cost` extraction
is free text, and selftest section 6 now pins that the point release survives
the round trip - so this is alignment, not data. Widening the column is a
`board.sh` rendering change nobody ordered in this session, which is also why
the value is deliberately ABSENT from section 6's widest-value loop: adding
it there would go red, and the red would be the unfixed gap wearing a broken
test's clothes. Reported to `.claude` instead.
- **Board's ORDRE column** counts PENDING orders per repo with the identical
idiom as INN, and the two are never summed: INN is "others are waiting on
YOU" (outgoing obligation), ORDRE is "authorized work is waiting on this
@ -1215,7 +1262,7 @@ obligations in another repo.
- TDD: no behavior change without a failing selftest check first.
`bash scripts/coord-selftest.sh` must exit 0 (242/242),
`bash scripts/board-selftest.sh` must exit 0 (360/360),
`bash scripts/route-selftest.sh` must exit 0 (69/69),
`bash scripts/route-selftest.sh` must exit 0 (73/73),
`bash scripts/orders-selftest.sh` must exit 0 (110/110) and
`bash scripts/state-line-guard-selftest.sh` must exit 0 (54/54).
- English for all code, docs, and commit messages (public repo). Norwegian