continuation: only an ellipsis may widen the keyword match

Deployed check, second round: "привет" after "какой сегодня день" answered
with the date. followUpMerge fills an empty Text from the previous
same-intent turn, so the topic-widening added a minute earlier was reading
an inherited topic on turns that had nothing to do with it.

Decision gains Continued, set only by continuation.go and never by the
router. replySystem widens on that and nothing else, so an inherited Text
is back to being invisible.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TrVSBKe3RFDF4fGYKWYQnX
This commit is contained in:
kami
2026-08-01 22:21:28 +04:00
parent 53616836db
commit 3f98a99f44
4 changed files with 39 additions and 3 deletions
+22
View File
@@ -116,3 +116,25 @@ func TestContinuationCarriesTheTopic(t *testing.T) {
t.Fatalf("Slots.Text = %q, want the previous turn's topic", dec.Slots.Text)
}
}
// TestReplySystemIgnoresAnInheritedTopic — the regression the deployed daemon
// showed on 01-08-2026: followUpMerge fills an empty Text from the previous
// same-intent turn, so a plain "привет" after "какой сегодня день" arrived at
// replySystem carrying the old topic and was answered with the date. Only a
// continuation may widen the keyword match.
func TestReplySystemIgnoresAnInheritedTopic(t *testing.T) {
h := &reactiveHandler{now: func() time.Time { return contNow }}
inherited := router.Decision{
Utterance: "привет",
Intent: router.IntentSystem,
Slots: router.Slots{Text: "какой сегодня день"},
}
if got := h.replySystem(nil, inherited); got != "пока не умею отвечать на этот вопрос." {
t.Fatalf("replySystem answered %q on an inherited topic", got)
}
cont := inherited
cont.Utterance, cont.Continued = "а завтра?", true
if got := h.replySystem(nil, cont); got == "пока не умею отвечать на этот вопрос." {
t.Fatalf("replySystem refused a real continuation")
}
}