OpenSpec: архив change retry-reject-broken-torrent (синк state-reconciliation)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -153,17 +153,20 @@ Retry SHALL переводить задачу обратно в `downloading`,
|
||||
Если источник задачи уже жив и ЗДОРОВ в qBittorrent, retry SHALL перецепляться
|
||||
к существующему торренту, а не добавлять источник повторно вслепую. Если же
|
||||
живой торрент в состоянии ошибки qBittorrent (`error`/`missingFiles`), retry
|
||||
перецепляться к нему SHALL NOT (перецепка к сломанному торренту тут же вернула
|
||||
бы задачу в `failed` по сверке) и SHALL повторно отдать источник, как при
|
||||
отсутствии раздачи. Повторный `Add` выполняется, только когда раздачи в
|
||||
qBittorrent нет ЛИБО она сломана.
|
||||
SHALL отклоняться с понятным пользователю сообщением — починить раздачу
|
||||
(`recheck`/восстановить файлы) в qBittorrent и повторить. Повторная отдача
|
||||
источника такой торрент не чинит (qBittorrent отверг бы дубль), а простой
|
||||
возврат в `downloading` тут же снова упал бы `qbit_error` по сверке (+ дебаунс
|
||||
уведомления) — retry выглядел бы сломанным. При отказе состояние задачи
|
||||
(`failed`/`stuck`) система менять SHALL NOT и повторный `Add` выполнять SHALL NOT.
|
||||
|
||||
Повторный `Add` при retry система SHALL выполнять **по типу источника**
|
||||
(`source_type`), как и добавление пойманной загрузки (см. `download-tracking`
|
||||
«Добавление пойманной загрузки в qBittorrent»): magnet/url — ссылкой; torrent —
|
||||
сохранёнными байтами `.torrent` файлом. Для torrent-источника retry БЕЗ живой
|
||||
раздачи система SHALL добавлять раздачу байтами и SHALL NOT активировать задачу
|
||||
в `downloading`, не добавив её (иначе задача повиснет как «нет в qBittorrent»).
|
||||
Повторный `Add` при retry система SHALL выполнять, только когда раздачи в
|
||||
qBittorrent нет, — **по типу источника** (`source_type`), как и добавление
|
||||
пойманной загрузки (см. `download-tracking` «Добавление пойманной загрузки в
|
||||
qBittorrent»): magnet/url — ссылкой; torrent — сохранёнными байтами `.torrent`
|
||||
файлом. Для torrent-источника retry БЕЗ живой раздачи система SHALL добавлять
|
||||
раздачу байтами и SHALL NOT активировать задачу в `downloading`, не добавив её
|
||||
(иначе задача повиснет как «нет в qBittorrent»).
|
||||
|
||||
#### Scenario: Retry упавшей magnet-загрузки из веб-UI
|
||||
|
||||
@@ -195,14 +198,15 @@ qBittorrent нет ЛИБО она сломана.
|
||||
torrent сохранёнными байтами файлом
|
||||
- **AND** задача переходит в `downloading`
|
||||
|
||||
#### Scenario: Retry сломанного живого торрента повторно отдаёт источник
|
||||
#### Scenario: Retry сломанного живого торрента отклоняется
|
||||
|
||||
- **GIVEN** задача в `failed`, её торрент присутствует в qBittorrent, но в
|
||||
состоянии ошибки (`error`/`missingFiles`)
|
||||
- **WHEN** пользователь инициирует retry
|
||||
- **THEN** источник отдаётся заново (перецепка к сломанному торренту не
|
||||
выполняется)
|
||||
- **AND** задача переходит в `downloading`
|
||||
- **THEN** retry отклоняется с сообщением починить раздачу (`recheck`) в
|
||||
qBittorrent
|
||||
- **AND** состояние задачи не меняется (остаётся `failed`), повторный `Add` не
|
||||
выполняется
|
||||
|
||||
#### Scenario: Retry torrent-загрузки без живого источника
|
||||
|
||||
|
||||
Reference in New Issue
Block a user