---
name: avtero_feedback_learning
description: "avtero v0.7.14 — петля обратной связи в боте (✅/❌, текст/голос), инбокс в админке, ИИ учится на одобренных админом уроках"
metadata:
  type: project
  originSessionId: 4eea915e-3b47-4cd5-8a0e-bfa29b78a87c
---

**v0.7.14 (2026-06-22, commit c0d5077): фидбэк-петля с обучением через одобрение.** Реюз паттерна CryptoPilot.

**Поток:** отчёт → `✅ Всё верно`/`❌ Не то` → на ❌ причина текстом ИЛИ голосом → `Feedback`+`ReportSnapshot` (юзер+отчёт) в bot.db + уведомление всем админам → админ в `📮 Обратная связь` открывает карточку (ленивая LLM-дистилляция урока) → `✅ Принять`→active → оркестратор подмешивает в `_user_message` по марке/модели.

**Решения юзера:** уроки активны ТОЛЬКО через одобрение админа (безопасность от отравления общего промпта); строили всё разом.

**Файлы:** `bot/services/voice.py` (PyAV+NIM Riva canary-1b-v2 gRPC, self-contained, deps `av`+`nvidia-riva-client` в avtero-venv), `app/services/feedback_distill.py` (+ endpoint `/api/feedback/distill`, реюз llm_mod), `app/services/lessons.py` (читает active-уроки из bot.db read-only по `BOT_DB_PATH`, кэш 60с, scope global/make/«make model»), `bot/handlers/feedback.py`, таблицы `ReportSnapshot/Feedback/Lesson`+ops, фидбэк-клавиатуры. Админ-инбокс в `bot/handlers/admin.py` (admin:fb/fbcard/les).

**Ключевые «почему»:** ленивая дистилляция (LLM только при открытии карточки админом — не блокирует юзера, не жжёт на спам); bot.db read-only из API (не плодить sync/endpoint, путь уже в env API); 3 новые таблицы (init_db=create_all не делает ALTER); snapshot отдельно от FSM (переживает MemoryStorage, id в callback_data). Полные обоснования → Obsidian Decisions `D-feedback-learning`.

**Проверено вживую (Rule 7):** TG ❌→текст→ack, заявка с юзером+Vesta+отчётом; live distill дал корректный scoped-урок; op-цепочка одобрения → урок active → инъекция в промпт Vesta (для др. машин нет); голос Milena-TTS→Riva точная расшифровка; suite 814 passed (1 pre-existing fail test_rendering).

**Границы:** причина ловит `F.voice|F.text` (микрофон), НЕ `F.audio` (загруженный файл) — добавить при желании. Уведомление → BOT_ADMIN_USER_IDS (admin=1005954706); доставку в TG админа не наблюдал (нет доступа к аккаунту). 5-мин кэш ответов задерживает эффект свежего урока на ≤5 мин.

Связь: [[avtero_overview]], [[cryptopilot_overview]] (исходный паттерн обучения на фидбэке). Доступ: мини `cebers_mini@Cebers-mini.local`, avtero-venv, bot env в плисте `local.avtero-bot.plist`.
