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-4925GitHub issuePublicReceived

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.

Received and recorded verbatim. Nothing has been checked yet.

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 crashes with "Tried to show lockscreen surfaces without active lock" when restarted while a lock is pendingrevision 1 · captured 2026-10-04 12:10 UTC via poll

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.

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.