# T532 — sweep-failure-notify-and-resume

> Status: `done`  
> Milestone: `M2`  
> Kind: `feat`  
> Est. change: `~160 lines`

## Goal

完成後系統應：sweep 失敗時 Sweep 記 `failed`＋可讀原因並發站內通知；重跑不重判已完成的貼文。

## Depends on

- T527、T530

## Inputs

- Spec：`../spec.md` §4.2.8、§5.4、§5.6、§7、§9.2（SW-04）
- 既有通知：`apps/backend/internal/module/notification/**`、`appnotif`

## Outputs

### 程式變更（預期路徑）

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/radar/usecase/sweep_run.go` | edit | 錯誤收斂：抓取失敗／判定全數失敗 → Sweep `failed_reason`＋Job fail |
| `apps/backend/internal/module/radar/usecase/sweep_notify.go` | add | 失敗通知（`ref_type=sweep` 或既有雷達通知型別），落地雷達頁 |
| `apps/backend/internal/module/radar/usecase/judge_persist.go` | edit | 續跑：跳過 `judged_external_ids` 已含者 |

### 行為變更

- 抓取路徑不可用：**不回成功空資料**，Sweep `failed` 並通知使用者「今天沒巡到，原因為 X」。
- 部分筆失敗：Sweep 仍為成功但記錄失敗筆數與原因摘要。
- Job 中途失敗後重跑：已判定者不再扣點重判（避免重複計費）。
- 日誌不含 token 明文。

## Out of scope

- 前端空狀態文案（T551）
- 觀測列表 API（T533）

## Acceptance

- [x] SW-04：抓取不可用 → Sweep `failed`＋原因＋通知；API 不回空成功
- [x] 中斷後重跑：`judged_count` 不重複累加、點數不重複扣
- [x] 指令：

```bash
cd apps/backend && go test ./internal/module/radar/... ./internal/module/notification/... -count=1
```
