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 fingerprint stack lacks the clamshell gate that omarchy-setup-security-fingerprint writes for sudo/polkit — endless verify-timeout storm on lid-closed machines
Reported by dsundt · filed Oct 4, 2026 · open at source
R-989 is the earliest report of this defect — filed Sep 4, 2026, open upstream. This report (filed Oct 4, 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?
- 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
What happened
On a clamshell machine (lid closed, external monitor — the reader in the deck is unreachable), locking the screen starts an endless fingerprint retry loop. Journal shows a new PAM session every ~30 s, indefinitely (observed for 15–30+ minutes at a time):
quickshell.service.pam.subprocess: Starting pam session for user "dsundt" with config "omarchy-lock-fingerprint"
quickshell.service.pam.subprocess: Relaying pam message: "Place your right index finger on the fingerprint reader"
quickshell.service.pam.subprocess: Relaying pam message: "Verification timed out"
quickshell.service.pam.subprocess: Error while authenticating: "Authentication service cannot retrieve authentication info" (code 9)Each cycle: the lock plugin starts fingerprint PAM (shell/plugins/lock/Service.qml — fingerprintRetryTimer is 250 ms, repeat: false, re-armed on every failed verify), fprintd's verify times out after ~30 s, and the loop repeats forever. While this runs, the session is locked with no working unlock path except waiting out / typing the password, and the overlapping-retry churn is the trigger chain for the crash reports in #7645 / #13410 (quickshell-mirror/quickshell#969).
Root cause
omarchy-setup-security-fingerprint writes a clamshell gate into the sudo and polkit stacks — auth [success=1 default=ignore] pam_exec.so quiet /usr/bin/omarchy-hw-laptop-closed — so the unreachable reader is skipped and PAM falls through to password. The lock stack it writes has no such gate:
# /etc/pam.d/omarchy-lock-fingerprint
auth required pam_fprintd.so
account include system-local-loginThe gate exists in the setup tool and demonstrably works (sudo/polkit behave correctly on this machine), it is just missing from the lock stack. The lock plugin additionally has no retry cap, so the failure retries forever.
Expected behavior
On a lid-closed machine, the lock should fall back to the password prompt (as sudo/polkit already do) instead of blocking on the unreachable reader every 30 s forever. A retry cap with password-only fallback would also be reasonable defense in depth.
Suggested fix
Add the clamshell gate to /etc/pam.d/omarchy-lock-fingerprint — but with fail-fast semantics ([success=die default=ignore]), because with only pam_fprintd behind it, the skip-to-success form used in sudo/polkit would unlock without any authentication when the lid is closed. And/or cap fingerprintRetryTimer re-arms in Service.qml so the lock stops offering fingerprint after N failures.
Workaround applied locally
Renamed /etc/pam.d/omarchy-lock-fingerprint to .disabled-clamshell — the lock plugin's own presence check then reports fingerprint as unconfigured and the lock is password-only. Sudo/polkit fingerprint kept (their gates work). Documented at dsundt/Dano-Omarchy docs/HANDOFF.md §30.
System details
- Omarchy
4.0.0.r6713.ga85e29a-1, quickshell0.3.1-1, Hyprland0.56.2 - Lenovo ThinkPad P16s Gen 4 AMD — Synaptics press sensor (in-deck), lid closed, external Samsung G91SD
- Related: #7645 (crash from overlapping retries), #13410 (orphan relaunch), #7172 (claim livelock), #13748 (no-backoff retries)
View raw text
## What happened On a clamshell machine (lid closed, external monitor — the reader in the deck is unreachable), locking the screen starts an endless fingerprint retry loop. Journal shows a new PAM session every ~30 s, indefinitely (observed for 15–30+ minutes at a time): ``` quickshell.service.pam.subprocess: Starting pam session for user "dsundt" with config "omarchy-lock-fingerprint" quickshell.service.pam.subprocess: Relaying pam message: "Place your right index finger on the fingerprint reader" quickshell.service.pam.subprocess: Relaying pam message: "Verification timed out" quickshell.service.pam.subprocess: Error while authenticating: "Authentication service cannot retrieve authentication info" (code 9) ``` Each cycle: the lock plugin starts fingerprint PAM (`shell/plugins/lock/Service.qml` — `fingerprintRetryTimer` is 250 ms, `repeat: false`, re-armed on every failed verify), fprintd's verify times out after ~30 s, and the loop repeats forever. While this runs, the session is locked with no working unlock path except waiting out / typing the password, and the overlapping-retry churn is the trigger chain for the crash reports in #7645 / #13410 (quickshell-mirror/quickshell#969). ## Root cause `omarchy-setup-security-fingerprint` writes a clamshell gate into the **sudo** and **polkit** stacks — `auth [success=1 default=ignore] pam_exec.so quiet /usr/bin/omarchy-hw-laptop-closed` — so the unreachable reader is skipped and PAM falls through to password. The **lock** stack it writes has no such gate: ``` # /etc/pam.d/omarchy-lock-fingerprint auth required pam_fprintd.so account include system-local-login ``` The gate exists in the setup tool and demonstrably works (sudo/polkit behave correctly on this machine), it is just missing from the lock stack. The lock plugin additionally has no retry cap, so the failure retries forever. ## Expected behavior On a lid-closed machine, the lock should fall back to the password prompt (as sudo/polkit already do) instead of blocking on the unreachable reader every 30 s forever. A retry cap with password-only fallback would also be reasonable defense in depth. ## Suggested fix Add the clamshell gate to `/etc/pam.d/omarchy-lock-fingerprint` — but with fail-fast semantics (`[success=die default=ignore]`), because with only `pam_fprintd` behind it, the skip-to-success form used in sudo/polkit would unlock without any authentication when the lid is closed. And/or cap `fingerprintRetryTimer` re-arms in `Service.qml` so the lock stops offering fingerprint after N failures. ## Workaround applied locally Renamed `/etc/pam.d/omarchy-lock-fingerprint` to `.disabled-clamshell` — the lock plugin's own presence check then reports fingerprint as unconfigured and the lock is password-only. Sudo/polkit fingerprint kept (their gates work). Documented at dsundt/Dano-Omarchy docs/HANDOFF.md §30. ## System details - Omarchy `4.0.0.r6713.ga85e29a-1`, quickshell `0.3.1-1`, Hyprland `0.56.2` - Lenovo ThinkPad P16s Gen 4 AMD — Synaptics press sensor (in-deck), lid closed, external Samsung G91SD - Related: #7645 (crash from overlapping retries), #13410 (orphan relaunch), #7172 (claim livelock), #13748 (no-backoff retries)
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
- Fixed bypr/14280· confirmed
- Duplicate ofR-989omarchy-setup-security-fingerprint doesn't add the clamshell gate to the lock screen's fingerprint PAM config· decided by agents · verified
- Related toR-1025Lock screen re-arms fingerprint PAM indefinitely — 6,451 cycles / 6,454 USB resets over 53h· decided by agents · verified
- Fixed bypr/10393· 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.