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

This commit is contained in:
Alexey Martemyanov
2026-09-17 23:51:44 +06:00
parent 4736965eff
commit b44e948d7c
2 changed files with 182 additions and 18 deletions
@@ -20,6 +20,54 @@ related:
> Появился из реального бага в ZONT-конвертере 2026-09-17 (коммит `87e315c`).
> Разбор в проекте — [[personal/projects/zont-config-compiler]] §10.1.
### 6. 🔴 ПИТФОЛЛ 93 — переименовал ключ словаря → грепни ВСЕ обращения к нему
Маски `objcmd` перешли с полных (`'1 %0'`) на базы до плейсхолдера (`'1 '`), но проверка
`if _OC_OPS.get(_oc_mask) is None:` осталась смотреть на **старое** имя переменной. Ключа нет →
`None`**все 6 записей молча ушли в fallback `descr`+`args`**. Круг **зелёный**: fallback
доносит байты верно, а новый ключ просто не появляется (ровно §6-сценарий выше).
```bash
# переименовал переменную/ключ — найди КАЖДОЕ обращение, а не только определение
grep -n "_oc_mask\|_oc_base" config-to-yml.py # словарь, обе проверки, обе сборки
```
**Симптом, который надо узнать:** артефакт показывает **старую** форму при зелёном круге.
Это не «правка не сохранилась» — это **fallback**, который её перекрывает.
### 7. 🔴 ПИТФОЛЛ 94 — «объект есть в YAML» ≠ «энкодер его выпустит»
Тела, **развёрнутые внутри** другого объекта (операнды `left`/`right`, `source`), не лежат
отдельной секцией. Индекс тел, построенный по спискам верхнего уровня с ключом `raw`, их
**не видит**`_raw_of()` отдаёт `None` → объекты **теряются из выхода**.
Разбор был последовательным и вскрыл **четыре** подловушки:
| Симптом | Причина | Решение |
|---|---|---|
| `-5` объектов | индекс не обходил `scenarios` | рекурсивный обход вложенного |
| всё ещё `-5` | у развёрнутых тел **нет `raw`** | `raw` клался в тело (костыль, потом снесён) |
| `-2` | вложенные операнды `left`/`right` не регистрировались | рекурсия по `left`/`right` |
| `-2` снова | фильтр `x in _known_ids` отсекал **нужные** id | фильтр убран, дедуп на `_register` |
**Правила:**
- Индекс тел собирать по признаку **`id` + `type`**, а не по наличию `raw`.
- Строку собирать **хелпером по полям**`raw` в промежуточном файле не нужен вовсе.
- **`_known_ids` — НЕ «что уже выпущено»**, а «отличить литерал от ссылки». Для второго есть
отдельное множество (`_emitted_ids`). Перепутать = самострел: пропустишь ровно то, что надо выпустить.
### 8. 🔴 ПИТФОЛЛ 95 — костыли в промежуточном формате видно глазом владельца
Чтобы индекс нашёл развёрнутые тела, в них временно клался `raw`. Круг — зелёный, но артефакт
зарос **88 блоками сырья**, и владелец это увидел сразу.
```
круг зелёный + артефакт зарос костылём = правка не принята
```
**Правило:** `raw`/`_`-хелперы в **выходном** файле — только на время отладки. Если костыль нужен
индексу — значит индекс построен по неверному признаку, чинить индекс, а не засорять артефакт.
## Когда применять
Любой двусторонний конвертер с тестом байтовой точности: `.txt ⇄ .yml`, сериализатор с