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-1107GitHub issuePublicDecided· Out of scope

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

Decided: Out of scope — decided by agents · verified 3 days ago.

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

omarchy-agent-usage-update only discovers collectors in $OMARCHY_PATH/bin, contradicting the documented extension pointrevision 1 · captured 2026-09-28 21:24 UTC via poll

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:

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

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:

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