70b32af8a7
V-572. "напомни в 11:00 позвонить маме" answered "Когда?". ReminderGrammar builds its slots by hand and the extractor never ran over a stage 0 decision, so HasTime was false however clearly the hour was spoken, and missingFor read the silence as absence. fillMatchedSlots in internal/router/router.go now runs the stage 2 extractor over every stage 0 decision and fills only what the grammar left empty. A matched value always wins. The LLM path had the same hole and the same fix, so both share one function rather than ten grammars re-implementing extraction. Slots.Text is deliberately not filled. A grammar that left Text empty meant it: agendaQueryBuild hands the query chain the sentence itself. Filling it would also make SlotText unaskable, which is the bug V-383 fixed on the LLM side. Enabled for all ten grammars and inert for nine. Extract fills Time for a reminder, Fn for an act and Key for a fact, and nothing for query, system, note or chat. Benchmarked at 20000x with the real date parser: every stage 0 shape stays inside the noise, and the reminder rule gains, because actionReminder was already running that same parse one layer down. TestONNXBaseline 64/91 before and after, no case regressed. The fixture's own "slots deferred to daemon" line went 6 to 0. On the box: "хорошо, напомню сегодня в 11:00." Conflict in internal/router/router.go resolved by hand: V-564's grammar-outcome note and V-572's slot fill both belong, fill first. Full -race suite green. --no-verify: the pre-commit hook refuses master, and the owner asked for straight-to-master merges for this unattended run.