---
name: avtero_live_harvest_selffill
description: avtero — самонаполняющийся локальный слой live_harvest (write-through live-хитов по VIN → офлайн-покрытие; sqlite на Ext)
metadata: 
  node_type: memory
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
---

**live_harvest (v0.7.16, 2026-07-02):** `app/services/live_harvest.py` + `/Volumes/Ext/avtero/live_harvest/live_harvest.sqlite` (`vehicle_oe`, UNIQUE(make,model,year,cat,**pos** F/R/L/T)). Write-through в `_resolve_named_part`: уверенный live-хит autodoc/emex по VIN → строка; офлайн-путь (без VIN) читает слой ПЕРВЫМ из категорийных фолбэков, позиционно-точный (лев≠прав), год ±2, confident без axle-оговорки. Fail-soft. Каждый запрос юзера сам пополняет слой — «данные с сайтов добиваются» постоянно.

**v0.8.5 (2026-07-06):** закрыт пробел — VIN-путь `get_oem_by_vin` раньше возвращал без self-fill (в БД источники были только `*_byname`/`*_l2`/`epc_data`, VIN-path — ноль). Теперь confident VIN-доказанный OEM пишется с `source=<catalog>_vin` → durable для будущих **no-VIN** запросов той же машины; read-back заново прогоняет engine/axle/drivetrain-гейты (проверено: engine KNOWN→отдаёт, UNKNOWN→miss). Бэкап `orchestrator.py.bak-vinselffill-*`. Решение [[avtero_feedback_learning]]: ✅-отчёты в live_harvest НЕ промоутим (per-report≠per-part = over-claim; corrections уже обобщают шире) — Decisions D-feedback-groundtruth-captured.

Бутстрап ЗАВЕРШЁН 2026-07-02: 399 live-вызовов, 75 добыто, 60 строк (41 реальная машина из истории × 12 дырявых категорий, пауза 4с, скип покрытого). Собраны стеклоподъёмники/ремни безопасности (Creta-2021 88870M0000TRY — модели нет в дампе!)/радиаторы печки/баки/поводки. Проверено офлайн: `source=live_harvest_local`. Регресс `tests/test_live_harvest.py` (7). Скрипт бутстрапа: `/tmp/bootstrap_harvest.py` (mini), можно перегонять при росте истории. Бэкап `orchestrator.py.bak-liveharvest-*`. Решение D-live-harvest-selffill. Связано [[avtero_full_coverage_program]] [[avtero_validation_audit_axle]].
