docs: проект переведён на канон документов версии 4

- каталог задач: PLAN.md → ROADMAP.md с каноническими секциями, все 44
  записи получили тип, заголовки приведены к форме своего типа
- расхождения, найденные судьями канона: исключения инварианта «источник
  неприкосновенен», инвариант про один активный infohash, UTC в logging.md,
  поведение из architecture.md заменено ссылками на спеки
- триггеры профиля ревью переписаны под умолчание standard
This commit is contained in:
av
2026-08-06 13:32:06 +03:00
parent 905a1ee4d3
commit 66d39297c5
66 changed files with 334 additions and 204 deletions
+3 -2
View File
@@ -1,6 +1,7 @@
# Аниме с абсолютной нумерацией
# ✨ Пересчитывать абсолютную нумерацию аниме в SxxEyy
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** аниме со сквозной нумерацией (#137) не раскладывается в SxxEyy, который ждёт Jellyfin — нужен пересчёт абсолютной нумерации
- **Теги:** goal:complex-releases
@@ -1,6 +1,7 @@
# Confidence-гейт авто-раскладки: узаконить в спеке + сделать выключаемым (дефолт 0.7)
# ✨ Узаконить confidence-гейт авто-раскладки в спеке и сделать его выключаемым (дефолт 0.7)
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** Решено (B): гейт оставляем как доп. проверку на ревью — выключаемый порог, дефолт 0.85→0.7, записать в спеку
- **Теги:** goal:recognition-accuracy
@@ -35,7 +36,12 @@
вспомогательный сигнал». Добавить сценарий: матч + чистая валидация +
согласованность, но `confidence` ниже порога → review.
4. **Конфиг-конвенция/дока:** описать ключ в `docs/conventions/config.md` (диапазон
[0,1], 0 = выкл, дефолт 0.7).
[0,1], 0 = выкл, дефолт 0.7) и поправить значение в таблице «Настройки с
числовым значением» [docs/database.md](../../database.md) — дом числа там, и
при смене дефолта оно разъедется первым. Формулировки инварианта в
`CLAUDE.md` и ложноположительного в `docs/review.md` уже приведены к
«единственным гейтом не является» (канон 4, 2026-08-06) — переписывать их
задача не должна.
5. **Тесты:** `decide` с `threshold=0` (гейт выключен, авто при чистых 1–3);
confidence ниже/выше порога при выполненных 1–3.
6. Точное число порога откалибровать позже — для этого есть задача
+3 -2
View File
@@ -1,6 +1,7 @@
# Шум ERROR фоновых циклов при недоступной зависимости
# 🐞 Не штормить ERROR при недоступном qBittorrent и эскалировать устойчивый сбой тика
- **Секция:** инфраструктура
- **Тип:** fix
- **Категория:** Инфраструктура
- **Зачем:** Остаток задачи логирования: ext.* ERROR-шторм при недоступном qBittorrent + эскалация устойчивого сбоя тика _(ревью Fable)_
- **Теги:** goal:operational-resilience
+3 -2
View File
@@ -1,6 +1,7 @@
# [idea] Сила совпадения кандидата и пересмотр распознавания/матчинга
# 🔬 Сила совпадения кандидата и пересмотр распознавания/матчинга
- **Секция:** ядро продукта
- **Тип:** research
- **Категория:** Ядро продукта
- **Зачем:** у кандидата метабазы нет метрики силы совпадения — список кандидатов на ревью нечем отсортировать по уверенности (сперва проработать процесс матчинга)
- **Теги:** goal:recognition-accuracy
@@ -1,6 +1,7 @@
# `addReq` не пересобирается из свежего `source_type` перед `Add` (окно namer'а)
# 🐞 Пересобирать `addReq` из свежего `source_type` перед `Add` (окно namer'а)
- **Секция:** ядро продукта
- **Тип:** fix
- **Категория:** Ядро продукта
- **Зачем:** При апгрейде magnet→.torrent в окне namer'а добавится magnet из устаревшего снимка; самоисцеляется через magnet_timeout→failed→Retry _(аудит 2026-07-17)_
- **Теги:** goal:state-integrity
+3 -2
View File
@@ -1,6 +1,7 @@
# [idea] Завершение загрузки через webhook
# 🔬 Завершение загрузки через webhook
- **Секция:** инфраструктура
- **Тип:** research
- **Категория:** Инфраструктура
- **Зачем:** завершение сейчас ловим поллингом qBittorrent — webhook реагировал бы быстрее, но связывает нас с его конфигом (решим по опыту эксплуатации)
- **Теги:** goal:ingest-and-review-interfaces
+3 -2
View File
@@ -1,6 +1,7 @@
# [goal] Сложные раздачи
# 🎯 Раскладывается не только типовая раздача
- **Секция:** темы
- **Тип:** goal
- **Секция:** Направления
- **Зачем:** типовая раздача раскладывается, а всё, что сложнее одного сезона одного тайтла, упирается в ручной разбор
- **Теги:** decomposed
+3 -2
View File
@@ -1,6 +1,7 @@
# [idea] Сложные сериальные раздачи: все сезоны разом, паки, спецраскладки
# 🔬 Сложные сериальные раздачи: все сезоны разом, паки, спецраскладки
- **Секция:** ядро продукта
- **Тип:** research
- **Категория:** Ядро продукта
- **Зачем:** сложные раздачи (все сезоны разом, паки, смешанная нумерация) целостно не проработаны — распознавание/ревью/раскладка заточены под один сезон
- **Теги:** goal:complex-releases
+3 -2
View File
@@ -1,6 +1,7 @@
# [idea] Кандидаты в конвенции кода
# 🔬 Кандидаты в конвенции кода
- **Секция:** Инфраструктура
- **Тип:** research
- **Категория:** Инфраструктура
- **Зачем:** накоплен список кандидатов (внешние клиенты, конкурентность, тесты, CLI, время) — надо решить, что из них стало реальным трением, а что выдумано вперёд
- **Теги:** goal:dev-process-quality
+3 -2
View File
@@ -1,6 +1,7 @@
# Ретеншн и очистка БД
# ✨ Чистить БД от терминальных задач и сырых ответов LLM старше срока хранения
- **Секция:** инфраструктура
- **Тип:** feature
- **Категория:** Инфраструктура
- **Зачем:** терминальные задачи и сырые ответы LLM копятся вечно — без авточистки список загрузок и БД деградируют по мере эксплуатации
- **Теги:** goal:operational-resilience
@@ -1,6 +1,7 @@
# Глубокий healthcheck и статус зависимостей
# ✨ Проверять в healthcheck доступность qBittorrent, LLM и метабаз и показывать её в UI
- **Секция:** инфраструктура
- **Тип:** feature
- **Категория:** Инфраструктура
- **Зачем:** /healthz проверяет только сам сервис — недоступность qBittorrent/LLM/метабазы видна лишь по застрявшим задачам, нет readiness и бейджа в UI
- **Теги:** goal:operational-resilience
+3 -2
View File
@@ -1,6 +1,7 @@
# [goal] Процесс и качество разработки
# 🎯 Домен называется одинаково везде, ревью откалибровано
- **Секция:** темы
- **Тип:** goal
- **Секция:** Сопровождение
- **Зачем:** наименования домена расходятся между спеками, UI и кодом, а конвейер ревью не откалиброван — растёт цена каждой следующей задачи
- **Теги:** decomposed
+3 -2
View File
@@ -1,6 +1,7 @@
# Раздачи-копии диска (DVD/BluRay: VIDEO_TS/BDMV)
# ✨ Раскладывать раздачу-копию диска (VIDEO_TS/BDMV) каталогом целиком
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** раздача-образ диска (VIDEO_TS/BDMV) сейчас разбирается пофайлово вместо раскладки каталога целиком — редкий, но реальный случай
- **Теги:** goal:complex-releases
+3 -2
View File
@@ -1,6 +1,7 @@
# Веб-UI зовёт Cancel вместо Dismiss на не-терминальных → теряется `user_dismiss`
# 🐞 Не терять маркер `user_dismiss` при закрытии не-терминальной загрузки из веб-UI
- **Секция:** ядро продукта
- **Тип:** fix
- **Категория:** Ядро продукта
- **Зачем:** Функционально ок (Cancel даёт cancelled), но маркер user_dismiss в error_code теряется; расхождение с буквой спеки _(аудит 2026-07-17)_
- **Теги:** goal:state-integrity
@@ -1,6 +1,7 @@
# История переходов загрузки
# ✨ Хранить историю переходов загрузки отдельной таблицей
- **Секция:** инфраструктура
- **Тип:** feature
- **Категория:** Инфраструктура
- **Зачем:** хранится только текущий статус загрузки — разбор «как сюда попали» идёт по логам сервера, нет таблицы истории переходов
- **Теги:** goal:state-integrity
+3 -2
View File
@@ -1,6 +1,7 @@
# Согласование канона нумерации серий с провайдером тега
# 🔬 Канон нумерации серий и порядок у провайдера тега
- **Секция:** ядро продукта
- **Тип:** research
- **Категория:** Ядро продукта
- **Зачем:** Косметика/редкость: порядок просмотра ок, но у тайтлов со спорным порядком (Бибоп) Jellyfin подтягивает не те подписи серий, если канон файлов ≠ дефолтный порядок провайдера тега
- **Теги:** goal:complex-releases
+3 -2
View File
@@ -1,6 +1,7 @@
# Внешние субтитры: пары VobSub и языковой суффикс
# ✨ Спаривать VobSub .idx+.sub и проставлять языковой суффикс субтитра
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** Привязка субтитр→серия уже работает; остались пары VobSub .idx+.sub и потеря Lang/Flags
- **Теги:** goal:complex-releases
@@ -1,6 +1,7 @@
# Проверка свободного места перед copy-fallback
# Проверять свободное место перед copy-fallback
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** copy-fallback при невозможности хардлинка может упереться в переполненный диск посреди раскладки — нет проверки места до копирования
- **Теги:** goal:operational-resilience
+3 -2
View File
@@ -1,6 +1,7 @@
# [idea] guessit как сервис-спутник
# 🔬 guessit как сервис-спутник
- **Секция:** ядро продукта
- **Тип:** research
- **Категория:** Ядро продукта
- **Зачем:** go-ptn слабее питоновского guessit — если точности пред-парса не хватит, завернуть guessit в сервис-спутник рядом с бинарём
- **Теги:** goal:recognition-accuracy
@@ -1,6 +1,7 @@
# Идентичность инфохэшей: split v1/v2 одного торрента + крафт-магнет отравляет владение (F4, F5)
# 🐞 Связать v1/v2-хеши одного торрента и не доверять паре xt из магнета (F4, F5)
- **Секция:** ядро продукта
- **Тип:** fix
- **Категория:** Ядро продукта
- **Зачем:** split v1/v2 идентичность и крафт-магнет отравляют владение инфохэшами _(ревью 2026-07-08)_
- **Теги:** goal:state-integrity
@@ -1,6 +1,7 @@
# [goal] Интерфейсы приёма и ревью
# 🎯 Раздача приносится и подтверждается из любого транспорта
- **Секция:** темы
- **Тип:** goal
- **Секция:** Направления
- **Зачем:** путь «принести раздачу и подтвердить догадку» упирается в незакрытые куски интерфейсов, а не в логику
- **Теги:** decomposed
+3 -2
View File
@@ -1,6 +1,7 @@
# Нити приёма: NoName в контексте, устаревшие комментарии, лог без причины, bencode-аллокации (N1, N3, N4, N5)
# 🧹 Закрыть мелочи приёма: NoName в контексте, устаревшие комментарии, лог без причины, bencode-аллокации (N1, N3, N4, N5)
- **Секция:** ядро продукта
- **Тип:** chore
- **Категория:** Ядро продукта
- **Зачем:** косметика приёма: NoName в контексте, устаревшие комментарии, лог, bencode-аллокации _(ревью 2026-07-08)_
- **Теги:** goal:state-integrity
@@ -1,6 +1,7 @@
# Обучение на правках человека (few-shot из прошлых ревью)
# ✨ Подмешивать прошлые правки человека в промпт распознавания (few-shot)
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** правки человека (матч/тип/нумерация) не переиспользуются — few-shot из прошлых ревью поднял бы точность на «своих» трекерах без смены модели
- **Теги:** goal:recognition-accuracy
@@ -1,6 +1,7 @@
# Раздачи с докачиванием (merge при повторном добавлении)
# ✨ Докладывать недостающие эпизоды merge-раскладкой при повторной заливке
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** повторная заливка сериала целиком должна доложить недостающие эпизоды merge-раскладкой, не трогая существующие ссылки — блокирует типовой сценарий свежих сериалов
- **Теги:** goal:complex-releases
+3 -2
View File
@@ -1,6 +1,7 @@
# Кэш метабаз (и опционально LLM)
# 🧹 Кэшировать ответы метабаз с TTL (и опционально LLM)
- **Секция:** инфраструктура
- **Тип:** chore
- **Категория:** Инфраструктура
- **Зачем:** повторные и ретраящиеся прогоны бьют TMDB/TVDB/TVMaze одним запросом — кэш с TTL сэкономил бы лимиты и ускорил «Распознать заново»
- **Теги:** goal:operational-resilience
+3 -2
View File
@@ -1,6 +1,7 @@
# [idea] Многоступенчатая верификация привязки
# 🔬 Многоступенчатая верификация привязки
- **Секция:** ядро продукта
- **Тип:** research
- **Категория:** Ядро продукта
- **Зачем:** несколько проходов распознавания с консенсусом подняли бы точность ценой стоимости/латентности — проработать, когда включать и как мерджить расхождения
- **Теги:** goal:recognition-accuracy
+3 -2
View File
@@ -1,6 +1,7 @@
# Крайние случаи именования: многофайловый фильм, редакции, двойная серия
# ✨ Заказать спекой крайние случаи именования: многофайловый фильм, редакции, двойная серия
- **Секция:** Ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** стэкинг частей (part1/cd1), редакции [edition-…] и двойная серия SxxEyy-Eyy описаны нарративом, но в file-layout не заказаны — раскладка таких раздач не определена
- **Теги:** goal:complex-releases
@@ -1,6 +1,7 @@
# Привязка уведомлений к источнику в ботах (мульти-бот)
# ✨ Слать уведомления автору загрузки в его транспорт (мульти-бот)
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** пинги и ревью должен получать автор загрузки в своём транспорте — нет привязки загрузки к источнику/отправителю (нужно для мульти-бота)
- **Теги:** goal:ingest-and-review-interfaces
+3 -2
View File
@@ -1,6 +1,7 @@
# [goal] Эксплуатационная прочность
# 🎯 Сервис переживает рост и потерю тома
- **Секция:** темы
- **Тип:** goal
- **Секция:** Сопровождение
- **Зачем:** сервис работает, но не переживает роста: база копится вечно, бэкапа нет, отказ зависимости виден только по застрявшим задачам
- **Теги:** decomposed
+3 -2
View File
@@ -1,6 +1,7 @@
# Агенты-ревьюверы качества (наименования, архитектура, конвенции, стиль)
# 🧹 Откалибровать проходы ревью и завести ревьювер наименований
- **Секция:** инфраструктура
- **Тип:** chore
- **Категория:** Инфраструктура
- **Зачем:** конвейер ревью переехал в плагин `av-dev-pipeline`; осталась калибровка проходов на этом проекте и ревьювер наименований (ждёт словарь единого языка)
- **Теги:** goal:dev-process-quality
+3 -2
View File
@@ -1,6 +1,7 @@
# [goal] Точность распознавания
# 🎯 Раздача узнаётся верно, и точность этого измерима
- **Секция:** темы
- **Тип:** goal
- **Секция:** Направления
- **Зачем:** смена модели или правка промпта сегодня вслепую — нет ни метрики, ни способа переиспользовать уже сделанные человеком правки
- **Теги:** decomposed
+3 -2
View File
@@ -1,6 +1,7 @@
# Eval-харнес распознавания (корпус кейсов + метрика точности)
# 🧹 Завести eval-харнес распознавания: корпус кейсов и метрику точности
- **Секция:** инфраструктура
- **Тип:** chore
- **Категория:** Инфраструктура
- **Зачем:** смена модели или правка промпта распознавания сейчас вслепую — нет корпуса кейсов и метрики точности, регрессии не видно
- **Теги:** goal:recognition-accuracy
+3 -2
View File
@@ -1,6 +1,7 @@
# Полный редактор маппинга «файл → серия» и ручной режим ревью
# ✨ Править на ревью маппинг «файл → серия» и раскладывать вручную при провале LLM
- **Секция:** Ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** правка S·E, «нумеровать подряд» и ручной режим при полном провале LLM были запланированы объёмом Ф5 и не заведены задачей — в ревью сегодня можно только подсказать текстом
- **Теги:** goal:ingest-and-review-interfaces
+3 -2
View File
@@ -1,6 +1,7 @@
# НФТ: масштаб до 100 одновременных загрузок (потолок — 1000)
# 🔬 Потолок нагрузки: 100 одновременных загрузок, план-максимум 1000
- **Секция:** инфраструктура
- **Тип:** research
- **Категория:** Инфраструктура
- **Зачем:** Зафиксировать в НФТ ориентир 100/1000 загрузок + аудит узких мест (SQLite, воркер, поллинг)
- **Теги:** goal:operational-resilience
+3 -2
View File
@@ -1,6 +1,7 @@
# Бэкап SQLite
# 🧹 Бэкапить SQLite по расписанию с ротацией
- **Секция:** инфраструктура
- **Тип:** chore
- **Категория:** Инфраструктура
- **Зачем:** architecture требует бекапить data-том, но стратегия не описана — сбой или редеплой стирают всё in-flight состояние (проще, пока БД маленькая)
- **Теги:** goal:operational-resilience
+3 -2
View File
@@ -1,6 +1,7 @@
# Мгновенные обновления через SSE
# ✨ Слать живые обновления через SSE вместо htmx-поллинга
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** живые обновления на htmx-поллинге дают задержку и холостые запросы — SSE убрал бы то и другое (поллинг работает, поэтому улучшение, не блокер)
- **Теги:** goal:ingest-and-review-interfaces
+3 -2
View File
@@ -1,6 +1,7 @@
# [goal] Целостность состояния и приёма
# 🎯 По записи загрузки видно, как она сюда попала
- **Секция:** темы
- **Тип:** goal
- **Секция:** Направления
- **Зачем:** известные окна рассинхрона и потери маркеров: каждое по отдельности самоисцеляется, вместе — источник необъяснимых состояний
- **Теги:** decomposed
+3 -2
View File
@@ -1,6 +1,7 @@
# Ревью уведомлений в Telegram (аудит текстов и формата)
# 🔬 Тексты и формат уведомлений в Telegram
- **Секция:** ядро продукта
- **Тип:** research
- **Категория:** Ядро продукта
- **Зачем:** зонтичный проход по всем текстам бота: полнота карточек, единый язык, оформление; порождает под-задачи
- **Теги:** goal:ingest-and-review-interfaces
+3 -2
View File
@@ -1,6 +1,7 @@
# Версии/качество одного тайтла (репаки, апгрейд 1080p → 2160p)
# ✨ Заменять разложенную версию тайтла новой (репаки, апгрейд 1080p → 2160p)
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** По калибровке болей (2026-07-02) — не боль, из приоритета выпало
- **Теги:** goal:complex-releases
+3 -2
View File
@@ -1,6 +1,7 @@
# Фетч .torrent по URL — остаток «единого окна»
# ✨ Принимать ссылку на .torrent и скачивать файл самим (нужен SSRF-гард)
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** magnet и .torrent-файл приняты; остался фетч .torrent по URL (нужен SSRF-гард)
- **Теги:** goal:ingest-and-review-interfaces
+3 -2
View File
@@ -1,6 +1,7 @@
# Локаль TVDB: перевод названия и оригинальное название
# ✨ Брать у TVDB название на языке настройки и оригинальное название
- **Секция:** Ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** [general].language правит только TMDB и промпт LLM — TVDB отдаёт primary name, и при language=ru в карточку ревью и имя папки попадает 哪吒之魔童降世 вместо «Нэчжа»
- **Теги:** goal:recognition-accuracy
@@ -1,6 +1,7 @@
# Словарь единого языка (ubiquitous language)
# 🧹 Свести термины домена в словарь единого языка
- **Секция:** инфраструктура
- **Тип:** chore
- **Категория:** Инфраструктура
- **Зачем:** наименования домена расходятся между спеками, UI и кодом — нет единого глоссария (на нём же стоит агент-ревьювер наименований)
- **Теги:** goal:dev-process-quality
+3 -2
View File
@@ -1,6 +1,7 @@
# Авторизация веб-UI (на будущее)
# ✨ Закрыть веб-UI авторизацией, когда доверенной LAN станет мало
- **Секция:** инфраструктура
- **Тип:** feature
- **Категория:** Инфраструктура
- **Зачем:** для v1 решено без авторизации (доверенная LAN, опц. allowlist подсетей) — задел на случай, если понадобится защита
- **Теги:** goal:ingest-and-review-interfaces
+3 -2
View File
@@ -1,6 +1,7 @@
# Современный Web-UI как PWA
# ✨ Переделать веб-UI в устанавливаемое PWA
- **Секция:** ядро продукта
- **Тип:** feature
- **Категория:** Ядро продукта
- **Зачем:** текущий server-rendered UI функционален — PWA (устанавливаемое, удобное с телефона) это улучшение большого объёма, не блокер
- **Теги:** goal:ingest-and-review-interfaces