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-2205GitHub issuePublicFixed

Lock screen: after a wrong password, the failure message replaces the field with no visible prompt — screen looks unusable, input actually works

Reported by folknology · filed Oct 3, 2026 · open at source

Validation verdict: Reproduced. An engine-executed run exited 1 and showed the defect signal. Awaiting a human decision.

At a glance

1 · What is claimed?
  • ConfirmedReproducible: after a failed attempt the empty field shows only the failure message (no placeholder, no cursor) while it still accepts typing
  • Not confirmedAffects the lock component
2 · What does it affect?
AreaIn the audited arealock· Decided by agents · verified
3 · Is it reproducible?
An engine-executed run exited 1 and showed the defect signal. See reproducer
4 · What remains unclear?
  • Open question for maintainers: Open decision: what should the password field show after a failed attempt? Options: (A) keep the current behaviour (the failure message replaces the prompt until the first keystroke); (B) show the failure message and the prompt together (the report's suggestion); (C) show the message for a time chosen by the maintainers, then the prompt again (open PR #14170); (D) show the message outside the field.
  • Open question for maintainers: The decision is the Omarchy maintainers'; a draft requirement listing these options sits on this report's branch (report/cmus3invr006gcdw4hm3h94a5), and approving one option = merging that draft into the baseline with the chosen text.
  • Affects the lock component — no requirement of the lock component is confirmed as violated
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: not a duplicate of another report — decided by agents · verified; 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.

Open question — draft spec awaiting a decision

Draft — awaiting a decisionSW-REQ-261005-XJN0component lockrefines When the user locks the session, the system shall engage… SYS-REQ-260912-T0XP

What shall the password field show after a failed attempt?

What the code does today

(upstream quattro 035ce29f) handlePasswordFailure sets failureMessage 'Authentication failed (N)' (Service.qml:346-355); with an empty field the overlay text shows that message instead of the 'Enter Password' placeholder (LockView.qml:225), the text cursor is hidden (LockView.qml:42, :188) and the border uses the error colour (LockView.qml:43); the field still accepts typing and the first character clears the message (LockView.qml:195-201).

Options (listed neutrally — the choice is the maintainers')
  1. AKeep the current behaviour
  2. BThe lock view shall show the failure message and the password prompt together
  3. CThe lock view shall show the failure message for a time chosen by the maintainers, then the prompt again
  4. DThe failure message shall appear outside the field

Approving this draft means choosing one option; its text then replaces this description.

Why this is an open question

Raised by omacom/omarchy#14125 (proof inbox R-2205). The validation (report/cmus3invr006gcdw4hm3h94a5, rval-1d0d301a89cd1f41155b5ae3843fac19) reproduced the display with the real LockView.qml. No requirement governs the failure display. Open upstream PR #14170 implements option C; a commenter on the issue prefers keeping the message in the field.

Raised inomacom/omarchy#14125 (upstream) R-2205 (this report)

Proposed on this report's branch @ e6db639e7f · specs/software/requirements/SW-REQ-261005-XJN0.req.yaml · not part of the audited spec until approved and merged

Written after the validation was sealed at 4e5857ec6f: the seal covers the reproducer and the observed behaviour, not this proposed text.

Original report

Lock screen: after a wrong password, the failure message replaces the field with no visible prompt — screen looks unusable, input actually worksrevision 1 · captured 2026-10-03 07:54 UTC via poll

What happened

After a single wrong password on the lock screen, the input field is replaced by a red "Authentication failed (1)" message with no visible text field, no placeholder, no cursor, and no prompt to type. The screen looks locked out / broken. In fact the input is still active and focused — the field with password dots only reappears once the user starts typing.

I hit this today and initially concluded I could not log in at all ("the text box is red and says authentication failure (1) so I cannot type anything in to login"). Clicking on the box changed nothing. Only when I started typing anyway did the dot field reveal itself and the password worked on the next attempt.

This is likely a contributor to reports of "locked out, had to reboot" (e.g. the random-failure discussion #1469): a user who gets one rejection and then sees a dead-looking red screen may not realize they can just keep typing.

Expected behaviour

After a failed attempt, the lock screen should remain obviously usable: keep the visible input field (or placeholder text such as "Password") alongside the failure message, so it's clear typing is still accepted.

Steps to reproduce

  1. Lock the screen (omarchy system lock, or wait for the idle lock).
  2. Type a wrong password and submit.
  3. Observe: field disappears, only the red "Authentication failed (1)" message shows, with no affordance indicating input still works.
  4. Type anything — the dot field reappears, confirming input was active the whole time.

Root cause (from reading the packaged source)

In shell/plugins/lock/LockView.qml (~line 186), the placeholder Text overlays the TextInput and is visible whenever passwordInput.text.length === 0:

text: root.authenticatingPassword ? "Checking…" : (root.failureMessage.length > 0 ? root.failureMessage : root.placeholderText)

When failureMessage is set, the placeholder renders the error instead of the normal placeholder, so with an empty field the UI shows only the red error and no "type your password" affordance. Note onTextChanged does clear the failure message on the first keystroke (if (text.length > 0 && root.failureMessage.length > 0) root.clearFailureRequested()), which is why the field "reappears" on typing — but nothing tells the user that.

Environment

  • Omarchy: 4.0.4-1, quickshell 0.3.1-1
  • Kernel 7.2.5-3-omarchy, Intel Arc B390 (xe driver), x86_64
  • No fingerprint enrolled (password-only lock); PAM stack stock (/etc/pam.d/omarchy-lock-password matches omarchy-apply-lock output)
  • faillock tally was 1/10 — not a faillock lockout; the same password authenticated successfully on the next attempt

Suggested fix

Show the failure message above/below the field rather than in place of the placeholder, or render both (error text + "Password" placeholder) so the field visibly invites input after a failure.

View raw text
## What happened

After a single wrong password on the lock screen, the input field is replaced by a red **"Authentication failed (1)"** message with no visible text field, no placeholder, no cursor, and no prompt to type. The screen looks locked out / broken. In fact the input is still active and focused — the field with password dots only reappears once the user starts typing.

I hit this today and initially concluded I could not log in at all ("the text box is red and says authentication failure (1) so I cannot type anything in to login"). Clicking on the box changed nothing. Only when I started typing anyway did the dot field reveal itself and the password worked on the next attempt.

This is likely a contributor to reports of "locked out, had to reboot" (e.g. the random-failure discussion #1469): a user who gets one rejection and then sees a dead-looking red screen may not realize they can just keep typing.

## Expected behaviour

After a failed attempt, the lock screen should remain obviously usable: keep the visible input field (or placeholder text such as "Password") alongside the failure message, so it's clear typing is still accepted.

## Steps to reproduce

1. Lock the screen (`omarchy system lock`, or wait for the idle lock).
2. Type a wrong password and submit.
3. Observe: field disappears, only the red "Authentication failed (1)" message shows, with no affordance indicating input still works.
4. Type anything — the dot field reappears, confirming input was active the whole time.

## Root cause (from reading the packaged source)

In `shell/plugins/lock/LockView.qml` (~line 186), the placeholder `Text` overlays the `TextInput` and is visible whenever `passwordInput.text.length === 0`:

```qml
text: root.authenticatingPassword ? "Checking…" : (root.failureMessage.length > 0 ? root.failureMessage : root.placeholderText)
```

When `failureMessage` is set, the placeholder renders the error *instead of* the normal placeholder, so with an empty field the UI shows only the red error and no "type your password" affordance. Note `onTextChanged` does clear the failure message on the first keystroke (`if (text.length > 0 && root.failureMessage.length > 0) root.clearFailureRequested()`), which is why the field "reappears" on typing — but nothing tells the user that.

## Environment

- Omarchy: 4.0.4-1, quickshell 0.3.1-1
- Kernel 7.2.5-3-omarchy, Intel Arc B390 (xe driver), x86_64
- No fingerprint enrolled (password-only lock); PAM stack stock (`/etc/pam.d/omarchy-lock-password` matches `omarchy-apply-lock` output)
- faillock tally was 1/10 — not a faillock lockout; the same password authenticated successfully on the next attempt

## Suggested fix

Show the failure message above/below the field rather than *in place of* the placeholder, or render both (error text + "Password" placeholder) so the field visibly invites input after a failure.

Validation

AI validator claude-code (claude-opus-5.5) · evaluated revision 1 at product commit 1e43373287af · sealed 2026-10-05T14:30:14Z

Validator's summary (commentary, not evidence)

Validation of omacom/omarchy#14125 on quattro-proof 1e433732 (upstream quattro 035ce29f product code plus the proof layer). The reported display reproduces with the real LockView.qml given the state Service.qml sets after handlePasswordFailure() (failureMessage 'Authentication failed (1)', Service.qml:346-355 upstream): with an empty field the only visible text is the red failure message, which replaces the 'Enter Password' placeholder (LockView.qml:225); the text cursor is hidden (showPasswordCursor, LockView.qml:42; cursorVisible, LockView.qml:188) and the border uses the error colour (LockView.qml:43). The field still accepts input (enabled, not read-only), and the first typed character clears the message (LockView.qml:195-201). No requirement governs what the field shows after a failed attempt, so the expected display is an open specification question for the maintainers. Open upstream PR #14170 proposes clearing the message with a timer; a commenter on the issue prefers keeping the message in the field.

  • ConfirmedReproducible

    Reproducible: after a failed attempt the empty field shows only the failure message (no placeholder, no cursor) while it still accepts typing

    Engine: engine-executed run exited 1 and showed the defect signal

    Evidence: file test/reports/report-cmus3invr006gcdw4hm3h94a5.sh

    Validator's rationale (commentary): Observed with the real LockView.qml: visible text ['Authentication failed (1)'], placeholder not shown, cursorVisible false, input enabled. No requirement covers the failure display; the expected form is the open question below.

  • Not confirmedAffects a componentlock

    Affects the lock component

    Engine: no requirement of the lock component is confirmed as violated

Engine reference checks at 4e5857ec6fb6 (9/9 ok)
  • okcommit4e5857ec6fb655aee09181947339b211950be86b
  • okbase commit1e43373287afbd6dca4674ad463d5b5db7812358
  • okbase ancestry1e43373287afbd6dca4674ad463d5b5db7812358
  • okproduct code untouchedthis report's reproducer branch
  • okbranchthis report's reproducer branch
  • okfiletest/reports/report-cmus3invr006gcdw4hm3h94a5.qml
  • okfiletest/reports/report-cmus3invr006gcdw4hm3h94a5.sh
  • okcomponentlock
  • okknown issuewithheld

The engine's own check, at validation time, that the commits, the reproducer branch (touching only reproducer files), the reproducer files and every mapped requirement / component / known issue really exist.

Validator-authored hypothesis. Each claim's verification is engine-computed: confirmed only from an engine-executed reproducer run recorded in this record, refuted when recorded evidence contradicts it. Prose is commentary. The disposition of the report is a human decision.

Reproducer

engine-runexit 1 · expected exit 0 · defect exit 1 · 563 ms · 2026-10-05T14:30:14Z→ showed the defect
test/reports/report-cmus3invr006gcdw4hm3h94a5.shon this report's reproducer branch @ 4e5857ec6f+ test/reports/report-cmus3invr006gcdw4hm3h94a5.qml
bash test/reports/report-cmus3invr006gcdw4hm3h94a5.sh

Setup failure: exit 2 means the reproducer could not set up (e.g. the product did not build) — such a run decides nothing.

Defect signal: output contains AS-REPORTED:

Matched lines (engine, over the full output)
AS-REPORTED: after a failed attempt the empty field shows only the failure message (no placeholder, no cursor) while the field still accepts typing
Observed output · 736 bytes
Observed on this tree (quickshell 0.3.1, lock plugin shell/plugins/lock):
  - before a failure, the field shows ["Enter Password"] (placeholderText "Enter Password")
  - after one failed attempt (empty field), the visible text is ["Authentication failed (1)"]
  - the placeholder "Enter Password" is not shown
  - the field border uses the error colour: errorState=true; text cursor shown: false (showPasswordCursor=false)
  - the field still takes input: enabled=true, readOnly=false
  - the first typed character clears the failure message (clearFailureRequested); visible text then []
AS-REPORTED: after a failed attempt the empty field shows only the failure message (no placeholder, no cursor) while the field still accepts typing

Needs: linux · quickshell (0.3.x) and jq on PATH; a sway binary for a private headless compositor (PROOF_ENV_DIR/sysroot/usr/bin/sway, else sway on PATH); the script exits 2 with SETUP: otherwise. Nothing to build: the QML is loaded straight from the worktree · ran on linux/amd64

Linked

  • Related PRpr/13183· confirmed
  • Fixed bypr/14170· 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.

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