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.
Custom bar/panel plugins fail silently — ReferenceError in Loader error handler swallows the diagnostic and skips the fallback
Reported by ltehacker · filed Sep 8, 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 happens
When a plugin declaring kind: "bar" (or a panel plugin) fails to load, the
user gets no diagnostic and the documented fallback to omarchy.bar does not
engage. The bar simply vanishes or silently reverts.
The cause is in shell/shell.qml. Both plugin Loader error handlers reference
a bare errorString:
// shell.qml:256 (bar option loader)
var detail = errorString && errorString() ? errorString() : ""
console.warn("bar option " + shell.activeBarId + " failed to load, falling back to " + shell.defaultBarId + ":", detail)
shell.failedBarId = shell.activeBarId// shell.qml:645 (panel plugin loader)
var detail = errorString && errorString() ? errorString() : ""
if (!detail && sourceComponent) detail = sourceComponent.errorString()Loader has no errorString — that member belongs to Component. In QML an
unqualified identifier that does not resolve throws a ReferenceError rather
than evaluating to undefined, so the errorString && ... guard cannot
short-circuit; it throws first.
Observed in the journal:
WARN scene: file:///home/<user>/.config/omarchy/plugins/<id>/Bar.qml[618:3]: Property value set multiple times
WARN scene: @shell.qml[256:-1]: ReferenceError: errorString is not definedTwo consequences at line 256:
- The
console.warnnaming the failing plugin never runs, so nothing points
at the plugin or the fallback.
2. shell.failedBarId = shell.activeBarId on the following line never runs, so
the activeBarId fallback path that failedBarId exists to drive does not
engage as designed.
At line 645 the same throw makes the sourceComponent.errorString() fallback
on the next line unreachable — which is precisely the case its own comment says
it is there to handle ("Surface both so the user sees something actionable
instead of a panel that silently refuses to open").
Reproduce
- Clone the stock bar:
omarchy plugin clone omarchy.bar - Introduce any QML error in the clone's
Bar.qml— e.g. add a second
Component.onCompleted: to the root Item, which yields
"Property value set multiple times".
3. omarchy restart shell
Expected: a warning naming the plugin, and a clean fallback to the built-in bar.
Actual: only the raw QML error plus ReferenceError: errorString is not defined;
no plugin-level diagnostic and no fallback.
Notes
A guard that works for a possibly-undefined identifier would betypeof errorString !== "undefined", but since Loader does not expose the
member at all, the intended source is likely sourceComponent.errorString()
alone. I have not proposed a patch as the right surface is a maintainer call.
System
- Omarchy 4.0.2-1
- Arch Linux, kernel 7.1.9-arch1-2
- Hyprland 0.56.2
View raw text
## What happens
When a plugin declaring `kind: "bar"` (or a panel plugin) fails to load, the
user gets no diagnostic and the documented fallback to `omarchy.bar` does not
engage. The bar simply vanishes or silently reverts.
The cause is in `shell/shell.qml`. Both plugin Loader error handlers reference
a bare `errorString`:
```qml
// shell.qml:256 (bar option loader)
var detail = errorString && errorString() ? errorString() : ""
console.warn("bar option " + shell.activeBarId + " failed to load, falling back to " + shell.defaultBarId + ":", detail)
shell.failedBarId = shell.activeBarId
```
```qml
// shell.qml:645 (panel plugin loader)
var detail = errorString && errorString() ? errorString() : ""
if (!detail && sourceComponent) detail = sourceComponent.errorString()
```
`Loader` has no `errorString` — that member belongs to `Component`. In QML an
unqualified identifier that does not resolve throws a ReferenceError rather
than evaluating to `undefined`, so the `errorString && ...` guard cannot
short-circuit; it throws first.
Observed in the journal:
```
WARN scene: file:///home/<user>/.config/omarchy/plugins/<id>/Bar.qml[618:3]: Property value set multiple times
WARN scene: @shell.qml[256:-1]: ReferenceError: errorString is not defined
```
Two consequences at line 256:
1. The `console.warn` naming the failing plugin never runs, so nothing points
at the plugin or the fallback.
2. `shell.failedBarId = shell.activeBarId` on the following line never runs, so
the `activeBarId` fallback path that `failedBarId` exists to drive does not
engage as designed.
At line 645 the same throw makes the `sourceComponent.errorString()` fallback
on the next line unreachable — which is precisely the case its own comment says
it is there to handle ("Surface both so the user sees something actionable
instead of a panel that silently refuses to open").
## Reproduce
1. Clone the stock bar: `omarchy plugin clone omarchy.bar`
2. Introduce any QML error in the clone's `Bar.qml` — e.g. add a second
`Component.onCompleted:` to the root `Item`, which yields
"Property value set multiple times".
3. `omarchy restart shell`
Expected: a warning naming the plugin, and a clean fallback to the built-in bar.
Actual: only the raw QML error plus `ReferenceError: errorString is not defined`;
no plugin-level diagnostic and no fallback.
## Notes
A guard that works for a possibly-undefined identifier would be
`typeof errorString !== "undefined"`, but since `Loader` does not expose the
member at all, the intended source is likely `sourceComponent.errorString()`
alone. I have not proposed a patch as the right surface is a maintainer call.
## System
- Omarchy 4.0.2-1
- Arch Linux, kernel 7.1.9-arch1-2
- Hyprland 0.56.2
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 11:06 UTC