# T730 — radar watch product domain repositories

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

## Goal

RadarWatch 可持久化合法 product context、快照與 pause reason，並相容舊 generic 文件。

## Depends on

- T724（Phase B UX 已批准）

## Inputs

- `../spec.md` §3.1、§3.5、§6
- `apps/backend/internal/module/radar/domain/watch.go`、repository watch files

## Outputs

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/radar/domain/watch.go` | edit | context fields、不變量、pause reasons、legacy normalize |
| `apps/backend/internal/module/radar/repository/watch_memory.go` | edit | context filters／copy semantics |
| `apps/backend/internal/module/radar/repository/watch_mongo.go` | edit | context persistence／filters／guarded pause |
| `apps/backend/internal/module/radar/domain/watch_test.go` | edit | generic／product transition cases |

## Behavior

- IDs 必須全空或全有；product 關聯不可原地更換。
- 缺 context_mode 的舊資料讀 generic。
- product_unavailable 不可直接 resume；archive 保留歷史。

## Out of scope

- 查驗 Brand/Product owner（T740／T750）
- API mapping（T733）

## Acceptance

- [x] memory／Mongo context fields, legacy normalization, one-way binding, and filters are covered by tests.

```bash
cd apps/backend && go test ./internal/module/radar/domain/... ./internal/module/radar/repository/... -count=1
```

Implementation result (2026-08-10): persisted product context/snapshots and
pause reasons, normalized legacy watches as generic, guarded unavailable resume,
and added copy-safe memory plus Mongo filters.
