feat(route,board): strike the advisor rule, add board.sh --row <repo>

Order 20260912T202210Z-7588027378-from-.claude, operator decision
2026-09-12 (helhetlig vurdering av arbeidssystemet, cut row 3 and the
board.sh --row improvement row). One order, two parts, one version bump.

THE ADVISOR RULE IS STRUCK. route.sh and board.sh --dispatch emit no
--advisor at all. The rule fired per ROW on a need - always on the Sonnet
rows (a capability lift, which is what made the quota fallback safe to
take), and on the Opus rows at reversibility=costly|one-way - and it read
well. It was killed by a MEASUREMENT, not by taste: of 54 dispatches the
PM issued 08.-12.09, ZERO carried the flag, because sessions are started
by hand from the model and effort rather than from the whole emitted
line. A rule nothing honours is not a policy, and an emitted value nobody
acts on is decoration in a field whose only job is to be evidence. The
advisor is now what it already was in practice: an operator decision per
session, said in one sentence in route.sh --help.

The comments that rested on the rule were REWRITTEN, not left standing.
board.sh --dispatch still refuses a --model/--effort pair, but the reason
is no longer "the advisor is a property of the ROW": it is that the rubric
has exactly one copy, and a dispatch taking the model directly would be a
second, unscored way to reach the same decision - recording no traits, no
rationale and no next-cost, so nothing afterwards could say whether the
routing or the scoring was wrong. A comment defending a removed mechanism
is how the next session restores it. Both skills carry the correction.

Pinned as an ABSENCE over the whole trait space - 81 combinations, every
line of output, with a known-positive control proving the sweep's grep
can find a planted advisor - rather than on four sampled rows, because
the claim is that no path emits it. board.sh --dispatch at
reversibility=costly is pinned separately: that is the exact input a
reintroduced rule would fire on. The literal string is absent from
route.sh entirely, including the paragraph recording what was struck (it
says "an opus advisor flag" in words), because a blunt grep cannot tell a
description from a specification. Backward compatibility is pinned rather
than assumed: a route line carrying a legacy advisor= field still parses
and still yields a command - measured, 0 of 48 route lines in ~/repos
carry one, but a reader that broke on an unknown field would turn last
month's STATE.md into "that repo has no route line". The three CLI gates
section 14 carried went with the rule; the suite no longer depends on the
installed claude at all.

board.sh --row <repo> IS THE SEVENTH RENDERING of the same scan, never a
second scan, read-only like every other one. (The order calls it the
sixth; by this file's own numbering --inbox-plan is the fourth and
--dispatch the fifth. Corrected rather than carried wrong.) It exists
because the columns WERE misread: on 11.09 the PM read FLY off the table
by eye and got it wrong, while every other rendering a program consumes
is already key=value. inn, ordre and fly are three separate fields
because they are three separate facts; status is the bare token, never
the table's blocked>target display, with blocked-on beside it; neste is
last and uncut. An unknown repo exits 2 and writes NOTHING to stdout - an
empty block would read as a repo whose every column is blank, which is a
real and different state.

upushet is the ONE field that is not a rendering of the scan, and it is
named rather than blended in: nothing in the scan measures it, so it is
read once, for the named repo only, and never enters the table, the plan
or the briefing. It reads the remote-TRACKING ref, not the remote, so
upushet=N honestly means "the local ref says N"; a repo with no upstream
reports ?, never 0.

The row fixture's three counts are three DIFFERENT integers (3/2/1), and
that is the finding worth recording. Built first with 2/1/1, it was
mutation-tested by making fly read the ORDRE field - the exact 11.09
misreading - and the check stayed GREEN, because the two fields held the
same digit. A fixture that cannot tell two columns apart is the defect
wearing a passing test, inside the section written to prevent it.

Suites under /bin/bash 3.2, before -> after: coord 257 -> 257, board
393 -> 427, route 73 -> 73 (13 advisor checks and 3 CLI gates out, 15
absence/legacy checks in, and it no longer varies with claude being on
PATH), orders 116 -> 116, state-line-guard 54 -> 54. Sum 893 -> 927,
README badge updated to the measured sum. npm test 12/12, fail 0.

Verified live against the real tree, not only fixtures: --row
repo-mailbox reports fly=1 beside ordre=0 (the distinction that was
misread), --row on the nested key from-ai-to-chitta/content-sadhguru
resolves, and an unknown repo exits 2.

No tag, no push, no catalog change - that is the operator's
release-plugin.mjs run.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-12 23:45:47 +02:00
commit 5e5bc4a66e
13 changed files with 689 additions and 271 deletions

View file

@ -7,6 +7,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [0.34.0] - 2026-09-12
### Changed
- **The advisor rule is struck from the rubric: `route.sh` and `board.sh
--dispatch` no longer emit `--advisor` at all.** It fired on two needs -
always on the Sonnet rows, and on the Opus rows at `costly|one-way` stakes -
and it read well. What killed it was a measurement, not a change of taste:
of 54 dispatches the PM issued 08.-12.09, **zero** carried the flag, because
sessions are started by hand from the model and effort rather than from the
whole emitted line. A rule nothing honours is not a policy, and an emitted
value nobody acts on is decoration in a field whose only job is to be
evidence. The advisor is now what it already was in practice: an operator
decision per session, said in one sentence in `route.sh --help`. The
direction is the safe one for the single thing the old rule protected - the
quota fallback is still exactly one row cheaper, it just no longer implies a
capability lift nobody was taking.
- **The comments that rested on it were rewritten, not left standing.**
`board.sh --dispatch` still refuses a `--model`/`--effort` pair, but the
reason is no longer "the advisor is a property of the ROW": it is that the
rubric has exactly one copy, and a dispatch taking the model directly would
be a second, unscored way to reach the same decision - one recording no
traits, no rationale and no `next-cost`, so nothing afterwards could say
whether the routing or the scoring was wrong. A comment defending a
mechanism that has been removed is how the next session restores it.
`skills/route/SKILL.md` and `skills/dispatch/SKILL.md` carry the same
correction.
- Pinned as an ABSENCE over the whole trait space rather than on sampled rows -
81 trait combinations, every line of output, with a known-positive control
proving the sweep's grep can find a planted advisor - plus `--dispatch` at
`reversibility=costly`, the exact input a reintroduced rule would fire on.
Backward compatibility is pinned too: a route line carrying a legacy
`advisor=` field still parses and still yields a command (measured the same
day: 0 of 48 `<!-- route:` lines anywhere in `~/repos` carry one, so nothing
in circulation depends on it - but a reader that broke on an unknown field
would turn last month's STATE.md into "that repo has no route line").
### Added
- **`board.sh --row <repo>`: the table's row for one repo, as `field=value`
lines.** A seventh rendering of the same scan, never a second scan, and
read-only like every other one. The motivation is a measured misreading: on
11.09 the PM read the FLY column off the table **by eye** and got it wrong.
Every other rendering a program consumes (`--plan`, `--inbox-plan`,
`--dispatch`) is already `key=value`; the default view was the one left out,
and a 34-character repo key already shifts a row two characters right, which
makes counting spaces worse than it looks. `inn`, `ordre` and `fly` are three
separate fields because they are three separate facts, and confusing them is
what this exists to close. `status` is the bare token, never the table's
`blocked>target` display, with `blocked-on` beside it; `neste` is last and
uncut, for the same reason it is last in the record. An unknown repo exits
**2** and writes nothing to stdout - an empty block would read as a repo whose
every column is blank, which is a real and different state.
- `upushet=` is the one field that is **not** a rendering of the scan, and it is
named rather than blended in: nothing in the scan measures it, so it is read
once, for the named repo only, and never enters the table, the plan or the
briefing. It reads the remote-TRACKING ref, not the remote, so `upushet=N`
honestly means "the local ref says N"; a repo with no upstream reports `?`,
never `0`, because "nothing is waiting to be pushed" and "nobody looked" are
exactly the pair this engine refuses to render alike.
### Fixed
- **README's selftest numbers were re-measured, not re-derived.** The badge said