repo-mailbox/scripts
Kjell Tore Guttormsen 2bec7fe2fb fix(route): --last-model learns Fable 5.1, and the set stays closed
Fable 5.1 shipped 2026-09-01. The closed set at route.sh:212 refused it,
so a session that actually ran it could not record what it ran: the
record was either omitted or LIED, and a lied record reads back months
later as a measurement rather than as the gap it is.

TDD, test first. The exact failure the new check produced before the fix:

  route: --last-model: 'Fable 5.1' is not a row-table model (Sonnet 5|Opus 5|Fable 5)

Two boundary decisions, both taken here and both written into the code:

(a) "Fable 5" is KEPT alongside the point release. The reason is not
    backward compatibility with existing route-last lines - measured
    across the machine, exactly 1 of 45 carries it. It is that route.sh's
    OWN row table spells rows 5-6 "Fable 5/high" and "Fable 5/xhigh", so
    dropping the value would make the script refuse to record a name its
    own spec writes.

(b) The set is WIDENED, never replaced by form validation. A pattern like
    "<family> <digits>[.<digits>]" would still catch a misspelled family
    and a drifted case, 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. This field is
    telemetry read as evidence, so a silently-accepted lie is worse than
    a loud refusal. The cost is real and was paid before the choice was
    made, so the die message now names the repair instead of leaving the
    caller to approximate to a value already in the list.

Both edit sites, never one: the usage block (route.sh:116) and the case
itself. Fixing the case alone is the two-copies-of-one-policy defect this
repo names repeatedly.

Selftest, 69 -> 73 checks:
  - Fable 5.1 is accepted                                   (was RED)
  - route-last carries "Fable 5.1" verbatim into the line    (was RED)
  - Fable 5.2 / Fable 6 / Fable 5.10 are still REFUSED - the
    check that makes "we did not switch to form validation"
    machine-verified rather than prose                       (control)
  - board parses back a hand-written Fable 5.1 next-cost     (control)

MEASURED 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. Widening the column
is a board.sh rendering change nobody ordered in this session, so it is
reported rather than fixed - which is also why the value is deliberately
absent from the widest-value loop in selftest section 6.

Not touched: the row table (still six rows, route.sh still emits only
1-4), and the note that a Fable session runs without an advisor because
the CLI does not enforce it.

Order: 20260901T185028Z-3612729538-from-.claude

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 21:42:28 +02:00
..
board-selftest.sh feat(board): --voyage reports the Voyage briefs in flight 2026-08-31 18:11:04 +02:00
board.sh feat(board): --voyage reports the Voyage briefs in flight 2026-08-31 18:11:04 +02:00
brief-nightly.sh feat(brief): render the nightly cross-repo briefing without a model 2026-08-01 22:38:46 +02:00
coord-count.sh fix(infra): a failed measurement must never render as a reassuring value 2026-08-26 12:15:05 +02:00
coord-done.sh feat(engine): make a bulk close state what Rule 7 says must be stated 2026-07-31 15:48:42 +02:00
coord-inbox.sh feat(engine): let a message say it needs no answer, and count debt without losing sight of the rest 2026-07-31 15:46:14 +02:00
coord-order-claim.sh fix(orders): call the order-verbs by absolute path, not bare PATH names 2026-08-18 09:16:59 +02:00
coord-order-done.sh fix(orders): narrow the return-reason escape so a plain arrow survives 2026-08-17 21:24:37 +02:00
coord-order-inbox.sh fix(orders): call the order-verbs by absolute path, not bare PATH names 2026-08-18 09:16:59 +02:00
coord-order-send.sh fix(coord): refuse a control character in --to instead of sanitizing it 2026-08-18 17:00:34 +02:00
coord-selftest.sh fix(infra): a failed measurement must never render as a reassuring value 2026-08-26 12:15:05 +02:00
coord-send.sh fix(coord): refuse a control character in --to instead of sanitizing it 2026-08-18 17:00:34 +02:00
coord-sweep.sh fix(coord-send): stop rejecting dot-prefixed repo names 2026-08-09 21:09:23 +02:00
orders-selftest.sh feat(board): ORDRE and FLY carry the age of the oldest order 2026-08-29 07:29:13 +02:00
route-selftest.sh fix(route): --last-model learns Fable 5.1, and the set stays closed 2026-09-01 21:42:28 +02:00
route.sh fix(route): --last-model learns Fable 5.1, and the set stays closed 2026-09-01 21:42:28 +02:00
state-line-guard-selftest.sh fix(infra): a failed measurement must never render as a reassuring value 2026-08-26 12:15:05 +02:00