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.
Lock screen stays on AMD iGPU monitor after unlock (NVIDIA + AMD mixed GPU)
Reported by carbonnumbers · filed Aug 20, 2026Closed upstream on 2026-09-18 by its own reporter carbonnumbers, as not planned. Closed by its own reporter — not by itself evidence of a fix.
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
System details
- Omarchy 4.0.0-1
- Hyprland 0.56.2 (
efb50993780079460b0cbed1363e2166a2de1d9f) - NVIDIA GeForce RTX 4090 (driver 610.57.04 open) + AMD Raphael iGPU (
amdgpu) - Two monitors on different GPUs:
- DP-1 /
card1(NVIDIA): Samsung Odyssey G8, 3840x2160@240, scale 1.6 - DP-4 /
card0(AMD iGPU): Corsair XENEON EDGE, 2560x720@60, scale 1.6, physically below the G8
What's wrong?
Idle lock works. Typing the password on the G8 authenticates and the G8 shows the desktop. The XENEON EDGE stays on the Quickshell lock field (Enter Password) indefinitely.
The lock plugin itself thinks the session is unlocked:
omarchy-shell lock status
{"locked":false,"requested":false,"pending":false,"sessionLocked":false,"secure":false,"realScreens":2,...,"lastEvent":"unlocked"}loginctl LockedHint=no. omarchy-hyprland-session-locked exits 1 (unlocked). hyprctl layers on DP-4 shows only omarchy-background and omarchy-bar — no lock overlay. Session-lock surfaces are not layer-shell, so that last point does not prove the leftover is gone, but the IPC/logind state does.
grim -o DP-4 hangs until killed. grim -o DP-1 returns immediately. Capturing a region that sits on the Edge layout (-g "400,1350 20x20") also hangs. So the AMD output is in a bad copy/scanout state after unlock, not just a stale wallpaper.
Journal (idle lock, then unlock on the G8)
15:29:04 lock-requested
15:29:04 lock-pending: screen-stabilizing
15:29:09 secure=true
15:31:34 idle-monitor: idle # idle cycle starts *while already locked*
15:34:04 lock-system: lock-timeout # second omarchy-system-lock while already locked
16:05:16 idle-monitor: active # mouse wake, ~36 min later
16:05:29 PAM omarchy-lock-password authenticated successfully
16:05:29 secure=false
16:05:29 session-locked=false
16:05:29 unlockedThere is no session-locked=true line between lock-requested and secure=true.
omarchy-system-wake then no-ops: omarchy-brightness-display on skips the DPMS enable when every monitor already reports dpmsStatus: true. After the mouse wake, both outputs report on, so unlock never modesets the AMD panel.
Steps to reproduce
- Mixed-GPU desktop: one monitor on NVIDIA, one on the AMD iGPU. The iGPU panel here is a 2560x720 XENEON EDGE.
- Wait for idle lock (
idle.lock300s). Displays blank ~5s later (idleBlankTimer). - Move the mouse / type the password on the NVIDIA monitor.
- NVIDIA monitor unlocks. AMD monitor keeps showing
Enter Password.
Related
- #2449 was the hyprlock-era dual-monitor leftover. This is Quattro /
WlSessionLock. - #7399 is the DPMS wake skip-guard on a slow-sync panel. Same
omarchy-brightness-display onguard, different symptom.
Local workaround that recovered the panel
Recreating only DP-4:
hl.monitor({ output = "DP-4", disabled = true })
-- then
hl.monitor({ output = "DP-4", mode = "2560x720@60", position = "400x1350", scale = 1.6, transform = 0, disabled = false })plus omarchy restart shell. I also started a Hyprland unlock>> listener that repeats that DP-4 toggle so the next idle unlock does not stick again.
Suggestions
- Do not start a new idle lock cycle while
omarchy-shell lock isLockedis already true (the 15:31/15:34 double lock above). omarchy-brightness-display onshould not treatdpmsStatus: trueas "this output actually has a fresh frame", at least on a secondary GPU.- After
finishUnlock(), force a modeset (orhl.dsp.force_renderer_reload()) on outputs that did not render the PAM field, or skip DPMS-off on mixed-GPU outputs.
View raw text
## System details
- Omarchy 4.0.0-1
- Hyprland 0.56.2 (`efb50993780079460b0cbed1363e2166a2de1d9f`)
- NVIDIA GeForce RTX 4090 (driver 610.57.04 open) + AMD Raphael iGPU (`amdgpu`)
- Two monitors on **different GPUs**:
- DP-1 / `card1` (NVIDIA): Samsung Odyssey G8, 3840x2160@240, scale 1.6
- DP-4 / `card0` (AMD iGPU): Corsair XENEON EDGE, 2560x720@60, scale 1.6, physically below the G8
## What's wrong?
Idle lock works. Typing the password on the G8 authenticates and the G8 shows the desktop. The XENEON EDGE stays on the Quickshell lock field (`Enter Password`) indefinitely.
The lock plugin itself thinks the session is unlocked:
```
omarchy-shell lock status
{"locked":false,"requested":false,"pending":false,"sessionLocked":false,"secure":false,"realScreens":2,...,"lastEvent":"unlocked"}
```
`loginctl` `LockedHint=no`. `omarchy-hyprland-session-locked` exits 1 (unlocked). `hyprctl layers` on DP-4 shows only `omarchy-background` and `omarchy-bar` — no lock overlay. Session-lock surfaces are not layer-shell, so that last point does not prove the leftover is gone, but the IPC/logind state does.
`grim -o DP-4` hangs until killed. `grim -o DP-1` returns immediately. Capturing a region that sits on the Edge layout (`-g "400,1350 20x20"`) also hangs. So the AMD output is in a bad copy/scanout state after unlock, not just a stale wallpaper.
## Journal (idle lock, then unlock on the G8)
```
15:29:04 lock-requested
15:29:04 lock-pending: screen-stabilizing
15:29:09 secure=true
15:31:34 idle-monitor: idle # idle cycle starts *while already locked*
15:34:04 lock-system: lock-timeout # second omarchy-system-lock while already locked
16:05:16 idle-monitor: active # mouse wake, ~36 min later
16:05:29 PAM omarchy-lock-password authenticated successfully
16:05:29 secure=false
16:05:29 session-locked=false
16:05:29 unlocked
```
There is no `session-locked=true` line between `lock-requested` and `secure=true`.
`omarchy-system-wake` then no-ops: `omarchy-brightness-display on` skips the DPMS enable when every monitor already reports `dpmsStatus: true`. After the mouse wake, both outputs report on, so unlock never modesets the AMD panel.
## Steps to reproduce
1. Mixed-GPU desktop: one monitor on NVIDIA, one on the AMD iGPU. The iGPU panel here is a 2560x720 XENEON EDGE.
2. Wait for idle lock (`idle.lock` 300s). Displays blank ~5s later (`idleBlankTimer`).
3. Move the mouse / type the password on the NVIDIA monitor.
4. NVIDIA monitor unlocks. AMD monitor keeps showing `Enter Password`.
## Related
- #2449 was the hyprlock-era dual-monitor leftover. This is Quattro / `WlSessionLock`.
- #7399 is the DPMS wake skip-guard on a slow-sync panel. Same `omarchy-brightness-display on` guard, different symptom.
## Local workaround that recovered the panel
Recreating only DP-4:
```lua
hl.monitor({ output = "DP-4", disabled = true })
-- then
hl.monitor({ output = "DP-4", mode = "2560x720@60", position = "400x1350", scale = 1.6, transform = 0, disabled = false })
```
plus `omarchy restart shell`. I also started a Hyprland `unlock>>` listener that repeats that DP-4 toggle so the next idle unlock does not stick again.
## Suggestions
- Do not start a new idle lock cycle while `omarchy-shell lock isLocked` is already true (the 15:31/15:34 double lock above).
- `omarchy-brightness-display on` should not treat `dpmsStatus: true` as "this output actually has a fresh frame", at least on a secondary GPU.
- After `finishUnlock()`, force a modeset (or `hl.dsp.force_renderer_reload()`) on outputs that did not render the PAM field, or skip DPMS-off on mixed-GPU outputs.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.