# processCatched: promote-without-add если торрент уже в qBittorrent (F2) **Приоритет:** средний · **Теги:** ingest, review-2026-07-08, lifecycle Ревью Fable 2026-07-08 (приём). worker.go:361-391, sourceAddParts :407-432, qbt.go:243-246. Сценарий: торрент уже в qBittorrent БЕЗ нашей категории/тега (юзер добавил вручную раньше → discover не усыновляет). Юзер грузит тот же .torrent в jellybit → catched → qbt.Add файлом; для file-add дубль → «Fails.» → Add ошибка → «will retry» каждый тик, вечно, до catch_timeout → failed/qbit_add, который reconcileRecovery НЕ воскрешает (worker.go:124-132). Торрент жив всё это время; юзер видит failed. Retry уже решает это alive-проверкой (worker.go:692-698 «повторный Add вреден»), а processCatched — нет, хотя live-снимок byHash того же тика доступен. Также лечит сценарий B (Add успех, PromoteCatched падает на транзиентной ошибке → снова Add дубля). Замечание: поведение qBit на дубль file-add версионно-зависимо («Fails.» vs «Ok.») — проверить на целевой версии. Фикс: перед Add проверить присутствие хешей в qBit; есть → promote без Add (зеркалит Retry). Смежное (ревью 2026-07-08, кластер A): апгрейд F6 (`UpgradeCatchedMagnetToTorrent`) оставил узкое окно — `processCatched` читает снимок `source_type` вне `w.mu`, поэтому при точном оверлапе тика воркера с апгрейдом воркер добавит magnet из устаревшего снимка, хотя БД уже `torrent`. Тот же фикс закрывает и это: перечитать источник под `w.mu` (или проверить присутствие хешей в qBit) перед Add. Вердикт: change (малая спека-дельта download-tracking + код).