# 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;候選未知時回範圍。