Files
jellybit/openspec/changes/archive/2026-07-17-2026-07-17-retry-reject-broken-torrent/proposal.md
T

2.6 KiB

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.goRetry (ветка alive && classErrored → отказ ErrConflict с сообщением вместо reAdd).
  • Тесты: internal/worker/worker_test.go — отклонение retry на живом сломанном торренте (error/missingFiles), контроль перецепки здорового.
  • Миграции БД: нет.