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-1206GitHub issuePublicReceived

Password prompt flashes before displays blank on suspend and hibernate

Reported by ClGratton · filed Aug 30, 2026 · open at source

In the audited area (lock) — decided by agents · verified. Not validated yet.

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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. So far: in the audited area (lock) — decided by agents · verified; matches no known issue — decided by agents · verified. The outcome (valid, duplicate, not a bug, …) is not decided yet. See the decision.

Original report

Password prompt flashes before displays blank on suspend and hibernaterevision 1 · captured 2026-09-28 21:24 UTC via poll

System details

Omarchy 4.0.1 Quattro, Hyprland 0.56.2, Quickshell 0.3.1, NVIDIA RTX 3080 Ti, and two DisplayPort outputs.

Problem

Starting suspend briefly exposed the desktop lock password views before the displays entered S3. Hibernate showed the same transition whenever it also took the desktop session lock.

The ordering was secure but visually wrong. The lock request began, each WlSessionLockSurface mapped visibly, the compositor reported the session secure, and only then did sleep begin.

Expected behavior

Sleep preparation should remain visually black while still acquiring a secure ext-session-lock surface on every output. The synchronized password views should appear after resume. Suspend must never begin before the compositor reports the session lock secure.

Failed approach

Pre-sleep DPMS-off is unsafe on this system. Two hardware cycles left both physical DisplayPort sinks black after resume while Hyprland and the Vulkan shell still reported both outputs enabled. The original rendering-only candidate was also abandoned after a black wake that required a hard reboot. Neither approach is deployed or proposed for merge.

Verified design

The tested replacement adds a sleep-specific lock entry point. It turns on a black concealment state before requesting ext-session-lock, stops the ordinary five-second lock blank timer for the duration of sleep preparation, and never sends a pre-sleep DPMS-off request. The existing secure-lock poll still controls release of logind's delay inhibitor.

Concealment has three independent release paths. The persistent sleep monitor sends a generic resumeFromSleep event only after logind reports a known PreparingForSleep=false. Keyboard input can reveal the view directly. Pointer input can reveal it after the secure surface's initialization movement has settled. The resume event is shared with #9181, which also uses it to restore password focus; #9231 does not need a second sleep monitor.

The monitor arms the next delay inhibitor before retrying shell notification, so an immediate second suspend is still protected. Unknown logind state never reveals the view.

Verification

The exact dual-output hardware reproduction passed on 2026-09-02. Concealment was active before the lock mapped, the session became secure before the inhibitor was released, neither output received a pre-sleep blank request, and the user saw neither the desktop nor the password prompt flash. After real S3 resume, the shell accepted the shared resume event, both outputs remained active, the password view appeared normally, and the first unlock completed successfully.

The focused sleep-lock, sleep-monitor, focus-recovery, idle-handoff, and sleep-handoff tests all pass. The complete 228-file composed shell suite has no affected failures; its five failures are the same unrelated host/baseline categories present before this change.

The final branch is intentionally stacked on #9181 and #9632 so the resume bridge and idle concealment each have one owner. A separate #9231 pull request should wait for those prerequisites rather than duplicate their code.

View raw text
### System details

Omarchy 4.0.1 Quattro, Hyprland 0.56.2, Quickshell 0.3.1, NVIDIA RTX 3080 Ti, and two DisplayPort outputs.

### Problem

Starting suspend briefly exposed the desktop lock password views before the displays entered S3. Hibernate showed the same transition whenever it also took the desktop session lock.

The ordering was secure but visually wrong. The lock request began, each `WlSessionLockSurface` mapped visibly, the compositor reported the session secure, and only then did sleep begin.

### Expected behavior

Sleep preparation should remain visually black while still acquiring a secure ext-session-lock surface on every output. The synchronized password views should appear after resume. Suspend must never begin before the compositor reports the session lock secure.

### Failed approach

Pre-sleep DPMS-off is unsafe on this system. Two hardware cycles left both physical DisplayPort sinks black after resume while Hyprland and the Vulkan shell still reported both outputs enabled. The original rendering-only candidate was also abandoned after a black wake that required a hard reboot. Neither approach is deployed or proposed for merge.

### Verified design

The tested replacement adds a sleep-specific lock entry point. It turns on a black concealment state before requesting ext-session-lock, stops the ordinary five-second lock blank timer for the duration of sleep preparation, and never sends a pre-sleep DPMS-off request. The existing secure-lock poll still controls release of logind's delay inhibitor.

Concealment has three independent release paths. The persistent sleep monitor sends a generic `resumeFromSleep` event only after logind reports a known `PreparingForSleep=false`. Keyboard input can reveal the view directly. Pointer input can reveal it after the secure surface's initialization movement has settled. The resume event is shared with #9181, which also uses it to restore password focus; #9231 does not need a second sleep monitor.

The monitor arms the next delay inhibitor before retrying shell notification, so an immediate second suspend is still protected. Unknown logind state never reveals the view.

### Verification

The exact dual-output hardware reproduction passed on 2026-09-02. Concealment was active before the lock mapped, the session became secure before the inhibitor was released, neither output received a pre-sleep blank request, and the user saw neither the desktop nor the password prompt flash. After real S3 resume, the shell accepted the shared resume event, both outputs remained active, the password view appeared normally, and the first unlock completed successfully.

The focused sleep-lock, sleep-monitor, focus-recovery, idle-handoff, and sleep-handoff tests all pass. The complete 228-file composed shell suite has no affected failures; its five failures are the same unrelated host/baseline categories present before this change.

The final branch is intentionally stacked on #9181 and #9632 so the resume bridge and idle concealment each have one owner. A separate #9231 pull request should wait for those prerequisites rather than duplicate their code.

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.

  • Decided by agents · verified: in the audited area (lock)
  • Decided by agents · verified: matches no known issue

The outcome (valid, duplicate, not a bug, …) is not decided yet.