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

5.0 KiB
Raw Blame History

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, и это главный риск изменения.
  • Пути на диске не меняются ни для одной раздачи с нормальным названием: санитайзинг идемпотентен и на чистом значении не меняет ничего.
  • Внешних зависимостей, схемы БД и конфигурации изменение не касается.