# T702 — frontend product radar types repos

> Status: `done`  
> Milestone: `M0` · Phase A  
> Kind: `feat` · Est. change: `~170 lines`

## Goal

讓 frontend 以單一 repository 介面表達 product watch、ProductMatch、產品篩選與主推操作，供 mock／live 共用。

## Depends on

- T700

## Inputs

- `../spec.md` §2、§3、§5.2、§5.4
- `apps/web/src/domain/types.ts`、`src/data/repos.ts`

## Outputs

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/web/src/domain/types.ts` | edit | ProductFitReason、ProductMatch、watch context、primary override、new counters |
| `apps/web/src/data/repos.ts` | edit | filters、assignProduct、setPrimaryProduct、product-aware suggest/explore/import |
| `apps/web/src/data/radarRepo.contract.test.ts` | add | mock／live mapper 共用契約斷言入口 |

## Behavior

- 新欄位 optional 以兼容舊 response；`product_matches` 對新 response 正規化為陣列。
- `product_id` filter 表示存在該 match，不等於修改 primary。
- repository 不把 not-ready／forbidden 降級成空列表。

## Out of scope

- mock 實作（T710）與 live mapping（T760）
- 頁面 UI

## Acceptance

- [x] TypeScript build 通過，介面涵蓋 spec API 全表。
- [x] 無第二套 page-only response 型別。

```bash
cd apps/web && npm run build && npm run lint
```

Implementation result (2026-08-10): extended the shared domain and RadarRepo
contract plus the live mapper/request methods; build and RadarRepo contract tests pass.
