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 retries fingerprint auth every 250ms with no backoff when the reader is unavailable
Reported by titteerbot · filed Sep 30, 2026Closed upstream on 2026-10-01 by its own reporter titteerbot, as a duplicate of #13748 (R-2099). GitHub close reason: not_planned.
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?
- Not yet mapped to any requirement or component.
- 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. No decision has been recorded yet.
Original report
Summary
When pam_fprintd cannot reach the fingerprint reader, the lock screen retries fingerprint
authentication every 250 ms indefinitely — no backoff, no attempt cap — forking a PAM subprocess
each time. On a machine whose reader becomes unavailable across suspend, this makes the first
unlock after a break visibly laggy, and it can spin for minutes.
The device fault itself is upstream (details below). This report is about Omarchy converting a
recoverable, detectable fault into a sustained busy-loop instead of falling through to the password
prompt.
Where
shell/plugins/lock/Service.qml
Timer {
id: fingerprintRetryTimer
interval: 250
repeat: false
onTriggered: root.startFingerprint()
}Both the completion path and the error path restart it unconditionally:
function handleFingerprintFinished(result) {
fingerprintAuthenticating = false
if (!lockRequested) return
if (result === PamResult.Success) {
finishUnlock()
} else if (fingerprintConfigured) {
fingerprintRetryTimer.restart()
}
}PamContext {
id: fingerprintPam
config: "omarchy-lock-fingerprint"
...
onError: function(error) {
root.fingerprintAuthenticating = false
if (root.lockRequested && root.fingerprintConfigured) fingerprintRetryTimer.restart()
}
}Nothing distinguishes "the user presented the wrong finger" from "the reader is unavailable"
(PAM_AUTHINFO_UNAVAIL). The only attempt counter in the file, failedAttempts, is on the
password path and is not consulted here.
Additionally /etc/pam.d/omarchy-lock-fingerprint is:
auth required pam_fprintd.so
account include system-local-loginso there is no graceful fallthrough at the PAM layer either.
Root cause chain
- A Synaptics Prometheus reader (
06cb:00fc) re-enumerates over USB on every resume — device
number 20 → 24 → 25 → 26 across two days on this machine.
2. fprintd creates a new D-Bus device object per re-enumeration and never reaps the dead ones.
After four days uptime, fprintd-list reported 4 devices for a single physical sensor
(Device/0, /3, /4, /10) and selected a stale one.
3. pam_fprintd tries to Claim the dead object and gets
Authorization denied ... Device was already claimed, returning PAM code 9
(PAM_AUTHINFO_UNAVAIL, "Authentication service cannot retrieve authentication info").
4. Omarchy sees a non-success result and re-arms the 250 ms timer. Forever.
Steps 1–2 are not Omarchy's — 2 looks like an fprintd leak. Step 4 is.
Evidence
Counts from a single boot on this machine:
- 36,782 ×
fprintd[...]: Authorization denied ... to call method 'Claim' ... Device was already claimed - matching
quickshell.service.pam.subprocess: Error while authenticating: "Authentication service cannot retrieve authentication info" (code 9)
Worst sustained episode: 219 denials/minute for five consecutive minutes, which is 3.65/s
against the timer's 4.00/s. The loop ran at its designed rate until a password was typed. A milder
episode during a normal unlock produced 25 denials and 26 PAM subprocess spawns.
Representative excerpt (username redacted):
fprintd[218632]: Authorization denied to :1.38010 to call method 'Claim' for device 'Synaptics Sensors': Device was already claimed
omarchy-shell[1852287]: quickshell.service.pam.subprocess: Error while authenticating: "Authentication service cannot retrieve authentication info" (code 9)
omarchy-shell[1852394]: quickshell.service.pam.subprocess: Starting pam session for user "<user>" with config "omarchy-lock-fingerprint" in dir "/etc/pam.d"
fprintd[218632]: Authorization denied to :1.38013 to call method 'Claim' for device 'Synaptics Sensors': Device was already claimed
omarchy-shell[1852394]: quickshell.service.pam.subprocess: Error while authenticating: "Authentication service cannot retrieve authentication info" (code 9)
...For contrast, suspend/resume itself is not slow here — `Freezing user space processes completed
(elapsed 0.001 seconds)`. The perceived lag is the retry storm.
Expected behaviour
On a PAM error or PAM_AUTHINFO_UNAVAIL, stop retrying and fall through to the password prompt,
or back off exponentially with a cap. A failed swipe can reasonably re-arm; an unavailable
device should not be retried four times a second indefinitely.
Steps to reproduce
- Laptop with a fingerprint reader that re-enumerates on resume (Synaptics Prometheus
06cb:00fc
here; likely any reader that drops off the USB bus during suspend).
2. Enroll a fingerprint so fingerprintConfigured is true.
3. Suspend/resume several times without restarting fprintd.
4. fprintd-list $USER now reports multiple devices for the one sensor.
5. Lock the session. The lock screen spins at 4 PAM spawns/second until a password is entered;
journalctl -f shows the paired "already claimed" / code 9 lines.
Workaround
Restarting fprintd clears the stale objects (4 → 1 here). To stop it recurring,/etc/systemd/system-sleep/fprintd-reset:
#!/bin/bash
case "$1" in
post) systemctl try-restart fprintd.service ;;
esacConfirmed working on this machine. This only papers over the upstream leak; the retry loop is
still worth bounding, since any cause of an unavailable reader will trigger it.
System
| Omarchy | 4.0.4-1 |
| Kernel | 7.2.5-3-omarchy |
| CPU | 13th Gen Intel Core i7-1365U |
| GPU | Intel Raptor Lake-P \[Iris Xe Graphics\] (rev 04) |
| Hyprland | 0.56.2-2 |
| quickshell | 0.3.1-1 |
| fprintd | 1.94.5-2 |
| libfprint | libfprint-git 1:1.94.100.r10.g6f9479c-1 |
| Reader | 06cb:00fc Synaptics Prometheus |
Note libfprint-git rather than stable libfprint, in case the device-object leak is specific to
that build.
View raw text
## Summary
When `pam_fprintd` cannot reach the fingerprint reader, the lock screen retries fingerprint
authentication every 250 ms indefinitely — no backoff, no attempt cap — forking a PAM subprocess
each time. On a machine whose reader becomes unavailable across suspend, this makes the first
unlock after a break visibly laggy, and it can spin for minutes.
The device fault itself is upstream (details below). This report is about Omarchy converting a
recoverable, detectable fault into a sustained busy-loop instead of falling through to the password
prompt.
## Where
`shell/plugins/lock/Service.qml`
```qml
Timer {
id: fingerprintRetryTimer
interval: 250
repeat: false
onTriggered: root.startFingerprint()
}
```
Both the completion path and the error path restart it unconditionally:
```qml
function handleFingerprintFinished(result) {
fingerprintAuthenticating = false
if (!lockRequested) return
if (result === PamResult.Success) {
finishUnlock()
} else if (fingerprintConfigured) {
fingerprintRetryTimer.restart()
}
}
```
```qml
PamContext {
id: fingerprintPam
config: "omarchy-lock-fingerprint"
...
onError: function(error) {
root.fingerprintAuthenticating = false
if (root.lockRequested && root.fingerprintConfigured) fingerprintRetryTimer.restart()
}
}
```
Nothing distinguishes "the user presented the wrong finger" from "the reader is unavailable"
(`PAM_AUTHINFO_UNAVAIL`). The only attempt counter in the file, `failedAttempts`, is on the
password path and is not consulted here.
Additionally `/etc/pam.d/omarchy-lock-fingerprint` is:
```
auth required pam_fprintd.so
account include system-local-login
```
so there is no graceful fallthrough at the PAM layer either.
## Root cause chain
1. A Synaptics Prometheus reader (`06cb:00fc`) re-enumerates over USB on every resume — device
number 20 → 24 → 25 → 26 across two days on this machine.
2. `fprintd` creates a new D-Bus device object per re-enumeration and never reaps the dead ones.
After four days uptime, `fprintd-list` reported **4 devices for a single physical sensor**
(`Device/0`, `/3`, `/4`, `/10`) and selected a stale one.
3. `pam_fprintd` tries to `Claim` the dead object and gets
`Authorization denied ... Device was already claimed`, returning PAM code 9
(`PAM_AUTHINFO_UNAVAIL`, "Authentication service cannot retrieve authentication info").
4. Omarchy sees a non-success result and re-arms the 250 ms timer. Forever.
Steps 1–2 are not Omarchy's — 2 looks like an `fprintd` leak. Step 4 is.
## Evidence
Counts from a single boot on this machine:
- **36,782** × `fprintd[...]: Authorization denied ... to call method 'Claim' ... Device was already claimed`
- matching `quickshell.service.pam.subprocess: Error while authenticating: "Authentication service cannot retrieve authentication info" (code 9)`
Worst sustained episode: **219 denials/minute for five consecutive minutes**, which is 3.65/s
against the timer's 4.00/s. The loop ran at its designed rate until a password was typed. A milder
episode during a normal unlock produced 25 denials and 26 PAM subprocess spawns.
Representative excerpt (username redacted):
```
fprintd[218632]: Authorization denied to :1.38010 to call method 'Claim' for device 'Synaptics Sensors': Device was already claimed
omarchy-shell[1852287]: quickshell.service.pam.subprocess: Error while authenticating: "Authentication service cannot retrieve authentication info" (code 9)
omarchy-shell[1852394]: quickshell.service.pam.subprocess: Starting pam session for user "<user>" with config "omarchy-lock-fingerprint" in dir "/etc/pam.d"
fprintd[218632]: Authorization denied to :1.38013 to call method 'Claim' for device 'Synaptics Sensors': Device was already claimed
omarchy-shell[1852394]: quickshell.service.pam.subprocess: Error while authenticating: "Authentication service cannot retrieve authentication info" (code 9)
...
```
For contrast, suspend/resume itself is not slow here — `Freezing user space processes completed
(elapsed 0.001 seconds)`. The perceived lag is the retry storm.
## Expected behaviour
On a PAM error or `PAM_AUTHINFO_UNAVAIL`, stop retrying and fall through to the password prompt,
or back off exponentially with a cap. A failed *swipe* can reasonably re-arm; an unavailable
*device* should not be retried four times a second indefinitely.
## Steps to reproduce
1. Laptop with a fingerprint reader that re-enumerates on resume (Synaptics Prometheus `06cb:00fc`
here; likely any reader that drops off the USB bus during suspend).
2. Enroll a fingerprint so `fingerprintConfigured` is true.
3. Suspend/resume several times without restarting `fprintd`.
4. `fprintd-list $USER` now reports multiple devices for the one sensor.
5. Lock the session. The lock screen spins at 4 PAM spawns/second until a password is entered;
`journalctl -f` shows the paired "already claimed" / code 9 lines.
## Workaround
Restarting `fprintd` clears the stale objects (4 → 1 here). To stop it recurring,
`/etc/systemd/system-sleep/fprintd-reset`:
```bash
#!/bin/bash
case "$1" in
post) systemctl try-restart fprintd.service ;;
esac
```
Confirmed working on this machine. This only papers over the upstream leak; the retry loop is
still worth bounding, since any cause of an unavailable reader will trigger it.
## System
| | |
|---|---|
| Omarchy | 4.0.4-1 |
| Kernel | 7.2.5-3-omarchy |
| CPU | 13th Gen Intel Core i7-1365U |
| GPU | Intel Raptor Lake-P \[Iris Xe Graphics\] (rev 04) |
| Hyprland | 0.56.2-2 |
| quickshell | 0.3.1-1 |
| fprintd | 1.94.5-2 |
| libfprint | libfprint-git 1:1.94.100.r10.g6f9479c-1 |
| Reader | `06cb:00fc` Synaptics Prometheus |
Note `libfprint-git` rather than stable `libfprint`, in case the device-object leak is specific to
that build.
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/12461· confirmed
- Fixed bypr/11273· confirmed
- Fixed bypr/10653· 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.
No decision has been recorded yet.