Files
jellybit/openspec/changes/archive/2026-07-11-field-resolution-display-name/proposal.md
T
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

6.4 KiB

Why

Отображаемое имя (download.display_name) сейчас выводится по двум расходящимся правилам. На шаге добавления naming извлекает из контекста структуру (тип/название/год/режиссёр/сезон) и рендерит полный ярлык «Название (режиссёр, год). Сезон N», но структуру после рендера выбрасывает. А обновление имени по распознаванию (ручная кнопка «Обновить имя» и авто-перелив при матче) даёт усечённый Title (Year) — без режиссёра и сезона. В итоге режиссёр, добытый из контекста, теряется, а перелив ухудшает уже показанное имя.

Причина расхождения — у распознавания нет поля режиссёра, а извлечение из контекста нигде не сохраняется. Решаем в общем виде: поля имени приходят из разных источников в разное время (контекст — на старте; метабаза — при распознавании; правки — в ревью), поэтому вводим единый слоистый источник и одну функцию рендера ярлыка.

What Changes

  • Слоистое разрешение скалярных полей имени (тип, название, ориг. название, год, режиссёр, сезон-для-ярлыка): эффективное значение поля — первый непустой слой сверху вниз override (человек) → recognition (LLM + матч метабазы) → новый базовый слой «контекст» (извлечение naming на старте). Слои overriderecognition уже существуют (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.