# T801 — frontend inbox domain repository seam

> Status: `done`
> Milestone: `M0`
> Est. change: `~160 lines`

## Goal

完成後 mock 與 live 前端共用同一組 Opportunity review、排序、CostPreview、DemandMap 與 Sweep funnel 型別／repository 介面。

## Depends on

- T800

## Inputs

- `apps/web/src/domain/types.ts`
- `apps/web/src/data/repos.ts`
- Spec §2、§7.2–§7.4

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/web/src/domain/types.ts` | edit | ReviewState、RemovalReason、Priority、DemandMap、CostPreview、funnel types |
| `apps/web/src/data/repos.ts` | edit | 擴充 RadarRepo，同時支援 mock/live |
| `apps/web/src/data/fixtures/**` | add/edit | 固定 legacy、pending、removed、未知時間資料 |

### 行為變更

- 型別區分 `OpportunityStatus` 與 `review_state`；舊欄位可缺省並由 mapper 補映射。

### API / 契約（若有）

- 不新增前端私有 shape；repository method 對齊 T800。

## Out of scope

- 不改頁面視覺、不接 live HTTP、不實作 mock 行為。

## Acceptance

- [ ] TypeScript 可表達五種排序、三種 review state、移除原因與兩種 key mode。
- [ ] mock/live repository signature 完全一致。
- [ ] 指令：

```bash
cd apps/web && npm run build && npm run test -- src/data src/domain
```

## Notes

保留既有 `intent_score`、`product_fit_score`，新加 `priority_score` 不取代歷史欄位。
