Files
av 42d5b73a04 docs: перевод документации на канон av-dev
- Раскладка docs/ приведена к канону 2: заведены passport/architecture/
  database/security/review и research; docs/specs, drafts, backlog, review/
  и BRIEF.md разобраны и удалены, беклог переехал в docs/tasks (34 задачи,
  6 целей, слаги на английский).
- Нарративы specs удалены как дубли openspec-спек после поимённой сверки;
  остаток заведён задачами (редактор маппинга ревью, крайние случаи
  именования), отказ от сущности title промоутнут в ADR.
- Проектные копии агентов и скиллов ревью/пайплайна удалены в пользу
  плагинов av-dev-pm и av-dev-pipeline; в task gate добавлен шаг canon
  вместо er-schema.
2026-08-04 09:27:26 +03:00

75 lines
6.4 KiB
Markdown

## Why
Отображаемое имя (`download.display_name`) сейчас выводится по двум расходящимся
правилам. На шаге добавления `naming` извлекает из контекста структуру
(тип/название/год/**режиссёр**/сезон) и рендерит **полный** ярлык
«Название (режиссёр, год). Сезон N», но структуру после рендера **выбрасывает**.
А обновление имени по распознаванию (ручная кнопка «Обновить имя» и авто-перелив
при матче) даёт **усечённый** `Title (Year)` — без режиссёра и сезона. В итоге
режиссёр, добытый из контекста, теряется, а перелив ухудшает уже показанное имя.
Причина расхождения — у распознавания нет поля режиссёра, а извлечение из
контекста нигде не сохраняется. Решаем в общем виде: поля имени приходят из
разных источников в разное время (контекст — на старте; метабаза — при
распознавании; правки — в ревью), поэтому вводим **единый слоистый источник** и
**одну** функцию рендера ярлыка.
## What Changes
- **Слоистое разрешение скалярных полей имени** (тип, название, ориг. название,
год, режиссёр, сезон-для-ярлыка): эффективное значение поля — первый непустой
слой сверху вниз `override` (человек) → `recognition` (LLM + матч метабазы) →
**новый базовый слой «контекст»** (извлечение `naming` на старте). Слои
`override``recognition` уже существуют (`effectivePlan`/`applyOverrides`);
добавляем нижний слой и единый хелпер разрешения.
- **Извлечение из контекста становится persistent.** Структуру, которую `naming`
извлекает на шаге добавления, сохраняем у загрузки в новой JSON-колонке
(`download.parsed_context`), чтобы переиспользовать без повторного вызова LLM.
- **Режиссёр из метабазы.** Подтверждённый матч TMDB/TVDB несёт режиссёра
(credits), он вкладывается в план так же, как уже вкладываются каноничные
название/год, и в разрешении бьёт контекстного (более проверенный источник).
- **Единый рендер ярлыка display_name.** Одна функция строит полный ярлык
«Название (режиссёр, год)» (+ для сериала сводка сезонов «. Сезон N» /
«. Сезоны 1–3» / «спецвыпуски») из эффективных полей и зовётся и на старте, и
при обновлении по распознаванию. Усечённый формат `Title (Year)` при обновлении
убирается. Это закрывает беклог-задачу «Кнопка „Обновить имя“: полный формат».
- **Инфо-часть ревью** показывает загруженного режиссёра (ранее — пустое
зарезервированное место).
Всё перечисленное — косметика отображения: не влияет на пути файлов,
распознавание или раскладку. Приём и вывод имени по-прежнему не валят загрузку.
## Capabilities
### New Capabilities
(нет — вводится слой внутри существующих capability, новых доменов нет)
### Modified Capabilities
- `ingest`: извлечение из контекста сохраняется у загрузки (`parsed_context`);
обновление отображаемого имени переходит с `Title (Year)` на полный ярлык из
эффективных полей (слоистое разрешение + сводка сезонов).
- `recognition`: план несёт опциональное скалярное поле `director` (источник —
подтверждённый матч, не LLM); режиссёр — недоверенное косметическое поле.
- `metadata-match`: подтверждённый матч и кандидат несут режиссёра (TMDB/TVDB
credits), когда он доступен, для вывода имени.
- `review`: подтверждение матча обновляет имя полным ярлыком; инфо-часть
выбранного источника показывает загруженного режиссёра.
## Impact
- Код: `internal/naming` (публичный рендер из эффективных полей, экспорт
извлечённой структуры), `internal/recognize` (`Plan.Director`),
`internal/metadata` (`Candidate.Director` + выборка credits в клиентах
TMDB/TVDB), `internal/worker` (сохранение `parsed_context` на старте; хелпер
`effectiveFields`; полный формат в `refreshDisplayNameLocked`),
`internal/store` (миграция goose: колонка `download.parsed_context`; чтение/
запись), `internal/httpapi` (инфо-часть режиссёра; переиспользование
`seasonSummary`).
- БД: новая колонка `download.parsed_context` (TEXT, JSON) — обновить ER-схему
`docs/specs/database.md`.
- Внешние вызовы: дополнительный запрос credits к TMDB/TVDB при подтверждённом
матче (best-effort, недоступность не валит распознавание).
- Беклог: закрывается `docs/tasks/items/knopka-obnovit-imya-polnyj-format.md`.