You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Claude usage limits never populate: rate_limit_event numbers live under unifiedWindows, and get_usage returns rate_limits: null #30310
Every Claude provider instance reports usageLimits: { windows: [], unavailable: { reason: "probeFailed" } } in server.getConfig, and checkedAt never moves after real turns. Codex
instances on the same server report their session and weekly windows fine.
Seen on T3 0.1.6 and on v0.1.7-nightly.20261103.4119 (both code paths are
identical), with Claude Code 2.1.306 on a Pro subscription, macOS arm64.
Cause
Two separate paths in apps/server/src/provider/claudeUsageLimits.ts:
Per-turn rate_limit_event is dropped.claudeRateLimitEventToUpdate
returns early unless info.utilization is a number:
So every event maps to undefined and onUsageLimits is never called.
The get_usage probe gets rate_limits: null. The capability probe
sends the get_usage control request; the CLI answers rate_limits_available: true with rate_limits: null, which claudeUsageResponseToLimits turns into probeFailed.
Suggested fix
In claudeRateLimitEventToUpdate, when info.unifiedWindows is present, map
each known key (five_hour, seven_day, and the model-scoped ones) with utilization * 100 and its own resetsAt, and keep the existing flat utilization path for older CLIs. That alone makes the windows appear after the
first turn, even while the get_usage probe still returns null.
Repro
Register a Claude provider instance logged in with a subscription.
Run one turn.
server.getConfig → providers[instance].usageLimits is still probeFailed with no windows, while the provider event log for the thread
contains the rate_limit_event above.
With that flag set, get_usage answers in about 7 ms with rate_limits_available: true, rate_limits: null. The CLI debug log shows fetchUtilization: GET /api/oauth/usage (attempt 1), then nothing. A direct authenticated GET to /api/oauth/usage returns 200 with full data. So for org-managed accounts the probe will never succeed, not just "before the first turn". The per-turn rate_limit_event is the only source, because it comes from inference response headers, which count as essential traffic.
The events are already parsed, but the window still doesn't show
On this CLI the events still have the flat fields, so the current code already maps them:
The Limits view still shows Claude as unavailable. Two gaps remain:
applyUsageLimitsUpdate keeps previous.unavailable (probeFailed) after merging streamed windows. It looks like the UI treats unavailable as "no data" and hides the windows it has. I haven't traced the renderer, so this is inferred from the stored state plus what the UI shows.
For (1): once streamed windows exist, show them even while the probe state is probeFailed, for example with a "from last request" hint instead of the error. Or clear unavailable when a stream update lands.
Follow-up: fix in #31135, tested in a real environment with the org-managed flag. With #30999 applied as well, Usage → Limits shows Session and Weekly, and both survive a manual refresh (a failed probe). Without #31135, the released app has the Weekly window in its cache, but the UI hides it.
Note: #31135 changes behavior from #15116, which made a failed probe drop streamed windows. The PR keeps the probeFailed marker but keeps and shows the windows, because for these accounts a full probe never succeeds. The trade-off is explained in the PR. It needs a maintainer call.
Confirming this still reproduces on the latest nightly, with a newer Claude Code than the report.
Setup
T3 Code 0.1.8-nightly.20261107.4327 (also seen on 0.1.5-nightly.20261029.3867), Linux x64, background service
Claude Code 2.1.319 (also seen on 2.1.314), Pro subscription, claude.ai OAuth
Claude shows no limits in T3. Antigravity limits do appear.
Findings
rate_limit_event is still dropped.claudeRateLimitEventToUpdate in 0.1.8 is unchanged and returns early unless info.utilization is a top-level number. Events from 2.1.319 carry the numbers only under unifiedWindows:
get_usage still returns rate_limits: null. I ran the capability probe directly with @anthropic-ai/claude-agent-sdk against the 2.1.319 binary, with and without CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, polling for ~10s. Every response was rate_limits_available: true, rate_limits: null, so the flag is not the cause on this setup.
The data is available to the account. GET /api/oauth/usage with the same token returns session 2% and weekly 0%, and T3's own status checks (checkClaudeProviderStatus) succeed with no auth errors.
So a user with a plain Pro login and no managed settings hits both paths. This matches the first fix proposed in the issue (map unifiedWindows in the event handler). #30999 was closed unmerged, so as far as I can tell nothing on main handles that case yet.
Activity
joh-klein commentedon Nov 4, 2026
Another data point, with a cause that PR #30999 alone will likely not fix.
Setup
@anthropic-ai/claude-agent-sdk0.3.284CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1comes from the org's remote managed settings (~/.claude/remote-settings.json), not from the user's own settings or env. The user can't override it (any non-empty value counts as set, see [Bug]: Claude limits warning does not explain when reads are blocked by CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC #27492).Why the probe returns
rate_limits: nullhereWith that flag set,
get_usageanswers in about 7 ms withrate_limits_available: true, rate_limits: null. The CLI debug log showsfetchUtilization: GET /api/oauth/usage (attempt 1), then nothing. A direct authenticated GET to/api/oauth/usagereturns 200 with full data. So for org-managed accounts the probe will never succeed, not just "before the first turn". The per-turnrate_limit_eventis the only source, because it comes from inference response headers, which count as essential traffic.The events are already parsed, but the window still doesn't show
On this CLI the events still have the flat fields, so the current code already maps them:
The provider cache (
~/.t3/caches/claudeAgent.json) then holds:The Limits view still shows Claude as unavailable. Two gaps remain:
applyUsageLimitsUpdatekeepsprevious.unavailable(probeFailed) after merging streamed windows. It looks like the UI treatsunavailableas "no data" and hides the windows it has. I haven't traced the renderer, so this is inferred from the stored state plus what the UI shows.rateLimitTypewindow is taken.five_hourinunifiedWindowsis ignored. fix(server): Claude limits update from rate_limit_event unifiedWindows #30999 addresses this part.Suggestion
probeFailed, for example with a "from last request" hint instead of the error. Or clearunavailablewhen a stream update lands.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, say that limits update after the next turn, instead of "Could not read limits".joh-klein commentedon Nov 4, 2026
Follow-up: fix in #31135, tested in a real environment with the org-managed flag. With #30999 applied as well, Usage → Limits shows Session and Weekly, and both survive a manual refresh (a failed probe). Without #31135, the released app has the Weekly window in its cache, but the UI hides it.
Note: #31135 changes behavior from #15116, which made a failed probe drop streamed windows. The PR keeps the
probeFailedmarker but keeps and shows the windows, because for these accounts a full probe never succeeds. The trade-off is explained in the PR. It needs a maintainer call.Wizhill05 commentedon Nov 7, 2026
Confirming this still reproduces on the latest nightly, with a newer Claude Code than the report.
Setup
0.1.8-nightly.20261107.4327(also seen on0.1.5-nightly.20261029.3867), Linux x64, background serviceFindings
rate_limit_eventis still dropped.claudeRateLimitEventToUpdatein 0.1.8 is unchanged and returns early unlessinfo.utilizationis a top-level number. Events from 2.1.319 carry the numbers only underunifiedWindows:{"status":"allowed","resetsAt":1794091200,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false,"unifiedWindows":{"five_hour":{"utilization":0.05,"resetsAt":1794091200,"status":"allowed"},"seven_day":{"utilization":0,"resetsAt":1794139200,"status":"allowed"}}}get_usagestill returnsrate_limits: null. I ran the capability probe directly with@anthropic-ai/claude-agent-sdkagainst the 2.1.319 binary, with and withoutCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, polling for ~10s. Every response wasrate_limits_available: true, rate_limits: null, so the flag is not the cause on this setup.GET /api/oauth/usagewith the same token returns session 2% and weekly 0%, and T3's own status checks (checkClaudeProviderStatus) succeed with no auth errors.So a user with a plain Pro login and no managed settings hits both paths. This matches the first fix proposed in the issue (map
unifiedWindowsin the event handler). #30999 was closed unmerged, so as far as I can tell nothing onmainhandles that case yet.