# T833 — review state api list and compatibility

> Status: `done`
> Milestone: `M3`
> Est. change: `~190 lines`

## Goal

完成後 live API 可完成／移除／復原商機，列表支援新 query／排序，舊 accept、dismiss、today 行為仍相容。

## Depends on

- T800、T830、T831、T832

## Inputs

- `apps/backend/internal/logic/radar/**opportunity**.go`
- `apps/backend/internal/module/radar/usecase/opportunity_ops.go`
- `apps/web/src/data/live/radarRepos.ts`
- Spec §7.2–§7.6

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/logic/radar/review_state_logic.go` | add | owner、transition、reason、audit logic |
| `apps/backend/internal/module/radar/usecase/opportunity_ops.go` | edit | accept／dismiss 相容與 review service |
| `apps/web/src/data/live/radarRepos.ts` | edit | mapper、list query、review actions |
| `apps/backend/internal/logic/radar/*_test.go` | add/edit | HTTP／owner／error tests |

### 行為變更

- completed／removed 不扣點；accept 完成 CRM binding 後同步 completed。
- `/today` 只作 pending＋today 的相容 view。

### API / 契約（若有）

- 遵守 102000 envelope、JWT owner、pagination/list、UTC ns。

## Out of scope

- 不實作 DemandMap、前處理或 CostPreview。

## Acceptance

- [x] 非 owner、invalid reason、expired／missing id 都不回成功空資料。
- [x] live mapper 與 mock review 行為一致。
- [ ] 指令：

```bash
cd apps/backend && go test ./internal/logic/radar/... ./internal/module/radar/... -run 'Review|Opportunity' -count=1
cd ../web && npm run test -- radarRepos
```

## Notes

生成後的 handler／routes 不手改，業務放 logic／module。
