# T820 — demand map mock editor

> Status: `done`
> Milestone: `M2`
> Est. change: `~190 lines`

## Goal

完成後 mock UI 可查看與編輯五類 DemandMap phrase，顯示來源依據、完整度、版本與 stale／待確認狀態。

## Depends on

- T801、T810

## Inputs

- `apps/web/src/pages/RadarWatchesPage.tsx`
- `apps/web/src/components/radar/ProductContextReadiness.tsx`
- Spec §4.1、§6.3、驗收 #6

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/web/src/components/radar/DemandMapEditor.tsx` | add | 五類 phrase、basis、origin、enabled 編輯 |
| `apps/web/src/data/mock/radarRepo.ts` | edit | get/save demand map mock |
| `apps/web/src/pages/RadarWatchesPage.tsx` | edit | 產品上下文入口與 incomplete gate |
| `apps/web/src/pages/RadarWatchesPage.test.tsx` | add/edit | 產品資料不足、保存與 conflict 測試 |

### 行為變更

- baseline 由產品資料免費生成；產品只有名稱時顯示 incomplete，不能啟動新巡邏。

### API / 契約（若有）

- 使用 T801 DemandMap 型別；保存需帶目前 map version。

## Out of scope

- 不呼叫真 AI、不接 live DemandMap API。

## Acceptance

- [x] 五類內容、basis、origin、待補資料都能讀懂。
- [x] phrase 編輯不記 platform credits。
- [ ] 指令：

```bash
cd apps/web && npm run test -- RadarWatchesPage DemandMapEditor && npm run build
```

## Notes

custom phrase 與 AI phrase 視覺上要可區分，但不把 AI phrase 當產品真相。
