Раскладка: сходимость папки сериала (второй сезон в ту же папку)

При подтверждённом матче база папки (имя+год) наследуется от живой
папки-якоря того же (provider, provider_id) вместо печати заново из выхода
LLM — так второй/последующий сезон ложится в ТУ ЖЕ папку, а не заводит
рядом почти одинаковую. Отдельная сущность «тайтл» не вводится.

- layout: Plan.FolderBase перекрывает базу в папке и именах файлов;
  TitleFolder разбирает dst_path в папку тайтла и базу (снятие тега).
- store: LiveTitleFolders — dst_path живых ссылок того же матча.
- worker: resolveFolderBase (живость якоря — по наличию папки на диске,
  os.Lstat, а не по статусу ссылки в БД) в linkPlan и в превью ревью
  (превью=применение); рассинхрон нескольких живых папок → review из
  linking (deferred→review в графе нет).

Схема БД не менялась. Change series-folder-convergence заархивирован,
требования влиты в openspec/specs/file-layout.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-07-10 13:50:49 +03:00
co-authored by Claude Opus 4.8
parent 3f1a928000
commit 5c3ef79496
20 changed files with 1031 additions and 56 deletions
+8 -1
View File
@@ -248,12 +248,19 @@ qBittorrent, но: v1/v2/гибрид дают разные значения; п
```
1. ULID загрузки + download_infohash (дедуп переезжает). ← фундамент
2. правило сходимости папки при плане раскладки. ← «второй сезон»
2. правило сходимости папки при плане раскладки. ← «второй сезон» ✓ реализовано
3. merge-раскладка (докачивание: доложить недостающее). ← §6.2
4. группа «тайтл» в UI (вычисляемая) + удаление целиком (path 2). ← §6.4
(state_transition — вставить, когда захочется таймлайн/метрики)
```
> Шаг 2 (правило сходимости папки) реализован — change
> `openspec/changes/archive/2026-07-10-series-folder-convergence/`, требования
> влиты в `openspec/specs/file-layout/`. Отличие от §5.2 черновика: живость якоря
> определяется существованием папки на диске (`os.Lstat`), а не только статусом
> ссылки; рассинхрон нескольких живых папок → review; in-app разрешение
> рассинхрона осознанно вне scope (ручной фикс на диске).
Каждый шаг — отдельный OpenSpec change; 1–2 самодостаточны и закрывают главную
боль.