Cancel a reminder by voice, and honour a refusal (V-719)
reminder_cancel.go is a stateful pre-route resolver ahead of a parked clarification and the statistical cascade. It accepts only an addressed command-position imperative plus the reminder or alarm noun, so questions, reported speech, past-tense reports and prohibitions establish no mutation authority. Subject terms keep negation and quantity, and a parsed time passes the same resolved-hour gate as capture. One match cancels through the typed IPC method. Several are stored as session candidates in the spoken order, capped at five, and only a whole affirmative ordinal consumes that list: re-querying on the follow-up would let a state change move the ordinal underneath him. No match, an unread time, a spent ordinal and an ambiguous delivery result are all explicit no-ops. command_prohibition.go is the first mutation boundary in a turn. A direct prohibition clears the three confirmation slots under their shared mutex, so a later bare "да" cannot revive authority he has just revoked. A parked clarify question is not authority and survives, suspended and repeated. refusesCommand is the same belt at the executor entry points, checked against the original utterance so a model rewriting Slots.Text cannot get around it. The rung is named in preRouteLadder, so /trace records whether it won or declined on every surface. --no-verify: master is the working branch this session by the owner's call. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -65,6 +65,36 @@ func TestSelfSourceAnswersFromTheDescription(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// V-720: asking how to operate Maven is never a third-party web-search query.
|
||||
func TestMavenHowToAnswersLocallyWithoutSearch(t *testing.T) {
|
||||
for _, testCase := range []struct {
|
||||
utterance string
|
||||
want string
|
||||
}{
|
||||
{"как отменить напоминание про молоко?", "отмени напоминание"},
|
||||
{"как отменить задачу настроить бэкапы?", "убери из задач"},
|
||||
{"можно ли отменить напоминание?", "отмени напоминание"},
|
||||
{"can I cancel a reminder?", "отмени напоминание"},
|
||||
{"could I cancel a task?", "убери из задач"},
|
||||
} {
|
||||
h, seen := searchHandler(t,
|
||||
`{"answers":["Инструкция стороннего приложения"],"results":[]}`,
|
||||
200)
|
||||
reply := h.actionQuery(context.Background(), router.Decision{
|
||||
Intent: router.IntentQuery,
|
||||
Utterance: testCase.utterance,
|
||||
Source: router.SourceSelf,
|
||||
SourceAnchored: true,
|
||||
})
|
||||
if !strings.Contains(reply, testCase.want) {
|
||||
t.Errorf("%q reply = %q, want local usage example containing %q", testCase.utterance, reply, testCase.want)
|
||||
}
|
||||
if *seen != "" {
|
||||
t.Errorf("%q leaked to search as %q", testCase.utterance, *seen)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestSelfDescriptionHoldsThePersona — it is her own text and she reads it out,
|
||||
// so the same rules the phrasing eval enforces apply to it. Feminine
|
||||
// self-reference, informal address, no pet names.
|
||||
|
||||
Reference in New Issue
Block a user