# The classifier baseline after the tokenizer fix

Measured 2026-08-11 on master at `2cf8b7e`, the classifier cascade with the ONNX
multilingual embedder, the configuration homesrv runs. `make t
PKG=./internal/router/eval/ RUN=TestONNXBaseline V=1`. Covers V-704.

## Result

Intent is **72/96 (75.0%)**. Destination is **11/33 (33.3%)**.

`docs/evals/2026-08-08-destination-fixture.md` recorded 73/96 (76.0%) and 12/33
(36.4%) three days earlier, and `CLAUDE.md` and `docs/routing.md` both carried
that pair until today. Same fixture, same 33 labelled cases, so the two pairs
are comparable and one case moved.

| | 2026-08-08 | today |
|---|---|---|
| intent | 73/96 (76.0%) | 72/96 (75.0%) |
| destination | 12/33 (36.4%) | 11/33 (33.3%) |
| world | 5/5 | 5/5 |
| the `SourceUnknown` floor | 5/7 | 4/7 |
| calendar | 2/6 | 2/6 |
| recall | 0/15 | 0/15 |

## One case moved, and it cost both numbers

`en-query-002`, "how long since the last backup finished". It routed `query` on
08-08 and routes `fact` today, at 0.870.

The case carries `want_source` present and empty, the floor label. `Score`
credits a destination only after the route lands the intent. So the case paid
once on the intent and once on the destination. Two numbers moved by one case,
which is why the drift read as two regressions.

## The commit

`feabf9f`, "The tokenizer read every long word backwards" (V-664), landed
2026-08-08 after the destination measurement.

Bisected by running `TestONNXBaseline` at each commit:

| commit | intent | destination |
|---|---|---|
| `b6eaa70` V-659, the 08-08 measurement | 73/96 | 12/33 |
| `e470435` V-661 | 73/96 | 12/33 |
| `a886217` V-663 | 73/96 | 12/33 |
| `50c6637` merge #205, parent of the fix | 73/96 | 12/33 |
| **`feabf9f` V-664, the tokenizer fix** | **72/96** | **11/33** |
| `c938148` V-666 | 72/96 | 11/33 |
| `2cf8b7e` master today | 72/96 | 11/33 |

Nothing between `a886217` and `feabf9f` touches routing except that commit and
one merge, and the merge holds the old pair.

## What this means for the pair

The higher pair is not a target to restore. Before `feabf9f`, `encodeWord`
emitted the characters of every long word in reverse. So the 76.0% and 36.4%
were scored on embeddings from a broken encoder. One case landed right under the
defect and lands wrong under the fix.

So 75.0% and 33.3% is the honest floor, and `en-query-002` is not a regression to
chase. It is a case the corrected encoder gets wrong, worth the same attention as
the other 23 intent misses and no more.

## What this does not measure

The routing heads row and the two gemma rows in `docs/routing.md` were not
re-run. The heads commits all land after `feabf9f`, so that row was already
measured against the corrected tokenizer. The gemma rows are the model arm and
were not checked either way.
