# T852 — judge structured result cache

> Status: `done`（2026-08-11）
> Milestone: `M5`
> Est. change: `~200 lines`

## Goal

完成後 AI 深判只處理 shortlist／不確定候選，輸出可驗證 evidence／basis／risk，並以版本唯一鍵復用有效 accepted／rejected 結果。

## Depends on

- T850、T851、T843

## Inputs

- `apps/backend/internal/module/radar/usecase/product_fit_ai.go`
- `apps/backend/internal/module/radar/usecase/judge.go`
- `apps/backend/internal/module/radar/domain/product_match.go`
- Spec §4.4、§5.3、驗收 #10、#16–#18

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/radar/domain/judgment_result.go` | add | versioned valid／invalid result domain |
| `apps/backend/internal/module/radar/repository/judgment_result_memory.go` | add | memory cache／unique key |
| `apps/backend/internal/module/radar/usecase/judge_pipeline.go` | add/edit | shortlist、structured validation、reuse |
| `apps/backend/internal/module/radar/usecase/judge_pipeline_test.go` | add | valid／invalid／rejected／reuse tests |

### 行為變更

- provider／公告／純名不進 high；完整 accepted 或 rejected 結果均可快取。
- 無法驗證的 evidence／basis 不形成有效快取。

### API / 契約（若有）

- 唯一鍵 owner＋source＋product＋input/map version＋judge kind。

## Out of scope

- 不接每日 Sweep checkpoint、不做 Mongo cache migration。

## Acceptance

- [x] 同候選跨 watch／query 重跑不再次呼叫 judge。
- [x] provider 結構成功但判定 rejected 正常計入有效結果。
- [ ] 指令：

```bash
cd apps/backend && go test ./internal/module/radar/usecase -run 'Judge|Judgment' -count=1
```

## Notes

AI 不能從品牌／產品名稱自行補痛點或作者背景。
