0ade0ec734
read_only was the whole decision on the Hexis act path, which flattened three answers into two. A capability that wipes the thing it names got the same single spoken "да" as one that restarts a service, and requires_confirmation — which the Hexis contract calls server-derived and never settable by a caller — was read by nobody. docs/ecosystem.md §17.3 says confirmation follows risk. RiskOfCapability reads Hexis's risk, read_only and requires_confirmation and returns one of the three tiers internal/tool already had. It takes plain values rather than a Capability, so internal/tool keeps no dependency on the Hexis client. RiskOf keeps deriving, because a shell row the owner ticked on /tools has no upstream to ask. Every disagreement between the three fields goes up, never down: safe and mutating is a contradiction and takes the confirm, an unrecognised tier takes the confirm, and requires_confirmation may only raise. Same default as an unrecognised dispatch shape — argue your way down, never up. The irreversible refusal was a Go literal in two places and is now one deck entry, act_needs_authed_surface. It lost four words to the persona ceiling.
146 lines
6.2 KiB
JSON
146 lines
6.2 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}»."]
|
|
},
|
|
"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}."]
|
|
}
|
|
}
|
|
}
|