---
name: avtero_vin_model_gate
description: avtero VIN identification — VDS→модель декодер (Mercedes) + pre-flight гейт требует модель (v0.7.24)
metadata: 
  node_type: memory
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
---

avtero v0.7.24 (commit `c289e97`): закрыт пробел «бренд по WMI есть, модель нет → OEM пустые» двумя слоями в `app/services/orchestrator.py` (бот не трогали — петля подтверждения `vehq:ok/manual/cancel` готова с v0.6.16).

**1. VDS→модель декодер.** `_VDS_MODEL_BY_MAKE` + `_vds_model_from_make_position(vin, make)` (зеркало `_VIN_ENGINE_BY_MAKE`: `positions`+`table`+`wmi_prefixes`+`digits_only`). Засеян ТОЛЬКО **Mercedes-Benz** Baumuster (поз.4-6, 0-based slice 3:6): 204/205/206=C-Class, 211/212/213/214=E-Class, 221/222/223=S-Class, 167=GLE, 253=GLC, 463=G-Class. Гарды: WMI ∈ W1K/W1N/WDD/WDC/WDB/W1V и только цифры. Хук в `_apply_vin_overrides` после project/family — ставит модель только если пуста (не перетирает каталог/LLM). **Volvo/Chery НЕ сеяли** намеренно: Volvo код модели зависит от рынка/года (с 2010 поз.4-5 = двигатель, модель на поз.7), Chery VIN-структура публично не раскрыта → угадывание = мисдекод → отдаём гейту.

**2. Гейт требует модель.** `decode_only` возвращает `confirmed=False` при пустой модели И источнике не из `_CONFIRMED_SOURCES` (exist/emex/vinformer/nsis/manual) → API `needs_confirmation` → бот спрашивает марку/модель/год. **ВАЖНО:** `_vehicle_confirmed` (honesty-guard) оставлен make-only — НЕ добавлять туда требование модели (рушит confidence до «low» для VW с LLM-моделью; ловит тест `test_orchestrator_validation_retry_succeeds`). Развязка: guard мягкий (марка), гейт строгий (модель).

Проверено: офлайн-юнит, живой API (Mercedes W1K→S-Class идёт в подбор; Chery/Volvo→needs_confirmation; Creta Z94 без регресса), bot tg-web-e2e (Volvo VIN→бот спросил модель). 824 passed.

Расширение охвата = добавить строки в `_VDS_MODEL_BY_MAKE` (Volvo/Chery — когда найдётся верифицированная per-платформенная таблица). Базы avtero (TecDoc/MariaDB/vin_hints) — на `/Volumes/Ext`, память mini не забивать. См. [[avtero_overview]], Obsidian Decisions D-vds-model-gate.

**v0.7.25 (commit `5c2838f`) — самообучение VIN→модель (`app/services/vin_learn.py`, SQLite `/Volumes/Ext/avtero/vin_hints.db`).** Каждое ручное подтверждение гейта = ground truth: точный VIN→модель активен с 1-го подтверждения, префикс WMI+поз.4-6→модель — консенсусом (count ≥ `VIN_HINTS_MIN_COUNT`=2, конфликт→молчит, мисдекод протечь не может). Захват в `main._preflight_gate` (ветка `confirm_make`), консульт в `orchestrator._apply_vin_overrides` ПОСЛЕ статического VDS, только при пустой модели (не перетирает каталог/LLM). 7 unit-тестов `tests/test_vin_learn.py`.

**ВАЖНО — честная граница для статических VDS-таблиц:** позиционная таблица «модель в VIN» надёжна ТОЛЬКО у брендов с чистой схемой (Mercedes/Hyundai/Kia/Lada — есть). BMW/VAG/Volvo/китайцы чистой схемы НЕ имеют → НЕ хардкодить (мисдекод), их закрывает самообучение. Бесплатного источника модели для них нет (проверено: exist/emex→None, NHTSA→только марка). Не предлагать «добавить таблицу BMW/VAG/Volvo» без верифицированной per-платформенной схемы. **Volvo конкретно:** 2010+ модель в поз.7, но ПЕРЕГРУЖЕНА годом (буква=разные модели по годам) — единой таблицы нет, не сеять.

**v0.7.26 (commit `82b38bc`):** Mercedes Baumuster расширен верифицированными однозначными кодами (Wikipedia): 176/177=A, 117/118=CLA, 257=CLS, 231/232=SL, 190/192=AMG GT, 253/254=GLC, 167=GLE, 292=GLE Coupe, 293=EQC, 294/295=EQE, 296/297=EQS, 463=G, плюс C/E/S. Неоднозначные 247(B/GLA/GLB) и 420(Vito/V/Citan) НЕ добавлены. Залочено `tests/test_vds_model.py` (31 кейс). Suite 862 passed. Живой decode_only: реальный W1K→S-Class, синтетический CLA→CLA, Chery/Volvo→гейт.
