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 alternates black <-> lock UI every ~13.5s on AMD iGPU over HDMI
Reported by williavs · filed Aug 28, 2026 · open at source
This defect is tracked under R-2112. This report describes the same defect, so it is folded under it in the inbox.
Earliest report of this defect: R-1329 (filed Aug 28, 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
Lock screen alternates black <-> lock UI every ~13.5s on AMD iGPU over HDMI (idle-blank + spurious disconnect uevent)
System
- Omarchy 4.0.1-1, Hyprland 0.56.2, kernel 7.1.9-arch1-2
- Beelink EQR7 mini PC — AMD Ryzen 5 7535U (Radeon 660M iGPU), HDMI out
- Monitor: BenQ GW2480 on HDMI-A-2 (single display)
Symptom
On the lock screen (stock omarchy.lock — also reproduced identically on a
cloned lock plugin), the display alternates between black and the lock UI on a
metronomic ~13.5s cycle, indefinitely. The monitor visibly loses signal each
cycle (its power state toggles). While the session sat auto-locked for ~5
hours, hyprland.log accumulated 2000+ Disabling output HDMI-A-2 events.
Never occurs while unlocked, regardless of idle time.
Root cause
plugins/lock/Service.qml blanks the display 5s after lock:
Timer {
id: idleBlankTimer
interval: 5000
...
if (root.lockRequested && !root.authenticatingPassword) root.runBlank()
}
Process {
id: blankProcess
command: ["bash", "-c", "omarchy-brightness-keyboard off; omarchy-brightness-display off"]
}On this amdgpu + HDMI combination, the DPMS-off fromomarchy-brightness-display off makes the kernel emit a **spurious connector
hotplug event that reads as disconnected**:
drm: Connector HDMI-A-2 disconnected <- connector probe during DPMS-off
drm: Disabling output HDMI-A-2
drm: Connector HDMI-A-2 enabledState changed true -> false(kernel log stays clean; /sys/class/drm/card1-HDMI-A-2/status readsconnected throughout — the disconnect is spurious)
Hyprland then re-enables the output when the connector re-reads connected, the
monitor wakes showing the lock UI, armBlankTimer() re-arms, and 5s later it
blanks again. 5s timer + ~8s of link renegotiation = the 13.5s loop:
blank (display off) -> spurious disconnect uevent -> output disabled
-> output re-enabled -> monitor wakes, lock UI visible -> blank re-arms -> repeatEach cycle also churns the shell: the transient output produces a placeholderQScreen(name=""), duplicate per-screen widgets (`Handler was registered but
will not be used for every bar panel), Not creating lock surface for screen
QScreen(...), and Got removal for monitor "FALLBACK"` warnings.
Ruled out with live A/B while locked (cycle survived all four):power_dpm_force_performance_level=high, debug:vfr false,snd_hda_intel power_save=0, stock vs. cloned lock plugin. Laptops (eDP) don't
reproduce — same code is fine on an XPS 15 and an Asahi MacBook.
Workaround
Clone the lock plugin and make runBlank() a no-op. Display stays lit while
locked; the alternation stops immediately (verified: 0 output disables since,
previously 1 per 13.5s without exception).
Suggested fix
Any of:
- a config knob to disable the lock's idle blank (e.g. idle.blank: false in
shell.json), or
- a wake-loop guard: if the display wakes with no input N times in a row after
runBlank(), stop re-arming the blank timer.
Happy to test patches — the repro is 100% reliable on this hardware.
Diagnostics
omarchy debug log available on request. Relevant excerpts above; thehyprland.log disable counter and journal timestamps document the exact
cadence.
View raw text
# Lock screen alternates black <-> lock UI every ~13.5s on AMD iGPU over HDMI (idle-blank + spurious disconnect uevent)
## System
- Omarchy 4.0.1-1, Hyprland 0.56.2, kernel 7.1.9-arch1-2
- Beelink EQR7 mini PC — AMD Ryzen 5 7535U (Radeon 660M iGPU), HDMI out
- Monitor: BenQ GW2480 on HDMI-A-2 (single display)
## Symptom
On the lock screen (stock `omarchy.lock` — also reproduced identically on a
cloned lock plugin), the display alternates between black and the lock UI on a
metronomic ~13.5s cycle, indefinitely. The monitor visibly loses signal each
cycle (its power state toggles). While the session sat auto-locked for ~5
hours, `hyprland.log` accumulated 2000+ `Disabling output HDMI-A-2` events.
Never occurs while unlocked, regardless of idle time.
## Root cause
`plugins/lock/Service.qml` blanks the display 5s after lock:
```qml
Timer {
id: idleBlankTimer
interval: 5000
...
if (root.lockRequested && !root.authenticatingPassword) root.runBlank()
}
Process {
id: blankProcess
command: ["bash", "-c", "omarchy-brightness-keyboard off; omarchy-brightness-display off"]
}
```
On this amdgpu + HDMI combination, the DPMS-off from
`omarchy-brightness-display off` makes the kernel emit a **spurious connector
hotplug event that reads as disconnected**:
```
drm: Connector HDMI-A-2 disconnected <- connector probe during DPMS-off
drm: Disabling output HDMI-A-2
drm: Connector HDMI-A-2 enabledState changed true -> false
```
(kernel log stays clean; `/sys/class/drm/card1-HDMI-A-2/status` reads
`connected` throughout — the disconnect is spurious)
Hyprland then re-enables the output when the connector re-reads connected, the
monitor wakes showing the lock UI, `armBlankTimer()` re-arms, and 5s later it
blanks again. 5s timer + ~8s of link renegotiation = the 13.5s loop:
```
blank (display off) -> spurious disconnect uevent -> output disabled
-> output re-enabled -> monitor wakes, lock UI visible -> blank re-arms -> repeat
```
Each cycle also churns the shell: the transient output produces a placeholder
`QScreen(name="")`, duplicate per-screen widgets (`Handler was registered but
will not be used` for every bar panel), `Not creating lock surface for screen
QScreen(...)`, and `Got removal for monitor "FALLBACK"` warnings.
Ruled out with live A/B while locked (cycle survived all four):
`power_dpm_force_performance_level=high`, `debug:vfr false`,
`snd_hda_intel power_save=0`, stock vs. cloned lock plugin. Laptops (eDP) don't
reproduce — same code is fine on an XPS 15 and an Asahi MacBook.
## Workaround
Clone the lock plugin and make `runBlank()` a no-op. Display stays lit while
locked; the alternation stops immediately (verified: 0 output disables since,
previously 1 per 13.5s without exception).
## Suggested fix
Any of:
- a config knob to disable the lock's idle blank (e.g. `idle.blank: false` in
`shell.json`), or
- a wake-loop guard: if the display wakes with no input N times in a row after
`runBlank()`, stop re-arming the blank timer.
Happy to test patches — the repro is 100% reliable on this hardware.
## Diagnostics
`omarchy debug` log available on request. Relevant excerpts above; the
`hyprland.log` disable counter and journal timestamps document the exact
cadence.
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/8896· confirmed
- Related PRpr/10343· confirmed
- Duplicate ofR-2112Lock screen wakes in a loop on monitors that drop HDMI hotplug in standby· decided by agents · verified
- Related PRpr/13129· 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.