# T710 — mock radar product repository

> Status: `done`  
> Milestone: `M1` · Phase B  
> Kind: `feat` · Est. change: `~190 lines`

## Goal

提供遵守 RadarRepo 契約的 feature mock，可在不接 backend 時操作 product／generic watch 與錯誤狀態。

## Depends on

- T702、T703

## Inputs

- `apps/web/src/data/repos.ts`
- `../spec.md` §3.1、§3.5、§4.1、§4.6

## Outputs

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/web/src/data/mock/radarRepo.ts` | add | in-memory RadarRepo、seed、watch 狀態與 error semantics |
| `apps/web/src/data/mock/radarRepo.test.ts` | add | repository contract 與狀態轉移 |
| `apps/web/src/data/radarRepo.contract.test.ts` | edit | 對 mock 跑共用案例 |

## Behavior

- product watch 驗證 Brand/Product 關係；generic 可一次補綁且不可換綁。
- product watch 不要求 ServiceProfile；generic active 維持要求。
- product unavailable 會 pause，不能直接 resume。
- mock 僅供 Phase B／測試注入，不重新開啟全站舊 mock 資料源。

## Out of scope

- UI 與 live HTTP
- ProductMatch fixture（T720）

## Acceptance

- [x] mock 通過共用 RadarRepo contract。

```bash
cd apps/web && npm run test -- radarRepo
```

Implementation result (2026-08-10): added an in-memory product-aware RadarRepo,
paired Brand/Product ownership checks, one-time generic assignment, guarded
unavailable resume, and repository tests.
