Give the stage 0 grammar set one home (V-693)

buildRouter held the real set and baselineGrammars in eval_test.go restated it
by hand, in the daemon's order, with its own comment saying so. Three test files
score against the fixture and nothing compared the two lists. They had already
drifted: BareCaptureGrammar went into the daemon with V-557 and never into the
fixture, so every routing measurement since has scored a set nobody runs. That
is the failure CLAUDE.md warns about by name, and a diff test would have caught
it one grammar late.

The list moves to router.StageZeroGrammars in internal/router/stagezero.go, with
the ordering comments, which are the load-bearing part. buildRouter and the
fixture both call it. One list cannot drift from itself.

Measured before and after on the 96-case fixture: classifier+onnx 72/96, 75.0%
intent, 33.3% destination, identical either way, and the deterministic claim and
reach hash ratchets do not move. So the missing grammar cost no measurable
accuracy. That is the point rather than a reprieve: the fixture had been scoring
the wrong set for four days and nothing could say so.

The invariants caveat is deleted, both entries, since V-692 landed the other
guard in the previous commit. The reasoning for both now sits in docs/routing.md
beside the subsystem, which is where a fix's durable record belongs.

Unrelated and pre-existing: TestONNXPersonalBoundary fails on "я рассказывал
тебе про байкал?" (personal 0.9068, world 0.9413) at the merge base too.
This commit is contained in:
2026-08-11 21:02:31 +04:00
parent d8efb667c7
commit 240d53a96a
7 changed files with 98 additions and 105 deletions
+4 -2
View File
@@ -115,13 +115,15 @@ classifier. Every stage may decline and the next one answers.
- **The classifier is the floor, not dead code.** It answers when the resident
model is off, absent, or erroring. **Any model error falls through.**
- **`baselineGrammars` in `eval_test.go` mirrors `buildRouter`.** A grammar
added to one belongs in both, or the fixture scores a set nobody runs.
- **The stage 0 set lives in `router.StageZeroGrammars`**, and both `buildRouter`
and the eval fixture call it. Add a grammar there, in the right place, and read
the comment above the line you insert after. Do not restate the list anywhere.
- **Go's `\b` is ASCII-only** and never fires after a Cyrillic letter. A Russian
pattern needs an explicit `(\s|[?!.]|$)`.
- **`PraxisGrammars()` is the only path to Praxis**, not a faster one.
- **`voice.embedder.heads_path` must never point at `model_path`.** Recall
depends on the resident e5-small scoring what it scored. Fine-tune a copy.
Refused at config load since V-692, symlinks included.
- **Routing traces are retained 14 days**, enforced on write and again on start.
- **Bump `tokenizerRev` on any change to what `encodeWord` emits**, so a
tokenizer fix triggers `ReembedAll` the way swapping the model file does.