# T851 — evidence extraction priority scorer

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

## Goal

完成後系統能從原文抽出 DemandEvidence，計算 priority_score 四因素，並以 hard gate 阻止純名稱／雜訊進 high。

## Depends on

- T850

## Inputs

- `apps/backend/internal/module/radar/usecase/product_fit.go`
- `apps/backend/internal/module/radar/domain/product_scoring.go`
- Spec §4.4–§4.5、驗收 #9–#12、#23

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/radar/usecase/demand_evidence.go` | add | 需求／求助／比較 evidence extraction |
| `apps/backend/internal/module/radar/usecase/priority_score.go` | add | 45/25/15/15 scorer、band、hard gates |
| `apps/backend/internal/module/radar/usecase/priority_score_test.go` | add | table tests、排序 tie-break |

### 行為變更

- recommended/newest/oldest/product_fit/demand_intent 的 server-ready sort key 明確。
- posted_at unknown 置底；正向理由須有 candidate excerpt 與 product basis。

### API / 契約（若有）

- 回 priority factors、band、DemandEvidence，保留既有 intent/product fit 分數。

## Out of scope

- 不接列表 repository、不呼叫 AI。

## Acceptance

- [x] 純名稱不取得 pain/evidence 分數且不能 high。
- [x] 以固定 tie-break 跨頁穩定。
- [ ] 指令：

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

## Notes

pain_fit 是 priority 主因，但不能把既有 product_fit_score 直接覆蓋。
