Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A 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.

Inbox
ReportR-4663GitHub issuePublicReceived

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.

Received and recorded verbatim. Nothing has been checked yet.

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

Codex agent usage collector passes an approval policy codex-cli no longer acceptsrevision 1 · captured 2026-10-04 12:03 UTC via poll

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:

  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
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.