[Bug]: Codex segment hidden on single-window plans (prolite): weekly arrives as primary_window, secondary null → session=null
- Dominant language
- TypeScript
- Stars
- 71.3k
- Forks
- 4.7k
- Avg merge
- 17h 8m
- Merged PRs (30d)
- 475
Description
### Operating system
macOS 26.6.2 (build 25G83), Apple Silicon
### Orca version
1.4.196
### Details
#### Short summary
After my ChatGPT subscription changed to a plan whose token reports `chatgpt_plan_type: "prolite"`, the **Codex segment disappeared entirely from the status bar**. Anthropic segments still render fine. The cause is not auth: the plan now returns **only one rate-limit window (weekly)**, and Orca's window classifier keeps only `~300 min` (session) and `~10080 min` (weekly), so `session` ends up `null` and nothing is shown — even though the weekly percentage is known and would be displayable.
#### What happened?
The shape of `rate_limits` changed at the exact moment the plan changed. From my own Codex session logs (`~/.codex/sessions/2026/09/03/rollout-*.jsonl`), same machine, same day:
| time | primary | secondary | credits |
|---|---|---|---|
| 08:47 | `used_percent: 15.0`, `window_minutes: 300` | `used_percent: 28.0`, `window_minutes: 10080` | absent |
| 09:52 | `used_percent: 66.0`, `window_minutes: 300` | `used_percent: 36.0`, `window_minutes: 10080` | absent |
| 10:0x | `null` | `null` | present |
| 11:00 onward | `used_percent: 4.0`, **`window_minutes: 10080`** | **`null`** | `{has_credits: false, unlimited: false, balance: "0"}` |
So on this plan the **weekly** window arrives as `primary_window`, `secondary_window` is `null`, and a `credits` block appears.
Matching that against the shipped bundle (`Contents/Resources/app.asar`), the classifier is exact-match on two durations:
```js
function Poi(e){ let t=e.windowDurationMins;
return typeof t!=='number'||!Number.isFinite(t) ? null
: Math.abs(t-300)<=Moi ? 'session'
: Math.abs(t-10080)<=Moi ? 'weekly'
: null }
```
and the fetch path maps `rate_limit.primary_window` / `rate_limit.secondary_window` through it, then returns `{session, weekly}`. With only a weekly window present, `session` is `null`. The follow-up helper confirms `session` is expected to exist:
```js
if (n?.signal?.aborted || e.session || !e.weekly) return e; // fallback only when session missing
```
#### Expected
If only one window is returned, still render what is known — the weekly meter — instead of hiding the Codex segment completely. Ideally also surface the new `credits` block (`balance`), since on credit-based plans that is the number that matters.
#### Actual
No Codex segment at all in the status bar. Screenshot shows only the Anthropic ones:
`5% used 4h 25m · 29% used 6d 7h · 29% used Fable`
#### Ruled out
- **Not auth.** `~/.codex/auth.json` was refreshed the same day; the access token is valid for another 10 days and `tokens.account_id` is set. `Voi()` builds the `Authorization` / `ChatGPT-Account-Id` headers from exactly these fields.
- **Not the Codex CLI.** Orca queries `https://chatgpt.com/backend-api/wham/usage` over HTTP itself, so a broken CLI cannot explain it. (Mine was in fact broken earlier that day — missing `@openai/codex-darwin-arm64` — and reinstalling it changed nothing here, as expected.)
- **Not a stale cache.** `orca-codex-usage.json` last scanned at 11:00:33 with `lastScanError: null`; that file tracks token counts, not rate limits.
#### Possibly related
#14489 reports the weekly Codex meter vanishing from the footer on 1.4.182. Same symptom, but that report attributes it to an app update; here the trigger is reproducibly the plan change, with the payload shape captured above. They may share a root cause.
Contributor guide
Assessment
This issue has not been assessed yet.