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

Third-party bar widget never mounts while its keepLoaded service runs, and reload does not compile the widget QML

Reported by thodoristsagko · filed Sep 26, 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

Third-party bar widget never mounts while its keepLoaded service runs, and reload does not compile the widget QMLrevision 1 · captured 2026-09-28 21:23 UTC via poll

System details

Intel i9-12900H, Intel Iris Xe + NVIDIA RTX A3000 Laptop, Omarchy 4.0.4-1, Quickshell 0.3.1 (Arch).

What happened

A third-party plugin that is both a service and a bar-widget ends up with a live service and no bar widget. The slot is in ~/.config/omarchy/shell.json, but nothing is drawn and the service has no widget instance. Reloading the plugin does not compile the widget file: a syntax error in that file produces no load error.

Reproduced with OmaStats 1.4.0 (crmne.omastats, keepLoaded: true, commit 61878e8). The plugin is enabled and its entry is in the right section of the bar.

The service is up. Its sampler is a child of the shell, and IPC answers:

omarchy-shell crmne.omastats status
{"ready":true,"seq":2606,"cpu":17.9,"cpuTemp":56,"memoryPercent":17.1,"download":1641668.75,"upload":31292.38,"gpu":null,"battery":24,"error":""}

The widget is not:

omarchy-shell crmne.omastats locate
[]

omarchy-shell crmne.omastats show cpu
no-widget

no-widget is what OmaStatsService.qml returns when no bar instance has called registerInstance(). The right-hand side of the bar shows the neighboring icons and no CPU / memory / network readouts in the OmaStats slot.

journalctl --user -t omarchy-shell has Local plugin changed, reloading: crmne.omastats and never Plugin widget crmne.omastats failed. A console.warn added to Component.onCompleted in OmaStatsWidget.qml never showed up after that reload, so the item is not constructed.

The widget file itself compiles. In a separate Quickshell process, Qt.createComponent("…/OmaStatsWidget.qml", Component.PreferSynchronous) returns status 1 (Ready) and an empty error string.

Saving a deliberate syntax error into OmaStatsWidget.qml still only logs the reload line. There is no Plugin widget crmne.omastats failed: warning. The diagnostic edit was reverted; git diff in the plugin checkout is empty. So the running shell is not compiling that file on reload.

Expected

The bar widget is created, draws its readouts, and locate lists the instance. A syntax error in the widget QML is reported with Plugin widget <id> failed.

Where this diverges in the shell

ensureService() compiles the service with Component.PreferSynchronous, and that path works. The sampler stays up across reloads because the manifest sets keepLoaded: true.

loadPluginWidget() compiles the bar widget with Component.Asynchronous and only calls barWidgetRegistry.register() from finalize(). Neither the Ready path nor the Error path is visible for this plugin: the widget is never registered, and a file that cannot compile does not log the failure.

This is not #11796. That report is a widget that does mount, whose bar.shell.serviceFor() returns null. Here the widget object is never constructed.

Steps

  1. Omarchy 4.0.4-1, stock omarchy.bar.
  2. omarchy plugin add https://github.com/crmne/omastats.git --enable
  3. Confirm the entry is in bar.layout and the sampler process is running.
  4. omarchy-shell crmne.omastats status returns data. locate returns []. show cpu returns no-widget. The bar slot is empty.
  5. Put a syntax error in ~/.config/omarchy/plugins/crmne.omastats/OmaStatsWidget.qml and save. The journal logs the reload and does not log Plugin widget crmne.omastats failed.
View raw text
## System details

Intel i9-12900H, Intel Iris Xe + NVIDIA RTX A3000 Laptop, Omarchy 4.0.4-1, Quickshell 0.3.1 (Arch).

## What happened

A third-party plugin that is both a `service` and a `bar-widget` ends up with a live service and no bar widget. The slot is in `~/.config/omarchy/shell.json`, but nothing is drawn and the service has no widget instance. Reloading the plugin does not compile the widget file: a syntax error in that file produces no load error.

Reproduced with [OmaStats 1.4.0](https://github.com/crmne/omastats) (`crmne.omastats`, `keepLoaded: true`, commit `61878e8`). The plugin is enabled and its entry is in the right section of the bar.

The service is up. Its sampler is a child of the shell, and IPC answers:

```
omarchy-shell crmne.omastats status
{"ready":true,"seq":2606,"cpu":17.9,"cpuTemp":56,"memoryPercent":17.1,"download":1641668.75,"upload":31292.38,"gpu":null,"battery":24,"error":""}
```

The widget is not:

```
omarchy-shell crmne.omastats locate
[]

omarchy-shell crmne.omastats show cpu
no-widget
```

`no-widget` is what `OmaStatsService.qml` returns when no bar instance has called `registerInstance()`. The right-hand side of the bar shows the neighboring icons and no CPU / memory / network readouts in the OmaStats slot.

`journalctl --user -t omarchy-shell` has `Local plugin changed, reloading: crmne.omastats` and never `Plugin widget crmne.omastats failed`. A `console.warn` added to `Component.onCompleted` in `OmaStatsWidget.qml` never showed up after that reload, so the item is not constructed.

The widget file itself compiles. In a separate Quickshell process, `Qt.createComponent("…/OmaStatsWidget.qml", Component.PreferSynchronous)` returns status `1` (Ready) and an empty error string.

Saving a deliberate syntax error into `OmaStatsWidget.qml` still only logs the reload line. There is no `Plugin widget crmne.omastats failed:` warning. The diagnostic edit was reverted; `git diff` in the plugin checkout is empty. So the running shell is not compiling that file on reload.

## Expected

The bar widget is created, draws its readouts, and `locate` lists the instance. A syntax error in the widget QML is reported with `Plugin widget <id> failed`.

## Where this diverges in the shell

`ensureService()` compiles the service with `Component.PreferSynchronous`, and that path works. The sampler stays up across reloads because the manifest sets `keepLoaded: true`.

`loadPluginWidget()` compiles the bar widget with `Component.Asynchronous` and only calls `barWidgetRegistry.register()` from `finalize()`. Neither the Ready path nor the Error path is visible for this plugin: the widget is never registered, and a file that cannot compile does not log the failure.

This is not #11796. That report is a widget that does mount, whose `bar.shell.serviceFor()` returns null. Here the widget object is never constructed.

## Steps

1. Omarchy 4.0.4-1, stock `omarchy.bar`.
2. `omarchy plugin add https://github.com/crmne/omastats.git --enable`
3. Confirm the entry is in `bar.layout` and the sampler process is running.
4. `omarchy-shell crmne.omastats status` returns data. `locate` returns `[]`. `show cpu` returns `no-widget`. The bar slot is empty.
5. Put a syntax error in `~/.config/omarchy/plugins/crmne.omastats/OmaStatsWidget.qml` and save. The journal logs the reload and does not log `Plugin widget crmne.omastats failed`.

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 18:45 UTC