diff --git a/CLAUDE.md b/CLAUDE.md index 72cc9b2..decb9f7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -162,6 +162,19 @@ on in deploy** — this section used to say it was wired `nil`, which stopped be Cascade order: `stage0.go` exact-match fast-path → LLM router (when non-nil) → classifier fallback. Any LLM error falls through to the classifier so a turn never breaks on the model. +**A stage-0 decision is slot-extracted too, since 06-08-2026** (V-572). `fillMatchedSlots` +in `router.go` runs the stage-2 extractor over whatever a grammar built and fills only the +slots it left empty — a matched value always wins, because the rule read a literal pattern +and the extractor guesses. It did not run before, so `ReminderGrammar` handed the daemon +`HasTime: false` for "напомни в 11:00 позвонить маме" and `missingFor` read the silence as +absence and asked "Когда?". It applies to every grammar and is inert for all but the +reminder: `Extract` fills Time, Fn and Key and nothing else, and the query, clock, agenda, +feed, list, task and narrative rules all emit intents with no such slot. Benchmarked at +20000x, a stage-0 query costs 3.7µs against 3.9µs before. **`Slots.Text` is deliberately not +filled** — a grammar that left it empty meant it, and `agendaQueryBuild` hands the query +chain the utterance itself. Fixture unchanged at 64/91, with "slots deferred to daemon" +6 → 0. + Measured on the 77-case RU fixture. **Re-measured 2026-08-02: the classifier scores 68.8% full accuracy at p50 16.6µs**, not the 36.8% at p50 31ms that stood here from `docs/evals/2026-07-31-model-bakeoff.md`. That older figure predates the stage 0 rules and the