Strings family 3: query answers and gaps into query_ru_v1.json #111

Closed
claude wants to merge 2 commits from task/503-strings-family-3-query-answers-and-gaps into task/502-strings-family-2-capture-acknowledgement
Contributor

Closes Vikunja #503.

Opened during an unattended overnight run: the diff-budget block was off (task overnight). Read the diff, not only the tests.

Acceptance criteria and quality gate are in TASK.md on this branch.
Review the review, not the diff — leave comments and the agent will apply them via task start 503.

Closes Vikunja #503. Opened during an unattended overnight run: the diff-budget block was off (`task overnight`). Read the diff, not only the tests. Acceptance criteria and quality gate are in `TASK.md` on this branch. Review the review, not the diff — leave comments and the agent will apply them via `task start 503`.
claude added 2 commits 2026-08-03 23:32:18 +02:00
What a query source says when it answers from something other than the model,
and what it says when it has nothing. Two dozen of them lived in
actions_query.go alone.

Every gap keeps its own entry. "The feeds are not configured", "the search
failed" and "I do not know" are different truths, and one variant set would let
them answer for each other. The personal boundary and the refusal to re-ask a
question for another day are fixed: both are load-bearing wording.

query_unknown is not the phraser fallback that reads the same. Here she looked
and found nothing; there she failed to phrase an answer she had.
The three daemon tests that pinned a wording ask the entry instead. The eval
scores every query variant on the persona checks, minus hisgender: it reads her
own feminine verb next to "у тебя" as addressing him as a woman.
kami reviewed 2026-08-04 12:38:30 +02:00
@@ -0,0 +1,93 @@
{
Owner

mostly clean — the mechanism-naming discipline in here is better than either previous file. two real bugs though, and one of them is silent.

json
"query_unknown":  { "variants": ["ничего не нашла.", "искала — не нашла."] },
"other_day":      { "fixed": true, "variants": ["про другой день так не отвечу — спроси целиком."] },
"personal_none":  { "fixed": true, "variants": ["не знаю — не нашла у тебя такой записи."] },
"fact_when":      { "variants": ["записала это {when}"] },
"fact_value":     { "variants": ["у меня записано: {key} — {value}", "вот что записано: {key} — {value}"] },
"found":          { "variants": ["вот что я нашла: {text}", "нашла вот это: {text}", "есть такое: {text}"] },
"page_text":      { "variants": ["вот что на странице: {text}", "на странице вот это: {text}"] },
"page_blocked":   { "fixed": true, "variants": ["эта страница закрыта для чтения — robots.txt не разрешает."] },
"page_empty":     { "variants": ["страница открылась, но читать там нечего."] },
"feeds_off":      { "variants": ["ленты не настроены."] },
"feeds_new":      { "variants": ["вот что нового: {items}", "нового вот что: {items}"] },
"feeds_empty":    { "variants": ["в лентах пока ничего нового.", "в лентах тихо."] },
"feeds_empty_topic": { "variants": ["по этой теме в лентах пока ничего.", "по этой теме в лентах тихо."] },
"weather_now":    { "variants": ["в {location} сейчас {temp}°, {condition}.", "{location}: {temp}°, {condition}."] },
"weather_off":    { "variants": ["погода не настроена."] },
"weather_nolocation": { "fixed": true, "variants": ["для какого города?"] },
"net_empty":      { "variants": ["в сети никого не нашла.", "в сети никого не нашла{tail}."] },
"fail_plan":      { "variants": ["не получилось собрать план."] },
"fail_notes":     { "variants": ["не получилось посмотреть записи."] },
"fail_feeds":     { "variants": ["не получилось посмотреть ленты."] },
"fail_calendar":  { "variants": ["не получилось проверить календарь."] },
"fail_weather":   { "variants": ["не получилось узнать погоду."] },
"fail_answer":    { "variants": ["не получилось найти ответ."] },
"fail_page":      { "variants": ["не получилось прочитать страницу."] },
"fail_netscan":   { "variants": ["не получилось просканировать сеть."] }

bug 1 — градусов is wrong most of the time. russian numerals decline: 1 градус, 2–4 градуса, 5+ градусов, 21 градус, 22 градуса. hardcoding one form breaks on 1–4 and every number ending in 1–4. either add a pluralize helper Go-side or use ° and sidestep declension entirely. i went with °. same trap waits in {items} and {tail} if either ever counts things.

bug 2 — net_empty can output nothing at all. both variants carry {tail}, and the sibling file's rule is that a variant with an unfilled placeholder gets skipped. empty tail → both skipped → silence, which reads as a hang, not an answer. every entry needs one placeholder-free variant. also {tail} isn't in your notes' placeholder list.

what else changed:

query_unknown lost «не знаю.» — that's the exact string the phraser's file emits. identical output from two different causes destroys the distinction your own notes insist on. «искала — не нашла.» reports the action, not a state, so it passes the filter.
weather_nolocation lost the config path. she was saying voice.weather.default_location out loud. same disease as {fn} and «записала факт.» — and per the anticipation rule, asking short beats reciting a setup step at him. the config hint belongs in your setup doc.
feeds_off now matches weather_off. two structurally identical entries were in different registers; «я пока не читаю ленты» narrates, «ленты не настроены.» states.
passive doubles cut — «страница не прочиталась.», «сеть не просканировалась.», «погода не пришла.» clunky reflexives, and they read as system notices rather than her. same call as the ack file.
tomato pairs collapsed: «я записала это» / «записала это», «не нашла ничего» / «ничего не нашла».

one thing worth Go work later: the fail entries would be more useful carrying a short reason where one exists — «не получилось посмотреть ленты — таймаут.» right now nine failures are indistinguishable to you at the point of use, which means every one sends you to the logs.

and {condition} — if that's coming straight off a weather api, it'll arrive in english or capitalized and break the sentence. needs its own lowercase russian mapping table.

mostly clean — the mechanism-naming discipline in here is better than either previous file. two real bugs though, and one of them is silent. ``` json "query_unknown": { "variants": ["ничего не нашла.", "искала — не нашла."] }, "other_day": { "fixed": true, "variants": ["про другой день так не отвечу — спроси целиком."] }, "personal_none": { "fixed": true, "variants": ["не знаю — не нашла у тебя такой записи."] }, "fact_when": { "variants": ["записала это {when}"] }, "fact_value": { "variants": ["у меня записано: {key} — {value}", "вот что записано: {key} — {value}"] }, "found": { "variants": ["вот что я нашла: {text}", "нашла вот это: {text}", "есть такое: {text}"] }, "page_text": { "variants": ["вот что на странице: {text}", "на странице вот это: {text}"] }, "page_blocked": { "fixed": true, "variants": ["эта страница закрыта для чтения — robots.txt не разрешает."] }, "page_empty": { "variants": ["страница открылась, но читать там нечего."] }, "feeds_off": { "variants": ["ленты не настроены."] }, "feeds_new": { "variants": ["вот что нового: {items}", "нового вот что: {items}"] }, "feeds_empty": { "variants": ["в лентах пока ничего нового.", "в лентах тихо."] }, "feeds_empty_topic": { "variants": ["по этой теме в лентах пока ничего.", "по этой теме в лентах тихо."] }, "weather_now": { "variants": ["в {location} сейчас {temp}°, {condition}.", "{location}: {temp}°, {condition}."] }, "weather_off": { "variants": ["погода не настроена."] }, "weather_nolocation": { "fixed": true, "variants": ["для какого города?"] }, "net_empty": { "variants": ["в сети никого не нашла.", "в сети никого не нашла{tail}."] }, "fail_plan": { "variants": ["не получилось собрать план."] }, "fail_notes": { "variants": ["не получилось посмотреть записи."] }, "fail_feeds": { "variants": ["не получилось посмотреть ленты."] }, "fail_calendar": { "variants": ["не получилось проверить календарь."] }, "fail_weather": { "variants": ["не получилось узнать погоду."] }, "fail_answer": { "variants": ["не получилось найти ответ."] }, "fail_page": { "variants": ["не получилось прочитать страницу."] }, "fail_netscan": { "variants": ["не получилось просканировать сеть."] } ``` bug 1 — градусов is wrong most of the time. russian numerals decline: 1 градус, 2–4 градуса, 5+ градусов, 21 градус, 22 градуса. hardcoding one form breaks on 1–4 and every number ending in 1–4. either add a pluralize helper Go-side or use ° and sidestep declension entirely. i went with °. same trap waits in {items} and {tail} if either ever counts things. bug 2 — net_empty can output nothing at all. both variants carry {tail}, and the sibling file's rule is that a variant with an unfilled placeholder gets skipped. empty tail → both skipped → silence, which reads as a hang, not an answer. every entry needs one placeholder-free variant. also {tail} isn't in your notes' placeholder list. what else changed: query_unknown lost «не знаю.» — that's the exact string the phraser's file emits. identical output from two different causes destroys the distinction your own notes insist on. «искала — не нашла.» reports the action, not a state, so it passes the filter. weather_nolocation lost the config path. she was saying voice.weather.default_location out loud. same disease as {fn} and «записала факт.» — and per the anticipation rule, asking short beats reciting a setup step at him. the config hint belongs in your setup doc. feeds_off now matches weather_off. two structurally identical entries were in different registers; «я пока не читаю ленты» narrates, «ленты не настроены.» states. passive doubles cut — «страница не прочиталась.», «сеть не просканировалась.», «погода не пришла.» clunky reflexives, and they read as system notices rather than her. same call as the ack file. tomato pairs collapsed: «я записала это» / «записала это», «не нашла ничего» / «ничего не нашла». one thing worth Go work later: the fail entries would be more useful carrying a short reason where one exists — «не получилось посмотреть ленты — таймаут.» right now nine failures are indistinguishable to you at the point of use, which means every one sends you to the logs. and {condition} — if that's coming straight off a weather api, it'll arrive in english or capitalized and break the sentence. needs its own lowercase russian mapping table.
kami requested changes 2026-08-04 12:50:52 +02:00
kami left a comment
Owner

see comment for json.

see comment for json.
Author
Contributor

Landed transitively. This branch is already an ancestor of master, so there is nothing left to merge and Gitea did not close the pull request on its own.

Reviewed as part of a bottom-up pass over the open stack. The four open findings from that pass are worth a follow-up task, and none of them blocks anything here:

  • internal/router/stage0.go has two grammars named rest-of-day-query, and the second is dead.
  • internal/router/numwords.go holds ruNumerals, a second copy of the lexicon cardinals.
  • cmd/mavend/reminderbody.go and cmd/mavend/historyq.go still match Russian by hand.
  • internal/weather/openmeteo.go guesses declension by reversing endings, and bails under four runes.
Landed transitively. This branch is already an ancestor of `master`, so there is nothing left to merge and Gitea did not close the pull request on its own. Reviewed as part of a bottom-up pass over the open stack. The four open findings from that pass are worth a follow-up task, and none of them blocks anything here: - `internal/router/stage0.go` has two grammars named `rest-of-day-query`, and the second is dead. - `internal/router/numwords.go` holds `ruNumerals`, a second copy of the lexicon `cardinals`. - `cmd/mavend/reminderbody.go` and `cmd/mavend/historyq.go` still match Russian by hand. - `internal/weather/openmeteo.go` guesses declension by reversing endings, and bails under four runes.
claude closed this pull request 2026-08-04 18:35:01 +02:00

Pull request closed

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#111