Files
jellybit/openspec/changes/archive/2026-08-10-metadata-title-sanitize/proposal.md
T
av 9aecf757e0 recognize: название из метабазы санитизируется перед попаданием в план
- чистка стоит на каждой точке входа значения метабазы в план — сборка матча,
  копия кандидата для ревью, набор закреплённых значений источника и его
  чтение: гарантия, поставленная только на запись, обходится данными,
  сохранёнными прежними версиями
- название, непригодное как имя каталога (пустое или без единой буквы и
  цифры), не подставляется — раздача уходит в review с названной причиной
- гейт подтверждения матча не сдвинут: сравнение с планом идёт по значениям
  провайдера, чистится только копия, уходящая дальше
2026-08-10 10:41:16 +03:00

62 lines
5.0 KiB
Markdown
Raw 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.
## Why
Название, которое система берёт из метабазы (TMDB, TVDB, TVMaze) при
подтверждённом матче, попадает в имя каталога библиотеки Jellyfin дословно —
таким, каким его отдал внешний сервис. Вывод LLM мы чистим и считаем
недоверенным; название из метабазы того же обращения не получает, хотя приходит
ровно так же — из-за периметра.
Итог наблюдаем: название из трёх невидимых символов (zero-width) даёт каталог,
имя которого выглядит пустым; название с кириллической `а` внутри латинского
слова даёт второй каталог, визуально неотличимый от первого; перевод строки
внутри названия доезжает до плана. Ни один из этих случаев авто-раскладку не
останавливает — она проходит, и разбирается это потом руками в библиотеке.
Класс не новый: тем же путём ходит TMDB с самого начала. Разговор поднят
ревью изменения `tvdb-title-locale`, где тот же путь распространили на второго
провайдера.
## What Changes
- Название, взятое из метабазы при подтверждённом матче, проходит ту же чистку,
что и название от LLM, — **до** того, как попасть в план и оттуда в путь на
диске. Дом чистки остаётся один, второго способа чистить названия не заводится.
- Ту же чистку проходят названия кандидатов, уходящих на ревью: выбор кандидата
человеком — полноправный путь подтверждения матча, и закреплённое им название
становится именем каталога так же, как название авто-матча. Условия
подтверждения сильного матча при этом не меняются: сравнение с планом идёт по
значению, как его отдал провайдер.
- Название, от которого после чистки ничего не остаётся, план не перезаписывает:
раздача уходит в ревью с названной причиной, а не раскладывается автоматически
и не падает на пустом имени каталога.
- Режиссёр остаётся как есть — он не участвует в пути на диске, и его чистка по
действующему требованию делается при выводе отображаемого имени.
## Capabilities
### New Capabilities
Новых нет.
### Modified Capabilities
- `metadata-match`: требование «Подтверждение матча и каноническое имя»
дополняется — каноническое название перед подстановкой в план санитизируется,
а название, схлопнувшееся в пустое, подстановку не выполняет и блокирует
авто-раскладку.
- `recognition`: требование «Санитайзинг человекочитаемых полей плана»
перестаёт быть требованием только о выводе LLM — оно называет чистку общей для
обоих источников названия и фиксирует, что после сверки с базой в плане не
остаётся несанитизированных человекочитаемых полей.
## Impact
- `internal/recognize` — порядок подстановки канонического названия
относительно санитайзинга (`recognize.go`), причина ухода в review
(`validate.go`).
- Поведение **обоих** провайдеров: правка меняет уже работающий путь TMDB, и это
главный риск изменения.
- Пути на диске не меняются ни для одной раздачи с нормальным названием:
санитайзинг идемпотентен и на чистом значении не меняет ничего.
- Внешних зависимостей, схемы БД и конфигурации изменение не касается.