From ba1d8e3f44b52efd44564baaeeea59b557ac24af Mon Sep 17 00:00:00 2001 From: kami Date: Sat, 1 Aug 2026 21:35:58 +0400 Subject: [PATCH] quiet: the noun form and the comparative are commands too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pre-route toggle knew "тихий режим" and every negation of it, but not the two phrasings that get spoken most: "включи режим тишины" (the setting named as a noun) and "сделай потише". Both fell through to the router, which has no quiet intent, so the command did nothing at all. Adds those as stem pairs, plus a quietWordStems list so the negated-but-unmatched fallback recognises "хватит тишины" the way it already recognised "хватит тихого режима". Locks the English phrasings from the routing fixture in the test table ("turn quiet mode back on", "turn off quiet mode", "stop quiet mode") — all three already behaved, none were covered. "на улице стало потише" and "в тишине лучше думается" stay inert: a single-word pattern still only matches a single-word utterance. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01TrVSBKe3RFDF4fGYKWYQnX --- cmd/mavend/quiet_toggle.go | 19 ++++++++++++++++--- cmd/mavend/quiet_toggle_test.go | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/cmd/mavend/quiet_toggle.go b/cmd/mavend/quiet_toggle.go index 13979cf..1bbd922 100644 --- a/cmd/mavend/quiet_toggle.go +++ b/cmd/mavend/quiet_toggle.go @@ -133,10 +133,21 @@ var ( quietOnPhrases = [][]string{ {"quiet", "on"}, {"quiet", "mode"}, {"тих", "режим"}, {"не", "шум"}, {"не", "беспоко"}, - {"тих"}, + // The noun form and the comparative. "режим тишины" is how the + // setting is named half the time, and "сделай потише" is how it is + // actually asked for out loud. Both used to fall through to the + // router, which has no quiet intent, so the command did nothing. + {"режим", "тишин"}, {"сделай", "тише"}, {"сделай", "потише"}, + {"говори", "тише"}, {"будь", "потише"}, + {"тих"}, {"потише"}, } ) +// quietWordStems — every stem that names the setting. Used by the +// negated-but-unmatched fallback in classifyQuietToggle, which has to +// recognise "хватит тишины" without an ON phrase having matched. +var quietWordStems = []string{"тих", "тишин", "потише"} + // quietNegatorWords — negators that are whole words with no useful stem. var quietNegatorWords = map[string]bool{ "не": true, "нет": true, "хватит": true, "no": true, "not": true, "off": true, @@ -197,8 +208,10 @@ func classifyQuietToggle(text string) (on, off bool) { // on after he asked for it to stop. if quietNegated(tokens, nil) { for _, t := range tokens { - if quietStem(t, "тих") { - return false, true + for _, stem := range quietWordStems { + if quietStem(t, stem) { + return false, true + } } } } diff --git a/cmd/mavend/quiet_toggle_test.go b/cmd/mavend/quiet_toggle_test.go index c450b95..c754fcc 100644 --- a/cmd/mavend/quiet_toggle_test.go +++ b/cmd/mavend/quiet_toggle_test.go @@ -47,6 +47,15 @@ func TestResolveQuietToggle(t *testing.T) { {"побудь в тихом режиме", quietOn}, {"Тихий Режим!", quietOn}, {"тихая", quietOn}, + // The noun form and the comparative. + {"включи режим тишины", quietOn}, + {"режим тишины", quietOn}, + {"сделай потише", quietOn}, + {"сделай тише", quietOn}, + {"потише", quietOn}, + // English, as the fixture phrases it. + {"turn quiet mode back on", quietOn}, + {"enable quiet mode", quietOn}, // OFF vocabulary — all seven, incl. the three that used to say ON. {"quiet off", quietOff}, @@ -60,6 +69,12 @@ func TestResolveQuietToggle(t *testing.T) { {"выключи тихий режим", quietOff}, {"отмени тихий режим пожалуйста", quietOff}, {"верни громкий режим", quietOff}, + {"выключи режим тишины", quietOff}, + {"хватит тишины", quietOff}, + {"turn off quiet mode", quietOff}, + {"quiet mode off", quietOff}, + {"stop quiet mode", quietOff}, + {"disable quiet mode", quietOff}, // False positives: "тихо"/"тихий" as ordinary Russian. {"очень тихий сегодня день", quietNone}, @@ -68,6 +83,8 @@ func TestResolveQuietToggle(t *testing.T) { {"потихоньку", quietNone}, {"тихонько", quietNone}, {"он говорил тихим голосом весь вечер", quietNone}, + {"в тишине лучше думается", quietNone}, + {"на улице стало потише", quietNone}, // Unrelated. {"напомни завтра позвонить маме", quietNone},