---
name: avtero_correctness_audit_v0733
description: avtero v0.7.33 — сквозной аудит корректности (5 агентов) + 7 фиксов; ядро — честность вычислялась, но не доходила до пользователя (веб не рендерил, канон не ставил needs_check); live_harvest без engine-оси
metadata:
  node_type: memory
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
---

**v0.7.33 (2026-07-03).** По просьбе «чтобы проблем гарантированно не было» — read-only аудит 5 параллельными агентами (A гейты честности, B идентификация, C таксономия, D источники+кэш, E паритет каналов). Честно: «ноль проблем» не гарантируется. Идентификация (B) и таксономия (C: инвариант 284 LEAF⇄284 TD, 0 мёртвых кат) чисты; узел→подузел утечек нет; дедуп ОК. Найдено 7 реальных дефектов, все — «честность считается, но не доходит» или отсутствие engine-оси там, где ось/сторона защищены.

**Фиксы (бэкапы `orchestrator.py.bak-audit-*`, `live_harvest.py.bak-engine-*`, `templates/index.html.bak-pcheck-*`):**
1. **CRITICAL** live_harvest без engine-оси: ключ `(make,model,year,cat,pos)`, read ПЕРЕД VIN-резолвом → чужой-моторный номер уходил confident, вытесняя корректный путь. Фикс: колонка `engine` (add-only ALTER, применён к боевой Ext-БД), write хранит двигатель, read для `_ENGINE_CATS` engine-strict → miss при несовпадении/неизвестном; hit обёрнут в `_mark_engine`. UNIQUE не менялся (кэшируется 1 мотор-вариант/позицию — ок для перф-кэша).
2. **HIGH** ключ 5-мин кэша без `predecoded_vehicle` → при frame/manual+пустой VIN чужой отчёт другому запросу. Фикс: veh-sig (make/model/year/frame/engine) в ключ.
3. **MAJOR** веб `renderPart` игнорировал check_note/needs_check → оговорки невидимы на сайте (жили в JSON). Фикс: блок `.pcheck`.
4. **MAJOR** канон `_enforce_named_parts` ставил check_note+confident=False, но не needs_check; схема `Part` роняет `confident` → бот не показывал. Фикс: confident False/check_note → `needs_check=True`. **Единый контракт: неуверенность несут ТОЛЬКО needs_check+check_note.**
5. бэкфилл `_apply_domestic_tecdoc_oe` — engine-оговорка зеркально axle.
6. валидатор `_validate_category_via_tecdoc` через `part.get("_cat")` вместо легаси-переклассификации (fail-open + ложный конфликт на переименованных).
7. стейл-тест рендера (premium→премиум).

**Проверено:** `tests/test_audit_fixes.py`(5)+`test_engine_honesty.py`(4), suite **1053 passed**. Живьём: бот (harness, кэш-бастер) Kia неизвестный двигатель «масляный фильтр» → 26320-27400 + **⚠️ оговорка про двигатель В РЕНДЕРЕ бота** (раньше не показывалась); веб `pcheck` в отдаваемой `curl /`; engine-колонка на Ext подтверждена PRAGMA. healthz 200.

**Оставлено осознанно:** 2 теста admin_guard падают в полном прогоне = env-порядок (.env ставит реальный admin id vs фейк 999999 в conftest; при изоляции проходят, код верен); corrections широкий part_kw+пустой model + ё-mismatch (админ-ввод, low); frame-регекс глотает не-фреймы (эффект = пустой результат, марку не подменяет); краевой год на границе MY; редкие side-only кат (headlight_leveling/door_lock_actuator/leaf_spring).

**v0.7.34 (2026-07-03) — живая батарея + subpart-коллизия стартера.** `battery.py` 16 кейсов по рынкам×гейтам через боевой API, автофлаги. 16/16 ок; 2 автофлага = ложные (VW топл.фильтр/задн.аморт резолвнуты `autodoc_catalog_byname` VIN/имя-aware → оговорка не нужна). 1 реальный: Volvo «бендикс» и «реле» оба → 8111635* из tecdoc_applicability, бендикс `confident=True` (бесплатный дамп не разделяет внутренности стартера). Фикс `_DEEP_INTERNAL_CATS`+`_mark_internal` (starter_bendix/solenoid/brushes, alternator_brushes/regulator/diode_bridge): resolve через engine/applicability-фолбэк → confident=False+оговорка «сверьте внутреннюю деталь узла»; part-exact (VIN/epc/live) не трогается, pulley НЕ в наборе. Тесты `test_deep_internal.py`(3), suite **1056**. `orchestrator.py.bak-internal-*`.

**v0.7.35 (2026-07-03) — инвариантный свип + класс coarse-subpart.** Ключевой инструмент: `scripts/invariant_sweep.py` — прямые вызовы `_resolve_named_part` (без LLM/кэша, конкурентно), 10 машин × {узел→подузел, все engine/axle/internal} = 1180 резолвов/мин, автопроверка 5 инвариантов (unit-leak, sibling-collision, engine/axle/internal-honesty). Это ПРАВИЛЬНЫЙ способ ловить весь класс за раз (LLM-e2e слишком медленный/узкий). Первый прогон: 5 engine-FP (VIN-native autodoc/emex, эвристика искала несущ. `byvin`) + 3 реальных subpart-коллизии (injector_nozzle==injector, rack_boot==rack_kit, clutch_disc==clutch_kit — грубый tecdoc/деревья). Фикс: `_mark_internal`→`_COARSE_SUBPART_CATS` (internals+injector_nozzle/seal+rack_boot/kit+clutch_disc/kit): грубый фолбэк→confident=False+оговорка «сверьте». Финал: **1180→0 нарушений**, suite 1056. `orchestrator.py.bak-coarse-*`. Урок: корректностные баги живут в детерминированном резолве → гонять инвариантный свип, а не только e2e.

Уроки: D-honesty-must-reach-user (флаг проверять по рендеру в ОБОИХ каналах, не по вычислению), D-live-harvest-engine-axis (кэш номеров ключевать по КАЖДОЙ оси различения). Связано [[avtero_subpart_unit_gate]] [[avtero_named_canonical_gate]] [[avtero_validation_audit_axle]].
