route_cmd_for()'s four extractions searched the WHOLE route line with a
greedy `.*trait=`, so a rationale that names a trait won the match over the
field itself. route.sh --help asks for a rationale per score, so a real
rationale names the traits routinely - this is the ordinary shape of the
data, not an edge case. route.sh then correctly refused the prose, --plan
printed command_missing=, and the operator read a broken PARSER as "that
repo has no route line": Verifiseringsloven ansikt 4 aimed at our own tooling.
Measured by .claude on four live STATE.md files before the order was written,
then re-measured here rather than quoted: A/B-ing the pre-fix script against
this one over the real tree at the same moment gives 25 tabs, command_missing
7 -> 2, and the five repos that gained a command (app-creator, catalog,
claude-code-llm-wiki, llm-security-commons, portfolio-optimiser-commons) are
exactly the five the order named. The two that remain are real and belong to
their own repos: okr writes scope=multi-module, outside the vocabulary, and
llm-security has no route line at all.
The cut keys on the FIRST `rationale=`, not on `; rationale=`: everything from
that token on is free text by definition, and the separator form would miss a
line written without the space. F4's [^;>]* class is untouched - the two answer
different questions and neither replaces the other.
The board line needs no equivalent change, and that was measured rather than
assumed: `grep -n 's/\.\*' scripts/board.sh` is the denominator, and the board
line's grammar carries no free-text field.
Selftest section 23 (7 checks, 252 -> 259) pins both failure directions,
including the sharp inverse where the FIELD is invalid (known2) while the
rationale holds a VALID value - before the fix that emitted a confident
command= built on prose the STATE line never declared. Two known-positive
controls prove the cut does not break the path that already worked.
Closes order 20260820T204409Z-8157821110-from-.claude
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AZa4oEsa93ac6pZQFEXqBF