## Why Удалить раздачу вместе с файлами сегодня можно только со страницы одной загрузки, из её danger-секции. Чтобы освободить место после десяти закрытых раздач, человек десять раз проходит путь «список → карточка → подтверждение». Работа механическая, а цена ошибки высокая: на каждом проходе он подтверждает необратимое действие заново и легко теряет, какие раздачи уже снёс. ## What Changes - Появляется отдельная страница веб-UI «Удаление», доступная из шапки. На ней перечислены только те загрузки, для которых удаление с файлами разрешено поштучно (`done`, `orphaned`, `target_missing`), у каждой строки — чекбокс. - Одна кнопка «Удалить выбранные» ведёт на **страницу подтверждения**, где выбранные раздачи названы поимённо. Удаление уходит только оттуда: POST без признака подтверждения отклоняется, ни одного удаления не делает. - Результат показывается поимённо: что удалено и что отказало, с причиной каждого отказа. Отказ на одной загрузке не отменяет остальных. - Групповой путь прав не расширяет: каждая выбранная загрузка проходит ту же проверку состояния, что и поштучное удаление, и отклоняется тем же конфликтом. - Условие «удаление разрешено» переезжает в единую точку домена (`store.State`): сейчас оно записано дважды — в проверке воркера и в сборке представления страницы загрузки, — а групповая страница была бы третьим местом. - Страница намеренно **не самообновляется**: живая перерисовка карточек стёрла бы выбор человека. Это и есть причина, по которой режим выбора не вешается на основной список. Не входит: групповое закрытие без файлов (`Dismiss`), автоматическая чистка по сроку хранения, изменение самой операции удаления одной загрузки. ## Capabilities ### New Capabilities Новых нет: групповое удаление — это новая поверхность существующего поведения, а не новое поведение системы. ### Modified Capabilities - `web-ui`: добавляется страница группового удаления с обязательным поимённым подтверждением и поимённым отчётом об исходе; ссылка на неё в шапке. - `state-reconciliation`: требование «Полное удаление загрузки пользователем» уточняется — подтверждение может быть одно на пачку, но остаётся обязательным и поимённым, а условия допустимости у каждой загрузки прежние и проверяются для каждой отдельно. ## Impact - `internal/httpapi`: страница выбора, страница подтверждения, обработчик группового удаления и страница результата; ссылка в шапке. - `web/templates`: новый шаблон страницы и её партиалы, `partials/header.html`. - `internal/store`: единая точка «в этом состоянии удаление разрешено». - `internal/worker`: `Reviewer.Delete` зовётся по каждой выбранной загрузке; сама операция не меняется. - qBittorrent `torrents/delete` с `deleteFiles=true` — внешний сервис, необратимая операция; число вызовов за один запрос человека растёт с одного до числа выбранных.