Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.
Codex agent usage collector passes an approval policy codex-cli no longer accepts
Reported by Sir-Earl-Grey · filed Aug 24, 2026Closed upstream on 2026-08-25 by the bot omarchybot; the closing comment says it was fixed by PR #7649. GitHub close reason: completed.
At a glance
- 1 · What is claimed?
- Only the report text below — no validator has restated it as checkable claims yet.
- 2 · What does it affect?
- Not yet mapped to any requirement or component.
- 3 · Is it reproducible?
- No validation has been run yet.
- 4 · What remains unclear?
- Not validated yet: no claims, no reproducer.
- 5 · What happens next?
- Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.
Original report
What happened
The agents panel shows no Codex limits. Instead the Codex tab renders "Codex limits unavailable" with a red help box containing the single word initialize.
The written record confirms it:
{"id":"codex","ready":true,"hasLocalStats":true,
"limits":[],"tierLabel":"",
"usageStatusText":"Codex limits unavailable",
"authHelpText":"initialize"}Local stats collect fine, so only the RPC limits probe is broken. Claude's tab works normally on the same machine.
Root cause
bin/omarchy-agent-usage-codex:531 launches the app-server with an approval policy that current codex-cli no longer accepts:
[codex, "-s", "read-only", "-a", "untrusted", "app-server"],codex-cli 0.149.0 dropped untrusted from --ask-for-approval:
$ codex --help
-a, --ask-for-approval <APPROVAL_POLICY>
Possible values:
- on-request: The model decides when to ask the user for approval
- never: Never ask for user approval
$ codex -s read-only -a untrusted app-server
error: invalid value 'untrusted' for '--ask-for-approval <APPROVAL_POLICY>'
[possible values: on-request, never]The process exits immediately. Two things then hide the real error:
stderr=subprocess.DEVNULLin thePopencall discards the message.Popenitself still succeeds, so theexceptaround it never fires.
Control reaches rpc_request, which waits 8s and hits raise TimeoutError(method) (line 495). str(exc) is therefore just the method name, which is why authHelpText reads initialize rather than anything actionable.
Steps to reproduce
- Install codex-cli 0.149.0 and sign in.
- Run
omarchy agent usage-update --force codex. - Inspect
~/.local/state/omarchy/agents/usage/codex.json-limitsis empty andauthHelpTextisinitialize.
Expected
Codex rate limits appear in the agents panel.
Suggested fix
Change untrusted to never on line 531. Verified working on this machine - the full RPC sequence then succeeds:
init: {"id":1,"result":{"userAgent":"omarchy-agent-usage/0.149.0 ...","codexHome":"/home/<user>/.codex"}}
account: {"id":2,"result":{"account":{"type":"chatgpt","planType":"plus"},"requiresOpenaiAuth":true}}
limits: {"id":3,"result":{"rateLimits":{"limitId":"codex","primary":{"usedPercent":3,"windowDurationMins":10080,"resetsAt":1788140941},"planType":"plus"}}}never is the right choice over on-request here: the collector is non-interactive, sandboxed read-only, and only issues account/read and account/rateLimits/read, so there is nothing to approve.
Two hardening suggestions while in this code path, both optional:
- Capture stderr instead of discarding it, and surface it in
authHelpTextwhen the process has already exited. A flag rejection currently costs an 8s timeout and produces a misleading message. - Give
TimeoutErrora message with context, e.g.TimeoutError(f"{method} timed out after {timeout}s"), so a genuine timeout does not surface in the UI as a bare method name.
System
- Omarchy 4.0.0-1
- codex-cli 0.149.0 (mise-managed)
- Kernel 7.1.8-arch1-3
- Intel i7-9750H / UHD Graphics 630 + NVIDIA GTX 1650 Mobile
View raw text
## What happened
The agents panel shows no Codex limits. Instead the Codex tab renders "Codex limits unavailable" with a red help box containing the single word `initialize`.
The written record confirms it:
```json
{"id":"codex","ready":true,"hasLocalStats":true,
"limits":[],"tierLabel":"",
"usageStatusText":"Codex limits unavailable",
"authHelpText":"initialize"}
```
Local stats collect fine, so only the RPC limits probe is broken. Claude's tab works normally on the same machine.
## Root cause
`bin/omarchy-agent-usage-codex:531` launches the app-server with an approval policy that current codex-cli no longer accepts:
```python
[codex, "-s", "read-only", "-a", "untrusted", "app-server"],
```
codex-cli 0.149.0 dropped `untrusted` from `--ask-for-approval`:
```
$ codex --help
-a, --ask-for-approval <APPROVAL_POLICY>
Possible values:
- on-request: The model decides when to ask the user for approval
- never: Never ask for user approval
$ codex -s read-only -a untrusted app-server
error: invalid value 'untrusted' for '--ask-for-approval <APPROVAL_POLICY>'
[possible values: on-request, never]
```
The process exits immediately. Two things then hide the real error:
1. `stderr=subprocess.DEVNULL` in the `Popen` call discards the message.
2. `Popen` itself still succeeds, so the `except` around it never fires.
Control reaches `rpc_request`, which waits 8s and hits `raise TimeoutError(method)` (line 495). `str(exc)` is therefore just the method name, which is why `authHelpText` reads `initialize` rather than anything actionable.
## Steps to reproduce
1. Install codex-cli 0.149.0 and sign in.
2. Run `omarchy agent usage-update --force codex`.
3. Inspect `~/.local/state/omarchy/agents/usage/codex.json` - `limits` is empty and `authHelpText` is `initialize`.
## Expected
Codex rate limits appear in the agents panel.
## Suggested fix
Change `untrusted` to `never` on line 531. Verified working on this machine - the full RPC sequence then succeeds:
```
init: {"id":1,"result":{"userAgent":"omarchy-agent-usage/0.149.0 ...","codexHome":"/home/<user>/.codex"}}
account: {"id":2,"result":{"account":{"type":"chatgpt","planType":"plus"},"requiresOpenaiAuth":true}}
limits: {"id":3,"result":{"rateLimits":{"limitId":"codex","primary":{"usedPercent":3,"windowDurationMins":10080,"resetsAt":1788140941},"planType":"plus"}}}
```
`never` is the right choice over `on-request` here: the collector is non-interactive, sandboxed `read-only`, and only issues `account/read` and `account/rateLimits/read`, so there is nothing to approve.
Two hardening suggestions while in this code path, both optional:
- Capture stderr instead of discarding it, and surface it in `authHelpText` when the process has already exited. A flag rejection currently costs an 8s timeout and produces a misleading message.
- Give `TimeoutError` a message with context, e.g. `TimeoutError(f"{method} timed out after {timeout}s")`, so a genuine timeout does not surface in the UI as a bare method name.
## System
- Omarchy 4.0.0-1
- codex-cli 0.149.0 (mise-managed)
- Kernel 7.1.8-arch1-3
- Intel i7-9750H / UHD Graphics 630 + NVIDIA GTX 1650 Mobile
Validation
Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.
Linked
Not linked to any known issue, other report or change yet.
Decision
Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.
No decision has been recorded yet.