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.
Agents panel: status banner is gated on `usageStatusText` but renders `authHelpText`, producing an empty warning box
Reported by johnfire · filed Sep 3, 2026Closed upstream on 2026-09-21 by bjarneo via an automated message, as a duplicate of #8445 (R-1410). 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
In the agents panel, the status banner's visibility and its content are keyed off different fields:
shell/plugins/agents/Panel.qml (~line 498):
// ---------- Status ----------
BorderSurface {
visible: !!root.provider && String(root.provider.usageStatusText || "") !== ""
...
Text {
id: statusText
text: root.provider ? String(root.provider.authHelpText || "") : ""So a record with a non-empty usageStatusText and an empty authHelpText renders an empty red warning box — urgent-tinted border and background, no text.
Why this matters beyond the shipped providers
It never fires for claude/codex/fireworks, because those set both fields together (or neither). But the plugin's own README advertises third-party collectors as the supported extension path:
Adding an agent therefore never touches this plugin: ship a collector that prints the record contract (see theclaudeandcodexcollectors inbin/), and the panel gains a tab.
The record contract is discoverable only by reading the shipped collectors' output, and nothing signals that usageStatusText means "something is wrong" rather than "a line of status to display". Setting it to a healthy summary — e.g. "$22.20 all-time across 49 sessions" — silently produces an empty alarm box.
Steps to reproduce
- Write
~/.local/state/omarchy/agents/usage/example.json:
{
"schemaVersion": 1, "id": "example", "name": "Example",
"updatedAt": "2026-09-03T13:00:00+00:00",
"ready": true, "hasLocalStats": true,
"tierLabel": "Pay-as-you-go",
"usageStatusText": "$22.20 all-time across 49 sessions",
"authHelpText": "",
"limits": [], "todayPrompts": 0, "todaySessions": 0,
"todayTotalTokens": 0, "todayTokensByModel": {},
"totalPrompts": 0, "totalSessions": 0, "activeDays": 0,
"activeDates": [], "recentDays": [], "modelUsage": {}
}omarchy-shell omarchy.agents refresh, then open the panel on the Example tab.
Expected
Either the status text renders, or no banner is drawn.
Actual
An empty urgent-styled box sits between the tab row and TOKENS BY DAY. The text is present in usageStatusText but never displayed, because the Text reads authHelpText.
Note heroMeta() (~line 181) does read usageStatusText, falling back to tierLabel — so the same field drives the hero subtitle and gates an unrelated warning box.
Suggested fix
Render the status text the visibility condition is based on:
text: root.provider
? String(root.provider.usageStatusText || root.provider.authHelpText || "")
: ""...or gate the banner on authHelpText instead, so the box appears only when there is help to show. Documenting the intended meaning of usageStatusText in the plugin README would also prevent third-party collectors from tripping on it.
System
- Omarchy 4.0.2-1
- Hyprland 0.56.2
- quickshell 0.3.1-1
- Kernel 7.1.9-arch1-2
- AMD Ryzen AI 9 HX 370 / Radeon 890M
View raw text
## What happened
In the agents panel, the status banner's visibility and its content are keyed off **different** fields:
`shell/plugins/agents/Panel.qml` (~line 498):
```qml
// ---------- Status ----------
BorderSurface {
visible: !!root.provider && String(root.provider.usageStatusText || "") !== ""
...
Text {
id: statusText
text: root.provider ? String(root.provider.authHelpText || "") : ""
```
So a record with a non-empty `usageStatusText` and an empty `authHelpText` renders an **empty red warning box** — urgent-tinted border and background, no text.
## Why this matters beyond the shipped providers
It never fires for `claude`/`codex`/`fireworks`, because those set both fields together (or neither). But the plugin's own README advertises third-party collectors as the supported extension path:
> Adding an agent therefore never touches this plugin: ship a collector that prints the record contract (see the `claude` and `codex` collectors in `bin/`), and the panel gains a tab.
The record contract is discoverable only by reading the shipped collectors' output, and nothing signals that `usageStatusText` means "something is wrong" rather than "a line of status to display". Setting it to a healthy summary — e.g. `"$22.20 all-time across 49 sessions"` — silently produces an empty alarm box.
## Steps to reproduce
1. Write `~/.local/state/omarchy/agents/usage/example.json`:
```json
{
"schemaVersion": 1, "id": "example", "name": "Example",
"updatedAt": "2026-09-03T13:00:00+00:00",
"ready": true, "hasLocalStats": true,
"tierLabel": "Pay-as-you-go",
"usageStatusText": "$22.20 all-time across 49 sessions",
"authHelpText": "",
"limits": [], "todayPrompts": 0, "todaySessions": 0,
"todayTotalTokens": 0, "todayTokensByModel": {},
"totalPrompts": 0, "totalSessions": 0, "activeDays": 0,
"activeDates": [], "recentDays": [], "modelUsage": {}
}
```
2. `omarchy-shell omarchy.agents refresh`, then open the panel on the Example tab.
## Expected
Either the status text renders, or no banner is drawn.
## Actual
An empty urgent-styled box sits between the tab row and `TOKENS BY DAY`. The text is present in `usageStatusText` but never displayed, because the `Text` reads `authHelpText`.
Note `heroMeta()` (~line 181) *does* read `usageStatusText`, falling back to `tierLabel` — so the same field drives the hero subtitle and gates an unrelated warning box.
## Suggested fix
Render the status text the visibility condition is based on:
```qml
text: root.provider
? String(root.provider.usageStatusText || root.provider.authHelpText || "")
: ""
```
...or gate the banner on `authHelpText` instead, so the box appears only when there is help to show. Documenting the intended meaning of `usageStatusText` in the plugin README would also prevent third-party collectors from tripping on it.
## System
- Omarchy 4.0.2-1
- Hyprland 0.56.2
- quickshell 0.3.1-1
- Kernel 7.1.9-arch1-2
- AMD Ryzen AI 9 HX 370 / Radeon 890M
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.