thread-master/docs/product/opportunity-inbox/tasks/T861-sweep-checkpoint-resum...

58 lines
1.7 KiB
Markdown
Raw Normal View History

2026-08-13 02:22:24 +00:00
# T861 — sweep checkpoint resume budget
> Status: `done`2026-08-11
> Milestone: `M6`
> Est. change: `~190 lines`
## Goal
完成後 Sweep 會逐筆 checkpoint在中斷、重跑或點數耗盡時只處理未完成候選並準確回報 partialblocked budget。
## Depends on
- T842、T853、T860
## Inputs
- `apps/backend/internal/module/radar/domain/sweep.go`
- `apps/backend/internal/module/radar/usecase/sweep_run.go`
- `apps/backend/internal/module/job/**`
- Spec §5.3§5.4、驗收 #18#20
## Outputs
### 程式變更(預期路徑)
| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/radar/domain/sweep.go` | edit | checkpoint、budget state、deferred count |
| `apps/backend/internal/module/radar/usecase/sweep_progress.go` | add | guarded per-candidate progress |
| `apps/backend/internal/module/radar/usecase/sweep_resume_test.go` | add | interruptionquotarace tests |
### 行為變更
- CreditCeiling方案額度用完停止新 provider 呼叫,已完成保留,剩餘為 deferred。
- Redis lock value 保持 workerID晚到 worker 不覆寫終態。
### API / 契約(若有)
- status 為 completepartial_budgetblocked_budgetfailed不以成功空資料表示 budget stop。
## Out of scope
- 不改 usage meter cost 定義、不做 live page mapper。
## Acceptance
- [x] 第五筆中斷重跑不重扣前五筆。
- [x] 多 worker race 不突破 owner ceiling。
- [ ] 指令:
```bash
cd apps/backend && go test ./internal/module/radar/... ./internal/module/job/... -run 'Sweep|Budget|Progress' -race -count=1
```
## Notes
job status 更新必須 guarded只由 lock owner 續期/釋放。