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-1329GitHub issuePublicDecided· Duplicate

Lock screen alternates black <-> lock UI every ~13.5s on AMD iGPU over HDMI

Reported by williavs · filed Aug 28, 2026 · open at source

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

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?
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

Lock screen alternates black <-> lock UI every ~13.5s on AMD iGPU over HDMIrevision 1 · captured 2026-09-28 21:24 UTC via poll

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 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.

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

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-2112Decided by agents · verified · 2026-10-09 03:10 UTC