[2026-09-17] eagle: personal/projects/zont-config-compiler.md personal/tech/roundtrip-key-verification.md
This commit is contained in:
@@ -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`, сериализатор с
|
||||
|
||||
Reference in New Issue
Block a user