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-1050GitHub issuePublicFixed

Idle lock: display turns back on with the password prompt ~3 s after blanking (idle service starts a new cycle at lock time)

Reported by Zedicuss · filed Sep 2, 2026 · open at source

Decided: Duplicate — decided by agents · verified 3 days ago.

This defect is tracked under R-731. This report describes the same defect, so it is folded under it in the inbox.

Earliest report of this defect: R-1050 (filed Sep 2, 2026).

Decided by agents · verified· Oct 9, 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?
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?
Decided by agents and verified by a second, independent agent — see the decision.

Original report

Idle lock: display turns back on with the password prompt ~3 s after blanking (idle service starts a new cycle at lock time)revision 1 · captured 2026-09-28 21:24 UTC via poll

System details

AMD Ryzen (32 threads), AMD Radeon RX 6600 (amdgpu), single 3440x1440 monitor on HDMI, Omarchy 4.0.2-1, Hyprland 0.56.2. Stock Tokyo Night theme, stock ~/.config/omarchy/shell.json (idle.screensaver 150, idle.lock 300). No custom shell plugins.

What's wrong?

What happens: leave the machine untouched. At 300 s the shell locks and the display goes dark. About three seconds later the display switches back on showing the lock screen with the password field, with nobody touching anything. It goes dark again at the next idle timeout (so the pattern is: black at 5:00, lit again at 5:03, black at 10:00).

Expected: the display stays off after the idle lock until there is real input.

Steps to reproduce: fresh 4.0.2 install, default settings, walk away for six minutes.

Cause, from the shell's own idle log (`journalctl --user`, one lock cycle, stock theme):

11:50:21Z idle  lock-system: lock-timeout
11:50:21Z idle  process-start: lock omarchy-system-lock
11:50:21Z idle  idle-monitor: idle                       <- a new idle cycle starts at the same instant as the lock
11:50:21Z idle  idle-cycle-start: screensaver=150 lock=300
11:50:21Z idle  process-start: screensaver [[ $(omarchy-shell lock isLocked 2>/dev/null) == "true" ]] || omarchy-launch-screensaver
11:50:21Z lock  lock-requested
11:50:21Z lock  lock-pending: screen-stabilizing
11:50:21Z idle  process-exit: screensaver exitCode=0 status=0   <- launch skipped because the session is locked, so no screensaver window
11:50:21Z idle  process-exit: lock exitCode=0 status=0
11:50:21Z idle  idle-monitor: active                     <- locking flips the idle monitor to active
11:50:21Z idle  idle-monitor-active: screensaver cycle remains armed
11:50:21Z lock  secure=true
11:50:24Z idle  idle-cycle-cancel: screensaver-not-running
11:50:24Z idle  process-start: wake omarchy-system-wake  <- omarchy-brightness-display on -> DPMS enable
11:50:24Z idle  process-exit: wake exitCode=0 status=0

In shell/plugins/services/idle/Service.qml, screensaverLaunchGraceTimer.onTriggered calls cancelIdleCycle("screensaver-not-running") when no screensaver window appeared within 3 s and the idle monitor is no longer idle. Immediately after lockSystem() both conditions become true for the wrong reasons: the screensaver launch is deliberately skipped while locked, and the lock itself makes the monitor report activity. cancelIdleCycle then runs omarchy-system-wake, which turns the display back on.

The same sequence also happened with a custom theme, so it is independent of theme. Reproduced on three consecutive lock cycles.

Suggested fix: don't start a new idle cycle (or skip the grace-timer wake) while the lock service reports the session as locked, e.g. guard startIdleCycle() / the grace timer's onTriggered on the locked state.

Workaround I'm using: a login-shell PATH override of omarchy-system-wake that skips omarchy-brightness-display on while omarchy-shell lock isLocked is true. Hyprland's misc:mouse_move_enables_dpms / misc:key_press_enables_dpms (both true in the Omarchy defaults) still light the display on real input, and the lock plugin's own unlock path still calls the stock wake.

(omarchy debug is not present in 4.0.2, so no debug log attached; happy to run whatever diagnostic you prefer.)

View raw text
### System details

AMD Ryzen (32 threads), AMD Radeon RX 6600 (amdgpu), single 3440x1440 monitor on HDMI, Omarchy 4.0.2-1, Hyprland 0.56.2. Stock Tokyo Night theme, stock `~/.config/omarchy/shell.json` (`idle.screensaver` 150, `idle.lock` 300). No custom shell plugins.

### What's wrong?

**What happens:** leave the machine untouched. At 300 s the shell locks and the display goes dark. About three seconds later the display switches back on showing the lock screen with the password field, with nobody touching anything. It goes dark again at the next idle timeout (so the pattern is: black at 5:00, lit again at 5:03, black at 10:00).

**Expected:** the display stays off after the idle lock until there is real input.

**Steps to reproduce:** fresh 4.0.2 install, default settings, walk away for six minutes.

**Cause, from the shell's own idle log (`journalctl --user`, one lock cycle, stock theme):**

```
11:50:21Z idle  lock-system: lock-timeout
11:50:21Z idle  process-start: lock omarchy-system-lock
11:50:21Z idle  idle-monitor: idle                       <- a new idle cycle starts at the same instant as the lock
11:50:21Z idle  idle-cycle-start: screensaver=150 lock=300
11:50:21Z idle  process-start: screensaver [[ $(omarchy-shell lock isLocked 2>/dev/null) == "true" ]] || omarchy-launch-screensaver
11:50:21Z lock  lock-requested
11:50:21Z lock  lock-pending: screen-stabilizing
11:50:21Z idle  process-exit: screensaver exitCode=0 status=0   <- launch skipped because the session is locked, so no screensaver window
11:50:21Z idle  process-exit: lock exitCode=0 status=0
11:50:21Z idle  idle-monitor: active                     <- locking flips the idle monitor to active
11:50:21Z idle  idle-monitor-active: screensaver cycle remains armed
11:50:21Z lock  secure=true
11:50:24Z idle  idle-cycle-cancel: screensaver-not-running
11:50:24Z idle  process-start: wake omarchy-system-wake  <- omarchy-brightness-display on -> DPMS enable
11:50:24Z idle  process-exit: wake exitCode=0 status=0
```

In `shell/plugins/services/idle/Service.qml`, `screensaverLaunchGraceTimer.onTriggered` calls `cancelIdleCycle("screensaver-not-running")` when no screensaver window appeared within 3 s and the idle monitor is no longer idle. Immediately after `lockSystem()` both conditions become true for the wrong reasons: the screensaver launch is deliberately skipped while locked, and the lock itself makes the monitor report activity. `cancelIdleCycle` then runs `omarchy-system-wake`, which turns the display back on.

The same sequence also happened with a custom theme, so it is independent of theme. Reproduced on three consecutive lock cycles.

**Suggested fix:** don't start a new idle cycle (or skip the grace-timer wake) while the lock service reports the session as locked, e.g. guard `startIdleCycle()` / the grace timer's `onTriggered` on the locked state.

**Workaround I'm using:** a login-shell PATH override of `omarchy-system-wake` that skips `omarchy-brightness-display on` while `omarchy-shell lock isLocked` is true. Hyprland's `misc:mouse_move_enables_dpms` / `misc:key_press_enables_dpms` (both true in the Omarchy defaults) still light the display on real input, and the lock plugin's own unlock path still calls the stock wake.

(`omarchy debug` is not present in 4.0.2, so no debug log attached; happy to run whatever diagnostic you prefer.)

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

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.

  • DuplicateR-731Decided by agents · verified · 2026-10-09 08:20 UTC