Files
Maven/docs/evals/2026-08-06-alarm-verbs-reach-stage-0.md
claude 1f8e9f21ce an alarm verb reaches stage 0, and the reminder grammar reads the lexicon (V-627)
reminder_verbs held five words and none named an alarm, and ReminderGrammar
did not read the set anyway — it carried the literal напомни|remind me. So no
part of the cascade recognised разбуди, and the three alarm cases in the
fixture went to fact and act at over 0.89.

The lexicon addition alone moved nothing, measured at 66/91. Every consumer
reads the set after a reminder route already exists. Building the grammar's
alternation from the set is what scored: 66/91 to 69/91, three cases gained,
none lost, and each alarm now carries its time slot.

Longest-first ordering in the alternation is load-bearing. Go's regexp
alternation is leftmost-first, so напомнить after напомни would never match.

Found while training the V-546 intent head, where the same three cases went
to system.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0117tgnmbgZpHVV3XSNw8Qua
2026-08-06 15:04:08 +04:00

2.5 KiB

Alarm verbs reach stage 0

06-08-2026. V-627. Measured with TestONNXBaseline, 91-case RU routing fixture, classifier plus the ONNX embedder. No LLM arm in this run.

What was wrong

lexicon.ReminderVerbs held five words and none of them named an alarm. ReminderGrammar in internal/router/stage0.go did not read the set at all: it carried the literal напомни|remind me. So no part of the cascade recognised разбуди.

Three fixture cases ride on that. Under the classifier they went to fact and act at high confidence, so the failure was never a near miss:

  • ru-rem-005 "разбуди меня в 6:30" to fact at 0.918
  • ru-rem-009 "разбуди меня полвосьмого" to act at 0.941
  • en-rem-002 "wake me at 6:15" to fact at 0.899

Found while training the V-546 intent head, where the same three cases went to system. The head reads a spoken time with no known verb in front of it as a clock question. The classifier was making the same mistake in its own way.

The change

Four alarm imperatives and bare wake join reminder_verbs. ReminderGrammar builds its alternation from the set, longest alternative first, and eats an optional мне, меня or me before the body.

Longest-first is load-bearing. Go's alternation is leftmost-first rather than longest-match, so напомнить listed after напомни would never match.

Result

66/91 to 69/91, 72.5% to 75.8% full. Three cases gained, none lost.

All three are the alarms above, and each now carries its time slot, which it did not before. Clarify counts unchanged at 0 false and 8 missed. The two remaining system failures, какое число завтра and какой день недели послезавтра, failed at baseline too.

What this does not fix

The lexicon addition on its own moved nothing. Measured before touching the grammar: 66/91, exactly the baseline. Every consumer of reminder_verbs reads it after a reminder route already exists. A verb that cannot win the route is a verb nobody asks about. The grammar was the whole change.

Lemma matching in isReminderVerb now covers разбудил as well as разбуди, because one lemma holds both. That is the trap cmd/mavend/quiet_toggle.go documents for говори. It is tolerable here and not in the quiet toggle. isReminderVerb runs only on an utterance already routed to reminder, and it decides where the subject starts. A quiet match flips a daemon-wide setting from any channel.