Triage
Confirmed. This is a mapping gap in the Claude Limits path, not a failed get_usage probe.
On Claude Enterprise (and any plan that reports a spending budget instead of rolling quotas), the CLI returns rate_limits_available: true with five_hour / seven_day null and populated rate_limits.spend + rate_limits.extra_usage. T3 still shows “No limits reported.”
Why
claudeUsageResponseToLimits in apps/server/src/provider/Layers/claudeUsageLimits.ts only maps:
five_hour→ Sessionseven_day→ Weeklymodel_scoped[]→ Weekly · {model}
It never reads spend or extra_usage. Null rolling windows are skipped, so the snapshot is { windows: [] } (success, not unavailable). limitsNotice() in packages/shared/src/usageLimits.ts then renders “No limits reported.” on web and mobile.
The capabilities probe already forwards the full rate_limits object (ClaudeProvider.ts), so the spend objects are available and then dropped.
The existing mapper test includes a disabled extra_usage object and does not assert it is mapped. That matches this miss. #9507 also noted live Claude get_usage windows were not verified when the Limits tab shipped.
In the captured payload, decimal_places: 2 / exponent: 2 mean 50000 → $500.00 and 4631 → $46.31. extra_usage.utilization is 9.262; spend.percent is the rounded 9. These are provider-reported account credits, not Usage → Cost token estimates.
Not a duplicate of #6582 / #5539 (those shipped the Limits view). This is a follow-up for an Enterprise spend-only payload that view still ignores.
Suggested fix
- Map an enabled spending budget to a monthly window even when session/weekly are null.
- Prefer
spendwhenenabled; otherwiseextra_usagewhenis_enabled. Do not show both — they are the same budget here. - Convert minor units with
exponent/decimal_places. Do not substitute local token-cost estimates. - Use used/limit (or
extra_usage.utilization) for percent so 9.262% is not collapsed tospend.percent’s 9. - Keep rolling windows when they exist; spend is additive.
- Add a regression fixture with this payload: it must not produce an empty Limits notice.
The window contract (packages/contracts/src/providerUsageLimits.ts) is percent-only today, and the UI rounds usedPercent. Mapping a monthly ~9% bar would already beat the empty state. Showing “$46.31 of $500.00 used (9.262%)” needs optional used/limit/currency on the window (or a formatted label) plus a small Limits-row change.
Accepting as a minor bug. Workaround until then: Claude’s own usage UI or the CLI get_usage control response.