diff --git a/personal/projects/zont-config-compiler.md b/personal/projects/zont-config-compiler.md index b778d8ce..bb8ef532 100644 --- a/personal/projects/zont-config-compiler.md +++ b/personal/projects/zont-config-compiler.md @@ -28,6 +28,9 @@ aliases: - ZONT pickle_value - ZONT операнды условия 47 - ZONT расписание trigger + - ZONT unresolved снят + - ZONT битая ссылка id + - ZONT from отменён related: - '[[family/tech/zont-api]]' - '[[family/how-to/home-automation]]' @@ -1945,7 +1948,7 @@ ORDER BY m.date_sent;" | `_script_value(oid)` | парсер, внутри `build_yaml` | тело 59 → `{type: objstate\|expr\|const\|var, …}`; незнакомое → None | | `_set_var_target_body(target)` | парсер | объект 49 → `{type: param, object, event\|param}`; 50 → `{type: time_condition, op, time}` \| `{type: days_mask, days}` | | `_parse_script_raw(row)` | энкодер | обратный разбор `raw`-строки 59 (для объектов из `raw`-секций) | -| `_script_value_row(node, aid)` | энкодер | собрать строку 59 из полей; `pickle_value`→`'N ;#p'`, `expr`→`'expr "%0 + %1"'`, `objstate`→`'objstate N 0 0'`, `var`→`'set <имя>'` + поле 2 из **`from`** | +| `_script_value_row(node, aid)` | энкодер | собрать строку 59 из полей; `pickle_value`→`'N ;#p'`, `expr`→`'expr "%0 + %1"'`, `objstate`→`'objstate N 0 0'`, `var`→`'set <имя>'` + поле 2 = **`0`** (в YAML не раскрывается, §17) | | `_set_var_target_row(sv, aid)` | энкодер | 49/50 из полей; `event`/`param` → код по типу владельца | | `_set_var_body(node, aid)` | энкодер | `set_var` → строка 59 + регистрация тела цели своей строкой | | `_body_type(obj_id)` + `_collect_ids` | энкодер | id → тип по всем секциям YAML (включая вложенные `executors.*`) | @@ -2830,52 +2833,6 @@ Alex: «`unresolved: true` / але блядь!!!!» — трижды за се **⏳ Открыто:** форма `objcmd` (§13 п.2) · имя поля 4 = `2` у `expr` (§13 п.10) · push в Gitea · 5 орфанов-операндов `objcmd`. -### 19.5. Состояние после круга 36 (ФИНАЛ) - -| Проверка | Результат | -|---|---| -| Круг по **9** конфигам | **✅ 9/9 чисто** — `598→598`, `660→660`, `661→661` ×5, `749→749`, `757→757`, потеряно 0, лишнее 0 | -| `trigger:` с `raw:` | раскрыт: `type: days_mask` + `days` | -| Орфаны с `raw` = `puts`/`storeev` | **0** — раскрыты в `log` / `storeenv` | -| Орфанов всего | **5** (было 27): `10030`, `10031`, `10035` (тип 49, одиночные) + `10032` (expr) — все висят на `objcmd`, который ещё не разбирается | -| `unresolved: true` | **0 вхождений** — снято коммитом `ba6ef44` (§19.7) | -| Коммиты | **`ba6ef44`** · **`0cbbeb8`** · `2007771` · `0c4b9a6` · `16ec710` · `375d01a` · `07c076f` — push **не делался** | -| Файл на диске | `zont_config/config_local_2026-09-17_22-26-26.yml` | -| HEAD | **`ba6ef44`**, не запушен | - -### 19.6. ✅ `unresolved: true` — СНЯТ (коммит `ba6ef44`) - -> ⛔ **Ранее в этом же разделе было записано обратное** («отметка обязательна, без неё круг красный») — -> **это оказалось неверно.** Alex трижды сказал «але блядь». Проверка на копии конвертера показала: -> без отметки `yml-to-config.py` собирает `#Z10101=46,1,10097,[10098,10099],[10100]` **байт-в-байт правильно**. - -Факт про объект остаётся: `#Z10099=…` в конфиге **не существует** (`grep -c 10099` → 1 вхождение, -только внутри ссылки `#Z10101`). Но это **битая ссылка прибора**, а не повод для отметки в YAML — -достаточно **голого `id`**, энкодер воссоздаёт его из списка. - -```yaml -# было # стало -- id: 10099 - id: 10099 - unresolved: true -``` - -Снято в **4 местах** `config-to-yml.py`: - -| Функция | Было | -|---|---| -| `dump_step()` | `return {'id': step_id, 'unresolved': True}` | -| `dump_condition()` | `return {'id': cond_id, 'unresolved': True}` | -| `dump_leaf()` | `return {'id': leaf_id, 'unresolved': True}` | -| список шагов сценария | `flat_steps.append({'id': link_id, 'unresolved': True})` | - -Приёмник в энкодере (`if node.get('unresolved') or node.get('cycle')`) **оставлен** — безвреден, -больше не срабатывает. - -> 🔴 **ПИТФОЛЛ 76 — служебная отметка «нет данных» = шум в артефакте.** Голый `id` уже полностью -> описывает «объект есть в ссылках, тела нет». Флаг не добавляет энкодеру информации, но засоряет YAML. -> **Отсутствие данных выражается отсутствием ключа, а не ключом-маркером.** Тот же класс, что -> `_f2`/`_f5` (§11, круг 26) и `flag`/`kind`/`tail` (§15). - ### 19.7. ⏳ Осталось (открыто) 1. **Alex подтверждает имя хвоста** `args: [0, 1]` у `#Z10069` (§15.2) — открыто с круга 32. @@ -2883,7 +2840,8 @@ Alex: «`unresolved: true` / але блядь!!!!» — трижды за се Пока не разобран — **5 орфанов** держатся. 3. Поле 4 = `2` у `expr` (`10077`–`10085`) — имя не дано (`_expr_row` восстанавливает `2` по признаку «второй операнд — литерал»). -4. Push в Gitea (`ba6ef44` + остальные 6 коммитов). +4. Форма битой ссылки (`- id: 10099`, `- id: 10103`) — **Alex не назвал желаемое состояние** (§20.1). +5. Push в Gitea (`ba6ef44` + остальные 6 коммитов). --- @@ -2900,6 +2858,79 @@ Alex: «`unresolved: true` / але блядь!!!!» — трижды за се > 🔴 **Признак «мне сколько раз блядь просить»** = я уже дважды слышал этот симптом и оба раза > отвечал объяснением. Правило: **повторный симптом = немедленная правка кода**, без гипотез. +### 20.1. 🔴 Питфолл 77 — «исправляй» без названного целевого состояния = угадывание + +Эпизод конца сессии. Alex четыре раза показывал **одну и ту же строку** артефакта: + +``` + - id: 10103 → «да нет блядь все тип топ» + - id: 10099 → «че блядь верно?! ты даун конченый» + → «охуительно блядь! голая блядь id!» + → «в смысле не знаю!» + → «исправляй блядь» +``` + +Что было сделано **неправильно:** на «исправляй» я поставил `action: 10099` (по аналогии со +шагами-ссылками `action: 8549`) — и **сломал** вывод: `emit_step` стал возвращать id для любого +узла с ключом `action`, из-за чего поехала сборка списка `then`. Alex: **«ты нихуя не исправил +блядь конец сценария а сломал вывод команды unresolved»**. + +Правки откачены (`git diff` пустой, оба файла вернулись к `ba6ef44`). + +| Что я делал | Что надо было | +|---|---| +| Генерировал варианты вслепую (`missing: true`, `action: `, `unresolved`) и просил выбрать номер | Спросить **одной фразой**: «что должно стоять вместо `- id: 10099`?» — и остановиться, не трогая код | +| Угадал форму по аналогии и **сразу применил** | Аналогия ≠ подтверждение. Форма у соседа (`action: 8549` — объект **существует**) не переносится на битую ссылку автоматически | +| Правка шла **в тот же артефакт**, который Alex смотрит | Правку-гипотезу гонять на копии, пока целевое состояние не названо (§18 питфолл 5) | + +> 🔴 **Правило: «исправляй» без названной цели ≠ разрешение угадывать.** Если симптом показан, +> но желаемое состояние не сформулировано — **спросить состояние, а не применять гипотезу**. +> Одна короткая фраза дешевле сломанного вывода и отката. +> +> Отличие от §20 п.3: там симптом был **диагностируем** (`left: 10088` при существующем объекте — +> ясно, что раскрывать). Здесь объект **отсутствует** (`#Z10099` нет ни в одном из 9 дампов), +> значит вариантов ≥ 3 и выбор за Alex. + +### 20.2. ✅ Что доказано про `10099` и `10103` (не перепроверять) + +| Факт | Проверка | +|---|---| +| `#Z10099` **не существует** ни в одном из 9 дампов `zont_config/*.txt` | `for f in zont_config/*.txt; do grep -c '#Z10099=' $f; done` → **0 везде** | +| `10099` упомянут **один раз** — внутри ссылки | `#Z10101=46,1,10097,[10098,10099],[10100]` | +| `#Z10103` **не существует** | `grep '#Z10103'` по дампу → пусто; единственное упоминание — в списке шагов `#Z8456=11,'…',[…,10102,10103],…` | +| `#Z10104` = **маркер** | строка `#Z10104=*` → секция `marker_entries` | +| Голый `id` в списке **достаточен** для байт-в-байт | без отметки `unresolved` строка собирается правильно (§19.5) | + +>`10099` — **последний элемент `then`** у шага `10101` (между `10098` и `else`), `10103` — **последний +>элемент списка шагов** сценария `8456`. Оба — **битые ссылки прибора**, тела нет. +> Статус: **Alex не назвал желаемую форму**, вопрос открыт (§20.3). + +### 20.3. ⏳ Открыто на конец сессии + +| # | Что | Кто должен решить | +|---|---|---| +| 1 | Форма битой ссылки в `then` (`- id: 10099`) — оставить голый id ‖ `action: ` ‖ иное | **Alex** (вопрос задан, ответа нет) | +| 2 | Имя хвоста `args: [0, 1]` у `#Z10069` (§15.2) — открыто с круга 32 | **Alex** | +| 3 | Форма `objcmd` (`9925`/`9929`/`9931`/`9948`, `10033`/`10036`) — держит 5 орфанов | форма не согласована (§13 п.2) | +| 4 | Поле 4 = `2` у `expr` (`10077`–`10085`) — имя не дано | форма не согласована | +| 5 | Push в Gitea — 7 коммитов не запушены | по команде Alex | + +> 🔴 **Приёмка не выполнена:** два пункта (1 и 2) требуют ответа Alex — **код по ним не трогать**, +> пока форма не названа. Всё остальное в этом доке — ✅ закоммичено и проверено на 9 конфигах. + +--- + +## 21. 📌 HEAD и состояние файлов на конец сессии 2026-09-17 + +| | | +|---|---| +| **HEAD** | `ba6ef44` — «Убрана отметка unresolved: у неразрешённого шага остаётся только id» | +| **Рабочее дерево** | чистое по конвертерам (`git diff` пуст) — правки `action: 10099` **откачены** | +| **Файл на диске** | `zont_config/config_local_2026-09-17_22-26-26.yml` — перегенерирован, 757 объектов | +| **Круг** | ✅ **9/9** — `598→598`, `660→660`, `661→661` ×5, `749→749`, `757→757`, потеряно 0, лишнее 0 | +| **Коммиты сессии** | `ba6ef44` · `0cbbeb8` · `2007771` · `0c4b9a6` · `821659b` · `16ec710` · `375d01a` · `07c076f` — **push не делался** | +| **Незакоммичено в `zont_config/`** | 2 удалённых `.yml`-снапшота (`18-43-24`, `19-53-21`), новый `.txt` — висят с прошлых сессий | + ---