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.
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
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?
- 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
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=0In 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
- Duplicate ofR-731Idle service wakes the display while the session is locked· decided by agents · verified
- Fixed bypr/9152· confirmed
- Fixed bypr/7131· 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.