Заархивировал review-source-selection: дельта web-ui влита в спеки (openspec)

Влил 3 ADDED (единый список источников, ручное добавление по id/URL,
предпросмотр полей до фиксации) и 2 MODIFIED (превью для каждого источника;
матч ссылкой в списке источников) требования в openspec/specs/web-ui.
Change перенесён в changes/archive. Убрал реализованный пункт из беклога,
перецелил ссылки на review-ux.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-07-03 10:34:10 +03:00
co-authored by Claude Opus 4.8
parent aac3ced262
commit 322bd8aa5b
7 changed files with 121 additions and 42 deletions
@@ -0,0 +1,87 @@
## Why
Экран ревью сегодня трактует распознавание нейронкой и совпадения из
метабаз как **разные режимы**: догадка LLM показана сверху как «текущий
план», а кандидаты TMDB/TVDB — отдельным списком ниже; «без базы» —
особое состояние. Из-за этого выбор источника непрозрачен: чтобы понять,
куда лягут файлы при другом кандидате, приходится сначала его выбрать
(запись пиннится в overrides) и только потом увидеть результат. Отменить и
попробовать другой — снова вслепую.
Принцип должен быть иным: **совпадение есть всегда — мы лишь выбираем
источник**. Матч нейронки — такая же строка списка, как кандидаты баз.
Выбор любого источника должен показывать, что получится (поля и целевые
пути), **до применения**.
## What Changes
- **Единый список источников совпадения** на странице ревью: строка
«распознано нейронкой» (без базы) наравне с кандидатами метабаз
(TMDB/TVDB/TVMaze) — один список с выбором одного активного источника,
а не «план сверху + кандидаты снизу».
- **Выбор / переключение / отмена в пользу нейронки** как операции над
этим списком: выбрать кандидата базы, переключиться на другого, снять
матч с базой обратно на нейронку — единообразно.
- **Ручное добавление кандидата** по id или URL записи базы, когда
автопоиск промахнулся: добавляется в тот же список как выбираемая строка.
- **Предпросмотр до применения**: при наведении/выборе источника показываем
**поля** (тип, название, год) и **предпросмотр целевых путей раскладки**,
которые получатся при этом источнике, **не пиннит** выбор до явного
подтверждения. Место под «режиссёр» в предпросмотре резервируем (источник
подключим позже — часто есть в контексте загрузки).
- Существующие действия ревью (Применить/Отклонить/Позже/Уточнить/тип/
игнор/Undo) сохраняются; переработка касается только блока выбора
источника и предпросмотра.
Вне объёма (осознанно, чтобы не раздувать change):
- **Детали записи из метабазы** (режиссёр и пр.) через новый вызов
«детали по id» — только резервируем место в UI, сам fetch не делаем.
- **Полноценный редактор маппинга «файл → серия»** — остаётся Ф5.
- Изменения в Telegram — не трогаем (веб = точные правки).
## Capabilities
### New Capabilities
Новых capability не вводим. Отдельный capability `review` (весь процесс
ревью) и перекройка домена метабаз — предмет отдельной задачи беклога
«Пересмотр набора capabilities и рефакторинг спек»; здесь ограничиваемся
существующими capability.
### Modified Capabilities
- `web-ui`: рендеринг страницы ревью получает **единый список выбора
источника** (нейронка + кандидаты баз + ручной ввод) и **предпросмотр
полей и целевых путей выбранного источника до применения**. Предпросмотр
берётся из единой логики `internal/layout`, как и текущее превью
раскладки.
Сбор кандидатов при сверке с базами (`recognition`) переиспользуется как
есть — его поведение не меняется.
Часть логики этого change доменная (ручное добавление источника,
самосогласованный набор overrides при выборе — см. design.md 1a), а не чисто
презентационная. До выделения отдельного capability `review` (отложено в
беклог) она осознанно живёт под `web-ui`; наблюдаемое поведение выражено
требованиями `web-ui`, а `docs/specs/review-ux.md` остаётся источником истины
по review-домену и обновляется в этом change.
## Impact
- **Код:** `internal/httpapi` (обработчик и шаблон страницы ревью,
парсер ручного ввода id/URL, клиентский JS переключения предпросмотра без
пиннинга), `internal/worker` (метод расчёта эфемерного плана + предпросмотра
путей для источника без записи overrides — переиспользует `applyOverrides` +
`layout.BuildLinks`; единая деривация «источник → overrides» с очисткой
title/year в `ChooseCandidate`/`ClearProvider` — заодно чинит залипший
override). Возможна небольшая правка `internal/store` при персистентности
вручную добавленного кандидата.
- **Данные:** новый пользовательский путь добавления кандидата вручную
(provider+id, опц. url); поля title/year у него могут быть пустыми
(деталей из базы пока не тянем).
- **Инварианты:** предпросмотр только строит пути через `layout` (та же
санитизация и проверка границ библиотеки); выбор источника ничего не
раскладывает — хардлинки по-прежнему только по «Применить».
- **Совместимость:** ломающих изменений API/схемы не предполагается;
существующие действия ревью и их семантика сохраняются.