# T751 — sweep explore product pipeline

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

## Goal

每日／首巡／手動 watch sweep／立即探索共用產品上下文、fit 與 ProductMatch merge 管線。

## Depends on

- T744、T745、T750

## Inputs

- `apps/backend/internal/module/radar/usecase/sweep_run.go`、`explore.go`、`judge_persist.go`
- `../spec.md` §4.2、§4.3、§5.5

## Outputs

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/radar/usecase/sweep_run.go` | edit | context load、invalid pause result、product processing |
| `apps/backend/internal/module/radar/usecase/explore.go` | edit | product IDs、snapshot、merged count |
| `apps/backend/internal/module/radar/usecase/judge_persist.go` | edit | shared path entry |
| pipeline tests | edit/add | scheduled/manual/explore parity |

## Behavior

- existing Opportunity 新 match 不占每日 opportunity quota。
- 同 Product 既有 match 不重判、不重計 ai_research。
- 無效 context 不成功空巡；watch guarded pause 並記通知原因。

## Out of scope

- import（T752）
- list filters（T753）

## Acceptance

- [x] scheduled／manual watch sweep／explore 共用同一 ProductMatch pipeline；fixture 測試通過。

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

Implementation result (2026-08-10): product watches no longer require a
ServiceProfile for sweep, explore accepts paired context IDs, and invalid
catalog context pauses the watch with an explicit failure instead of returning
an empty successful sweep. New product matches flow through the same judge,
merge, and primary arbitration path.
