# T842 — cost preview quota gate

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

## Goal

完成後 provider 動作前可取得不扣點 CostPreview，並由 owner、版本、期限、餘額與 CreditCeiling gate 阻擋不合格執行。

## Depends on

- T840、T841

## Inputs

- `apps/backend/internal/module/usage/**`
- `apps/backend/internal/module/radar/usecase/watch_quota.go`
- Spec §5.2–§5.4、驗收 #13、#19、#20

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/radar/usecase/cost_preview.go` | add | preview estimate、expiry、ceiling validation |
| `apps/backend/internal/logic/radar/get_cost_preview_logic.go` | add | read-only preview endpoint |
| `apps/backend/internal/module/radar/usecase/cost_preview_test.go` | add | expiry、version、quota、BYOK tests |

### 行為變更

- ceiling 小於固定成本、preview 過期或 context 變更時 provider 不被呼叫。
- owner 當日剩餘額度與方案 soft cap 都須通過。

### API / 契約（若有）

- GET preview 不 commit usage；回 fixed/min/max、key_mode、remaining、expires_at。

## Out of scope

- 不執行搜尋／AI、不修改方案價格或新增 meter。

## Acceptance

- [x] preview 可重現且不扣點；platform／BYOK 行為正確。
- [x] gate error 不回成功空資料。
- [ ] 指令：

```bash
cd apps/backend && go test ./internal/module/radar/usecase ./internal/logic/radar -run 'CostPreview|Quota' -count=1
```

## Notes

固定搜尋成本沿用既有 meter cost；候選未知時回範圍。
