From 4d98c6ae89a03bf48a5d544dcb30a580bc759384 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Fri, 18 Sep 2026 00:05:25 +0600 Subject: [PATCH] =?UTF-8?q?zont:=20=D0=BA=D1=80=D1=83=D0=B3=D0=B8=2047-48?= =?UTF-8?q?=20=E2=80=94=20call=5Fsub,=20send=5Fsms,=20end->exit=20(HEAD=20?= =?UTF-8?q?9c83651)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- personal/projects/zont-config-compiler.md | 89 ++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/personal/projects/zont-config-compiler.md b/personal/projects/zont-config-compiler.md index 664f53fb..f74493e2 100644 --- a/personal/projects/zont-config-compiler.md +++ b/personal/projects/zont-config-compiler.md @@ -3159,7 +3159,28 @@ Alex прочитал `git show --stat ba6ef44` (2 файла, 10 строк) и принята и живёт в 15 других местах артефакта. Прежде чем оставлять `raw` — `grep` принятую форму у соседей (ср. §10.1 круг 16, питфолл 73). -### 21.1. ✅ Круг 37 (ФИНАЛ) — `unresolved` ПЕРЕИМЕНОВАН в `end` +### 21.1. ✅ Круг 37 → ПЕРЕИМЕНОВАНО в круг 48 — `unresolved` → `end` → **`exit`** + +Битая ссылка (id есть в поле 2 сценария, строки `#Z=` в конфиге нет) сначала звалась +`unresolved` («неразрешённый объект»), в круге 37 переименована в `end`, в круге 48 (Alex: +*«или `- exit`»*) — в **`exit: true`**. Итоговая форма: + +```yaml + then: + - id: 10441 + log: then-text + - id: 10442 + exit: true +``` + +🔴 **`id` обязателен и при `exit`:** без него ссылку не вернуть в поле 2 сценария — +`- exit` без id ломает round-trip (Alex: *«а, ей id еще нужен.. блин»*). + +| Точка | Было | Стало | +|---|---|---| +| Декодер, 4 точки (`dump_leaf`, `dump_condition`, `dump_step`, `flat_steps`) | `{'id': N, 'end': True}` | `{'id': N, 'exit': True}` | +| Артефакт: `10442`, `10446`, `8601` | `end: true` | `exit: true` | +| Энкодер, 2 чтения | `node.get('end')` | `node.get('exit') or node.get('end')` (старое имя принято для совместимости) | **«unresolved - конец сценария»** — битая ссылка прибора это **конец сценария**, а не «неразрешённый объект». Ключ `unresolved` отвергнут, принят **`end`**. @@ -3847,3 +3868,69 @@ relay_commands: - авто-id (`_resolve_id` + аллокатор `max+1`, 17 точек) — план есть, код не написан; - push `75f46f3` в Gitea — по команде. +--- + +## 28. ✅ Круги 47-48 (2026-09-18) — `call_sub`, `send_sms`, `exit` + +**HEAD после кругов: `9c83651`.** Круг **9/9 зелёный, 759 → 759**. + +### 28.1. Круг 47 — голый id и raw-алиас в шагах + +Alex показал два места как мусор: + +```yaml + - id: 11109 + - id: 8195 + raw: *id002 +``` + +| Что | Разбор | Форма | +|---|---|---| +| `11109` | тип **11** — вызов другого сценария; своего тела у ссылки нет | `- call_sub: 11109` | +| `8195` | тип **3** — SMS; тело живёт в секции `sms_notifications` под тем же id | `- send_sms: 8195` | + +🔴 **Причина `raw: *id002`:** шаг печатался `raw`-телом, а PyYAML, увидев **тот же самый +Python-объект-список** в секции и в шаге, подставил якорь `&id002` и алиас `*id002`. +Читается как обрывок. Лечение — ссылка-действие вместо тела. + +Проверено: других таких мест в дампе нет (голых id в шагах — 1, raw-тел — 1). +Остался один алиас `*id001` (`mqtt_topics[8283].sensors` ↔ его же `raw[3]`) — это связь +**внутри одного объекта**, не обрывок; оставлен как есть. + +Реализация: декодер — ветки `t == 11` и `t == 3` в `dump_step`; энкодер — приём ключей +`call_sub`/`send_sms` в `emit_step` (до `sid = step.get('id')`, у этих узлов своего `id` нет). + +### 28.2. Круг 48 — `end` → `exit` + +Alex: *«`end: true` — по-другому ваще ника?»*, затем *«или `- exit`»*. Принято **`exit: true`**. + +```yaml + then: + - id: 10441 + log: then-text + - id: 10442 + exit: true +``` + +🔴 **`id` обязателен:** `- exit` без id ломает round-trip (ссылка не вернётся в поле 2). +Alex: *«а, ей id еще нужен.. блин»*. + +### 28.3. 🔴 ПИТФОЛЛ 98 — имя пометки задаёт Alex, мои варианты — только повод + +«`end` → `missing` / `orphan` / голый id» — Alex не принял ни один; дал **своё** слово `exit`. +Спрашивать «как назвать» одним сообщением с 2–3 вариантами (не раунд за раундом), принимать +его слово как финальное, не защищать свой выбор. + +### 28.4. 🔴 ПИТФОЛЛ 99 — «по-другому ваще ника?» = «покажи, что нельзя» ≠ приказ менять + +Вопрос про `end` был про **странность формы**, не команда переименовать. Пока форма объяснена +(«id обязателен, иначе round-trip ломается») — Alex решает сам. После его «пусть будет» — +править сразу, в тот же заход. + +### 28.5. Открыто после круга 48 + +- 5 `objcmd`-орфанов (`8669`, `8382`, `11907` и др.); +- поле 4 = `2` у `expr` (`10077`–`10085`); +- авто-id (план есть, код не написан); +- push `9c83651` в Gitea — по команде. +