Приём: дедуп по target_missing/orphaned + стоп-кран «Закрыть»
Два дубля-близнеца на один инфохэш рождались, когда повторный приём
попадал на запись в target_missing: дедуп искал только активную задачу,
а target_missing терминален → заводилась новая загрузка, воркер усыновлял
уже присутствующий торрент и раскладывал его.
- Приём: критерий дедупа расширен до «блокирующей повторный приём» =
активные ∪ {target_missing, orphaned}. Повторный приём такого инфохэша
привязывается к существующей записи (спящей, без обращения к qBittorrent),
а не плодит близнеца. Прочие терминальные (done/cancelled/failed/reverted/
deleted) повторный приём не блокируют — осознанная свежая попытка. Новый
read-метод FindReingestBlockingByInfohash (приоритет активной над desync);
общий active-гард не тронут.
- Команда «Закрыть» (Dismiss) — универсальный стоп-кран из любого состояния,
кроме deleted → cancelled (error_code=user_dismiss). Только меняет статус:
файлы (в т.ч. хардлинки done/orphaned) и раздачу qBittorrent не трогает,
в отличие от «Удалить». Веб — danger-зона внизу страницы; Telegram —
кнопка с подтверждением; из cancelled — идемпотентный no-op.
- Транспорты при дедупе на desync-запись сообщают адресно (target_missing —
привязать заново/закрыть; orphaned — закрыть и добавить заново); веб при
дедупе ведёт на страницу существующей записи.
Спеки: ingest (дедуп), state-reconciliation (стоп-кран); граф переходов
допополнен рёбрами <терминал>→cancelled. OpenSpec change
dedup-target-missing-and-dismiss заархивирован.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+13
-2
@@ -65,8 +65,10 @@ stateDiagram-v2
|
||||
deleted --> [*]
|
||||
|
||||
note right of cancelled
|
||||
«Отклонить» доступно из любого
|
||||
нетерминального состояния
|
||||
В cancelled ведут: «Отклонить»
|
||||
(из нетерминальных) и «Закрыть»
|
||||
(стоп-кран — из любого состояния,
|
||||
кроме deleted; только статус)
|
||||
end note
|
||||
```
|
||||
|
||||
@@ -134,6 +136,15 @@ stateDiagram-v2
|
||||
`error_code`: пользовательское удаление — `user_delete`, вывод сверкой —
|
||||
`reconcile`. Полные требования — `openspec/specs/state-reconciliation/`.
|
||||
|
||||
**Закрыть (dismiss).** Универсальный стоп-кран из любого состояния, кроме
|
||||
`deleted`: переводит запись в терминальный `cancelled` (`error_code =
|
||||
"user_dismiss"`), **только меняя статус** — ни файлы (библиотечные хардлинки
|
||||
`done`/`orphaned` остаются на месте), ни раздачу в qBittorrent не трогает, в
|
||||
отличие от «Удалить». Служит закрытием зависшей/спорной/лишней записи (напр.
|
||||
дубля-близнеца в `target_missing`); из `cancelled` дальше доступна перепривязка.
|
||||
Для нетерминальных ту же роль штатно играет «Отменить» — в UI стоп-кран
|
||||
показывается там, где иного выхода нет (терминальные, кроме `deleted`).
|
||||
|
||||
Сверка трогает только `done`/`target_missing`/`orphaned` — терминальный
|
||||
`deleted`, активные и пользовательски-терминальные (`reverted`/`cancelled`/
|
||||
`failed`/`stuck`) состояния не задевает. Реальность «лечится» сама: при
|
||||
|
||||
Reference in New Issue
Block a user