# Полное удаление загрузки из jellybit («единое окно», path 2) **Приоритет:** высокий Безопасная половина «единого окна» уже в проде: распознавание ручного удаления и пометка рассинхрона (state-reconciliation — `target_missing`/`orphaned`/`deleted`, undo с nlink-гардом, preflight). Осталась вторая половина — **удалять из самого jellybit**, не идя руками в qBittorrent/Jellyfin. Основной сценарий одного окна — «досмотрел → освободить место»: удалить и раздачу, и файлы в библиотеке разом. Из-за хардлинков иначе место и не вернуть — файл в `downloads/` (qBittorrent) и наша ссылка в библиотеке указывают на **один инод**, диск освобождается только когда исчезает последняя ссылка. Значит delete обязан снять **обе** стороны. ## Действие «Удалить» (одна загрузка) - Снять живые хардлинки загрузки (переиспользуем undo-механику: `superseded` пропускаем) **+** удалить раздачу с файлами из qBittorrent (новый метод в `qbt`, `deleteTorrents` с `deleteFiles=true`). - **Осознанно обходим** предохранитель последней копии (undo при «источник удалён, цель — последняя копия» отказывает — `worker/review.go:499`; здесь мы наоборот хотим снять последнюю копию). - Обязательное **подтверждение** — это выход за инвариант «источник неприкосновенен», не по случайному клику. Логировать как осознанное удаление источника. ## undo vs delete (зафиксировать различие) - **undo** — «перераспознать»: снимает только наши ссылки, раздачу в qBittorrent сохраняет, данные бережёт (гард включён). Уже готов. - **delete** — «убрать окончательно, освободить место»: снимает наши ссылки И сносит раздачу+файлы, гард выключен, состояние терминальное. ## Терминальное состояние Переиспользуем существующий `deleted` (исход тот же: и источник, и цель сняты) — **без** нового статуса. Инициатора (`user` против reconciliation) пишем в причину/ лог перехода. В граф переходов добавить явное пользовательское ребро `done → deleted` (сейчас `deleted` выводит только сверка с реальностью). ## Опционально (если понадобится) Мультивыбор в списке + «удалить выбранное» — тонкая обёртка над тем же действием для редкого случая «снести сериал целиком». Вычисляемую группу-«тайтл» и экран состава **не** делаем — оверинжиниринг ради редкого сценария. Оформить как OpenSpec-change (дельта `state-reconciliation`/`review` + метод `qbt` + ребро графа + action в UI/боте). Связано: drafts/logical-title-model.md §5.3/§6.4, ADR-2026-06-13-hardlinks, openspec/specs/state-reconciliation, specs/workflow.md, пакеты qbt, worker, layout.