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

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

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

Custom bar/panel plugins fail silently — ReferenceError in Loader error handler swallows the diagnostic and skips the fallbackrevision 1 · captured 2026-09-28 21:23 UTC via poll

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