## Why На шаге добавления пойманной загрузки (`catched`) worker выводит имя (LLM, секунды) и вызывает `qbt.Add` **вне** блокировки переходов. Если в это окно пользователь отменяет задачу (`catched → cancelled`), запись перехода `PromoteCatched` корректно пропускается (гард `state='catched'`), НО источник уже добавлен в qBittorrent под нашей категорией. Такой торрент качается/сидирует вечно, ест диск, а видимой задачи-владельца нет: усыновить назад его нельзя — `adopt` проверяет `ExistsByInfohash` (любое состояние), а хеши уже принадлежат отменённой задаче. Спека покрывает переход состояния, но не этот побочный эффект (находка ревью F3/NIT-13). ## What Changes - **Re-read состояния прямо перед `qbt.Add`** (под блокировкой переходов, после медленного вывода имени): если задача уже не в `catched` (отменена) — источник в qBittorrent НЕ добавляется вовсе. Сужает окно гонки до промежутка между re-read и записью перехода. - **Scoped cleanup**: если отмена случилась в оставшемся окне (уже ПОСЛЕ успешного `add`, но до записи перехода), worker удаляет только что добавленный торрент из qBittorrent **вместе с данными** — уборка собственного мусора. - **Гарантия «удаляем только своё»**: удаление-с-данными допустимо ТОЛЬКО для торрента, который worker создал именно этим `add`. Признак — подтверждённое **отсутствие** infohash в qBittorrent непосредственно перед `add`. Если infohash уже присутствовал до нашего `add` (внешний клиент раздаёт тот же торрент), worker источник не добавляет и чужие данные не трогает. - **WARN-логи** на этом пути (торрент оставлен после отмены → удаляем; факт удаления), с корреляцией по `download_id`, без секретов. ## Capabilities ### New Capabilities Нет. ### Modified Capabilities - `download-tracking`: требование «Добавление пойманной загрузки в qBittorrent» — добавляется re-read состояния перед `add`, подтверждение отсутствия infohash перед `add` как признак «своего» торрента и уборка добавленного торрента при отмене в окне после `add`. Сценарий «Отмена во время добавления» уточняется и дополняется сценариями уборки и негативного инварианта. ## Impact - **Спеки:** дельта `download-tracking` (одно MODIFIED-требование + сценарии). - **Код:** `internal/worker/worker.go` — `processCatched` (re-read state и проверка присутствия перед `Add`; уборка добавленного при промахе `PromoteCatched`). Новых методов `qbt`/`store` не требуется (переиспользуем `Torrents`, `Delete`). - **Тесты:** `internal/worker/catched_test.go` — обновление сценария отмены во время namer (Add не вызывается) + новые: уборка после Add, негативный инвариант (пред-существующий торрент не удаляется с данными). - **Миграции БД:** нет. - **Инвариант «источник неприкосновенен»:** обоснование удаления-с-данными и негативная гарантия — в `design.md`.