---
name: avtero-make-brand-matching-class
description: Автеро — подстрочное сравнение марки/бренда жило в 4 местах и выдавало деталь чужого производителя за заводскую; сведено к одному пословному матчеру maker_matches_fields
metadata: 
  node_type: memory
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
  modified: 2026-07-29T22:18:48.303Z
---

Глубокий аудит Автеро 6 осями (2026-07-29/30) нашёл самый массовый источник неверных
номеров: сравнение «этот бренд = марка автомобиля?» стояло подстрочным (`k in b or b in k`)
в **четырёх** независимых местах, и они расходились. Суммарно ~232 тыс. OE-строк были
доступны как «заводской номер этой марки»: `AC` (17 753 строки) проходил за
honda/acura/cadillac/dacia, `ROVER` (162 487) за land rover и jaguar, `OM` (33 819) за
omoda и alfa romeo, `Lemforder` за Ford (`ford` внутри `lemfORDer` — самое эксплуатируемое,
Lemförder массовый бренд подвески), `gm` внутри `GmbH` — за всю группу GM.

**Сведено к одному матчеру** `tecdoc_local.maker_matches_fields`; `orchestrator._brand_matches`,
`tecdoc_local._validate_oe_sync` и `local_brands._mk_match` делегируют ему, список исключений
`NON_CAR_BRAND_MARKERS` тоже один. Полный разбор, замеры и отвергнутые варианты — в
`Projects/Автеро/Changelog.md` (2026-07-30) и `Decisions.md`
(`D-one-matcher-for-make-vs-brand`, `D-running-process-is-not-the-repo`).

**Три вещи, которые стоит помнить при следующей работе здесь:**

1. **Маркер класса техники проверять по объединению всех полей строки.** TecDoc усекает
   `Matchcode`, поэтому «RENAULT TRUCKS» приходит как `mc='RENAULT'` + `descr='RENAULT
   TRUCKS'`; при попольной проверке усечённый `mc` совпадает первым и маркер не читается.
   Симптом был живой: рессора Renault Trucks предлагалась для Lada Granta, у которой рессор
   нет вообще (226 из 1155 попаданий по отечественным — пары Lada←RENAULT TRUCKS).

2. **«Короткое имя = усечение длинного» верно только для НАЧАЛА имени.** «Mercedes» — это
   Mercedes-Benz, но «Rover» — не «Land Rover», а отдельная марка. Первая версия фикса
   принимала любой токен, и поймал это не разбор, а замер на 920 живых брендах из кэша emex
   (ровно одна новая ложная пара).

3. **Матчер вынесен из замыкания на уровень модуля СПЕЦИАЛЬНО ради тестируемости.** Пока он
   был closure, проверить его можно было только переписав логику в пробнике — и такая
   реплика молча отстаёт: ось аудита «подтвердила живым прогоном» баг `AC`→honda, который
   к моменту прогона уже был исправлен, потому что пробник тестировал реплику. Не
   возвращать в замыкание; логика закреплена 45 параметризованными тестами.

**#189 закрыт (2026-07-30):** грязные OEM-строки (ведущая `*` 83% из 180k замеренных строк, `(Nx)`-суффикс количества, битая scientific-notation нечинибельна) больше не уходят пользователю — `clean_oe_display()` в tecdoc_local.py режет только края строки. Заодно найден reverse false-negative (точный поиск не находил `'X (3x)'`) — чинится index-friendly LIKE-префиксом (подтверждено EXPLAIN: не полный скан). Деплой этого фикса тоже поймал [[deployed_is_not_running]] повторно тем же днём — kickstart не поднял процесс с первого раза.

**Закрыто тем же днём:** VIN-валидация (#187), честность отечественного филлера (#188),
грязные OEM-строки (#189), потеря флагов честности через LLM-ретрай при переполнении
check_note (#194). **Ещё открыто:** запрос без LIMIT роняет MariaDB, 48 крэшей в логе
(#190); устаревшее ожидание в test_orchestrator_validation_retry_succeeds (#191);
аналоги чужой категории — пружины EIBACH к крылу (#192); нерешённые вопросы паритета
каналов и honesty госномера/vin_structure (#193).

Связано: [[deployed_is_not_running]] (в этой же сессии прод крутил код от 26.07),
[[avtero_gemini_audit_fixes_2026-07]] (предыдущий заход, тот же класс),
[[avtero_delor_honesty_pattern]], [[avtero_oem_provenance]].
