## Why Второй/третий сезон одного сериала должен ложиться в ТУ ЖЕ папку, а не заводить рядом почти одинаковую. Сейчас имя папки печатается заново из выхода LLM при каждой раскладке (`layout.BuildLinks` из полей плана), и совпадение `(provider, provider_id)` не гарантирует совпадение строки папки: LLM может дать «Fargo» и «Фарго», год сезона вместо года сериала — и верно заматченный второй сезон уедет в соседнюю папку. Это ядро «проблемы второго сезона»: она **не про группировку, а про сходимость папки** (см. `docs/drafts/logical-title-model.md` §3, §5.2). ## What Changes - Вводим **правило сходимости папки** при построении плана раскладки: при подтверждённом матче (`provider` и `provider_id` заданы) база папки (`Название (Год)`) **наследуется** от живых `file_link` других загрузок того же тайтла, а выход LLM для папки игнорируется. - Якорь берём из **существующего `dst_path`** живых ссылок (`status IN linked/copied/exists`) загрузок, чей current recognition имеет тот же `(provider, provider_id)` — живые пути — истина (переименовали папку → сверка уводит ссылки в `target_missing`, якорь исчезает, следующая загрузка печатает заново). - Унаследованная база применяется **и к папке, и к именам файлов внутри** (episode/movie stem), чтобы `Fargo (2014) S02E01` совпадало с `Fargo (2014) S01E01`. Провайдер-тег `[tvdbid-…]` по-прежнему берётся из текущего `(provider, provider_id)`. - **Рассинхрон** (несколько РАЗНЫХ живых папок с одним `(provider, provider_id)`, случившийся до внедрения правила) → загрузка уходит в **review** с явной причиной, якорь молча не выбираем. - Отдельная сущность «тайтл» **не вводится**: это join по существующим таблицам (`file_link → download → recognition(is_current)`), без новых сущностей/таблиц. Схема БД не меняется. ## Capabilities ### New Capabilities ### Modified Capabilities - `file-layout`: добавляется правило сходимости базы папки при построении целевого пути — при подтверждённом матче база наследуется от живых ссылок того же `(provider, provider_id)`, а не печатается из выхода распознавания; несколько расходящихся живых папок → уход в review с причиной «рассинхрон» вместо тихого выбора (по прецеденту коллизии, которая тоже уводит в review из file-layout). ## Impact - **Код:** `internal/layout` (возможность построить план с унаследованной базой папки), `internal/worker` (`linkPlan`/построение плана раскладки: lookup якоря, ветка рассинхрон→review), `internal/store` (новый read-метод: живые целевые папки по `(provider, provider_id)`, исключая текущую загрузку). - **Инварианты безопасности данных:** не трогаем. `download` остаётся мостом, выход распознавания недоверенный, безопасность — на санитизации и проверке пути под библиотекой. Никаких новых прав на источник. - **Схема БД:** без изменений (только новый SELECT-join). - **Границы:** нет якоря → папка из распознавания (как сейчас); нет матча (`provider=none`) → авто-раскладки нет, всё через review (инвариант); смена провайдера между сезонами якорь не склеит — редкий случай, штатно review (осознанная цена, черновик §6.1). - **Совместимость:** поведение первой загрузки тайтла не меняется; правило влияет только на последующие вклады при наличии живого якоря.