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

5.5 KiB
Raw Blame History

Авто-раскладка только при подтверждённом матче в метабазе

  • Дата: 2026-06-13

Контекст

jellybit распознаёт содержимое релиза через LLM по недоверенным сигналам: имя торрента, текстовый контекст человека, распарсенное сообщение бота — всё управляется извне и может содержать инъекции. По результату распознавания нужно решить: разложить файлы хардлинками автоматически или отправить на ревью человеку. Цена ошибки авто-раскладки реальна — мусор в библиотеке Jellyfin под неверным названием/папкой, возможно поверх чужого. Хочется максимум авто, но не ценой тихих ошибок.

Силы и ограничения:

  • LLM хорошо разбирает русские и релиз-имена, но галлюцинирует, а его самооценка (confidence) плохо откалибрована и тривиально поддаётся инъекции из тех же недоверенных сигналов.
  • Внешние базы (TMDB/TVDB/TVMaze) дают независимый авторитетный сигнал: каноническое имя + provider_id. Но русские релизы и аниме часто в них отсутствуют.
  • Безопасность раскладки уже держится на валидации пути, не на промпте (см. 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). Полная модель уверенности — в recognition.md.

Последствия

  • + Нет тихих авто-ошибок раскладки: всё неподтверждённое видит человек.
  • + provider_id из базы заодно даёт каноническое имя папки ([tmdbid-…]) — Jellyfin не путает русские названия.
  • Рус/аниме и всё, чего нет в базах, всегда требует ручного подтверждения — авто там недоступно by design.
  • Без включённых TMDB/TVDB/TVMaze авто-раскладки нет вовсе: сервис работает в режиме «распознал → review».
  • Делает цикл ревью критичным: если он неудобен, ручное подтверждение станет узким местом — поэтому review-ux вынесен в отдельную спеку.