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

Locked session re-arms a hardcoded 5s display-blank timer, so slow displays can never finish waking

Reported by hayarza · filed Aug 29, 2026Closed upstream on 2026-10-09 by the bot omarchybot, as a duplicate (target not recorded).

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

R-1584 is the earliest report of this defect — filed Aug 22, 2026, open upstream. This report (filed Aug 29, 2026) describes the same defect, so it is folded under it in the inbox.

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

Locked session re-arms a hardcoded 5s display-blank timer, so slow displays can never finish wakingrevision 1 · captured 2026-09-28 21:24 UTC via poll

What happened

While the session is locked, waking the display re-arms a hardcoded 5-second
timer that blanks it again. On a display that takes longer than 5 seconds to
re-sync after DPMS off, the wake can never complete: the monitor is blanked
again before it has finished showing the lock screen. Moving the mouse
restarts the same race indefinitely.

From shell/plugins/lock/Service.qml:

Timer {
  id: idleBlankTimer
  interval: 5000
  ...
  onTriggered: {
    ...
    if (root.lockRequested && !root.authenticatingPassword) root.runBlank()
  }
}

function armBlankTimer() {
  idleBlankTimer.armedAt = Date.now()
  idleBlankTimer.restart()
}

function runWake() {
  if (!wakeProcess.running) wakeProcess.running = true
  if (lockRequested) armBlankTimer()   // every wake restarts the 5s countdown
}

function runBlank() {
  if (!blankProcess.running) blankProcess.running = true
}

blankProcess runs omarchy-brightness-keyboard off; omarchy-brightness-display off,
and omarchy-brightness-display off issues hyprctl dispatch dpms disable.
DPMS off drops the link entirely, so the monitor enters its own standby and
must renegotiate on wake — commonly several seconds over DisplayPort, longer
than the 5s budget.

The only escape is authenticatingPassword, which suppresses blanking once
the user has started typing. In practice that means the workaround is to type
the password blind, into a lock screen you cannot see.

Expected

Waking a locked session should give the display enough time to actually
become visible. Any of:

  1. Don't re-arm the blank timer inside runWake() — let it blank once on

lock and stay awake after a deliberate wake until idle re-triggers.
2. Make the interval configurable (e.g. lock.blank-delay in shell.json)
so slow displays can raise it.
3. Raise the hardcoded default well above typical DP re-sync time.

Steps to reproduce

Requires a display that takes more than ~5s to wake from DPMS off; a
DisplayPort-connected desktop monitor is the usual case.

  1. Lock the session (omarchy system lock, or wait for idle.lock).
  2. After ~5s the display blanks and the monitor enters standby.
  3. Move the mouse. The compositor re-enables DPMS

(misc:mouse_move_enables_dpms is true), and the monitor begins
re-syncing.
4. Before the monitor finishes and shows an image, the 5s timer fires and
blanks it again.
5. Repeat indefinitely. The lock screen is never visible.
6. Type the password blind — it succeeds, confirming the session was
responsive the whole time and only the display was unreachable.

System

  • Omarchy 4.0.1-1 (upgraded from 3.x via omarchy-upgrade-to-quattro)
  • Kernel 7.1.9-arch1-2
  • AMD Ryzen 5 5600X, NVIDIA RTX 2060 (TU106), nvidia-open-dkms
  • MSI MP271 on DP-1, 1920x1080@144, scale 1
  • misc:mouse_move_enables_dpms and misc:key_press_enables_dpms both true
View raw text
### What happened

While the session is locked, waking the display re-arms a hardcoded 5-second
timer that blanks it again. On a display that takes longer than 5 seconds to
re-sync after DPMS off, the wake can never complete: the monitor is blanked
again before it has finished showing the lock screen. Moving the mouse
restarts the same race indefinitely.

From `shell/plugins/lock/Service.qml`:

```qml
Timer {
  id: idleBlankTimer
  interval: 5000
  ...
  onTriggered: {
    ...
    if (root.lockRequested && !root.authenticatingPassword) root.runBlank()
  }
}

function armBlankTimer() {
  idleBlankTimer.armedAt = Date.now()
  idleBlankTimer.restart()
}

function runWake() {
  if (!wakeProcess.running) wakeProcess.running = true
  if (lockRequested) armBlankTimer()   // every wake restarts the 5s countdown
}

function runBlank() {
  if (!blankProcess.running) blankProcess.running = true
}
```

`blankProcess` runs `omarchy-brightness-keyboard off; omarchy-brightness-display off`,
and `omarchy-brightness-display off` issues `hyprctl dispatch dpms disable`.
DPMS off drops the link entirely, so the monitor enters its own standby and
must renegotiate on wake — commonly several seconds over DisplayPort, longer
than the 5s budget.

The only escape is `authenticatingPassword`, which suppresses blanking once
the user has started typing. In practice that means the workaround is to type
the password blind, into a lock screen you cannot see.

### Expected

Waking a locked session should give the display enough time to actually
become visible. Any of:

1. Don't re-arm the blank timer inside `runWake()` — let it blank once on
   lock and stay awake after a deliberate wake until idle re-triggers.
2. Make the interval configurable (e.g. `lock.blank-delay` in shell.json)
   so slow displays can raise it.
3. Raise the hardcoded default well above typical DP re-sync time.

### Steps to reproduce

Requires a display that takes more than ~5s to wake from DPMS off; a
DisplayPort-connected desktop monitor is the usual case.

1. Lock the session (`omarchy system lock`, or wait for `idle.lock`).
2. After ~5s the display blanks and the monitor enters standby.
3. Move the mouse. The compositor re-enables DPMS
   (`misc:mouse_move_enables_dpms` is true), and the monitor begins
   re-syncing.
4. Before the monitor finishes and shows an image, the 5s timer fires and
   blanks it again.
5. Repeat indefinitely. The lock screen is never visible.
6. Type the password blind — it succeeds, confirming the session was
   responsive the whole time and only the display was unreachable.

### System

- Omarchy 4.0.1-1 (upgraded from 3.x via omarchy-upgrade-to-quattro)
- Kernel 7.1.9-arch1-2
- AMD Ryzen 5 5600X, NVIDIA RTX 2060 (TU106), nvidia-open-dkms
- MSI MP271 on DP-1, 1920x1080@144, scale 1
- `misc:mouse_move_enables_dpms` and `misc:key_press_enables_dpms` both true

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