---
name: avtero-stale-mock-and-provenance-retry-gap
description: "Автеро — единственный падающий тест мокал функцию, удалённую 4 версии назад (маскировал реальный decode-fallback); фикс вскрыл честностный гейт, который полностью пропускает successful validation-retry"
metadata: 
  node_type: memory
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
  modified: 2026-07-30T07:36:32.237Z
---

Последний из шести найденных при глубоком аудите Автеро (2026-07-29/30)
багов оказался в самом тесте, не в проде — но диагностика вскрыла настоящую
находку в проде.

**Тест мокал мёртвую функцию.** `test_orchestrator_validation_retry_succeeds`
мокал `vinformer.decode` — удалённую из `_decode_vin` ещё в v0.4.9 (docstring
сам об этом говорит: «captcha-gated, 0/10 empirical»). С мёртвым моком
реальная цепочка проваливалась до LLM-фолбэка, `raw_source` становился
`llm_knowledge`, и честностный гейт **корректно** ронял `confidence` до
`low` — тест ожидал `medium` по инерции от старой, уже не работающей мок-схемы.

**Диагностический урок — самый ценный для будущего.** Ad-hoc скрипты (прямой
импорт тестовой функции + собственный `MonkeyPatch()`) давали ДРУГОЙ,
нерепрезентативный результат, чем настоящий `pytest` — потому что
`tests/conftest.py`'s `autouse`-фикстура `_patch_caches` (подменяет Redis на
in-memory dict) грузится ТОЛЬКО через pytest-коллекцию, а прямой импорт
модуля её не подхватывает. Прямой скрипт бил по НАСТОЯЩЕМУ боевому Redis.
**Правило на будущее:** если тест ведёт себя иначе в ad-hoc скрипте, чем в
`pytest`, — сразу проверить `conftest.py` на `autouse`-фикстуры, прежде чем
доверять скрипту.

**Побочная находка — честностный гейт не работает после ретрая.** Фикс мока
вскрыл: Phase-1 provenance-теггинг и Phase-2 честностный гейт
(`orchestrator.py` ~7394/7402) выполняются над `parsed` **до**
`_retry_validation`. Когда ретрай успешен, `parsed` подменяется на
результат ретрая — но обе проверки уже отработали над СТАРЫМ, отброшенным
`parsed` и не перезапускаются. Итог: **любой `primary_oem` из успешного
retry-пути полностью минует честностный гейт** — не тегируется как
`llm_output`, не блокируется, даже будучи чистой выдумкой модели. Тянет к
тому же классу, что и находка #194 в этой же сессии (лимит схемы на
`check_note` тоже провоцировал retry, который терял детерминированные
флаги) — retry-путь в этом пайплайне систематически недополучает
пост-обработку, которую получает основной путь. Заведена отдельная задача
(#195 в task-листе сессии) — не откладывать неопределённо, это дыра в
честности отчёта, не косметика.

Полный разбор — `Projects/Автеро/Changelog.md`, запись «#191 закрыт».

Связано: [[avtero_schema_cap_retry_lossy]] (тот же паттерн: retry-путь
теряет пост-обработку, которую получает основной путь — второй раз за
сессию, оба раза в retry-логике), [[avtero_make_brand_matching_class]].
