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 never clears the password buffer across suspend/resume
Reported by brightwalker25 · filed Aug 22, 2026Closed upstream on 2026-08-27 by its own reporter brightwalker25. GitHub close reason: completed. Closed by its own reporter — not by itself evidence of a fix.
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
What happened
Resuming from suspend with the session already locked sometimes brings up the
Omarchy lock screen with its password field already populated — a short run of
characters I did not type. Authentication then fails on the first attempt,
because the real password is appended to whatever is already in the buffer.
What I expected
The password field to be empty on every wake, as it is on a fresh lock.
Steps to reproduce
- Lock the session (
omarchy system lock, or let it idle-lock). - Suspend, and leave the machine suspended for a while.
- Resume and look at the password field before typing.
It is intermittent, not every wake.
The Omarchy part
resetAuthenticationState() in shell/plugins/lock/Service.qml:116 clearsenteredPassword. It is called from exactly three places:
beginLock()(:134)finishUnlock()(:155)- the unlock branch of
onLockStateChanged(:259)
All three are lock/unlock transitions. Nothing resets the buffer across a
suspend/resume boundary, so a lock screen that was already up before suspend
keeps whatever the input layer delivered while it was down.
The plugin has no PrepareForSleep handler, but it is not unaware of resume
elsewhere — idleBlankTimer (:418) explicitly compensates for a countdown
frozen by suspend by checking wall-clock drift:
// A countdown frozen by suspend fires right after resume, which would
// blank the freshly woken unlock screen under the user. Wall-clock time
// exposes the gap: take a fresh run-up instead of blanking.
if (Date.now() - armedAt > interval + 2000) {The same resume boundary that gets special handling for blanking gets none for
authentication state.
There is a mild credential angle too: if a partly-typed real password is in the
field when the machine suspends, it survives the suspend and is still there on
wake, rather than being discarded.
What I have not established
- The source of the characters is unconfirmed. My guess is the built-in
i8042 keyboard (AT Translated Set 2 keyboard) flushing latched scancodes
when S3 re-powers the controller. A Logi Bolt receiver (046D:C548) that also
exposes a keyboard interface is not ruled out. I have not captured
libinput debug-events across a resume to name the device.
- Whether a reset on resume is sufficient. If the characters are delivered
shortly after resume rather than buffered from before it, a reset fired on
the resume signal could race them and clear too early. Ordering would need
checking before settling on a fix.
So the report I am confident in is the narrow one: the auth buffer is never
cleared at the suspend/resume boundary. Whether that fully explains the symptom
is a separate question.
Relevant local context
This machine is pinned to S3 (MemorySleepMode=deep) as a workaround for
#7788. S3 powers down USB and the i8042 controller where s2idle did not, and
the phantom characters appeared after that change — so anyone trying to
reproduce this on s2idle may not see it.
Workaround
Esc or Ctrl+U clears the field (LockView.qml:177 Keys.onPressed).
System details
- Omarchy 4.0.0-1, Hyprland 0.56.2-1, quickshell-git 0.3.0.r20.g28771c7-2
- Kernel 7.1.8-arch1-3
- ASUS Zenbook UX8402ZE (Zenbook Pro 14 Duo)
- Intel Core i9-12900H (Alder Lake), Iris Xe i915 + NVIDIA RTX 3050 Ti Mobile
/sys/power/mem_sleep=s2idle [deep]pacman -Qkk omarchy: 1628 total files, 0 altered files- No lock plugin override in
~/.config/omarchy/
Related: #7788 (the S3 workaround this appeared downstream of), #6925 (a
different failure in the same auth-state area, closed not-planned).
Filed by Claude Opus 5 via Claude Code.
View raw text
## What happened
Resuming from suspend with the session already locked sometimes brings up the
Omarchy lock screen with its password field already populated — a short run of
characters I did not type. Authentication then fails on the first attempt,
because the real password is appended to whatever is already in the buffer.
## What I expected
The password field to be empty on every wake, as it is on a fresh lock.
## Steps to reproduce
1. Lock the session (`omarchy system lock`, or let it idle-lock).
2. Suspend, and leave the machine suspended for a while.
3. Resume and look at the password field before typing.
It is intermittent, not every wake.
## The Omarchy part
`resetAuthenticationState()` in `shell/plugins/lock/Service.qml:116` clears
`enteredPassword`. It is called from exactly three places:
- `beginLock()` (:134)
- `finishUnlock()` (:155)
- the unlock branch of `onLockStateChanged` (:259)
All three are lock/unlock transitions. Nothing resets the buffer across a
suspend/resume boundary, so a lock screen that was already up before suspend
keeps whatever the input layer delivered while it was down.
The plugin has no `PrepareForSleep` handler, but it is not unaware of resume
elsewhere — `idleBlankTimer` (:418) explicitly compensates for a countdown
frozen by suspend by checking wall-clock drift:
```qml
// A countdown frozen by suspend fires right after resume, which would
// blank the freshly woken unlock screen under the user. Wall-clock time
// exposes the gap: take a fresh run-up instead of blanking.
if (Date.now() - armedAt > interval + 2000) {
```
The same resume boundary that gets special handling for blanking gets none for
authentication state.
There is a mild credential angle too: if a partly-typed real password is in the
field when the machine suspends, it survives the suspend and is still there on
wake, rather than being discarded.
## What I have not established
- **The source of the characters is unconfirmed.** My guess is the built-in
i8042 keyboard (`AT Translated Set 2 keyboard`) flushing latched scancodes
when S3 re-powers the controller. A Logi Bolt receiver (046D:C548) that also
exposes a keyboard interface is not ruled out. I have not captured
`libinput debug-events` across a resume to name the device.
- **Whether a reset on resume is sufficient.** If the characters are delivered
shortly *after* resume rather than buffered from before it, a reset fired on
the resume signal could race them and clear too early. Ordering would need
checking before settling on a fix.
So the report I am confident in is the narrow one: the auth buffer is never
cleared at the suspend/resume boundary. Whether that fully explains the symptom
is a separate question.
## Relevant local context
This machine is pinned to S3 (`MemorySleepMode=deep`) as a workaround for
#7788. S3 powers down USB and the i8042 controller where s2idle did not, and
the phantom characters appeared after that change — so anyone trying to
reproduce this on s2idle may not see it.
## Workaround
Esc or Ctrl+U clears the field (`LockView.qml:177` `Keys.onPressed`).
## System details
- Omarchy 4.0.0-1, Hyprland 0.56.2-1, quickshell-git 0.3.0.r20.g28771c7-2
- Kernel 7.1.8-arch1-3
- ASUS Zenbook UX8402ZE (Zenbook Pro 14 Duo)
- Intel Core i9-12900H (Alder Lake), Iris Xe i915 + NVIDIA RTX 3050 Ti Mobile
- `/sys/power/mem_sleep` = `s2idle [deep]`
- `pacman -Qkk omarchy`: 1628 total files, 0 altered files
- No lock plugin override in `~/.config/omarchy/`
Related: #7788 (the S3 workaround this appeared downstream of), #6925 (a
different failure in the same auth-state area, closed not-planned).
Filed by Claude Opus 5 via Claude 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.
No decision has been recorded yet.