- Раскладка 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.
6.4 KiB
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.