[2026-09-17] eagle: personal/projects/zont-config-compiler.md
This commit is contained in:
@@ -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` — висят с прошлых сессий |
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user