[2026-09-18] eagle: family/how-to/home-automation.md personal/projects/zont-config-compiler.md personal/tech/roundtrip-key-verification.md
This commit is contained in:
@@ -320,3 +320,55 @@ git stash pop
|
||||
|
||||
База тоже сломана → унаследовано; база зелёная → это твоя правка. И **коммитить сразу, как
|
||||
только круг зелёный** — `git checkout --` затирает незакоммиченное без возврата.
|
||||
|
||||
### Ловушка 6 — 🔴 «круг чистый» ≠ «объект выпущен» (2026-09-18, круг 51)
|
||||
|
||||
Самая коварная из ловушек: **приёмка показала `exit=0` и `roundtrip: ЧИСТЫЙ` для всех трёх
|
||||
проверяемых типов — при том, что объект молча исчезал из вывода.** Круг проверяет «вывод
|
||||
парсера == вход», а входом был вывод энкодера, из которого объект уже пропал. Зелёный круг
|
||||
на потере объекта.
|
||||
|
||||
**Как ловить — считать объект по ИМЕНИ в артефакте, а не полагаться на круг:**
|
||||
|
||||
```python
|
||||
hits = [l for l in out.split("\r\n") if "ТЕСТ-ДАТЧИК" in l]
|
||||
if not hits:
|
||||
print("ОБЪЕКТ ПОТЕРЯН") # круг при этом может быть «ЧИСТЫЙ»
|
||||
```
|
||||
|
||||
### Ловушка 6.1 — первопричина: `alloc(None)` не кэширует → два id на один объект
|
||||
|
||||
Энкодер проходит объекты **дважды**: секционный цикл кладёт строки в `lines`, затем цикл
|
||||
`TYPE_ORDER` собирает `result_lines`, ища `zid in z_dict`. Если выдача номера **не кэшируется**,
|
||||
второй проход выдаёт **другой** номер, `zid` не находится в `z_dict` и строка теряется молча.
|
||||
|
||||
Доказательство — временные принты в копию энкодера:
|
||||
|
||||
```
|
||||
DBG-T1 [..., "#Z4102=1,'0','ТЕСТ-ДАТЧИК',..."] ← проход 1 выдал 4102
|
||||
DBG-TZ obj_id=4101 -> zid=4101 in_z_dict=False ← проход 2 выдал 4101, строки нет
|
||||
```
|
||||
|
||||
**Лечение — номер должен быть «липким»:** сразу после выдачи зарегистрировать его
|
||||
тождественным переименованием (`keep()`), чтобы любой последующий `_alloc_id(<int>)` вернул
|
||||
тот же номер.
|
||||
|
||||
```python
|
||||
if 'id' not in obj:
|
||||
obj['id'] = _alloc.alloc(None)
|
||||
_alloc.keep(obj['id']) # ← без этой строки объект пропадёт
|
||||
```
|
||||
|
||||
**Урок:** при внедрении авто-id проверять, сколько раз энкодер проходит один объект, и
|
||||
кэшируется ли выдача между проходами. «Круг чистый» этого не покажет (см. ловушку 6).
|
||||
|
||||
**Приёмка авто-id — полный чек-лист** (все пункты обязательны, ни один не заменяет другой):
|
||||
|
||||
| # | Проверка | Что ловит |
|
||||
|---|---|---|
|
||||
| 1 | `exit=0` | падение кодирования |
|
||||
| 2 | объект найден в выводе **по имени** | потерю объекта (ловушки 1, 2, 6) |
|
||||
| 3 | выданный id **внутри окна** `ID_MIN..ID_MAX` | прыжок в железный диапазон |
|
||||
| 4 | ссылка владельца → id ребёнка (устройство → регистр) | битую связь |
|
||||
| 5 | круг чистый на **всём** файле | регресс |
|
||||
| 6 | круг по **всем** снапшотам, не по свежему | регресс на старых дампах |
|
||||
|
||||
Reference in New Issue
Block a user