Files

43 lines
2.6 KiB
Markdown

## Why
Retry задачи в `failed`/`stuck`, чей торрент ЖИВ в qBittorrent, но в состоянии
ошибки (`error`/`missingFiles`), сейчас повторно отдаёт источник. На живом
сломанном торренте это бесполезно: qBittorrent отвергает дубль, задача уходит в
`downloading`, а на ближайшем тике сверки `classErrored` тут же возвращает её в
`failed` (+ дебаунс уведомления). Пользователю retry выглядит сломанным, а
реальное лекарство (перепроверка/`recheck`/восстановление файлов в qBittorrent)
не подсказано (находка ревью NIT-12).
## What Changes
- **Retry сломанного живого торрента отклоняется**, а не переотдаёт источник.
Отказ несёт понятное сообщение: починить раздачу (`recheck`/восстановить
файлы) в qBittorrent и повторить. Состояние задачи не меняется, повторного
`Add` не происходит.
- Повторный `Add` при retry остаётся только для случая, когда раздачи в
qBittorrent НЕТ (перецепка к здоровому живому торренту — без `Add`, как и
раньше).
## Capabilities
### New Capabilities
Нет.
### Modified Capabilities
- `state-reconciliation`: требование «Ручной повтор зависшей/упавшей загрузки из
транспортов» — ветка живого сломанного торрента меняет исход с «повторно отдать
источник» на «отклонить с подсказкой про `recheck`». Прочие ветки retry (нет
раздачи → `Add`; жив и здоров → перецепка без `Add`; сброс базиса `retried_at`)
без изменений.
## Impact
- **Спеки:** дельта `state-reconciliation` (одно MODIFIED-требование).
- **Код:** `internal/worker/worker.go``Retry` (ветка `alive && classErrored`
→ отказ `ErrConflict` с сообщением вместо `reAdd`).
- **Тесты:** `internal/worker/worker_test.go` — отклонение retry на живом
сломанном торренте (`error`/`missingFiles`), контроль перецепки здорового.
- **Миграции БД:** нет.