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.
omarchy-agent-usage-update only discovers collectors in $OMARCHY_PATH/bin, contradicting the documented extension point
Reported by ScytheAkira · filed Sep 1, 2026 · open at source
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?
- AreaOutside the audited area· Decided by agents · verified
- 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?
- Decided by agents and verified by a second, independent agent — see the decision.
Original report
What happened
The agents plugin README documents adding an agent as a self-service extension
point:
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.
(shell/plugins/agents/README.md, "Data")
But bin/omarchy-agent-usage-update discovers collectors with:
for collector in "$OMARCHY_PATH"/bin/omarchy-agent-usage-*; do$OMARCHY_PATH/bin is /usr/share/omarchy/bin, which is package-owned and
documented as never-edit for end users. So the only way to "ship a collector"
is to put a file in a directory that omarchy update overwrites. A collector
placed on the user's PATH (~/.local/bin) is never discovered or run.
The result is that the documented extension point is unusable as written for
any agent Omarchy does not ship a collector for.
Steps to reproduce
- Write an executable
~/.local/bin/omarchy-agent-usage-<agent>that prints a
valid record on stdout.
2. Run omarchy agent usage-update.
3. No record for <agent> appears in
~/.local/state/omarchy/agents/usage/, and no tab appears in the panel.
Expected
A user-supplied collector on PATH, or in a documented user directory, is
discovered and run alongside the packaged ones.
Suggested fix
Scan a user directory in addition to the packaged one, preferring the user's
copy on an id collision, e.g.:
user_dir="${XDG_CONFIG_HOME:-$HOME/.config}/omarchy/agents/collectors"
for collector in "$OMARCHY_PATH"/bin/omarchy-agent-usage-* "$user_dir"/omarchy-agent-usage-*; doThat keeps the current behaviour, matches the pattern already used for custom
themes (~/.config/omarchy/themes/) and hooks (~/.config/omarchy/hooks/), and
makes the README's promise true. Alternatively, if collectors are intentionally
package-only, the README wording should say so.
Note — the display side is already fully extensible
Only discovery is the blocker. shell/plugins/agents/Main.qml:27 enumerates
records with find "$usageDir" -maxdepth 1 -name '*.json', and the enabled
check defaults unknown provider ids to true:
if (!settings || !settings.providers || !settings.providers[id]) return trueso a record written directly into the usage directory by any means does render
as a working tab, and omarchy-agent-usage-update does not prune records it did
not write. I am currently using that as a workaround: a collector plus a
systemd user timer that writes~/.local/state/omarchy/agents/usage/opencode.json itself, bypassingusage-update entirely. It works, but it duplicates collect()'s
write-then-rename logic and misses the panel's own refresh trigger, which is
exactly what the documented extension point should have handled.
Context (why I hit this)
There is no collector for opencode, so an opencode Zen/Go subscription reports
nothing in the panel. Note also that bin/omarchy-agent-usage-claude ingests
"opencode sessions on an Anthropic provider" into the Claude record — so
opencode usage on Anthropic models counts toward Claude's meter, while opencode
usage on non-Anthropic models (Kimi, GLM, Qwen, MiniMax viahttps://opencode.ai/zen/go/v1) is counted nowhere.
An upstream opencode collector may be worth considering separately, though note
that opencode Go exposes no quota/balance/remaining-usage endpoint — the CLI
bundle contains no such call and /zen/go/v1/models returns no rate-limit
headers — so such a collector could report local token stats but no limit
meters.
System details
- Omarchy version: 4.0.2-1
- Arch Linux, Hyprland (Wayland)
- opencode 1.18.25
View raw text
## What happened
The agents plugin README documents adding an agent as a self-service extension
point:
> 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.
(`shell/plugins/agents/README.md`, "Data")
But `bin/omarchy-agent-usage-update` discovers collectors with:
```bash
for collector in "$OMARCHY_PATH"/bin/omarchy-agent-usage-*; do
```
`$OMARCHY_PATH/bin` is `/usr/share/omarchy/bin`, which is package-owned and
documented as never-edit for end users. So the only way to "ship a collector"
is to put a file in a directory that `omarchy update` overwrites. A collector
placed on the user's `PATH` (`~/.local/bin`) is never discovered or run.
The result is that the documented extension point is unusable as written for
any agent Omarchy does not ship a collector for.
## Steps to reproduce
1. Write an executable `~/.local/bin/omarchy-agent-usage-<agent>` that prints a
valid record on stdout.
2. Run `omarchy agent usage-update`.
3. No record for `<agent>` appears in
`~/.local/state/omarchy/agents/usage/`, and no tab appears in the panel.
## Expected
A user-supplied collector on `PATH`, or in a documented user directory, is
discovered and run alongside the packaged ones.
## Suggested fix
Scan a user directory in addition to the packaged one, preferring the user's
copy on an id collision, e.g.:
```bash
user_dir="${XDG_CONFIG_HOME:-$HOME/.config}/omarchy/agents/collectors"
for collector in "$OMARCHY_PATH"/bin/omarchy-agent-usage-* "$user_dir"/omarchy-agent-usage-*; do
```
That keeps the current behaviour, matches the pattern already used for custom
themes (`~/.config/omarchy/themes/`) and hooks (`~/.config/omarchy/hooks/`), and
makes the README's promise true. Alternatively, if collectors are intentionally
package-only, the README wording should say so.
## Note — the display side is already fully extensible
Only discovery is the blocker. `shell/plugins/agents/Main.qml:27` enumerates
records with `find "$usageDir" -maxdepth 1 -name '*.json'`, and the enabled
check defaults unknown provider ids to true:
```qml
if (!settings || !settings.providers || !settings.providers[id]) return true
```
so a record written directly into the usage directory by any means does render
as a working tab, and `omarchy-agent-usage-update` does not prune records it did
not write. I am currently using that as a workaround: a collector plus a
systemd user timer that writes
`~/.local/state/omarchy/agents/usage/opencode.json` itself, bypassing
`usage-update` entirely. It works, but it duplicates `collect()`'s
write-then-rename logic and misses the panel's own refresh trigger, which is
exactly what the documented extension point should have handled.
## Context (why I hit this)
There is no collector for opencode, so an opencode Zen/Go subscription reports
nothing in the panel. Note also that `bin/omarchy-agent-usage-claude` ingests
"opencode sessions on an Anthropic provider" into the Claude record — so
opencode usage on Anthropic models counts toward Claude's meter, while opencode
usage on non-Anthropic models (Kimi, GLM, Qwen, MiniMax via
`https://opencode.ai/zen/go/v1`) is counted nowhere.
An upstream opencode collector may be worth considering separately, though note
that opencode Go exposes no quota/balance/remaining-usage endpoint — the CLI
bundle contains no such call and `/zen/go/v1/models` returns no rate-limit
headers — so such a collector could report local token stats but no limit
meters.
## System details
- Omarchy version: 4.0.2-1
- Arch Linux, Hyprland (Wayland)
- opencode 1.18.25
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.
- Out of scopeDecided by agents · verified · 2026-10-09 10:26 UTC