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

5.5 KiB

1. Хранение контекста (миграция + store)

  • 1.1 Миграция goose (internal/store/migrations): ALTER TABLE download ADD COLUMN parsed_context TEXT NOT NULL DEFAULT '' (down — дроп колонки)
  • 1.2 store.Download: поле ParsedContext string \db:"parsed_context"`; включить колонку в SELECT/INSERT (internal/store/download.go, list.go`)
  • 1.3 Метод SetParsedContext(ctx, id, json string) error (best-effort апдейт) в store; добавить в интерфейс worker
  • 1.4 Обновить ER-схему docs/specs/database.md (новая колонка)

2. Извлечение из контекста → persistent

  • 2.1 internal/naming: экспортировать извлечённую структуру и её JSON (публичный тип полей + метод/функция, возвращающая структуру вместе с именем), не ломая текущий DeriveName
  • 2.2 worker.go шаг добавления: сохранять извлечённую структуру в download.parsed_context (best-effort; сбой логируется, добавление не валит); пустая структура → пустой parsed_context

3. Режиссёр из метабазы (решение A2)

  • 3.1 metadata.Provider: метод выборки режиссёра по id (credits) — реализовать в клиентах TMDB и TVDB (best-effort); TVMaze → пусто/не поддержан
  • 3.2 recognize.Plan: поле Director \json:"director,omitempty"``; LLM его не заполняет, в валидации/гейте/plan-санитайзинге не участвует
  • 3.3 Recognize/matchMetadata: при подтверждённом авто-матче вкладывать режиссёра в plan.Director (как уже вкладываются title/year), best-effort
  • 3.4 Интерфейс Recognizer (worker): метод выборки режиссёра по (provider, id) — проброс к metadata-провайдерам (без прямой зависимости worker→metadata)
  • 3.5 Ручной путь ревью: новое override-поле ovrDirector; добавить его в sourcePins; chooseCandidateLocked/AddManualSource best-effort тянут режиссёра выбранного provider:id и пишут в ovrDirector (пусто → очищает пин)
  • 3.6 applyOverrides: класть ovrDirector в plan.Director

4. Единый рендер ярлыка + слоистое разрешение

  • 4.1 Вынести логику seasonSummary (httpapi/files.go) в переиспользуемое место (recognize или naming); httpapi зовёт общий хелпер (поведение карточки не меняется)
  • 4.2 internal/naming: публичная функция рендера полного ярлыка из эффективных полей (title/director/year + готовая строка сводки сезонов); удалить/перевести FormatTitleYear
  • 4.3 worker: хелпер effectiveNameFields(download, plan, overrides) — первый непустой слой override → recognition(+match) → parsed_context на поле; сводка сезонов: seasonSummary(plan) при наличии episode-ролей, иначе fallback на контекстный скаляр Season → «Сезон N»; director: override → plan → context
  • 4.4 refreshDisplayNameLocked: заменить FormatTitleYear(...) на рендер по эффективным полям; сохранить best-effort qBit rename, no-op при пустом источнике
  • 4.5 Сверить, что старт (DeriveName) использует тот же рендер (единый формат ярлыка на всех путях)

5. UI ревью: режиссёр в инфо-части

  • 5.1 httpapi инфо-часть выбранного источника: показывать режиссёра из эффективного плана/кандидата, пустой → прочерк (без слома вёрстки)

6. Тесты и проверки

  • 6.1 Юнит-тесты рендера ярлыка: полный формат, опциональность режиссёра/года, сводка сезонов (один/несколько/спецвыпуски), санитайзинг+лимит
  • 6.2 Тест слоистого разрешения: контекст-режиссёр переживает распознавание без матча; матч-режиссёр бьёт контекстного; override бьёт оба
  • 6.3 Тест persist parsed_context на старте + best-effort (сбой не валит добавление)
  • 6.4 Тест метабазного режиссёра: авто-матч TMDB/TVDB → plan.Director; ручной выбор кандидата тянет режиссёра в ovrDirector; недоступность credits → пусто, матч/выбор не падают
  • 6.5 task lint и task test зелёные; openspec validate --strict
  • 6.6 Удалить закрытую беклог-задачу docs/tasks/items/knopka-obnovit-imya-polnyj-format.md и строку в индексе беклога