---
name: avtero_full_coverage_program
description: avtero «самый полный охват» — слои категорий 259 (весь остаток дерева), linkage-покрытие 82.5% (потолок сознательный), концерн-группы, fill-only бэкфилл; программа ЗАКРЫТА 2026-07-02
metadata:
  node_type: memory
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
---

**v4 2026-07-02 (v0.7.18, исчерпывающий добор всего остатка дерева):** развёртка ВСЕХ 424 немапленных prd-строк ≥5k linkage с корзинами (D-tree-exhaustive-remainder): из 23.7% немапленного лампы 40.9%+жидкости 18%+аксессуары 2.8% = осознанный скип, OTHER 38.4% = реальные узлы → **+97 категорий** во все слои (259 leaf/prd, 264 RU), покрытие 76.3%→**82.5%**. Добраны: впрыск (форсунка/ТНВД/датчики топлива/абсорбер), трансмиссия (фильтр/поддон/радиатор АКПП, опора+сальники+трос КПП, коробка/двигатель в сборе), ДВС-внутренности (поддон/насос/щуп масла, компл.прокладок, шайбы/сухари/коромысла клапанов, ГБЦ, VVT клапан+муфта, клапан вентиляции картера), впуск/наддув (ДПДЗ/дроссель/трос газа/патрубок наддува/N75), датчики (ДТВВ/EGT/давления ОГ/скорости/уровня масла·ОЖ/педали/угла руля/парктроник/TPMS), тормоза (кольцо+блок ABS, ВУТ, вакуум-насос, колдун, скоба суппорта, щиток диска), подвеска/рулевое (кулак, ступ.гайка, тяги, подрамник, штанга+тарелка стабилизатора, рессора+втулка, проставки, болт развала, рул.колонка), привод (крестовина+подвесной кардана, вилка сцепления), выхлоп (подушки глушителя), электрика (реле накала, коммутатор, трамблёр, реле поворотов, аварийка, свет, климат-блок, замок зажигания, шлейф руля, актуатор замка), охлаждение (кран печки, доп-помпа, масл.радиатор), кузов/салон (ограничитель+актуатор двери, крышка багажника, панели задка/передка, боковина, шумоизоляция капота, защита картера, дефлектор, клипсы, бачок+форсунка омывателя, стекло+корректор фары, трос капота), AC/ГУР (муфта компрессора, шланг+бачок ГУР) + ~40 паттернов-синонимов. Батареи 255/255, excludes к 12+ старым триггерам. Смоук 10/14 OE (форсунка Kia 33800-2F000, фильтр АКПП 46321-23001, VW клапан картера 06F103235). 857 passed, live e2e сайт: фильтр АКПП→genuine 4632139010. Бэкапы `*.bak-audit18-*`. **ПОТОЛОК 82.5% — сознательный:** остаток = лампы(~14%)/жидкости(~3%)/аксессуары(~1%), не VIN-специфичный OEM. 100% по объёму НЕ цель.

**v3 2026-07-02 (v0.7.17, взвешенный аудит «все марки + всё дерево + кузов/салон»):** покрытие меряем linkage-объёмом всех 26 938 prd (D-coverage-weighted-audit): 63.7%→**76.3%**, **+46 категорий** во все слои (162 leaf/prd, 169 RU; ДМРВ/полуось/рабочий тормозной цилиндр/ремкомплект суппорта/маслосъёмные колпачки/датчики стоп-сигнала·заднего хода·вентилятора·давления кондиционера/резистор печки/поворотник/ВВ-провода/сливная пробка/крышки/поршень/распредвал/гидрокомпенсаторы/патрубок/подрулевой + кузов/салон: подкрылок, накладка порога, обшивка двери, дверь, спойлер, кнопка стеклоподъёмника, плафон, подсветка номера, ДХО, ролик сдвижной двери, накладка педали, крепление фары, решётка бампера, фаркоп, рейлинги) + excludes к 16 старым триггерам от first-match коллизий (батареи 122/122). Лампы+жидкости = осознанный скип (остаток немапленного почти целиком они). Марки: в дампе 594, отсутствуют только пост-2018 китайцы (Exeed/Omoda/Jaecoo/Tank/Voyah/Zeekr) → live-путь+live_harvest. Смоук новых категорий 10/12 OE; 857×2 passed; e2e оба канала (резистор печки XC90→8693262). Попутно починен прод-баг `_req_id` в `main.py` async-путе (все ask_async сайта падали со вчера, `*.bak-reqid-*`). Бэкапы `*.bak-audit17-*`/`*.bak-audit17b-*`. ГРАБЛИ: сигнатура `_oe_for_vehicle_category_sync(make, model, year, ENGINE, cat_key)` — категория на месте engine = тихий None.

**v2b 2026-07-02 (v0.7.15b, data-driven добор):** метод «prd-описания с linkage-счётчиками» вместо догадок → 12 паттернов ужесточены (датчик наддува лез в турбину, шкив в ГУР-насос и т.п.) + **7 heavy-linkage категорий добавлено целиком**: clutch_disc(369k)/clutch_cable(221k)/wiper_rubber(193k)/mirror_cover(259k)/wiper_linkage/wiper_arm/fuel_tank. Слои: 110 паттернов/112 триггеров. Live: «крышка левого зеркала» XC60→39821914. Data-limits: трапеция у Volvo без make-OE, резинки 2/8, seat_belt 108 строк. Бэкапы `*.bak-tune-*`/`*.bak-tune2-*`.

**ПОКРЫТИЕ v2 ЗАКРЫТО 2026-07-02 (v0.7.15, интерьер/экстерьер/узлы):** слои категорий выровнены и достроены **68→108** (0 рассинхронов `_LEAF_TRIGGERS`=`_TD_PRD_LIKE`; +42 паттерна с excludes, +70 триггеров в конец списка + excludes к 5 коллизиям, +57 RU-имён, +16 side-cats): зеркала/фары/фонари/бамперы/капот/стёкла/ручки/замки/стеклоподъёмники/дворники/печка/кондиционер (компрессор-конденсатор-испаритель-осушитель)/ШРУС/ступица/турбо/EGR/DPF/катализатор/глушитель/кардан/рейка/ГУР/АКБ/сцепление-цилиндры/вкладыши/прокладки. Классификация 64/64. Матрица 14×35=490 реальных resolve: **0 wrong-make, 85% офлайн** (без VIN-каналов). **Концерн-группы** `_MAKE_CONCERN` (13 групп, D-concern-groups-narrow): concern=True ТОЛЬКО в oe_make_conflict+_maker_matches; validate_oe/K-type СТРОГИЕ (инвариант v0.3.12 Skoda-на-VW цел). **Fill-only tecdoc-бэкфилл всем маркам** (D-fillonly-model-level): пустой primary → make-verified model-level OE; tech_fluids-блокер убран (фреон у компрессора молча блокировал). Live: компрессор XC60→36002941+7 алт, радиатор печки→9171503. UX-аудит Playwright+tg-web-e2e: онбординг/кабинет/история/оценка/mobile — чисто. 850/850 тестов. Бэкапы `*.bak-cats-*`, `*.bak-concern*`, `*.bak-fillonly/filllevel/techfluids-*`. Data-limits прежние: seat_belt linkage пуст, Vesta ABS.

**СПЛОШНОЙ АУДИТ 2026-07-01 (все марки×все категории):** матрица 60 марок × 63 категории по TecDoc-applicability → покрытие **~полное**: ВСЕ RU-марки 62-63/63 (Toyota/VW/MB/Nissan/Renault/BMW/Kia/Hyundai/LADA/Chery… = 63/63); дыры только нишевые US (RAM 21/63, GMC/Buick). Паттерны 67 категорий все «видимы» (0 багов). **Реальная дыра была на уровне МОДЕЛИ/K-type** (тонкие/новые: Vesta 2017=1 present ktype, Chery 2021=0), не марки. Фикс: **make-level фолбэк** `_make_present_ktypes_sync` в `_oe_for_vehicle_category_sync` (`tecdoc_local.py`, бэкап `*.bak-makelevel-*`) — модель пуста → выборка present-K-type марки → make-verified genuine (confident=False, бэкап orchestrator `*.bak-makelevel-*`). Замер 87%→**93% (30/32)**; Vesta диск/рычаг закрыты live. Потолок (2/32): Vesta ABS-датчик — в дампе 2018 его артикулы ГРУЗОВЫЕ, passenger-OE нет → honesty-guard None. Kit_contents/kit_parents/supersession («запчасти запчастей») работают. Харнесы scratchpad: `audit_matrix2.py`, `coverage_after.py`.

**Запрос юзера (2026-06-30):** «самый полный охват» — Автеро должен резолвить ЛЮБУЮ деталь (интерьер/экстерьер, вплоть до зеркала/пепельницы), не только сервисные.

**Карта покрытия (заземлена на дереве Kia KNAFW411 через autodoc quick-groups, ~327 групп):**
- **В каталоге по VIN + теперь достаётся** (после Level-1): экстерьер (бампер/капот/крыло/зеркало/решётка/молдинг/спойлер/порог), освещение, остекление, электрика (генератор/стартер/ЭБУ/датчики/реле/проводка), климат, выхлоп, топливная, + весь сервис/подвеска/тормоза.
- **НЕТ в quick-groups** (нужен Level-2): глубокий салон (пепельница/бардачок/торпедо/коврики/ручки), безопасность (подушки/ремни/преднатяжители).
- **Вне охвата по природе:** шины/диски/колпаки (товарный фид, не OEM-микрофиша), АКБ/масла/химия (подбор по спеке, LLM уже делает).

**Архитектура резолва:** pre-resolve (`work_groups`, ~67 сервис-категорий, быстро) → quick-groups каталог (autodoc/emex `get_oem_by_vin` + `resolve_by_name` по VIN) → original-units каталог (НЕ интегрирован) → локальные харвесты (TecDoc/repxpert/bilstein/autoopt/mann/mahle/china) → LLM+search_web.

**LEVEL-1 — ✅ СДЕЛАНО (2026-06-30): noun-core фолбэк в `resolve_by_name`.** Кузов/электрика УЖЕ были в дереве, но `resolve_by_name` находил только сервис-категории (концепт-матчер `_match_score` требует ≥2 покрытых концепта; у «зеркало заднего вида левое» в обобщённом листе «Зеркало наружное» совпадал лишь нон → 0). Правки (`app/scrapers/emex_catalog.py` + `autodoc_catalog.py`, бэкапы `*.bak-nouncore-*`/`*.bak-order-*`):
1. `_noun_core_qids(concepts, tree)` в emex — матчит листья по СПЕЦИФИЧНОМУ неслужебному непозиционному нону (искл. `_POSITION_PREFIXES` перед/задн/лев/прав/верхн/нижн + `_GENERIC_STEMS`). Фолбэк, когда строгий путь пуст.
2. Вызывается в обоих `resolve_by_name` **ДО `_VALVETRAIN_ANCHORS`** (критично: анкеры головы есть в любом авто → иначе qids не пуст → фолбэк голодает; это был баг первой итерации).
3. `select_by_name_axle_aware` скорит по `score_concepts` (позиционные сняты — они уже отработаны axle/side-гейтом, в имени детали «ЛЕВ./ЗАДН.» <5 симв не стеммятся).
**Результат (живьём, Kia VIN): 1/10 → 7/10** — зеркало `876101M265`, бампер `865111M000`, капот `664001M010`, решётка `863501M600`, генератор, стартер + сервис цел. **240 unit passed, регрессии нет.** Сервис не задет (фолбэк только при пустом строгом пути).

**LEVEL-1.5 — ЗАКРЫТ (2026-07-01, #107):** крыло — закрыто через L2 (`663111M040`); **лобовое стекло — ПОЧИНЕНО:** настоящий good назван ПО-АНГЛИЙСКИ «GLASS ASSY - WINDSHIELD», рус-стем не ловил; добавлен точный RU→EN мост в `resolve_by_name_full` ПЕРЕД select (запрос «лобов/ветров»+«стек» → windshield+glass, исключая washer/wiper/pad/провод/дверь/зеркало/молдинг) — «лобовое/ветровое стекло» → `861101M150` (E2E проверено, бэкап `autodoc_catalog.py.bak-windshield-*`); **молдинг — честный предел:** good назван просто «МОЛДИНГ», по имени неотличим от молдинга двери/крыла → None вместо неверного (качество>охват).

**ОСТАЛОСЬ:**
- **Level-2: original-units каталог Laximo** — глубокий салон + безопасность (нет в quick-groups). **RECON 2026-06-30 (autodoc API `web.autodoc.ru/api/catalog-original-service/catalog-original`):** цепочка полной микрофиши найдена почти целиком:
  1. `GET /categories?catalogCode={cc}&ssd={ssd}` → топ-категории `[{categoryId,name,ssd,children}]` (Двигатель/ТРАНСМИССИЯ/ХОДОВАЯ/**Кузовная**/Код отделки/Электрические). РЕКУРСИВНО: тот же endpoint с `&categoryId={cid}&ssd={свой ssd ноды}` → дети.
  2. `GET /category-nodes/{categoryId}?catalogCode&ssd={cat ssd}` → **units микрофиши** `[{nodeId,code:"20-211C",name:"Блок цилиндров в сборе",ssd}]`. ТОЖЕ рекурсивно (`/category-nodes/{nodeId}` → суб-units).
  3. **`GET /node-goods?catalogCode={cc}&ssd={ssd ЮНИТА}`** → ДЕТАЛИ юнита (OEM!): list (иногда `{items:[...]}`) из `{article=OEM, name, codeOnImage, attributes:[date_range,amount,...]}`. ⚠️ nodeId в path НЕ нужен — `ssd` юнита (из category-nodes) кодирует позицию. Проверено: Кузовная→«Крылья и панель капота»→node-goods → БОЛТ-ФЛАНЕЦ и т.д.
  **RECON DONE (endpoint найден из JS-бандла autodoc):** граб `https://autodoc.ru/main-PTZG6PTY.js` → 46 ленивых `chunk-*.js`; в `chunk-WRNM3BR5.js` весь список путей `catalog-original-service/catalog-original/`: brands, car-info, **categories**, **category-nodes/${id}**, compatible-modifications, goods-compatibility, **node-goods**, quick-group-nodes, quick-groups, vin-modifications, **wizard-items**, **wizard-modifications**.
  **БОНУС для input-gap (#109): `wizard-modifications`/`wizard-items`** = подбор каталога по make/model БЕЗ VIN (мастер-навигация Laximo) → даёт cc+ssd так же, как vin-modifications.
  **LEVEL-2 ✅ СДЕЛАНО (2026-06-30):** `resolve_by_name_full(vin, part_name)` в `autodoc_catalog.py` (бэкап `*.bak-l2-*`). `resolve_by_name` теперь 2-ярусный: tier-1 `_resolve_by_name_qg` (quick-groups), при None → tier-2 микрофиша. Цепочка: `_l2_categories`(6 топ, кэш 7д)→`_l2_units`(category-nodes/{id}, кэш)→`_l2_goods`(node-goods?ssd=unitSSD, кэш). Кандидат-юниты: оверлап нонов (`_l2_nouns`, 4-char declension-tolerant, минус generic/position) + `_L2_HINTS` (пепельница/прикуриватель/коврик→консоль; бардачок→панель приборов/вещевой; и т.д. для компонент-в-юните). Выбор: `_ec.select_by_name_axle_aware`, при None — loose-фолбэк С ГАРДОМ: good обязан содержать ГЛАВНЫЙ нон запроса (иначе None — качество>охват). **Проверено живьём (deployed-модуль, Kia):** пепельница `845552M000DAJ`, коврик `846901M000`, крыло `663111M040` (закрыл #107-крыло!), ремень безоп `888401M000WK`, консоль `846111M501DAJ` ✓; молдинг/лобовое→None (молдинг-good нет в юните; windshield-good назван по-англ. «GLASS ASSY-WINDSHIELD» — рус-стемы не ловят; честный None вместо неверного). Разблокировано: салон/консоль/коврики/сиденья/ремни/зеркала/бамперы/стёкла/климат/аудио/проводка/детальные тормоза-трансмиссия. Подушка безопасности отдельным юнитом в этом каталоге ОТСУТСТВУЕТ (лимит данных, не баг). НЕ интегрировано в hot pre-resolve (там get_oem_by_vin по категориям) — L2 работает на by-name пути (search_oem), в пределах LLM-бюджета 60с.
  **(устарело) ОСТАЛОСЬ — БИЛД Level-2** (recon закрыт): функция `resolve_by_name_full(vin, part_name)` — найти категорию по ключам имени → обойти category-nodes (рекурсивно, юниты глубже экстерьера: салон/безопасность в под-ветках Кузовной/Электрических, НЕ в первых 18 юнитах) → node-goods подходящих юнитов → select_by_name_axle_aware. Врезать 3-м слоем в `resolve_by_name` после quick-groups (дорого — полный обход; кэш 7д + ограничить глубину/таргетить по keyword). Эталон проверки: пепельница/бардачок/подушка безопасности дают OEM.
- **Input-гэп: пре-резолв без VIN — ✅ СДЕЛАНО (#109, 2026-06-30, бэкап `orchestrator.py.bak-novin-*`).** Симптом до фикса: confirm-only запрос (make/model/year без VIN) → **502** (LLM крутит тулзы впустую, ни один OEM-источник без VIN не работает → таймаут бюджета → каталог-fallback тоже None, т.к. был VIN-based → raise). Фикс: helper `_vehicle_oe_no_vin(vehicle, cat_key)` = OEM по make/model/year из локальных деревьев (`local_brands.vehicle_oe_local`: autoopt/china/bilstein/repxpert). Врезан в `_pre_resolve_parts` (новый параметр `vehicle`, гейт ослаблен `not (vin or make+model)`, ветка `if not vin`) И в `_build_catalog_fallback` как **backstop** (после промаха VIN-каталогов → локальные деревья по make/model, что закрывает заодно catalog-blind VIN: китайцы с реальным VIN, которых нет в emex/autodoc). Проверено живьём (HTTP /api/ask): no-VIN Chery Tiggo 7 Pro → 200, OEM из china (PBP050/BRBD179/А95171); no-VIN VW Polo → 200, OEM из bilstein/repxpert (03C115561H/861698151A); no-VIN Haval/Geely → OEM. **Безотказно: всегда 200** — full-LLM-отчёт когда чейн быстр, каталог-fallback (confidence=low, меньше деталей) когда чейн >60с-бюджета; никогда 502. VIN-путь не тронут (`if not vin` не срабатывает). Ограничение: no-VIN охват = что покрывают локальные деревья (VIN-каталоги emex/autodoc без VIN не работают по определению).
- **Товарные фиды** (шины/диски/АКБ) — отдельный домен, решить нужны ли в продукте.

**БАГ САЙТА (репро, 2026-06-30) — таймаут на многосоставном запросе.** VIN `KNAFW411BD5677381`, запрос «трос ручника, колодки ручника, диски тормозные перед+зад, задняя балка, амортизаторы передние, опоры амортизатора передние» → фронт: «Подбор слишком долго не отвечает». Гипотеза: 6+ категорий, часть НЕ пре-резолвится (трос/колодки ручника, задняя балка, опора аморта — нет в work_groups/_CAT_VEH/autodoc-маппинге) → полный медленный LLM-цикл; усугублено throttled free-головами после тест-нагрузки. Фиксы: добавить эти категории (handbrake cable/shoes, rear beam/axle, strut mount) в work_groups+_CAT_VEH; распараллелить multi-work пре-резолв; поднять фронт-таймаут или стримить прогресс. Проверять на сайте когда головы отойдут. (Задача #110.)

**#110 ЗАКРЫТ (2026-06-30) — настоящий диагноз = LLM-инфра, не покрытие.** Репро дал 502 `llm_failed` за 291с: ВЕСЬ чейн упал — zyloo/bynara ReadTimeout (free-reseller-пулы троттлятся/выгорают под нагрузкой, в т.ч. от моих тестов), `r9/gpt-5.5-pro20x` и `mistral/mistral-medium-latest` = мёртвые 404-роуты на OmniRoute :20128, cerebras обе «empty» при max_tokens=8 (артефакт reasoning, реально работают). nemotron-super-49b делает tool_calls, но НЕ выдаёт парсабельный финальный JSON (как в историческом аудите) — в чейн не годится. Три фикса (все проверены живьём):
1. **Покрытие work_groups+emex** (бэкапы `*.bak-coverage-*`): добавлены правила `handbrake_replace`/`rear_axle_replace`/`strut_mount_replace` + категории emex `handbrake_cable`/`handbrake_shoes`/`rear_axle_beam` (strut_mount уже был). Все детали ЕСТЬ в каталоге Kia: «Тросы,тяги и рычаги тормозной системы», «Колодки стояночного тормоза», «Балка моста», «Опора амортизатора подвески». Резолвятся в OEM 597601M300/583051MA00/624051M005/546101M000. Все 6 работ запроса теперь пре-резолвятся; регрессий нет (50 кейсов, «то с фильтрами»→full_service, «опоры двигателя»→engine_mount).
2. **Чистка чейна** (плист, бэкап `*.bak-chain-*`): убраны 2 мёртвых 404-роута → chain_len 6→4 (zyloo,bynara,cerebras-glm,cerebras-oss). Реверсивно. НЕ добавлял неаудированные головы.
3. **Детерминированный fallback (ГЛАВНЫЙ фикс безотказности)** `_build_catalog_fallback` в orchestrator.py (бэкап `*.bak-fallback-*`, sha-guard от 525999031e): когда ВЕСЬ чейн падает («All models in fallback chain failed») — вместо 502 собирается каталог-отчёт из work_groups+autodoc/emex+search_cross, ранний возврат `OrchestratorResult(model=catalog_fallback, confidence=low)` минуя LLM-санитайзинг. ПРОВЕРЕНО: форс дохлого чейна → **возврат 1.0с, 10 OEM с аналогами, НЕ 502**. Симптом «слишком долго не отвечает» теперь невозможен, когда деталь в каталоге.

**АНИМАЦИЯ САЙТА (юзер, после компакта):** текущий лоадер кривой → заменить на чистое крутящееся кольцо ИЛИ спидометр-гейдж (стрелка вверх-вниз, юзеру нравится). Компонент в apps/avtero. (Задача #111.)

См. [[avtero_overview]] [[avtero_harvest_sources_v2]] [[avtero_fastpath_singlepass]] [[kodoceh_web_overview]].
