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

Quickshell aborts when idle lock shows surfaces without an active session lock

Reported by MiNTH-IT · filed Sep 1, 2026 · open at source

In the audited area (lock) — decided by agents · verified. Not validated 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?
AreaIn the audited arealock· 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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. So far: in the audited area (lock) — decided by agents · verified. The outcome (valid, duplicate, not a bug, …) is not decided yet. See the decision.

Original report

Quickshell aborts when idle lock shows surfaces without an active session lockrevision 1 · captured 2026-09-28 21:24 UTC via poll

What happened

While the automatic idle lock was activating, the Omarchy Quickshell process aborted with SIGABRT. The shell restarted automatically and recovered the stranded lock.

The journal immediately before the abort contains:

Sep 01 07:06:52 omarchy-shell: FATAL: Tried to show lockscreen surfaces without active lock
Sep 01 07:06:52 omarchy-shell: ERROR: Quickshell has crashed under pid 729136
Sep 01 07:06:52 omarchy-shell: ERROR: Quickshell has been restarted.

Recovery then completed:

Sep 01 07:06:53 omarchy lock: lock-stranded: recovering
Sep 01 07:06:53 omarchy lock: lock-requested
Sep 01 07:06:53 omarchy lock: lock-pending: screen-stabilizing
Sep 01 07:06:58 omarchy lock: secure=true

This is the only Quickshell crash currently recorded by coredumpctl list on this system. No user-data loss was observed.

Expected behavior

The idle lock should acquire the Wayland session lock and show its surfaces without terminating and restarting the desktop shell.

Reproduction

This was observed once when the normal idle-lock sequence ran:

  1. Allow the configured idle screensaver timeout to elapse.
  2. Allow the subsequent system-lock timeout to invoke omarchy-system-lock.
  3. Quickshell aborts while the lock surfaces are being shown.

I have not yet reproduced it a second time.

Diagnosis

A systemd-coredump core was symbolized using Arch debuginfod. The relevant stack is:

qAbort()
qt_message_output(QtFatalMsg, ...)
QDebug::~QDebug()
WlSessionLock::updateSurfaces(show=true, old=null)
  at quickshell/src/wayland/session_lock.cpp:106
WlSessionLock::qt_metacall(... QMetaObject::WriteProperty ...)
QQmlPropertyPrivate::write(...)
...
QQmlTimer::ticked()

Omarchy's lock plugin writes the property from /usr/share/omarchy/shell/plugins/lock/Service.qml:

function requestSessionLock() {
  if (!lockRequested || sessionLock.locked || sessionLock.secure) return
  if (sessionLockStabilizeTimer.running) return
  ...
  sessionLock.locked = true
}

The evidence shows a state/order mismatch: QML requested sessionLock.locked = true, causing Quickshell to call WlSessionLock::updateSurfaces(show=true), but Quickshell had no active ext-session-lock object and deliberately emitted the fatal message and aborted.

It is not yet clear whether the underlying race belongs in Quickshell's session-lock backend or Omarchy's lock request/recovery ordering, but it occurs in Omarchy's shipped native lock plugin path.

Resource exhaustion was ruled out: there were no OOM-killer or systemd-oomd entries around the crash, and the machine had ample available memory.

System details

Omarchy:       4.0.2-1
Kernel:        7.1.9-arch1-2
Hyprland:      0.56.2 (efb50993780079460b0cbed1363e2166a2de1d9f)
Quickshell:    0.3.1-1
qt6-base:      6.11.2-2
qt6-declarative: 6.11.2-1
qt6-wayland:   6.11.2-1
Architecture:  x86_64

omarchy-debug --no-sudo --print completed successfully and generated /tmp/omarchy-debug.log. The namespaced omarchy debug --no-sudo --print command documented by the crash-reporting guidance is not available in Omarchy 4.0.2.

Filed by an OpenAI model (exact model identifier unavailable) via pi.

View raw text
## What happened

While the automatic idle lock was activating, the Omarchy Quickshell process aborted with SIGABRT. The shell restarted automatically and recovered the stranded lock.

The journal immediately before the abort contains:

```text
Sep 01 07:06:52 omarchy-shell: FATAL: Tried to show lockscreen surfaces without active lock
Sep 01 07:06:52 omarchy-shell: ERROR: Quickshell has crashed under pid 729136
Sep 01 07:06:52 omarchy-shell: ERROR: Quickshell has been restarted.
```

Recovery then completed:

```text
Sep 01 07:06:53 omarchy lock: lock-stranded: recovering
Sep 01 07:06:53 omarchy lock: lock-requested
Sep 01 07:06:53 omarchy lock: lock-pending: screen-stabilizing
Sep 01 07:06:58 omarchy lock: secure=true
```

This is the only Quickshell crash currently recorded by `coredumpctl list` on this system. No user-data loss was observed.

## Expected behavior

The idle lock should acquire the Wayland session lock and show its surfaces without terminating and restarting the desktop shell.

## Reproduction

This was observed once when the normal idle-lock sequence ran:

1. Allow the configured idle screensaver timeout to elapse.
2. Allow the subsequent system-lock timeout to invoke `omarchy-system-lock`.
3. Quickshell aborts while the lock surfaces are being shown.

I have not yet reproduced it a second time.

## Diagnosis

A systemd-coredump core was symbolized using Arch debuginfod. The relevant stack is:

```text
qAbort()
qt_message_output(QtFatalMsg, ...)
QDebug::~QDebug()
WlSessionLock::updateSurfaces(show=true, old=null)
  at quickshell/src/wayland/session_lock.cpp:106
WlSessionLock::qt_metacall(... QMetaObject::WriteProperty ...)
QQmlPropertyPrivate::write(...)
...
QQmlTimer::ticked()
```

Omarchy's lock plugin writes the property from `/usr/share/omarchy/shell/plugins/lock/Service.qml`:

```qml
function requestSessionLock() {
  if (!lockRequested || sessionLock.locked || sessionLock.secure) return
  if (sessionLockStabilizeTimer.running) return
  ...
  sessionLock.locked = true
}
```

The evidence shows a state/order mismatch: QML requested `sessionLock.locked = true`, causing Quickshell to call `WlSessionLock::updateSurfaces(show=true)`, but Quickshell had no active `ext-session-lock` object and deliberately emitted the fatal message and aborted.

It is not yet clear whether the underlying race belongs in Quickshell's session-lock backend or Omarchy's lock request/recovery ordering, but it occurs in Omarchy's shipped native lock plugin path.

Resource exhaustion was ruled out: there were no OOM-killer or systemd-oomd entries around the crash, and the machine had ample available memory.

## System details

```text
Omarchy:       4.0.2-1
Kernel:        7.1.9-arch1-2
Hyprland:      0.56.2 (efb50993780079460b0cbed1363e2166a2de1d9f)
Quickshell:    0.3.1-1
qt6-base:      6.11.2-2
qt6-declarative: 6.11.2-1
qt6-wayland:   6.11.2-1
Architecture:  x86_64
```

`omarchy-debug --no-sudo --print` completed successfully and generated `/tmp/omarchy-debug.log`. The namespaced `omarchy debug --no-sudo --print` command documented by the crash-reporting guidance is not available in Omarchy 4.0.2.

Filed by an OpenAI model (exact model identifier unavailable) via pi.

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.

  • Decided by agents · verified: in the audited area (lock)

The outcome (valid, duplicate, not a bug, …) is not decided yet.