Команда Defer гардила только IsTerminal() и потому принимала catched (торрент ещё не добавлен в qBittorrent). Defer из catched уводил задачу в лимбо → необратимый deleted: processCatched листает только catched и больше её не подхватывал, а последующие команды через отсутствие источника выводили deleted (ноль исходящих рёбер), хотя байты .torrent лежат в download_torrent. - Worker.Defer отклоняет catched с ErrConflict (транслируется в 409 / редирект с сообщением); прочие не-терминальные состояния, где раздача уже есть, принимает как раньше. - Снято мёртвое ребро графа catched → deferred (allowedTransitions); инвариант «deferred из каждого не-терминального» уточнён: кроме пре-источникового catched. catched — единственное состояние без раздачи среди не-терминальных. - Тесты: Defer из catched отклоняется и не меняет состояние; инвариант графа обновлён + негативная проверка ребра. - OpenSpec: MODIFIED «Команды ревью и их эффекты» (review) с позитивным и негативным сценариями; change заархивирован, дельта влита в спеку. - Беклог: закрыта review-major6-defer-catched. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1.7 KiB
1.7 KiB
1. Код
- 1.1
internal/worker/review.go— вDeferпослеGetDownloadдобавить гард:d.State == store.StateCatched→ErrConflictс понятным сообщением (отложить можно только после добавления торрента в qBittorrent), не меняя состояние. Существующий гардIsTerminal()оставить. - 1.2
internal/store/download.go— убратьStateDeferredиз исходящихStateCatchedвallowedTransitions; уточнить комментарий инвариантаdeferred(«из КАЖДОГО не-терминального» → «кроме пре-источниковогоcatched»).
2. Тесты
- 2.1
internal/worker/review_test.go—DeferизcatchedвозвращаетErrConflict, состояние остаётсяcatched; контроль —Deferизreviewпо-прежнему уводит вdeferred(существующийTestDefer). - 2.2
internal/store/transition_test.go— обновить инвариантdeferred: легальная цель из каждого не-терминального состояния, КРОМЕcatched(и самопереходdeferred); добавить проверку, чтоcatched → deferredне легально.
3. Спека
- 3.1 MODIFIED-требование «Команды ревью и их эффекты» в
review;openspec validate --strictзелёный.
4. Проверка
- 4.1
task testиtask lintзелёные; существующие тесты worker/httpapi/store не сломаны.