From 56f00e053a828006957689549a016ec7eac6ee35 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Thu, 17 Sep 2026 22:55:47 +0600 Subject: [PATCH] [2026-09-17] eagle: personal/projects/zont-config-compiler.md --- personal/projects/zont-config-compiler.md | 78 +++++++++++++++++++++-- 1 file changed, 74 insertions(+), 4 deletions(-) diff --git a/personal/projects/zont-config-compiler.md b/personal/projects/zont-config-compiler.md index bb8ef532..8865c02b 100644 --- a/personal/projects/zont-config-compiler.md +++ b/personal/projects/zont-config-compiler.md @@ -3,7 +3,7 @@ title: ⚙️ ZONT Config Compiler — конвертеры .txt ⇄ .yml namespace: personal type: how-to created: '2026-09-17' -updated: '2026-09-17k37' +updated: '2026-09-17k38' tags: - personal - zont @@ -30,6 +30,9 @@ aliases: - ZONT расписание trigger - ZONT unresolved снят - ZONT битая ссылка id + - ZONT конец сценария + - ZONT терминатор сценария + - ZONT unresolved = конец сценария - ZONT from отменён related: - '[[family/tech/zont-api]]' @@ -2903,13 +2906,77 @@ Alex: «`unresolved: true` / але блядь!!!!» — трижды за се >`10099` — **последний элемент `then`** у шага `10101` (между `10098` и `else`), `10103` — **последний >элемент списка шагов** сценария `8456`. Оба — **битые ссылки прибора**, тела нет. -> Статус: **Alex не назвал желаемую форму**, вопрос открыт (§20.3). + +### 20.2.1. ✅ РАЗГАДКА 2026-09-17 (поздняя сессия): `unresolved` = **КОНЕЦ СЦЕНАРИЯ** + +Alex: **«unresolved — конец сценария»**. Флаг значил не «потерянный объект», а **маркер терминатора**: +битая ссылка стоит **последним элементом списка** и обозначает конец сценария. Отсюда вчерашний конфликт — +`ba6ef44` снял флаг, посчитав его шумом; флаг нёс смысл. + +Проверено по данным — **все три случая стоят последними в своём списке**: + +| Элемент | Строка конфига | Позиция | Объект `#Z` | +|---|---|---|---| +| `10099` | `#Z10101=46,1,10097,[10098,10099],[10100]` | **последний в `then`** (перед `else`) | нет | +| `10103` | `#Z8456=11,'…',[…,10102,10103],0,0,8,0,0` | **последний в списке шагов** | нет | +| `8601` | `#Z8599=11,'…',[8600,8601],0,0,10,43200000,0` | **последний в шагах**, следом `#Z9144` | нет | + +`8601` — самый чистый пример: сценарий **по интервалу** (`interval_ms: 43200000`), ровно два шага, +`8600` реальный (`log: Отладка`), `8601` — терминатор. Объекта `#Z8601` нет ни в одном из 9 дампов +(`grep -c 8601 zont_config/*.txt` → **0 везде**, включая сам `22-26-26.txt`). + +⚠️ Парадокс, который надо держать в голове: **в TXT-строке id терминатора присутствует** (это элемент +списка ссылок), но **своего `#Z=` у него нет**. То есть «голый id» в YAML — это и есть корректная +передача строки конфига; вопрос лишь в том, **чем пометить** этот id для читателя. + +**Итог по форме:** голый `- id: N` **функционально верен** (round-trip 9/9 чистый). Открыт только +вопрос **имени пометки** — `end: true` ‖ `terminal` ‖ `finish` ‖ оставить голый id как есть. +Ждём **одно слово** от Alex (§20.3 п.1). + +> 🔴 **Приёмка не выполнена:** два пункта (1 и 2) требуют ответа Alex — **код по ним не трогать**, +> пока форма не названа. Всё остальное в этом доке — ✅ закоммичено и проверено на 9 конфигах. + +**План правки (если пометка нужна):** + +| # | Файл | Точка | Что | +|---|---|---|---| +| 1 | `config-to-yml.py` | `562` `_dump_leaf` | `{'id': leaf_id}` → `{'id': leaf_id, '<пометка>': True}` | +| 2 | `config-to-yml.py` | `594` `_dump_condition` | там же | +| 3 | `config-to-yml.py` | `861` `dump_step` | там же | +| 4 | `config-to-yml.py` | `1146` сборка `steps` | там же | +| 5 | `yml-to-config.py` | строки `413` / `834` / `844` | чтение пометки уже есть (по имени `unresolved`), пометку **не печатать в TXT** | +| 6 | — | — | регенерация артефакта + `test_roundtrip.py` по 9 конфигам → ждём 9/9 байт-в-байт | + +⚠️ **`yml-to-config.py` в `ba6ef44` НЕ входил** — там 3 чтения `unresolved` (`413`, `834`, `844`) остались +от прошлых коммитов; они безвредны и как раз пригодятся, если пометку переименовать. + +**Не путать с `#Z10104=*`** — это отдельный механизм: маркер-пустышка в секции `marker_entries`, +не терминатор списка. + +### 20.2.2. 🔴 ПИТФОЛЛ 79 — «в коммите только это» = приказ откатывать + +Alex прочитал `git show --stat ba6ef44` (2 файла, 10 строк) и сказал **«откатывай нахуй значит и делай +блядь как просил»**. Логика: раз весь коммит — это снятие флага, а флаг был смысловым, то правильная +реакция — **откатить коммит целиком**, а не спорить о форме. + +| Что я сделал | Что надо было | +|---|---| +| Ответил «не откатываю», объяснив, что побочно снесётся круг 36 | Показать **что именно** потеряется при откате, одной таблицей, и **спросить выбор**: `git revert ba6ef44` ‖ `git reset --hard 0cbbeb8` | +| Дал список из 5 пунктов «что осталось» | Он спрашивал про **один** коммит, не про роадмап | + +> 🔴 **Правило:** когда Alex говорит «откатывай» — **сначала назвать, что именно откат уничтожит** +> (не «нельзя, потому что»), затем **предложить оба способа** с разницей в истории. Решение — за ним. +> `git checkout --`/`reset --hard` затирают незакоммиченное **без возврата** → сперва `git stash push -m`. + +⚠️ **Не путать два чтения одной фразы.** «`unresolved` — конец сценария» допускает: +(а) «ключ переименовать в `end`» и (б) «он и означал конец, поэтому голый id верен, откатывать нечего». +Развести **одним вопросом** («какое слово ставить?»), не выбирать самому — это и есть питфолл 77. ### 20.3. ⏳ Открыто на конец сессии | # | Что | Кто должен решить | |---|---|---| -| 1 | Форма битой ссылки в `then` (`- id: 10099`) — оставить голый id ‖ `action: ` ‖ иное | **Alex** (вопрос задан, ответа нет) | +| 1 | ✅ Смысл `unresolved` назван — **конец сценария** (§20.2.1). Осталось **одно слово**: имя пометки `end` ‖ `terminal` ‖ `finish` ‖ оставить голый 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`) — имя не дано | форма не согласована | @@ -2925,11 +2992,14 @@ Alex: «`unresolved: true` / але блядь!!!!» — трижды за се | | | |---|---| | **HEAD** | `ba6ef44` — «Убрана отметка unresolved: у неразрешённого шага остаётся только id» | +| **Содержимое `ba6ef44`** | **только** снятие флага: `config-to-yml.py` (4 точки: `562`, `594`, `861`, `1146`) + регенерация артефакта (3 строки `unresolved: true` у `10099`, `10103`, `8601`). Итого 2 файла, `+6/-7`. `yml-to-config.py` **не входил** | | **Рабочее дерево** | чистое по конвертерам (`git diff` пуст) — правки `action: 10099` **откачены** | -| **Файл на диске** | `zont_config/config_local_2026-09-17_22-26-26.yml` — перегенерирован, 757 объектов | +| **Файл на диске** | `zont_config/config_local_2026-09-17_22-26-26.yml` — перегенерирован, 757 объектов; строки `4170` (`- id: 10099`) и `4176` (`- id: 10103`) — голый id | | **Круг** | ✅ **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` — висят с прошлых сессий | +| **Открытые вопросы** | §20.3 — 5 пунктов, два ждут **одного слова** от Alex (пометка терминатора, имя `args`) | +| **Статус решения по откату** | ⏳ Alex сказал «откатывай / делай как просил» → **не откачено**, ждём выбора: `revert ba6ef44` ‖ `reset --hard 0cbbeb8` ‖ оставить + переименовать пометку | ---