feat(route)!: Fable rows are a hand-written override, never a route.sh outcome

The operator removed the "Fable can only be suggested after a failed Opus
5/xhigh session" policy on 2026-08-06 - it stood in the way too often. Until
now that policy was implemented as code: --opus-xhigh-failed was the ONLY
way route.sh's SELECTION chain could reach rows 5-6 (Fable), so the rubric
still enforced a policy the operator had already dropped.

Given a choice between (A) deleting the branches and the flag outright, so
the calculator's output range closes at row 4, or (C) keeping a path that
renders a Fable row on explicit instruction with rule=operator-override, the
operator chose A (AskUserQuestion) - CLAUDE.md is explicit that the rubric
stays the only deterministic lookup and a Fable choice is now always a
deviation from it, recorded in STATE as an override rather than produced
here. board.sh is untouched and still parses "Fable 5/high"/"Fable 5/xhigh"
written by hand into a board line (route-selftest.sh section 6 now pins that
half directly, since route.sh can no longer produce the strings itself).

TDD: every affected selftest check was rewritten to fail against the
unmodified route.sh first (72->68/69, confirmed red), then route.sh was
edited to match. --opus-xhigh-failed is gone outright - passing it now exits
2 like any other unknown argument, not silently accepted as a no-op.

route-selftest.sh: 73 -> 69 checks (three checks tested command shapes
row_advisor() can no longer produce; the two row-5/row-6 reachability checks
in section 1 collapsed into one "the flag is gone" check). coord 191, board
142 unaffected. Suite total 406 -> 402.

Also folds in a standalone fix already pushed this session: section 14 was
gating the wrong CLI fact (whether "claude --advisor fable" is rejected,
which row_advisor() never depends on) instead of the one it actually rests
on (whether opus/sonnet can advise a FABLE main model). Re-pointed and
verified against the installed CC 2.1.226.

Verified before committing: grepped every repo under ~/repos for a route
line carrying --opus-xhigh-failed (none - one repo has it in prose only,
not in its <!-- route: --> comment) and ran board.sh --plan/--brief over the
real tree to confirm no repo's command line broke. Sent a follow-up
coord-send to catalog superseding an earlier now-stale "406" stat-line
correction with the current 402.

skills/route/SKILL.md: usage block, "last-session record" framing, and the
closing --opus-xhigh-failed paragraph rewritten to match. CLAUDE.md, README
and CHANGELOG updated (checks 73->69, badge 406->402, new 0.21.0 entry).
Version bumped 0.20.3 -> 0.21.0 across plugin.json, package.json and all
three skill frontmatters (breaking CLI removal at 0.x -> minor, per v0.20.0
precedent).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ap1WKHCDPcSfpjo4ds2dQX
This commit is contained in:
Kjell Tore Guttormsen 2026-08-09 22:03:05 +02:00
commit dd8f3ce042
10 changed files with 172 additions and 124 deletions

View file

@ -5,6 +5,38 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.21.0] - 2026-08-09
### Changed
- **`route.sh` no longer routes to Fable (rows 5-6).** The `--opus-xhigh-failed`
flag was, until 2026-08-06, the only way to reach the Fable rows — mirroring
a global policy that Fable could only be *suggested* after a failed Opus
5/xhigh session. The operator removed that policy ("for ofte ER Fable
riktig"); `route.sh`'s output range shrinks to rows 1-4 rather than gaining
a new trait-derived path to Fable, matching the updated policy's own
framing: a Fable choice is now always a deliberate deviation from the
rubric, recorded in STATE as an override, never produced by the calculator.
The flag itself is gone — passing it now exits 2 like any other unknown
argument. `board.sh` is untouched and still parses "Fable 5/high" /
"Fable 5/xhigh" written by hand into a board line.
`route-selftest.sh`: 73 -> 69 checks (three checks tested a command
`row_advisor()` can no longer produce; the two row-5/row-6 reachability
checks in section 1 collapsed into one "the flag is gone" check).
### Fixed
- **`route-selftest.sh` section 14 was gating the wrong CLI fact.** It checked
whether `claude --advisor fable` is rejected, but `row_advisor()` never
emits `--advisor fable` — it depends on the opposite direction, whether
`opus`/`sonnet` can advise a **fable main model**. Both checks happened to
agree when the section was written; they diverged once the CLI's capability
ordering changed; measured against the installed CC 2.1.226, fable is now
itself accepted as an advisor for opus/sonnet mains, while opus/sonnet
advising a fable main is still rejected. Re-pointed at the fact
`row_advisor()` actually depends on.
## [0.20.3] - 2026-08-09
### Fixed