---
name: avtero_open_roadmap
description: "avtero — статус роадмапа: история/паритет/TecDoc-резолвер/коллизия коррекций ЗАКРЫТЫ 2026-07-01; остались честные дыры данных (Lada Vesta, ABS-сторона в дампе)"
metadata: 
  node_type: memory
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
---

**2026-07-01: все 4 открытые задачи ЗАКРЫТЫ и проверены живьём (детали — Obsidian Changelog).**

1. **Коллизия коррекций «перед» — ЗАКРЫТО.** `part_corrections.part_kw` теперь набор токенов (существительное+ось+сторона), матч = ВСЕ токены в имени (AND), не подстрока. `corrections.py` + `admin.py._part_key` (склонение-устойчивые корни). Строки id=4→«датчик перед прав», id=5→«датчик перед лев». Проверено: левый→30748149, правый→32373144, диск→None, AWD-совместимость цела.

2. **TecDoc genuine-OE резолвер по имени — ЗАКРЫТО, 50%→87%.** Root-cause = ПЛАН ЗАПРОСА: `fitting_articles_by_category_sync` стартовал с suppliers(ALL) → linkageid как post-WHERE → 30с read_timeout → молчаливый 0. Фикс = `STRAIGHT_JOIN` + `FORCE INDEX (linkageid)` (~2с). Плюс триггеры датчиков в `_LEAF_TRIGGERS` (ABS/коленвал/распредвал/детонации/темп-ОЖ/давл-масла) + `oe_for_vehicle_category` встроен финальным фолбэком в `_resolve_named_part`. Замер тем же харнесом: 16/32→28/32. Live `/api/ask` XC60 ABS-датчик→30748149. **Честный остаток:** Lada Vesta 4/8 (ABS-датчик/тормозной диск/рычаг ОТСУТСТВУЮТ в дампе TecDoc 2018); ABS лев/прав дают ОДИН OE из дампа (сторона добивается коррекциями). Харнес: scratchpad `coverage_after.py`.

3. **Синхронизация истории бот↔сайт — ЗАКРЫТО.** Оказалось: оба канала зовут ОДИН API, и API пишет `request.account_id` для бот-запросов (X-Bot-User→account) → app.db `request` УЖЕ единый стор. Открыл `/api/history` и `/api/history/{rid}` бот-авторизации; добавил боту кнопку «📋 История» (`avtero_client.fetch_history*` + `ask.py` хендлеры) → те же данные, что на сайте. Bot e2e PASS (список→тап→рендер сохранённого отчёта).

4. **Паритет функционала бот↔сайт — ЗАКРЫТО (главный разрыв — оценка отчёта).** `POST /api/report_feedback` пишет ТЕ ЖЕ `report_snapshots`+`feedback` в bot.db, что бот (web-аккаунт → telegram_id слинкованный или `-account_id`, full_name `web#N`, status `new`). Фронт: компонент `ReportRating` (✅/❌+причина) под отчётом (свежий+история); `_meta.request_id` прокинут. Дальше — бот-инбокс/одобрение + вкладка «Обучение» без изменений. Site Playwright e2e PASS (реальная отправка → строка в bot.db). **Намеренная асимметрия:** одобрение уроков — только в боте (сайт = read-only вкладка), по прежнему решению юзера.

Проверка/доступ — см. [[avtero_two_channels_verify]] [[avtero_hard_corrections_learning]] [[avtero_full_coverage_program]]. Мини: `ssh -p 2222 cebers_mini@100.84.177.25`; фронт-сборка `export PATH=/opt/homebrew/bin:$PATH` из `~/Разработки/kodoceh-web/apps/avtero` (`rm -rf .next`), рестарт `npm start -- -p 20413`.
