Сверка с метабазой промахивалась на иностранных фильмах с русским релиз-именем (кейс «Тёмный рыцарь»): поиск шёл по одной строке provider_hint||title и игнорировал original_title, а базы индексированы прежде всего по оригинальным названиям. - matchMetadata ищет по ключам original_title → title → provider_hint с ранним стопом на первом единичном сильном матче; пустые и нормализованно-дублирующие ключи пропускаются, кандидаты для review копятся из всех заходов. - Промпт требует всегда заполнять title и original_title (дублировать при отсутствии оригинала / российском контенте; при неуверенности дублировать, не выдумывать). Разбор остаётся мягким к пустому original_title. - TMDB-поиск передаёт language (по умолчанию ru-RU, настраивается [metadata.tmdb].language); original_title не зависит от локали. - Нормализация названий сводит ё→е. Инварианты не ослаблены: авто только при подтверждённом единичном матче + структурной валидации + согласованности сигналов. Capability recognition впервые перенесена в OpenSpec; change архивирован. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.8 KiB
4.8 KiB
Why
Сверка распознавания с базой метаданных промахивается на иностранных
фильмах с русским релиз-именем: реальный кейс — «Тёмный рыцарь» (The Dark
Knight), поиск не нашёл ничего, раскладку пришлось делать вручную. Базы
(TMDB/TVDB) индексированы прежде всего по оригинальным названиям, а поиск
сейчас идёт по одной строке provider_hint || title и игнорирует
original_title. Из-за этого сильное звено сверки — оригинальное название —
не используется ни в запросе, ни (когда модель оставила его пустым) в гейте
сравнения.
What Changes
- Поиск по нескольким названиям в сверке с базой: стратегия
«оригинал → fallback» — сначала запрос по
original_title, при единичном сильном матче стоп; иначе запрос по локализованномуtitle; третьим фолбеком —provider_hint. Кандидатов для review копим из всех заходов (дедуп поprovider:id). Избыточный запрос-дубль (когда нормализованные названия совпадают) пропускаем. - Контракт LLM на оба названия: промпт требует всегда заполнять и
title, иoriginal_title. Нет отдельного оригинала / российское происхождение → продублироватьtitle. Не уверен в оригинале → дублировать, а не выдумывать (защита от ложного авто-матча по галлюцинации). Схема разбора остаётся мягкой: пустойoriginal_titleне отбраковываем, а graceful-фолбэк наtitle. - Локаль TMDB: TMDB-поиск всегда передаёт
language(по умолчаниюru-RU), параметризуемый конфигом. ЛокализованныйTitleприходит по-русски — сходится русская сторона гейта и аккуратнее карточки кандидатов в review.original_titleу TMDB остаётся на языке оригинала, английская сторона гейта не страдает. - Нормализация названий: в сравнении сводим
ё→е, чтобы «Тёмный» и «Темный» считались одним названием.
Гейты авто-раскладки не ослабляются: авто по-прежнему только при подтверждённом единичном матче в базе + структурной валидации + согласованности сигналов. Изменение лишь повышает попадаемость сверки.
Capabilities
New Capabilities
recognition: распознавание контента раздачи (фильм/сериал, название, год, сезон/серия), сверка с базами метаданных и решение «авто или review». Первый перенос capability изdocs/specs/recognition.mdв OpenSpec; в этот change фиксируем требования к сверке с базой и контракту названий, затронутые изменением (остальное мигрируется отдельно).
Modified Capabilities
Impact
internal/recognize/metadata.go—matchMetadata(многозапросный поиск),normalize(ё→е).internal/recognize/prompt.go— правила промпта поtitle/original_title.internal/metadata/tmdb.go— параметрlanguageв запросе поиска.- Конфигурация — новое поле
[metadata.tmdb].language(дефолтru-RU), валидация на старте. docs/specs/recognition.md— синхронизируем с дельтой (источник истины до полного переноса).- Внешнее API/схема ответа LLM:
provider_hintсохраняется; новые требования к заполнениюoriginal_title. Обратная совместимость хранимых данных не затрагивается.