- страница /download/{id} держит бейдж «распознаётся» после перехода задачи
дальше; воспроизведено на боевом umbar на последней версии
- причина неизвестна: тик самообновления объявлен и покрыт тестом, поэтому
первый критерий приёмки — назвать, на каком шаге он теряется
16 KiB
16 KiB
Беклог
Что можно взять. Одна задача = один файл items/<slug>.md
- строка здесь. Целей тут нет — они в ROADMAP.md: беклог — то, что
берут, роадмап — то, подо что берут. Ведётся скиллом
av-dev-tasks:tasks.
Порядок строк внутри секции — это приоритет. Первая строка секции — то, что
делают следующим. Порядок назначает человек на груминге
(av-dev-tasks:groom), машина его не выводит.
Секции «блокеры» здесь нет и не заводится: блокер — это состояние, оно живёт до ответа человека, а его следы — вопросами в файлах задач.
Ядро продукта
- 🔬 Форма ответа поиска TheTVDB и семантика параметра language — форма ответа поиска TheTVDB принята по swagger 4.7.10 и живым прогоном не подтверждена — при иной форме разбор молча уходит в фолбэк, гейт зелёный, локализованное название не работает
- ✨ Узаконить confidence-гейт авто-раскладки в спеке и сделать его выключаемым (дефолт 0.7) — Решено (B): гейт оставляем как доп. проверку на ревью — выключаемый порог, дефолт 0.85→0.7, записать в спеку
- ✨ Пересчитывать абсолютную нумерацию аниме в SxxEyy — аниме со сквозной нумерацией (#137) не раскладывается в SxxEyy, который ждёт Jellyfin — нужен пересчёт абсолютной нумерации
- ✨ Раскладывать раздачу-копию диска (VIDEO_TS/BDMV) каталогом целиком — раздача-образ диска (VIDEO_TS/BDMV) сейчас разбирается пофайлово вместо раскладки каталога целиком — редкий, но реальный случай
- ✨ Принимать ссылку на .torrent и скачивать файл самим (нужен SSRF-гард) — magnet и .torrent-файл приняты; остался фетч .torrent по URL (нужен SSRF-гард)
- ✨ Докладывать недостающие эпизоды merge-раскладкой при повторной заливке — повторная заливка сериала целиком должна доложить недостающие эпизоды merge-раскладкой, не трогая существующие ссылки — блокирует типовой сценарий свежих сериалов
- ✨ Слать живые обновления через SSE вместо htmx-поллинга — живые обновления на htmx-поллинге дают задержку и холостые запросы — SSE убрал бы то и другое (поллинг работает, поэтому улучшение, не блокер)
- ✨ Проверять свободное место перед copy-fallback — copy-fallback при невозможности хардлинка может упереться в переполненный диск посреди раскладки — нет проверки места до копирования
- ✨ Слать уведомления автору загрузки в его транспорт (мульти-бот) — пинги и ревью должен получать автор загрузки в своём транспорте — нет привязки загрузки к источнику/отправителю (нужно для мульти-бота)
- ✨ Заменять разложенную версию тайтла новой (репаки, апгрейд 1080p → 2160p) — По калибровке болей (2026-07-02) — не боль, из приоритета выпало
- ✨ Спаривать VobSub .idx+.sub и проставлять языковой суффикс субтитра — Привязка субтитр→серия уже работает; остались пары VobSub .idx+.sub и потеря Lang/Flags
- ✨ Переделать веб-UI в устанавливаемое PWA — текущий server-rendered UI функционален — PWA (устанавливаемое, удобное с телефона) это улучшение большого объёма, не блокер
- ✨ Править на ревью маппинг «файл → серия» и раскладывать вручную при провале LLM — правка S·E, «нумеровать подряд» и ручной режим при полном провале LLM были запланированы объёмом Ф5 и не заведены задачей — в ревью сегодня можно только подсказать текстом
- ✨ Заказать спекой крайние случаи именования: многофайловый фильм, редакции, двойная серия — стэкинг частей (part1/cd1), редакции [edition-…] и двойная серия SxxEyy-Eyy описаны нарративом, но в file-layout не заказаны — раскладка таких раздач не определена
- 🐞 Не сносить раздачу, которой владеет другая активная загрузка — удаление старой закрытой задачи уничтожает файлы живой загрузки с тем же инфохэшем; воспроизведено падающим тестом на ревью bulk-delete-page
- 🐞 Не оставлять задачу в done, когда ссылки сняты, а раздача не снесена — при недоступном qBittorrent задача весь простой соседа показывает done, хотя тайтла в Jellyfin уже нет: сверка падает на первом шаге и до коррекции не доходит
- 🐞 Обновлять страницу загрузки при выходе из «распознаётся» — на боевом umbar последней версии страница держит бейдж «распознаётся» после того, как задача ушла в review или done — состояние видно только по F5
- 🔬 Канон нумерации серий и порядок у провайдера тега — Косметика/редкость: порядок просмотра ок, но у тайтлов со спорным порядком (Бибоп) Jellyfin подтягивает не те подписи серий, если канон файлов ≠ дефолтный порядок провайдера тега
- 🔬 Тексты и формат уведомлений в Telegram — зонтичный проход по всем текстам бота: полнота карточек, единый язык, оформление; порождает под-задачи
- 🔬 guessit как сервис-спутник — go-ptn слабее питоновского guessit — если точности пред-парса не хватит, завернуть guessit в сервис-спутник рядом с бинарём
- 🔬 Многоступенчатая верификация привязки — несколько проходов распознавания с консенсусом подняли бы точность ценой стоимости/латентности — проработать, когда включать и как мерджить расхождения
- 🔬 Сила совпадения кандидата и пересмотр распознавания/матчинга — у кандидата метабазы нет метрики силы совпадения — список кандидатов на ревью нечем отсортировать по уверенности (сперва проработать процесс матчинга)
- 🔬 Сложные сериальные раздачи: все сезоны разом, паки, спецраскладки — сложные раздачи (все сезоны разом, паки, смешанная нумерация) целостно не проработаны — распознавание/ревью/раскладка заточены под один сезон
- 🔬 Идентичность торрента при split v1/v2 и доверие к паре xt из магнета (F4, F5) — две находки ревью 2026-07-08 упираются в нерешённую модель идентичности: связывать ли v1- и v2-хеши одного торрента и что делать с парой xt, которую qBittorrent не подтверждал — merge, supersede или ограничение в документе
Инфраструктура
- 🐞 Тормозить опрос qBittorrent бэкоффом при недоступности и эскалировать устойчивый сбой — недоступный qBittorrent опрашивается каждые 5 с и даёт WARN на каждом тике: нужен экспоненциальный бэкофф до минутного потолка со сбросом по первому успеху и ERROR на устойчивой деградации
- 🧹 Откалибровать проходы ревью и завести ревьювер наименований — конвейер ревью переехал в плагин
av-dev-pipeline; осталась калибровка проходов на этом проекте и ревьювер наименований (ждёт словарь единого языка) - ✨ Закрыть веб-UI авторизацией, когда доверенной LAN станет мало — для v1 решено без авторизации (доверенная LAN, опц. allowlist подсетей) — задел на случай, если понадобится защита
- 🧹 Бэкапить SQLite по расписанию с ротацией — architecture требует бекапить data-том, но стратегия не описана — сбой или редеплой стирают всё in-flight состояние (проще, пока БД маленькая)
- ✨ Проверять в healthcheck доступность qBittorrent, LLM и метабаз и показывать её в UI — /healthz проверяет только сам сервис — недоступность qBittorrent/LLM/метабазы видна лишь по застрявшим задачам, нет readiness и бейджа в UI
- ✨ Хранить историю переходов загрузки отдельной таблицей — хранится только текущий статус загрузки — разбор «как сюда попали» идёт по логам сервера, нет таблицы истории переходов
- 🧹 Кэшировать ответы метабаз с TTL (и опционально LLM) — повторные и ретраящиеся прогоны бьют TMDB/TVDB/TVMaze одним запросом — кэш с TTL сэкономил бы лимиты и ускорил «Распознать заново»
- ✨ Чистить БД от терминальных задач и сырых ответов LLM старше срока хранения — терминальные задачи и сырые ответы LLM копятся вечно — без авточистки список загрузок и БД деградируют по мере эксплуатации
- 🧹 Свести термины домена в словарь единого языка — наименования домена расходятся между спеками, UI и кодом — нет единого глоссария (на нём же стоит агент-ревьювер наименований)
- 🧹 Разобрать кандидатов по тестам и записать конвенцию — как пишем тесты, не записано нигде: пункт «Тесты» в convention-candidates не пересматривали, он обещает фикстуры в testdata/, которых в проекте нет — а трение накопилось (четыре внешних клиента, fakeStore с инъекцией ошибок, env-гейты, флаки-прогон, diff-coverage)
- 🐞 Не держать общий замок воркера во время обращения к qBittorrent при удалении — на время удаления встаёт весь фон: опрос, сверка и команды остальных транспортов ждут замок до 30 с на загрузку, пачкой — минутами; замерено на ревью bulk-delete-page
- 🔬 Потолок нагрузки: 100 одновременных загрузок, план-максимум 1000 — Зафиксировать в НФТ ориентир 100/1000 загрузок + аудит узких мест (SQLite, воркер, поллинг)
- 🔬 Завершение загрузки через webhook — завершение сейчас ловим поллингом qBittorrent — webhook реагировал бы быстрее, но связывает нас с его конфигом (решим по опыту эксплуатации)
- 🔬 Кандидаты в конвенции кода — накоплен список кандидатов (внешние клиенты, конкурентность, тесты, CLI, время) — надо решить, что из них стало реальным трением, а что выдумано вперёд