## Why

Деление capabilities в OpenSpec сложилось стихийно по ходу миграции и смешивает
разные заботы в одной спеке: `recognition` держит и разбор через LLM, и работу с
внешними базами; поведение ревью размазано между `web-ui` и не перенесённым
`docs/specs/review-ux.md`; ключевые звенья цепочки (раскладка, отслеживание
загрузки, уведомления) в OpenSpec отсутствуют вовсе. На каждой задаче приходится
гадать, какой capability трогать. Приводим набор capabilities к цепочке
«загрузка → распознавание → матч → ревью → раскладка», где имя capability
отвечает **одному** поведению.

Это чисто спецификационный рефакторинг: **поведение системы не меняется**, код не
трогаем. Меняются только границы и расположение требований.

## What Changes

- **Разделяем `recognition`**: оставляем в нём только разбор сигналов LLM (план,
  тип, название, файлы→серии, модель уверенности, решение auto/review); всю работу
  с метабазами выносим в новую `metadata-match`.
- **Вводим `review`** как отдельный capability: переносим поведение ревью из
  `web-ui` (единый список источников, ручное добавление источника, предпросмотр
  полей) и мигрируем `docs/specs/review-ux.md`.
- **Подрезаем `web-ui`** до чистого оформления: статика, шрифты, дизайн-система,
  скелет страниц, бейджи, клиентские взаимодействия, превью через единую логику
  именования.
- **Мигрируем в OpenSpec** три звена цепочки, живущие пока в `docs/specs`:
  `file-layout` (из `jellyfin-layout.md`), `download-tracking` (FSM/поллинг из
  `workflow.md`), `notifications` (из `workflow.md` + `architecture.md`).
- **Чистим `identity`** до инфраструктуры id: переносим приёмные требования
  (инфохэши, дедуп, атомарный возврат в активное) в `ingest`.
- **Собираем уведомления** в `notifications`: переносим «Уведомление о
  рассинхроне» из `state-reconciliation`.
- Не-BREAKING: перенос требований (REMOVED в исходной спеке + ADDED в целевой),
  формулировки сохраняем эквивалентными.

## Capabilities

### New Capabilities
- `metadata-match`: поиск записи во внешних базах (TMDB/TVDB/TVMaze) по названиям,
  сбор кандидатов, подтверждение единичного сильного матча → `provider`/
  `provider_id`/каноническое имя/год, URL кандидата.
- `review`: процесс ревью после распознавания и матча — петля «догадка → подсказка
  → перераспознавание», команды (Применить/Уточнить/Распознать заново/Тип/Игнор/
  Позже/Отклонить/Undo/Привязать заново), подсказка vs override, единый список
  источников совпадения, ручное добавление источника, предпросмотр (превью=
  применение), разделение труда транспортов.
- `file-layout`: целевые имена фильмов/сериалов, сопоставление источник→цель,
  хардлинки, санитизация пути и запрет выхода за библиотеку, never-overwrite,
  copy-fallback. Владение путём (`superseded`) и безопасный undo (`nlink<=1`)
  остаются в `state-reconciliation` (не дублируем — см. design.md).
- `download-tracking`: поллинг qBittorrent и машина состояний загрузки —
  `downloading`/`completed`/`stuck`/`failed`, завершение (moving/checking),
  таймауты (`magnet_timeout`/`stuck_after`), усыновление по категории/тегу.
- `notifications`: пинги автору загрузки — падения (`failed`/`stuck`, включая
  приёмный `qbit_add` мимо поллинга) с дебаунсом, вход в review и готовность,
  рассинхрон.

### Modified Capabilities
- `recognition`: убираем требования по метабазам (уезжают в `metadata-match`);
  добавляем перенесённый из `docs/specs/recognition.md` разбор сигналов LLM
  (пред-парс, схема плана, провайдер LLM, модель уверенности).
- `ingest`: принимает перенесённые из `identity` приёмные требования (множество
  инфохэшей, дедуп по любому хешу, атомарный возврат в активное состояние).
- `identity`: убираем приёмные требования — остаётся инфраструктура id (ULID,
  нормализация/валидация, корреляция в логах, миграция).
- `web-ui`: убираем ревью-специфику (уезжает в `review`) — остаётся оформление.
- `state-reconciliation`: убираем «Уведомление о рассинхроне» (уезжает в
  `notifications`).

## Impact

- Затрагивает только `openspec/specs/**` и `openspec/changes/**` — **кода нет**.
- Источник истины по мигрируемым темам переезжает из `docs/specs/`
  (`recognition.md`, `review-ux.md`, `jellyfin-layout.md`, `workflow.md`) в
  `openspec/specs/` (как пилот `ingest`); в исходных файлах ставим пометку о
  переезде, содержимое не дублируем.
- CLAUDE.md и `docs/backlog.md`: снять пункт из беклога, при необходимости
  поправить перечисление capabilities.
- Валидация: `openspec validate --strict` для change перед коммитом; после архива
  дельты вливаются в `openspec/specs/`.
