Переработка экрана ревью: единый список источников (нейронка наравне с кандидатами баз), выбор/переключение/снятие в пользу нейронки, ручное добавление по id/URL, предпросмотр полей и целевых путей до применения. Дизайн отревьюен: единая деривация «источник → overrides» (preview==apply, чинит залипший override title/year). Ограничились существующими capabilities. Беклог: добавил две идеи — «Пересмотр набора capabilities и рефакторинг спек» и «Сила совпадения кандидата / пересмотр распознавания и матчинга». Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
88 lines
7.2 KiB
Markdown
88 lines
7.2 KiB
Markdown
## 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/схемы не предполагается;
|
||
существующие действия ревью и их семантика сохраняются.
|