Commit Graph

4 Commits

Author SHA1 Message Date
claude 9ed259660d the suspend contract, and the row that was waiting for it (V-561)
The parseable twin of the owner's transcript goes green and loses its skip: Rome
is answered, the question survives the side query on the same attempt, and the
answer after it completes the reminder he actually asked for.

His transcript verbatim stays skipped, and V-561 was never going to unskip it.
What is left there is the parser — StubDateTimeParser reads neither "на 9" nor
"на завтра", so the third turn lands as an answer that filled nothing. The skip
reason now names V-543 and V-562 instead of this task.

Two V-560 tests asserted the drop notice and now assert the suspend: nothing
says a request was let go, the reply ends with the resumed question, and the
parked question is still there on attempt 1 with what it was about intact.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 01:23:37 +04:00
kami 214a4032cf Tell him when an expired clarify question is dropped
Vikunja #382. A parked clarifying question past its TTL was discarded
silently on read; now she says the old request is gone and the newly
spoken words are still routed as a fresh utterance.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CGeSZxh1DCtRxmFVSYVGvJ
2026-07-31 12:51:47 +04:00
kami 62d320f93a Let her ask three times, and let a restated answer win
MaxAttempts was 1, justified as "not a nag". Wrong reading: "not a nag" is about
interrupting unprompted, and a clarifying question is part of a conversation he
started. Now three, configurable via voice.clarify_max_attempts (default 3).
Three, because after that the likely problem is she misheard the whole request,
not one slot.

Answer used to keep the parked value, so "в три" then "нет, в пять" threw the
five away. Now a value the answer carries wins for the slot she asked about.
Only for the clarify answer — a correction in a fresh turn is followUpMerge.

The eight-field chained assertion in the Answer test is one DeepEqual now, so a
new field in Slots is covered without touching the test.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CGeSZxh1DCtRxmFVSYVGvJ
2026-07-31 12:31:46 +04:00
kami 39d83a33e8 Add the pending-question data layer for slot clarification
PendingQuestion plus ClarifyStore: same shape, locking and expiry as SessionStore. Answer fills only the missing slots and never overwrites a filled one. No wiring yet — TODOs mark the daemon hooks.
Reviewer: MaxAttempts is 1 on purpose (Maven asks once, she is not a nag).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CGeSZxh1DCtRxmFVSYVGvJ
2026-07-31 02:13:48 +04:00