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

Cold-boot lock (autologin) silently drops submitted input: no PAM conversation, no failure feedback

Reported by archledger · filed Aug 28, 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; not a duplicate of another report — 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

Cold-boot lock (autologin) silently drops submitted input: no PAM conversation, no failure feedbackrevision 1 · captured 2026-09-28 21:24 UTC via poll

Environment

  • Omarchy 4.0.1-1, fresh install, default autologin (/etc/sddm.conf.d/autologin.conf), Hyprland session on a laptop
  • Reproduced twice, deterministically, on separate cold boots

What happens

On a cold boot with autologin, the session starts and the lock engages at startup. The lock's password field accepts typing, but submitting input (any text, including a real password or the string yes) is silently dropped: no PAM conversation starts, there is no failure flash, and the field just resets. Waiting 10+ seconds after the lock appears before submitting does not help.

Once the session is up, locking manually works perfectly: the same dialog, the same omarchy-lock-password PAM service, authentication succeeds normally.

Evidence

  1. No PAM conversation runs at the cold lock. I have face authentication wired into omarchy-lock-password (a pam_irlume.so line, plus the same in sudo/polkit-1). At the cold-boot lock, yes + Enter never reaches PAM: the auth daemon's journal (which logs every attempt on every other surface) shows zero requests during the cold-lock window. Fingerprint also does not engage there. So input is dropped before passwordPam.start() could matter, or the start itself never happens.
  2. The lock plugin logs nothing at cold start. Service.qml logs omarchy lock <ts> <event> on lock-requested etc. via console.log. The shell's journal for the whole boot contains zero omarchy lock events, even though the lock surface was visibly up and accepting keystrokes. That suggests the cold-start surface never went through beginLock() (stranded-lock recovery path), and lockRequested is therefore false while the UI is visible.
  3. The silent-drop path exists in the code: submitPassword() opens with if (!lockRequested || authenticatingPassword || password.length === 0) return and LockView binds inputEnabled: root.lockRequested. A visible, typeable lock that drops submissions with no feedback is the observed behavior of exactly that guard.

Why it matters

A visible lock screen that ignores submitted authentication, with no error feedback, is security-relevant on its own (users cannot tell dropped input from a wrong password) and it breaks every PAM-integrated unlock helper (biometric agents like irlume or pam_fprintd lanes) precisely at the moment the machine is most likely to be locked: right after boot.

Reproduction

  1. Install with autologin (the default)
  2. Reboot
  3. At the startup lock, type anything and press Enter
  4. Observe: no failure message, no PAM activity (verifiable with any PAM-logging module wired into omarchy-lock-password), field resets

Contrast: lock manually from the running session; the same input path works.

Happy to provide the daemon-side journal excerpts or test a patch if useful.

View raw text
## Environment

- Omarchy 4.0.1-1, fresh install, default autologin (`/etc/sddm.conf.d/autologin.conf`), Hyprland session on a laptop
- Reproduced twice, deterministically, on separate cold boots

## What happens

On a cold boot with autologin, the session starts and the lock engages at startup. The lock's password field accepts typing, but submitting input (any text, including a real password or the string `yes`) is **silently dropped**: no PAM conversation starts, there is no failure flash, and the field just resets. Waiting 10+ seconds after the lock appears before submitting does not help.

Once the session is up, locking manually works perfectly: the same dialog, the same `omarchy-lock-password` PAM service, authentication succeeds normally.

## Evidence

1. **No PAM conversation runs at the cold lock.** I have face authentication wired into `omarchy-lock-password` (a `pam_irlume.so` line, plus the same in sudo/polkit-1). At the cold-boot lock, `yes` + Enter never reaches PAM: the auth daemon's journal (which logs every attempt on every other surface) shows zero requests during the cold-lock window. Fingerprint also does not engage there. So input is dropped before `passwordPam.start()` could matter, or the start itself never happens.
2. **The lock plugin logs nothing at cold start.** `Service.qml` logs `omarchy lock <ts> <event>` on `lock-requested` etc. via `console.log`. The shell's journal for the whole boot contains zero `omarchy lock` events, even though the lock surface was visibly up and accepting keystrokes. That suggests the cold-start surface never went through `beginLock()` (stranded-lock recovery path), and `lockRequested` is therefore false while the UI is visible.
3. **The silent-drop path exists in the code**: `submitPassword()` opens with `if (!lockRequested || authenticatingPassword || password.length === 0) return` and `LockView` binds `inputEnabled: root.lockRequested`. A visible, typeable lock that drops submissions with no feedback is the observed behavior of exactly that guard.

## Why it matters

A visible lock screen that ignores submitted authentication, with no error feedback, is security-relevant on its own (users cannot tell dropped input from a wrong password) and it breaks every PAM-integrated unlock helper (biometric agents like irlume or pam_fprintd lanes) precisely at the moment the machine is most likely to be locked: right after boot.

## Reproduction

1. Install with autologin (the default)
2. Reboot
3. At the startup lock, type anything and press Enter
4. Observe: no failure message, no PAM activity (verifiable with any PAM-logging module wired into `omarchy-lock-password`), field resets

Contrast: lock manually from the running session; the same input path works.

Happy to provide the daemon-side journal excerpts or test a patch if useful.

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: not a duplicate of another report
  • Decided by agents · verified: matches no known issue

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