# TODO Конкретные задачи на будущее, ранжированные по приоритету. Это не план реализации (он — в [drafts/roadmap.md](drafts/roadmap.md)) и не свалка идей ([drafts/ideas.md](drafts/ideas.md)): сюда попадает то, что уже решили сделать, но ещё не сделали. Принятое и реализованное переезжает в `docs/specs`/`docs/adr`. Приоритет — грубая оценка «ценность / стоимость», не обязательство к порядку. ## Высокий ### Проблема второго сезона Если первый сезон сериала уже разложен, а мы добавляем второй/третий/…, распознавание должно привязать новый сезон к **тому же** названию и папке, а не завести рядом почти одинаковую вторую папку. Ключ — стабильный `provider_id`: один и тот же `[tvdbid-…]` → одна папка сериала, новые `Season NN` доливаются внутрь. Нужно: при матче учитывать уже существующие в библиотеке сериалы (или прошлые распознавания с тем же провайдер-id) и склонять LLM/выбор кандидата к согласованности с ними. Связано: [recognition.md](specs/recognition.md) (модель уверенности, матч в базе), [jellyfin-layout.md](specs/jellyfin-layout.md) (папка сериала с провайдер-id). ### Название из контекста при добавлении в qBittorrent При создании magnet-загрузки передавать в qBittorrent человекочитаемое имя из контекста (если оно есть), чтобы в списке qBit не было безликих `rutracker-topic-6852853`. Небольшая задача с заметной отдачей в повседневной эксплуатации. Связано: [architecture.md](specs/architecture.md) → «Транспорты», пакет `ingest`/`qbt`. ## Средний ### Машина состояний на go-библиотеке Сейчас FSM реализована вручную в `worker`. Выбрать подходящую go-библиотеку для описания воркфлоу/машины состояний и перевести переходы на неё — ради декларативности, проверяемости переходов и единого места правды. Кандидаты для оценки: `looplab/fsm`, `qmuntal/stateless` (и аналоги). Граф и переходы уже формализованы — переносим один в один. Связано: [workflow.md](specs/workflow.md) (текущий граф состояний). ### Привязка уведомлений к источнику в ботах (мульти-бот) Уведомления и запросы подтверждения должен получать тот, кто прислал загрузку: автор сообщения о новой раздаче — адресат пингов и ревью по ней. Транспортов-ботов может быть несколько (Telegram, в перспективе Matrix и др.); каждый адресует «своему» отправителю. Веб-интерфейс остаётся **единым для всех** и точкой правды по функциональности (боты — тонкие адаптеры над тем же ядром). Нужно: хранить у загрузки источник/транспорт и идентификатор отправителя, маршрутизировать пинги по нему. Связано: [review-ux.md](specs/review-ux.md) (разделение труда транспортов, веб = точные правки), [architecture.md](specs/architecture.md) → «Транспорты». ### Добавление торрентов файлом/ссылкой — «единое окно» Поддержать источники помимо magnet: `.torrent`-файл и URL (отдаём их в qBittorrent, без исходящих запросов на пользовательский URL — SSRF исключён). Идеал — одно поле «единого окна»: кидаем туда текст или файл, а сервис сам разбирает, что это (magnet / ссылка / .torrent / сообщение бота), и заводит загрузку. Связано: [architecture.md](specs/architecture.md) → «Транспорты» (`source_type = magnet|torrent|url` уже в схеме), пакет `ingest` (сейчас поддержан только magnet). ## Низкий ### Многоступенчатая верификация привязки (тема для размышления) Идея: несколько раз извлекать данные из раздачи и контекста разными промптами, искать в метабазах, затем сводить результаты в общий вердикт (голосование/консенсус) — выше точность ценой нескольких вызовов LLM и запросов к базам. Требует проработки: когда включать, как мерджить расхождения, стоимость/латентность. Связано: [recognition.md](specs/recognition.md) (конвейер и модель уверенности). ### Современный Web-UI как PWA Переделать веб-интерфейс в современное PWA-приложение (устанавливаемое, отзывчивое, удобное с телефона). Текущий server-rendered UI функционален, поэтому это улучшение, а не блокер; большой объём работы. Связано: [review-ux.md](specs/review-ux.md) (веб = точные правки), пакет `httpapi`.