Voice cannot accept a routine (V-367); the last three prompts are Russian (V-404) #89

Merged
kami merged 2 commits from fix/367-voice-parks-routine-accept into master 2026-08-02 11:39:16 +02:00
Contributor

Closes Vikunja #367 and #404. Two small, independent fixes found while sweeping the backlog.

#367 — voice was over-privileged. Accepting a proposed routine gives the tick loop a standing new reason to speak. DESIGN.md § "surface caps authority" puts that at layer 3 and says voice is structurally incapable of layer 3, because a room mic is reachable by anyone present. The /routines button was gated at step-up; the voice path accepted outright, so the two surfaces disagreed. A spoken "да" now leaves the row proposed and points at /routines. A spoken "нет" still dismisses — declining does not move the boundary outward. Two tests lock both halves.

#404 — three pieces of English prose left over from #400. PhraseReminder's user prompt was fully English and is Russian now, without restating the JSON contract or the persona rules that nudgeSystem already carries. querySystemPrompt and router.KnowledgePrompt had their trailing Respond ONLY with valid JSON: translated; the JSON skeleton itself is untouched. Kept rather than deleted because the GBNF grammar is switchable off.

make test passes.

Closes Vikunja #367 and #404. Two small, independent fixes found while sweeping the backlog. **#367 — voice was over-privileged.** Accepting a proposed routine gives the tick loop a standing new reason to speak. DESIGN.md § "surface caps authority" puts that at layer 3 and says voice is structurally incapable of layer 3, because a room mic is reachable by anyone present. The `/routines` button was gated at step-up; the voice path accepted outright, so the two surfaces disagreed. A spoken "да" now leaves the row `proposed` and points at `/routines`. A spoken "нет" still dismisses — declining does not move the boundary outward. Two tests lock both halves. **#404 — three pieces of English prose left over from #400.** `PhraseReminder`'s user prompt was fully English and is Russian now, without restating the JSON contract or the persona rules that `nudgeSystem` already carries. `querySystemPrompt` and `router.KnowledgePrompt` had their trailing `Respond ONLY with valid JSON:` translated; the JSON skeleton itself is untouched. Kept rather than deleted because the GBNF grammar is switchable off. `make test` passes.
claude added 2 commits 2026-08-02 08:03:28 +02:00
Accepting a proposed routine gives the tick loop a standing new reason to
speak. DESIGN.md § "surface caps authority" puts that at layer 3, and says
voice is structurally incapable of layer 3 because a room mic is reachable
by anyone in the room. The /routines button was gated at step-up; the voice
path accepted outright. The two surfaces disagreed, so one of them was wrong.

A spoken "да" now leaves the row 'proposed' and sends him to /routines,
where the gated button is. A spoken "нет" still dismisses: declining does
not move the boundary outward, so voice keeps it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CotYKycuio1GwLbYh9jfc
#400 rewrote the chat and query prompts in Russian and left three pieces
of English prose behind.

PhraseReminder's user prompt was fully English. It is Russian now, and it
no longer restates the JSON contract or the persona rules: the call goes
through chat(), so nudgeSystem already states both, and a second copy of a
contract is one more thing that can drift out of step with the first.

querySystemPrompt and router.KnowledgePrompt both closed with the English
"Respond ONLY with valid JSON:". That sentence is prose instruction, not
wire format — the JSON skeleton after it is the wire format, and it is
unchanged. Kept rather than deleted: the GBNF grammar makes it close to
redundant, but the grammar is switchable off (phraser NoGrammar), and the
sentence is the floor when it is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CotYKycuio1GwLbYh9jfc
Owner

good to merge.

good to merge.
kami merged commit 92d2629001 into master 2026-08-02 11:39:16 +02:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kami/Maven#89