1524991adc
ECOSYSTEM-SPEC §2.6 requires list_attention to distinguish "nothing needs attention" from "I cannot currently tell", and to say so when a source is failed or stale. Maven said the first one unconditionally: ListAttention decoded into []map[string]any, the word degraded appeared nowhere, and an empty list answered "ничего не требует внимания". A Praxis with every source dead read as calm. Two halves, because the spec's mechanism does not exist server-side yet. The deployed Praxis answers /api/v1/tools/attention with a bare array and no envelope, so praxisAttention now decodes either shape and believes a degraded array when one arrives. Until one does, an empty list triggers one read of /api/v1/sources, and anything that is not reporting health "ok" is named instead of the all-clear. Zero sources is the same answer: a Praxis that polls nothing knows nothing, which is the state of this box today. A sources read that fails is deliberately not a hedge. The attention call succeeded, and not being able to ask about health is not evidence of a fault. Both hedges also cover the entity-scoped digest, where a per-entity all-clear is the more convincing of the two. New keys attention_degraded and attention_no_sources, in acts_ru_v1.json and the floor. The fake Praxis serves one healthy source by default, so the existing attention tests still assert an all-clear on purpose rather than by omission.
154 lines
6.5 KiB
JSON
154 lines
6.5 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": ["тут нужны аргументы, из голоса не соберу. угадывать не буду."]
|
|
},
|
|
"act_needs_authed_surface": {
|
|
"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}»."]
|
|
},
|
|
"attention_degraded": {
|
|
"fixed": true,
|
|
"variants": ["за всё не отвечу — источники молчат: {items}."]
|
|
},
|
|
"attention_no_sources": {
|
|
"fixed": true,
|
|
"variants": ["мне пока нечего смотреть — у Praxis нет источников."]
|
|
},
|
|
"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}."]
|
|
}
|
|
}
|
|
}
|