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.
Shell crashes with "Tried to show lockscreen surfaces without active lock" when restarted while a lock is pending
Reported by kelvincushman · filed Sep 6, 2026Closed upstream on 2026-09-21 by bjarneo via an automated message, as a duplicate of #9654 (R-1096). GitHub close reason: completed.
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?
- Not yet mapped to any requirement or component.
- 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?
- Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.
Original report
Shell crash: "FATAL: Tried to show lockscreen surfaces without active lock" when the shell restarts while a lock is pending
What happened
While my machine was idle with a lock in progress, the Omarchy shell (quickshell child instance, PID 206773) aborted itself with SIGABRT after hitting quickshell's fatal session-lock check:
FATAL: Tried to show lockscreen surfaces without active lockThe parent quickshell instance (crash handler) relaunched the shell about a second later, and the restarted instance recovered the lock successfully (secure=true ~3 s after the crash). So the impact was a brief shell blip mid-lock, but it is a real crash with a coredump.
Timeline (BST, 2026-09-06, from the user journal and file mtimes)
11:45:51 idle-monitor: idle -> screensaver launched (machine idle, not locked)
11:47:11 omarchy lock: lock-stranded: recovering
omarchy lock: lock-requested
omarchy lock: lock-pending: screen-stabilizing <- lock requested, waiting
11:48:08 ~/.config/omarchy/shell.json modified (mtime 11:48:08.990)
11:48:08 new shell instance starts; duplicate-handler warnings show the previous
instance was still registered:
WARN scene: QML IpcHandler ... Handler was registered but will not be used
because another handler is registered for target omarchy.agents
(same for omarchy.bluetooth, omarchy.network, omarchy.audio, ... )
11:48:09 FATAL: Tried to show lockscreen surfaces without active lock
11:48:09 ERROR: Quickshell has crashed under pid 206773
11:48:09 Quickshell has been restarted
11:48:12 omarchy lock: secure=true <- lock engages fine on retryBacktrace (coredumpctl, key frames)
Trigger: a QML Timer fired and its handler wrote a property that shows lockscreen surfaces before the ext-session-lock was active:
#6 abort
#7 libQt6Core.so.6 (qt_message_fatal)
#8 QDebug::~QDebug() <- fatal message emitted here
#9 quickshell + 0x832b3 <- qFatal site (unsymbolized)
#10 quickshell + 0x2240c2 <- property setter (unsymbolized)
#12 QQmlPropertyPrivate::write(...)
#13 QV4::QObjectWrapper::setProperty(...)
#16 QV4::Lookup::setterFallback(...)
#25 QQmlJavaScriptExpression::evaluate
#26 QQmlBoundSignalExpression::evaluate
#28 QQmlNotifier::emitNotify
#30 QQmlTimer::ticked() <- the timer that fired
#32 QCoreApplication::notifyInternal2The two quickshell-owned frames could not be symbolized (no debug symbols via debuginfod); the fatal string itself is compiled into /usr/bin/quickshell. Quickshell's own crash report (~/.cache/quickshell/crashes/<run-id>/report.txt) records the same stack and log tail.
Expected behavior
The shell's lock-recovery path (lock-stranded: recovering / lock-pending: screen-stabilizing) should not make lockscreen surfaces visible until the session lock is actually active. The restarted instance does this correctly, so the happy path exists — the recovery path during a shell restart appears to race the lock state.
Reproduce (best guess)
- Let the machine go idle far enough that a lock is requested and sitting in
lock-pending: screen-stabilizing(screensaver active). - While in that state, trigger a shell restart/reload (in my case
~/.config/omarchy/shell.jsonwas rewritten at 11:48:08.990, which coincides with the new instance starting). - The recovering instance's timer flips the lockscreen visible before the session lock engages -> qFatal -> SIGABRT.
What rewrote shell.json at that moment I can't tell from the evidence (the machine was idle; an assistant/miner automation was active around that time), so step 2's exact trigger is inferred — the mtime/restart correlation and the duplicate-instance warnings are what's established. The two coexisting shell instances during the restart may be what strands the lock state in the first place.
System details
- Omarchy 4.0.2-1 (
omarchy version) - quickshell 0.3.1-1 (Arch package, RelWithDebInfo), Qt 6.11.2
- Hyprland 0.56.2-1, kernel 7.1.9-arch1-2
- GPU: Intel i915 (8086:9a78), Wayland session
- Shell config: default
/usr/share/omarchy/shell, user plugins:kelvinlee.netbird,wearable.assistant - No OOM kill, no package updates around the crash (quickshell installed 2026-08-31, unchanged since)
- One-off occurrence so far;
omarchy debugis not available on this install (4.0.2) to attach fuller diagnostics
Filed by GLM (glm-5.3) via opencode.
View raw text
# Shell crash: "FATAL: Tried to show lockscreen surfaces without active lock" when the shell restarts while a lock is pending
## What happened
While my machine was idle with a lock in progress, the Omarchy shell (quickshell child instance, PID 206773) aborted itself with SIGABRT after hitting quickshell's fatal session-lock check:
```
FATAL: Tried to show lockscreen surfaces without active lock
```
The parent quickshell instance (crash handler) relaunched the shell about a second later, and the restarted instance recovered the lock successfully (`secure=true` ~3 s after the crash). So the impact was a brief shell blip mid-lock, but it is a real crash with a coredump.
## Timeline (BST, 2026-09-06, from the user journal and file mtimes)
```
11:45:51 idle-monitor: idle -> screensaver launched (machine idle, not locked)
11:47:11 omarchy lock: lock-stranded: recovering
omarchy lock: lock-requested
omarchy lock: lock-pending: screen-stabilizing <- lock requested, waiting
11:48:08 ~/.config/omarchy/shell.json modified (mtime 11:48:08.990)
11:48:08 new shell instance starts; duplicate-handler warnings show the previous
instance was still registered:
WARN scene: QML IpcHandler ... Handler was registered but will not be used
because another handler is registered for target omarchy.agents
(same for omarchy.bluetooth, omarchy.network, omarchy.audio, ... )
11:48:09 FATAL: Tried to show lockscreen surfaces without active lock
11:48:09 ERROR: Quickshell has crashed under pid 206773
11:48:09 Quickshell has been restarted
11:48:12 omarchy lock: secure=true <- lock engages fine on retry
```
## Backtrace (coredumpctl, key frames)
Trigger: a QML `Timer` fired and its handler wrote a property that shows lockscreen surfaces before the ext-session-lock was active:
```
#6 abort
#7 libQt6Core.so.6 (qt_message_fatal)
#8 QDebug::~QDebug() <- fatal message emitted here
#9 quickshell + 0x832b3 <- qFatal site (unsymbolized)
#10 quickshell + 0x2240c2 <- property setter (unsymbolized)
#12 QQmlPropertyPrivate::write(...)
#13 QV4::QObjectWrapper::setProperty(...)
#16 QV4::Lookup::setterFallback(...)
#25 QQmlJavaScriptExpression::evaluate
#26 QQmlBoundSignalExpression::evaluate
#28 QQmlNotifier::emitNotify
#30 QQmlTimer::ticked() <- the timer that fired
#32 QCoreApplication::notifyInternal2
```
The two quickshell-owned frames could not be symbolized (no debug symbols via debuginfod); the fatal string itself is compiled into `/usr/bin/quickshell`. Quickshell's own crash report (`~/.cache/quickshell/crashes/<run-id>/report.txt`) records the same stack and log tail.
## Expected behavior
The shell's lock-recovery path (`lock-stranded: recovering` / `lock-pending: screen-stabilizing`) should not make lockscreen surfaces visible until the session lock is actually active. The restarted instance does this correctly, so the happy path exists — the recovery path during a shell restart appears to race the lock state.
## Reproduce (best guess)
1. Let the machine go idle far enough that a lock is requested and sitting in `lock-pending: screen-stabilizing` (screensaver active).
2. While in that state, trigger a shell restart/reload (in my case `~/.config/omarchy/shell.json` was rewritten at 11:48:08.990, which coincides with the new instance starting).
3. The recovering instance's timer flips the lockscreen visible before the session lock engages -> qFatal -> SIGABRT.
What rewrote `shell.json` at that moment I can't tell from the evidence (the machine was idle; an assistant/miner automation was active around that time), so step 2's exact trigger is inferred — the mtime/restart correlation and the duplicate-instance warnings are what's established. The two coexisting shell instances during the restart may be what strands the lock state in the first place.
## System details
- Omarchy 4.0.2-1 (`omarchy version`)
- quickshell 0.3.1-1 (Arch package, RelWithDebInfo), Qt 6.11.2
- Hyprland 0.56.2-1, kernel 7.1.9-arch1-2
- GPU: Intel i915 (8086:9a78), Wayland session
- Shell config: default `/usr/share/omarchy/shell`, user plugins: `kelvinlee.netbird`, `wearable.assistant`
- No OOM kill, no package updates around the crash (quickshell installed 2026-08-31, unchanged since)
- One-off occurrence so far; `omarchy debug` is not available on this install (4.0.2) to attach fuller diagnostics
Filed by GLM (glm-5.3) via opencode.
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.
No decision has been recorded yet.