From 9cf7a6f6187bdbdc6b338a1c6319e8ec3a254300 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Fri, 18 Sep 2026 00:27:27 +0600 Subject: [PATCH] [2026-09-18] eagle: personal/projects/zont-config-compiler.md --- personal/projects/zont-config-compiler.md | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/personal/projects/zont-config-compiler.md b/personal/projects/zont-config-compiler.md index 6f91723e..b5a39b91 100644 --- a/personal/projects/zont-config-compiler.md +++ b/personal/projects/zont-config-compiler.md @@ -3682,6 +3682,33 @@ Alex: **«надо жестоко ограничить диапазон»** → **Hard fail обязателен:** `_next > ID_MAX` → конвертер падает с текстом `id window exhausted`, конфиг **не собирается**. Молчаливый прыжок в `20xxx` запрещён. +### 25.5. ✅ РАЗВЕДКА (2026-09-18) — механика энкодера, план врезки + +**Ключевой факт, меняющий шаг 1 плана:** фаза 1 эмитит **строки** (`lines: List[str]`), а не объекты. +`obj['id']` подставляется в текст немедленно; `z_dict = {zid: line}` собирается **из строк** +(`int(line.split('=')[0][2:])`, строки 1852-1856); `result_lines` собирается из `z_dict` по id +(`if zid in z_dict: append(...)`, 1971-1977). Ссылки (`target`, `output_id`, `a`/`b` у expr) — +**уже числа** внутри `fields` к моменту печати (`_register` строит `{'id': obj_id, 'raw': fields}`, +строки 82-87). + +⇒ «Проставить id всем записям ДО эмиссии» (шаг 4 старого плана) **не требуется**. Новый id надо +выдавать **в момент рождения строки** и запоминать связь `старый → новый` в одном словаре; все +обращения (`_register`, `_inline_bodies`, `_body_index`, `_emitted_ids`, `z_dict`) — через него. +Иначе дубль `Duplicate ID` (та же природа, что питфолл 96 с `8817`). + +### 25.6. ✅ РЕШЕНИЕ ALEX: id написан — не трогаем + +Alex: **«если id есть то очевидно ничего не придумаем»**. + +| Случай | Что в YAML | Поведение | +|---|---|---| +| 1 | `target: 99999` — **ссылка** на несуществующий объект | ❌ **ОШИБКА**, конвертер падает: «target 99999 не найден». Автозамена запрещена — иначе команда в никуда, контроллер примет мусор | +| 2 | запись **без своего `id`** (`- set_relay:` без строки `id:`) | ✅ **АВТО**: выдать свободный id из окна `4098..19999` (дыры снизу вверх) | +| 3 | `id: 99999` — номер **написан руками**, такого объекта в конфиге нет | ❌ **ОШИБКА**. «Если id есть — ничего не придумываем». Решение человека, не повод для автозамены | + +**Правило одной строкой:** `id` в YAML = решение человека, неприкосновенно. Нет `id` — выдаём сами. +Ссылка на несуществующий id — всегда ошибка, автозамены нет ни в одном случае. + **Риски:** (а) ссылки в новые объекты — реальная проблема, требует решения шага 3; (б) порядок эмиссии: `S`-блоки первыми, `Z` — после, id нужен раньше строки; (в) **верхняя граница** — `max+1 = 20556` перескочит железо, вопрос к Alex открыт.