Files
jellybit/docs/adr/ADR-2026-06-13-auto-link-requires-db-match.md

70 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Авто-раскладка только при подтверждённом матче в метабазе
- Дата: 2026-06-13
## Контекст
jellybit распознаёт содержимое релиза через LLM по **недоверенным**
сигналам: имя торрента, текстовый контекст человека, распарсенное
сообщение бота — всё управляется извне и может содержать инъекции. По
результату распознавания нужно решить: разложить файлы хардлинками
автоматически или отправить на ревью человеку. Цена ошибки авто-раскладки
реальна — мусор в библиотеке Jellyfin под неверным названием/папкой,
возможно поверх чужого. Хочется максимум авто, но не ценой тихих ошибок.
Силы и ограничения:
- LLM хорошо разбирает русские и релиз-имена, но галлюцинирует, а его
самооценка (`confidence`) плохо откалибрована и тривиально поддаётся
инъекции из тех же недоверенных сигналов.
- Внешние базы (TMDB/TVDB/TVMaze) дают **независимый** авторитетный сигнал:
каноническое имя + `provider_id`. Но русские релизы и аниме часто в них
отсутствуют.
- Безопасность раскладки уже держится на валидации пути, не на промпте
(см. [recognition.md](../specs/recognition.md)); решение «авто vs review» —
второй слой защиты, на уровне доверия результату.
## Рассмотренные варианты
- **Гейт по самооценке LLM (`confidence ≥ порог`).** Просто и даёт
максимум авто. Но `confidence` не откалибрована и инъектируема —
«уверенный» неверный ответ прошёл бы молча. Небезопасно.
- **LLM + структурная валидация, без обязательной базы.** Ловит часть
ошибок (число файлов у фильма, дыры/дубли в нумерации S·E), но не ловит
«правильную структуру под неверным названием». Недостаточно как
единственный гейт авто.
- **Авто только при подтверждённом матче в базе + валидация +
согласованность сигналов.** Независимый авторитет снимает риск «LLM
придумал». Цена — рус/аниме (нет в базах) всегда идут в review, но это и
так нужный кейс.
## Решение
Авто-раскладку делаем, только если выполнено **всё**: (1) единственный
сильный матч в метабазе по названию+году, давший `provider_id`;
(2) структурная валидация без предупреждений; (3) пред-парс (`go-ptn`) и
LLM не противоречат по типу/названию/году. Нет матча или база выключена →
**всегда review**. Самооценку LLM учитываем лишь как вспомогательный
сигнал, не как гейт.
Почему так: безопасность держится на **независимой** проверке (база), а не
на доверии к выходу LLM, построенному из недоверенных данных. Это разом
закрывает основной кейс (рус/аниме отсутствуют в базах → человек
подтверждает) и убирает целый класс тихих ошибок «модель уверенно
ошиблась». Review здесь — не наказание, а штатный режим для всего, что
база не подтвердила (петля «догадка → подсказка → перераспознавание», см.
[review-ux.md](../specs/review-ux.md)). Полная модель уверенности — в
[recognition.md](../specs/recognition.md).
## Последствия
- `+` Нет тихих авто-ошибок раскладки: всё неподтверждённое видит человек.
- `+` `provider_id` из базы заодно даёт каноническое имя папки
(`[tmdbid-…]`) — Jellyfin не путает русские названия.
- `` Рус/аниме и всё, чего нет в базах, всегда требует ручного
подтверждения — авто там недоступно by design.
- `` Без включённых TMDB/TVDB/TVMaze авто-раскладки нет вовсе: сервис
работает в режиме «распознал → review».
- Делает цикл ревью критичным: если он неудобен, ручное подтверждение
станет узким местом — поэтому review-ux вынесен в отдельную спеку.