a spoken status change reaches the board at stage 0 (V-512)
Step 4 of the board build (docs/plans/15-board-surface.md). Naming a task instead of its position reached nothing: "закрой задачу купить молоко" routed act, found no allowlisted fn, and the gate asked "Что сделать?". The position path already worked through resolveCandidate, but only in the two turns after she read the list out. TaskStatusGrammar is the same shape TaskCaptureGrammar uses — matches broadly, decides in Build, no eighth intent — and fills the fn slot with task_status, which is neither a Hexis capability nor a Praxis one. Three conditions, all required: the board noun, so no ordinary sentence claims a turn; exactly one status class, since "готово, убери" names two and asking beats picking; and a status word matched as an imperative exactly or a stative by lemma. So a bare "готово" and a bare "закрой" are not this rule's, and the second belongs to Praxis, which claims it already. Two lexicon sets rather than one with a value. The store records which of the two transitions happened and /tasks shows it: work he chose to stop is not work he did. Measured on the fixture, two new cases (ru-act-020, ru-act-021). Classifier + ONNX 62/89 (69.7%) → 64/91 (70.3%); cascade+llm 67/89 (75.3%) → 69/91 (75.8%, 80.2% intent-only) at p50 1.225s. Both new cases claimed at stage 0, no case regressed, clarify counts unchanged at 3 false / 1 missed. The task's own warning stands: every such grammar runs its parser ahead of the resident model on every turn, so this is the last one that is free. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SoL7EBdYC5Mhz3DJd49GJy
This commit is contained in:
@@ -400,6 +400,10 @@ func buildRouter(emb router.Embedder, acts router.ActMatcher, threshold float64,
|
||||
// explicit capture marker beats the model, which called it an act and
|
||||
// rewrote the task text (Vikunja #467). After the rules above because a
|
||||
// marker never collides with a clock or agenda question.
|
||||
// After Praxis, whose bare "закрой" claim this rule cannot reach (it needs the
|
||||
// board noun), and before the capture marker, which would otherwise read
|
||||
// "убери из задач купить молоко" as a new task (Vikunja #512).
|
||||
grammars = append(grammars, router.TaskStatusGrammar())
|
||||
grammars = append(grammars, router.TaskCaptureGrammar())
|
||||
// After the capture marker, so "запиши" still wins over "расскажи", and
|
||||
// last overall because it matches on the first word alone: "расскажи про
|
||||
|
||||
Reference in New Issue
Block a user