[2026-09-17] eagle: personal/projects/zont-config-compiler.md

This commit is contained in:
Alexey Martemyanov
2026-09-17 22:50:41 +06:00
parent 8a6e1e1cbc
commit f9d6502285
+79 -48
View File
@@ -28,6 +28,9 @@ aliases:
- ZONT pickle_value - ZONT pickle_value
- ZONT операнды условия 47 - ZONT операнды условия 47
- ZONT расписание trigger - ZONT расписание trigger
- ZONT unresolved снят
- ZONT битая ссылка id
- ZONT from отменён
related: related:
- '[[family/tech/zont-api]]' - '[[family/tech/zont-api]]'
- '[[family/how-to/home-automation]]' - '[[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 | | `_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}` | | `_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`-секций) | | `_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_target_row(sv, aid)` | энкодер | 49/50 из полей; `event`/`param` → код по типу владельца |
| `_set_var_body(node, aid)` | энкодер | `set_var` → строка 59 + регистрация тела цели своей строкой | | `_set_var_body(node, aid)` | энкодер | `set_var` → строка 59 + регистрация тела цели своей строкой |
| `_body_type(obj_id)` + `_collect_ids` | энкодер | id → тип по всем секциям YAML (включая вложенные `executors.*`) | | `_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 · **⏳ Открыто:** форма `objcmd` (§13 п.2) · имя поля 4 = `2` у `expr` (§13 п.10) · push в Gitea ·
5 орфанов-операндов `objcmd`. 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. ⏳ Осталось (открыто) ### 19.7. ⏳ Осталось (открыто)
1. **Alex подтверждает имя хвоста** `args: [0, 1]` у `#Z10069` (§15.2) — открыто с круга 32. 1. **Alex подтверждает имя хвоста** `args: [0, 1]` у `#Z10069` (§15.2) — открыто с круга 32.
@@ -2883,7 +2840,8 @@ Alex: «`unresolved: true` / але блядь!!!!» — трижды за се
Пока не разобран — **5 орфанов** держатся. Пока не разобран — **5 орфанов** держатся.
3. Поле 4 = `2` у `expr` (`10077``10085`) — имя не дано (`_expr_row` восстанавливает `2` по 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: <id>`, `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: <id>` ‖ иное | **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` — висят с прошлых сессий |
--- ---