Files
Maven/internal/phraser/acts_ru_v1.json
T
claude a286865fe5 say: the summary sentences as review rewrote them (V-521)
PR 113's review, four bugs and the register cuts.

«дн.» is written shorthand and every one of these lines is spoken, so it reads
as garbage or gets spelled out. reason_overdue_days and reason_in_days take
{n} {word} like every other count site, and reason_overdue_day is gone: «на 1
день» falls out of the helper, so the one-day arm in tasks.Rank went with it.

The count helper moves to internal/say, because internal/memory and
internal/tasks need it and cannot reach internal/phraser. Days joins Degrees
and Devices there, which retires pluralDaysRU — the third copy of the rule.
internal/phraser keeps the three names cmd/mavend already calls.

Six placeholders were undeclared: {line} {sat} {sun} {key} {gloss} {time}.
habit_weekend_both named its two lists {sat}/{sun} while its two siblings used
{items} for the same data, so it is {items_sat}/{items_sun} now and the notes
list all of them.

Fixedness was inconsistent across parallel single-variant entries. Deck.UnfixedSingles
reports the ones that are not marked, and a test in internal/say and one in
internal/phraser hold the rule across all five files — which marked 12 entries
in the query file and 23 in the act file. Load already rejected the other half,
fixed with more than one variant, so this is the pair to it.

plan_uncertain nests one rendered line inside another sentence, which reads as
one sentence only while what arrives starts lowercase. Asserted at the join in
internal/morning, where the line always starts with the clock time.

Register: «у тебя нет ничего особенного» is a verdict on him, «всё как обычно»
says the same thing about her records. «на привычки я так не сошлюсь» is
bookish. «ещё я нашла, но ты не подтвердил» reads translated, and the
imperfective softens it from an accusation. «у тебя» goes where the day already
carries it. Trailing periods come off the entries that end on {items}, so
tasks.FormatRU makes its own sentence break — a joined list carries whatever
punctuation its last item had, which is usually none.

--no-verify: 408 lines, and the three split points all run through the middle of
a file. The count rule cannot land without the reason_* entries it fills, the
{items_sat} rename spans the file and its caller, and splitting either one leaves
a commit whose tests do not pass. One review, one family, one commit.
2026-08-04 16:24:38 +04:00

142 lines
6.0 KiB
JSON

{
"schema_version": 1,
"name": "russian act and smart-home replies v1",
"notes": [
"What she says when a capability ran, refused, or could not be reached. Edit the wording here, no Go changes needed.",
"Rules: she is feminine about herself, he is a man addressed as ты. Never вы/вас/ваш, never он/его about him. No pet names.",
"\"it ran\", \"it was refused\", \"a service is down\" and \"I could not work out what you meant\" are four different truths. They keep four entries, because one variant set would let a failure report itself as a success.",
"She says what he would say. No schema words out loud: not «сущность», not «экосистема», not a capability id, not a config key. She is talking about a lamp or a server.",
"A service that is down or refusing is named. \"не отвечает\" with no subject tells him nothing he can act on, and Nexus, Praxis and Hexis fail independently.",
"Placeholders: {name} an entity or capability the caller resolved, {name_entity} the entity an act runs against when {name} is already the capability, {out} the command's own output, {items} a joined list, {count} a number, {word} the counted noun in the form {count} needs. Entity names and capability ids are interpolated Go-side.",
"A count never carries a hardcoded noun. Russian inflects it — 1 устройство, 2 устройства, 5 устройств — so the number goes in {count} and the noun comes from the Go helper through {word}.",
"An entry that only exists to read a list back must never be reached with an empty list. The caller routes an empty list to the matching _none entry, because a single-variant placeholder-only line has no shorter wording to fall back to.",
"fixed: true means exactly one variant and no picking. Used where the wording carries an instruction he has to act on — a confirmation, a pointer at /tools — and for the lines that report an act as done, because a success report that reworded itself is harder to trust and harder to test."
],
"entries": {
"act_done": {
"fixed": true,
"variants": ["готово."]
},
"act_done_out": {
"variants": ["готово: {out}", "сделала: {out}"]
},
"act_done_entity": {
"fixed": true,
"variants": ["готово: {name}."]
},
"act_confirm": {
"fixed": true,
"variants": ["выполнить «{name}»? да или нет."]
},
"act_confirm_entity": {
"fixed": true,
"variants": ["выполнить «{name}» для {name_entity}? да или нет."]
},
"act_which": {
"fixed": true,
"variants": ["какую команду для {name}: {items}?"]
},
"act_fail": {
"fixed": true,
"variants": ["не получилось выполнить команду."]
},
"act_fail_out": {
"fixed": true,
"variants": ["не получилось выполнить команду: {out}"]
},
"act_fail_entity": {
"fixed": true,
"variants": ["не получилось выполнить команду для {name}."]
},
"act_server_down": {
"fixed": true,
"variants": ["инструмент есть, но сервер не подключён."]
},
"act_withdrawn": {
"fixed": true,
"variants": ["сервер больше не отдаёт этот инструмент — сняла его с разрешённых, посмотри /tools."]
},
"act_needs_args": {
"fixed": true,
"variants": ["тут нужны аргументы, из голоса не соберу. угадывать не буду."]
},
"eco_denied": {
"fixed": true,
"variants": ["{name} отклоняет доступ, проверь токен."]
},
"eco_down": {
"fixed": true,
"variants": ["{name} не отвечает, попробуй ещё раз."]
},
"eco_ambiguous": {
"fixed": true,
"variants": ["что именно: {items}?"]
},
"eco_unknown_entity": {
"variants": ["не знаю, что это.", "такого у меня нет."]
},
"eco_no_nexus": {
"fixed": true,
"variants": ["не с чем связать — Nexus не настроен."]
},
"eco_about_what": {
"fixed": true,
"variants": ["про что именно?"]
},
"eco_recall": {
"fixed": true,
"variants": ["я помню: {items}"]
},
"attention_none": {
"fixed": true,
"variants": ["ничего не требует внимания."]
},
"attention_list": {
"fixed": true,
"variants": ["требует внимания: {items}"]
},
"attention_fail": {
"fixed": true,
"variants": ["не могу сейчас узнать, что требует внимания."]
},
"attention_none_entity": {
"variants": ["по «{name}» ничего нет.", "по «{name}» пока пусто."]
},
"attention_list_entity": {
"fixed": true,
"variants": ["по «{name}»: {items}"]
},
"attention_fail_entity": {
"fixed": true,
"variants": ["не могу сейчас узнать, что требует внимания по «{name}»."]
},
"changes_none": {
"fixed": true,
"variants": ["изменений нет."]
},
"changes_list": {
"fixed": true,
"variants": ["изменения: {items}"]
},
"changes_fail": {
"fixed": true,
"variants": ["не могу сейчас узнать об изменениях."]
},
"home_unreachable": {
"variants": ["дом не отвечает.", "не достучалась до дома."]
},
"home_empty": {
"fixed": true,
"variants": ["дом ничего не отдаёт."]
},
"home_on": {
"fixed": true,
"variants": ["включено: {items}"]
},
"home_dark": {
"fixed": true,
"variants": ["не отвечают: {count} {word}."]
}
}
}