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

Shell wedges alive while idle-locked: IPC keeps serving stale lock state, the session-lock client dies, and omarchy-restart-shell refuses to recover

Reported by codemonkey76 · filed Sep 6, 2026 · open at source

Partly 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?
AreaPartly in 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: partly in the audited area (lock) — decided by agents · verified; matches no known issue — decided by agents · verified. The outcome (valid, duplicate, not a bug, …) is not decided yet. See the decision.

Original report

Shell wedges alive while idle-locked: IPC keeps serving stale lock state, the session-lock client dies, and omarchy-restart-shell refuses to recoverrevision 1 · captured 2026-09-28 21:23 UTC via poll

System details

Omarchy 4.0.2-1, Quickshell 0.3.1-1, Hyprland 0.56.2-1, 1password 8.12.34-35, linux 7.1.9-arch1-2.
Laptop, hybrid GPU: Intel CometLake-H UHD (i915, eDP-1) + NVIDIA GTX 1650 Mobile (nvidia-open-dkms). Single internal display, no external monitor. Wayland, uwsm session.

What's wrong

Twice in one night, quickshell wedged while the session was idle-locked. The process stayed alive and its IPC kept answering, but it stopped logging entirely and its ext-session-lock client died — leaving Hyprland's crashed-lockscreen failsafe on screen until morning.

The dangerous part is that IPC keeps serving the lock state the shell last reached, so the shell reports a healthy, secure lock long after its locker is gone:

$ omarchy-shell lock status
{"locked":true,"requested":true,"pending":false,"sessionLocked":true,
 "secure":true,"realScreens":1,...,"lastEvent":"secure=true",
 "lastEventAt":"2026-09-06T16:02:06.569Z"}    <- 4h39m stale

`omarchy-restart-shell` then refuses to recover it. Its guard reads exactly that status to decide whether a live locker is worth preserving:

Refusing to restart Omarchy shell while the session is locked.

So the documented way out of the failsafe is blocked by the very state it exists to clear. The wedge is in the event loop, not the IPC thread, so a dead locker is indistinguishable from a healthy one over IPC. Short of patching a copy of the script, the only way back in is a reboot.

Occurrences

Both times: shell alive, solitaryBlockedBy contains LOCK, zero log lines afterwards.

locked atlast log linesilent forshell PID
120:14:1620:36:435h16m20183
202:02:0602:13:084h39m267461

No suspend was involved in either — the last suspend was hours before (PM: suspend exit at 20:01:13). The system journal has nothing at all in the surrounding minute in either case.

What is not the trigger

Both wedges end on an identical pair of lines, which looks like a smoking gun and is not one:

1password[1401]: Lock state changed: Locked
omarchy-shell[...]: WARN quickshell.dbus.properties: Error updating property
                    :1.41/StatusNotifierItem/org.kde.StatusNotifierItem:IconName
omarchy-shell[...]: WARN quickshell.dbus.properties: QDBusError(
                    "org.freedesktop.DBus.Error.Failed", "error occurred in Get")

:1.41 is 1Password, whose tray icon changes as it auto-locks. But this pair fires on all seven idle lock-timeouts across the two nights, including the five the shell survived. It is simply the last thing logged in every idle-lock cycle, so it is also the last thing logged before silence. Recording it here so nobody else spends time on it.

I could not find anything that distinguishes the two wedges from the five healthy locks. The trigger remains unidentified; the reproducer is only "leave the session idle-locked and wait", which hit twice in two nights here.

Relationship to #10108

Related but distinct. #10108 is IPC-dead (omarchy-shell is not responding), follows an S3 resume on a single-GPU NVIDIA desktop, leaves a stale background layer covering the desktop, and fails restart with An instance of this configuration is already running.

Here IPC stays alive and answers, there is no suspend, the visible result is Hyprland's lock failsafe rather than a stale wallpaper, and restart fails by refusing rather than aborting. The common thread is a quickshell that wedges without dying, so the supervision path never fires.

Suggested fix for the recovery half

Whatever causes the wedge, being unable to recover from it without a reboot seems worth fixing on its own. A --force flag on omarchy-restart-shell that skips the live-locker guard and goes straight to its existing relock path is enough — someone looking at the failsafe knows the lock screen is dead even when IPC insists otherwise. PR to follow.

View raw text
### System details

Omarchy 4.0.2-1, Quickshell 0.3.1-1, Hyprland 0.56.2-1, 1password 8.12.34-35, linux 7.1.9-arch1-2.
Laptop, hybrid GPU: Intel CometLake-H UHD (i915, `eDP-1`) + NVIDIA GTX 1650 Mobile (nvidia-open-dkms). Single internal display, no external monitor. Wayland, uwsm session.

### What's wrong

Twice in one night, `quickshell` **wedged while the session was idle-locked**. The process stayed alive and its **IPC kept answering**, but it stopped logging entirely and its `ext-session-lock` client died — leaving Hyprland's crashed-lockscreen failsafe on screen until morning.

The dangerous part is that IPC keeps serving the lock state the shell last reached, so the shell reports a healthy, secure lock long after its locker is gone:

```
$ omarchy-shell lock status
{"locked":true,"requested":true,"pending":false,"sessionLocked":true,
 "secure":true,"realScreens":1,...,"lastEvent":"secure=true",
 "lastEventAt":"2026-09-06T16:02:06.569Z"}    <- 4h39m stale
```

**`omarchy-restart-shell` then refuses to recover it.** Its guard reads exactly that status to decide whether a live locker is worth preserving:

```
Refusing to restart Omarchy shell while the session is locked.
```

So the documented way out of the failsafe is blocked by the very state it exists to clear. The wedge is in the event loop, not the IPC thread, so a dead locker is indistinguishable from a healthy one over IPC. Short of patching a copy of the script, the only way back in is a reboot.

### Occurrences

Both times: shell alive, `solitaryBlockedBy` contains `LOCK`, zero log lines afterwards.

| | locked at | last log line | silent for | shell PID |
|---|---|---|---|---|
| 1 | 20:14:16 | 20:36:43 | 5h16m | 20183 |
| 2 | 02:02:06 | 02:13:08 | 4h39m | 267461 |

No suspend was involved in either — the last suspend was hours before (`PM: suspend exit` at 20:01:13). The system journal has **nothing at all** in the surrounding minute in either case.

### What is *not* the trigger

Both wedges end on an identical pair of lines, which looks like a smoking gun and is not one:

```
1password[1401]: Lock state changed: Locked
omarchy-shell[...]: WARN quickshell.dbus.properties: Error updating property
                    :1.41/StatusNotifierItem/org.kde.StatusNotifierItem:IconName
omarchy-shell[...]: WARN quickshell.dbus.properties: QDBusError(
                    "org.freedesktop.DBus.Error.Failed", "error occurred in Get")
```

`:1.41` is 1Password, whose tray icon changes as it auto-locks. But this pair fires on **all seven** idle lock-timeouts across the two nights, including the five the shell survived. It is simply the last thing logged in every idle-lock cycle, so it is also the last thing logged before silence. Recording it here so nobody else spends time on it.

I could not find anything that distinguishes the two wedges from the five healthy locks. The trigger remains unidentified; the reproducer is only "leave the session idle-locked and wait", which hit twice in two nights here.

### Relationship to #10108

Related but distinct. #10108 is IPC-**dead** (`omarchy-shell is not responding`), follows an S3 resume on a single-GPU NVIDIA desktop, leaves a stale background layer covering the desktop, and fails restart with `An instance of this configuration is already running`.

Here IPC stays **alive** and answers, there is no suspend, the visible result is Hyprland's lock failsafe rather than a stale wallpaper, and restart fails by **refusing** rather than aborting. The common thread is a quickshell that wedges without dying, so the supervision path never fires.

### Suggested fix for the recovery half

Whatever causes the wedge, being unable to recover from it without a reboot seems worth fixing on its own. A `--force` flag on `omarchy-restart-shell` that skips the live-locker guard and goes straight to its existing relock path is enough — someone looking at the failsafe knows the lock screen is dead even when IPC insists otherwise. PR to follow.

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

  • Related PRpr/14591· confirmed
  • Related PRpr/7169· confirmed

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: partly in the audited area (lock)
  • Decided by agents · verified: matches no known issue

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