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.
Cloned omarchy.lock: built-in lock still loads at shell startup, two session locks race and Quickshell crashes
Reported by meibe-ab · filed Oct 10, 2026 · open at source
R-1075 is the earliest report of this defect — filed Sep 2, 2026, closed upstream · completed. This report (filed Oct 10, 2026) describes the same defect, so it is folded under it in the inbox.
R-1075 upstream: Closed upstream on 2026-10-09 by its own reporter ninepointlabs. GitHub close reason: completed. Closed by its own reporter — not by itself evidence of a fix.
Decided by agents · verified· Oct 10, 2026
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?
- 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
Summary
When omarchy.lock is cloned (omarchy plugin clone omarchy.lock) and the clone is enabled, the built-in omarchy.lock is still instantiated briefly every time the shell starts or reloads its plugins. For a moment two WlSessionLock services run in the same Quickshell process. If a lock is active or being recovered at that moment, Quickshell aborts and Hyprland shows "Oopsie daisy… your lock screen app died".
What happened
shell.json has the expected state after cloning:
"plugins": [{ "id": "mei.lock" }],
"disabledPlugins": ["omarchy.lock"],
"cloneSourceRestores": ["mei.lock"]On every shell (re)start, both IPC handlers register. The duplicate-handler warning shows up for both files:
WARN scene: QML IpcHandler at file:///usr/share/omarchy/shell/plugins/lock/Service.qml[510:3]: Handler was registered but will not be used because another handler is registered for target lock
WARN scene: QML IpcHandler at file:///home/<user>/.config/omarchy/plugins/mei.lock/Service.qml[510:3]: Handler was registered but will not be used because another handler is registered for target lockBoth instances then run stranded-lock recovery, 50 ms apart:
11:13:25.781Z lock-stranded: recovering
11:13:25.781Z lock-requested
11:13:25.781Z lock-pending: screen-stabilizing
11:13:25.831Z lock-stranded: recovering
11:13:25.831Z lock-requested
11:13:25.831Z lock-pending: screen-stabilizingAnother occurrence ended in a crash:
22:41:02 omarchy lock lock-stranded: recovering
22:41:02 omarchy lock lock-requested
22:41:02 omarchy lock lock-pending: screen-stabilizing
22:42:12 FATAL: Tried to show lockscreen surfaces without active lock
22:42:12 ERROR: Quickshell has crashedThe user was left at Hyprland's "lock screen app died" screen and had to end the session.
Likely cause
PluginRegistry.isEnabled() (shell/services/PluginRegistry.qml ~L123–139) treats first-party plugins as enabled unless disabledPlugins lists them. In shell.qml's Component.onCompleted (~L145–156), pluginRegistry.rescan() and shell._syncServices() can run before shellConfig is populated. At that point shellConfigProvider() returns null, isDisabled() returns false, and omarchy.lock is instantiated together with the clone. Later, onShellConfigChanged → pluginsChanged → _syncServices() destroys it, which can happen in the middle of a session lock.
A keepLoaded service holding a WlSessionLock is the worst case, but any disabled first-party service probably has the same startup race.
Possible fixes:
- Don't sync services until the user shell.json has been read (or treat "config not loaded yet" as "not enabled").
- Skip a first-party plugin when an enabled clone exists (clonedFrom matches), as resolveEnabledId already does for routing.
Steps to reproduce
omarchy plugin clone omarchy.lockand enable the clone (source goes intodisabledPlugins).omarchy restart shell. Bothlock/Service.qmlIPC handlers register (see the warnings above).- Lock the screen, then let the shell restart or reload while locked (e.g. suspend/resume where
omarchy-sleep-locktriggers recovery). Stranded recovery runs twice, and the lock sometimes crashes withTried to show lockscreen surfaces without active lock.
Workaround: omarchy plugin disable <clone> to go back to the built-in lock. After that, only one handler registers and the problem is gone.
System
- Omarchy 4.0.0-1
- Hyprland 0.56.2-1
- quickshell-git 0.3.0.r20.g28771c7-2
- AMD Ryzen 9 7940HS (Radeon 780M) + NVIDIA RTX 4060 Max-Q (hybrid)
- Kernel 7.1.8-arch1-3
View raw text
## Summary
When `omarchy.lock` is cloned (`omarchy plugin clone omarchy.lock`) and the clone is enabled, the built-in `omarchy.lock` is still instantiated briefly every time the shell starts or reloads its plugins. For a moment two `WlSessionLock` services run in the same Quickshell process. If a lock is active or being recovered at that moment, Quickshell aborts and Hyprland shows "Oopsie daisy… your lock screen app died".
## What happened
`shell.json` has the expected state after cloning:
```json
"plugins": [{ "id": "mei.lock" }],
"disabledPlugins": ["omarchy.lock"],
"cloneSourceRestores": ["mei.lock"]
```
On every shell (re)start, both IPC handlers register. The duplicate-handler warning shows up for both files:
```
WARN scene: QML IpcHandler at file:///usr/share/omarchy/shell/plugins/lock/Service.qml[510:3]: Handler was registered but will not be used because another handler is registered for target lock
WARN scene: QML IpcHandler at file:///home/<user>/.config/omarchy/plugins/mei.lock/Service.qml[510:3]: Handler was registered but will not be used because another handler is registered for target lock
```
Both instances then run stranded-lock recovery, 50 ms apart:
```
11:13:25.781Z lock-stranded: recovering
11:13:25.781Z lock-requested
11:13:25.781Z lock-pending: screen-stabilizing
11:13:25.831Z lock-stranded: recovering
11:13:25.831Z lock-requested
11:13:25.831Z lock-pending: screen-stabilizing
```
Another occurrence ended in a crash:
```
22:41:02 omarchy lock lock-stranded: recovering
22:41:02 omarchy lock lock-requested
22:41:02 omarchy lock lock-pending: screen-stabilizing
22:42:12 FATAL: Tried to show lockscreen surfaces without active lock
22:42:12 ERROR: Quickshell has crashed
```
The user was left at Hyprland's "lock screen app died" screen and had to end the session.
## Likely cause
`PluginRegistry.isEnabled()` (`shell/services/PluginRegistry.qml` ~L123–139) treats first-party plugins as enabled unless `disabledPlugins` lists them. In `shell.qml`'s `Component.onCompleted` (~L145–156), `pluginRegistry.rescan()` and `shell._syncServices()` can run before `shellConfig` is populated. At that point `shellConfigProvider()` returns null, `isDisabled()` returns false, and `omarchy.lock` is instantiated together with the clone. Later, `onShellConfigChanged` → `pluginsChanged` → `_syncServices()` destroys it, which can happen in the middle of a session lock.
A `keepLoaded` service holding a `WlSessionLock` is the worst case, but any disabled first-party service probably has the same startup race.
Possible fixes:
- Don't sync services until the user `shell.json` has been read (or treat "config not loaded yet" as "not enabled").
- Skip a first-party plugin when an enabled clone exists (`clonedFrom` matches), as `resolveEnabledId` already does for routing.
## Steps to reproduce
1. `omarchy plugin clone omarchy.lock` and enable the clone (source goes into `disabledPlugins`).
2. `omarchy restart shell`. Both `lock/Service.qml` IPC handlers register (see the warnings above).
3. Lock the screen, then let the shell restart or reload while locked (e.g. suspend/resume where `omarchy-sleep-lock` triggers recovery). Stranded recovery runs twice, and the lock sometimes crashes with `Tried to show lockscreen surfaces without active lock`.
Workaround: `omarchy plugin disable <clone>` to go back to the built-in lock. After that, only one handler registers and the problem is gone.
## System
- Omarchy 4.0.0-1
- Hyprland 0.56.2-1
- quickshell-git 0.3.0.r20.g28771c7-2
- AMD Ryzen 9 7940HS (Radeon 780M) + NVIDIA RTX 4060 Max-Q (hybrid)
- Kernel 7.1.8-arch1-3
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
- Duplicate ofR-1075Quickshell SIGABRT ("Tried to show lockscreen surfaces without active lock") when a plugin live-reloads while the screen is locked· decided by agents · verified
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.