# T821 — query plan preview mock

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

## Goal

完成後使用者可在探索前看到由 DemandMap 產生的 1–6 組使用者語言查詢與排除訊號，且純產品名不會單獨成組。

## Depends on

- T820

## Inputs

- `apps/web/src/components/radar/WatchSuggestPanel.tsx`
- `apps/web/src/data/mock/radarRepo.ts`
- Spec §4.2、驗收 #7

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/web/src/components/radar/QueryPlanPreview.tsx` | add | 查詢組、來源 basis、排除訊號預覽 |
| `apps/web/src/data/mock/radarRepo.ts` | edit | deterministic query plan |
| `apps/web/src/components/radar/WatchSuggestPanel.tsx` | edit | 接 DemandMap 與 query plan |

### 行為變更

- 同義痛點分散查詢組；產品／品牌名稱只作輔助召回。

### API / 契約（若有）

- QueryPlan 保存 DemandInputVersion、DemandMapVersion 摘要。

## Out of scope

- 不改 Threads provider、不實作 live search。

## Acceptance

- [x] 任何查詢組至少含困擾、情境或期望結果之一。
- [x] 查詢組數遵守 1–6 與短詞規則。
- [ ] 指令：

```bash
cd apps/web && npm run test -- QueryPlanPreview WatchSuggestPanel
```

## Notes

預覽要能回答「系統會用什麼人話找人」，不是只列模型術語。
