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

- **Дата:** 2026-06-13
- **Источник:** архивного `design.md` нет — решение принято до перехода
  проекта на OpenSpec (первый архивный change — `2026-06-28`); первичный
  материал — история git

## Контекст

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

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

- LLM хорошо разбирает русские и релиз-имена, но галлюцинирует, а его
  самооценка (`confidence`) плохо откалибрована и тривиально поддаётся
  инъекции из тех же недоверенных сигналов.
- Внешние базы (TMDB/TVDB/TVMaze) дают **независимый** авторитетный сигнал:
  каноническое имя + `provider_id`. Но русские релизы и аниме часто в них
  отсутствуют.
- Безопасность раскладки уже держится на валидации пути, не на промпте
  (см. [recognition](../../openspec/specs/recognition/spec.md)); решение «авто vs review» —
  второй слой защиты, на уровне доверия результату.

## Рассмотренные варианты

- **Гейт по самооценке LLM (`confidence ≥ порог`).** Просто и даёт
  максимум авто. Но `confidence` не откалибрована и инъектируема —
  «уверенный» неверный ответ прошёл бы молча. Небезопасно.
- **LLM + структурная валидация, без обязательной базы.** Ловит часть
  ошибок (число файлов у фильма, дыры/дубли в нумерации S·E), но не ловит
  «правильную структуру под неверным названием». Недостаточно как
  единственный гейт авто.
- **Авто только при подтверждённом матче в базе + валидация +
  согласованность сигналов.** Независимый авторитет снимает риск «LLM
  придумал». Цена — рус/аниме (нет в базах) всегда идут в review, но это и
  так нужный кейс.

## Решение

Авто-раскладку делаем, только если выполнено **всё**: (1) единственный
сильный матч в метабазе по названию+году, давший `provider_id`;
(2) структурная валидация без предупреждений; (3) пред-парс (`go-ptn`) и
LLM не противоречат по типу/названию/году. Нет матча или база выключена →
**всегда review**. Самооценку LLM учитываем лишь как вспомогательный
сигнал, не как гейт.

Почему так: безопасность держится на **независимой** проверке (база), а не
на доверии к выходу LLM, построенному из недоверенных данных. Это разом
закрывает основной кейс (рус/аниме отсутствуют в базах → человек
подтверждает) и убирает целый класс тихих ошибок «модель уверенно
ошиблась». Review здесь — не наказание, а штатный режим для всего, что
база не подтвердила (петля «догадка → подсказка → перераспознавание», см.
[review](../../openspec/specs/review/spec.md)). Полная модель уверенности — в
[recognition](../../openspec/specs/recognition/spec.md).

## Последствия

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