# T843 — demand map enrichment metering byok

> Status: `done`（2026-08-11）
> Milestone: `M4`
> Est. change: `~190 lines`

## Goal

完成後使用者確認 CostPreview 後才可用 AI 擴充 DemandMap，成功才切換版本並正確記錄 platform／BYOK 用量。

## Depends on

- T840、T841、T842

## Inputs

- `apps/backend/internal/module/radar/usecase/suggest.go`
- `apps/backend/internal/module/usage/domain/**`
- `apps/backend/internal/logic/radar/**`
- Spec §4.1、§5.1–§5.3、驗收 #17、#20、#22

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/radar/usecase/demand_map_enrich.go` | add | preview gate、AI output validation、merge |
| `apps/backend/internal/logic/radar/enrich_demand_map_logic.go` | add | authenticated action |
| `apps/backend/internal/module/radar/usecase/demand_map_enrich_test.go` | add | success、invalid output、retry、BYOK |
| `apps/backend/internal/module/usage/**` | edit | 沿用 meter、source=`radar.demand_map` |

### 行為變更

- provider 未完成有效結構時不切 current map；依既有失敗退點規則處理。
- BYOK platform credits=0，count/source 仍增加。

### API / 契約（若有）

- POST enrichment 必須帶 preview_id、credit_ceiling、context version。

## Out of scope

- 不做每日 sweep、不改產品真相、不新增第五 meter。

## Acceptance

- [x] enrichment 成功、失敗、重試與版本衝突行為可對帳。
- [x] AI token 不回前端。
- [ ] 指令：

```bash
cd apps/backend && go test ./internal/module/radar/... ./internal/module/usage/... -run 'DemandMap|Enrich|Meter' -count=1
```

## Notes

AI phrases 必須帶 basis，不得把模型推測當產品承諾。
