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

This commit is contained in:
Alexey Martemyanov
2026-09-18 00:27:27 +06:00
parent 79454c586a
commit 9cf7a6f618
+27
View File
@@ -3682,6 +3682,33 @@ Alex: **«надо жестоко ограничить диапазон»** →
**Hard fail обязателен:** `_next > ID_MAX` → конвертер падает с текстом `id window exhausted`, **Hard fail обязателен:** `_next > ID_MAX` → конвертер падает с текстом `id window exhausted`,
конфиг **не собирается**. Молчаливый прыжок в `20xxx` запрещён. конфиг **не собирается**. Молчаливый прыжок в `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; (б) порядок **Риски:** (а) ссылки в новые объекты — реальная проблема, требует решения шага 3; (б) порядок
эмиссии: `S`-блоки первыми, `Z` — после, id нужен раньше строки; (в) **верхняя граница** эмиссии: `S`-блоки первыми, `Z` — после, id нужен раньше строки; (в) **верхняя граница**
`max+1 = 20556` перескочит железо, вопрос к Alex открыт. `max+1 = 20556` перескочит железо, вопрос к Alex открыт.