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/authentication surface needs hard resource bounds
Reported by vip32 · filed Sep 3, 2026 · open at source
At a glance
- 1 · What is claimed?
- ConfirmedReproducible: the lock password field keeps up to Qt's default 32767 characters (no maximumLength in LockView.qml) and reports all of them to the service
- Not confirmedAffects the lock component
- 2 · What does it affect?
- RequirementWhen entered password text exceeds the field width, the… SW-REQ-260912-WBS3
- Componentlock
- 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: should the lock screen limit the length of a typed or pasted password, and where? Options: (A) keep the current behaviour, no limit of its own (Qt's default 32767 in the field); (B) a maximum in the password field, value chosen by the maintainers; (C) also reject over-long values in the lock service before PAM (the report's ask; PR #10082 proposes B and C).
- Open question for maintainers: The decision is the Omarchy maintainers'; a draft requirement listing these options sits on this report's branch (report/cmulr91070k6l1gw401lz9v1z), 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: 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.
Open question — draft spec awaiting a decision
Should the lock screen limit the length of a typed or pasted password, and where?
(upstream quattro 035ce29f) the password TextInput in LockView.qml (line 164) declares no maximumLength, so it keeps Qt's default of 32767 characters; the text is mirrored into the masking TextMetrics (LockView.qml:90-96) and through passwordTextEdited into the service (Service.qml:488), and submitPassword forwards any non-empty value to PAM (Service.qml:324-339).
- AKeep the current behaviour, no limit of its own
- BThe password field shall accept at most N characters, N chosen by the maintainers
- CIn addition, the lock service shall reject a longer value before PAM
Approving this draft means choosing one option; its text then replaces this description.
Why this is an open question
Raised by omacom/omarchy#10078 (proof inbox R-995). The validation (report/cmulr91070k6l1gw401lz9v1z, rval-1aeca03bd74654626c6df3e95e77ef51) reproduced the current behaviour with the real LockView.qml. No requirement bounds the length today; SW-REQ-260912-WBS3 only scales the dots. Upstream PR #10082 (draft, by the reporter) proposes B and C. For reference only: Linux-PAM's PAM_MAX_RESP_SIZE is 512 bytes.
Proposed on this report's branch @ 9db55aed27 · specs/software/requirements/SW-REQ-261005-N4TG.req.yaml · not part of the audited spec until approved and merged
Written after the validation was sealed at 8d111672d2: the seal covers the reproducer and the observed behaviour, not this proposed text.
Original report
System details
Omarchy 4
What's wrong?
the lock/authentication surface still hard resource bounds:
LockView.qml:113-120,170-213 accepts an unbounded password and constructs a matching repeated-character TextMetrics string. Clipboard/keyboard input can therefore force unbounded allocation and layout work on the lock screen. Enforce a small explicit maximum length before storing, measuring, or sending the value to PAM.
Service.qml:188-207 forwards that unbounded value into the PAM flow. Apply the same limit at this service boundary as defense in depth and clear/reject oversized input before assigning pendingPassword.
The recurring authentication/helper processes (Service.qml:221-239,369-399) have no explicit attempt/deadline budget. In particular, failed fingerprint authentication is retried every 250 ms for the entire lock duration. Add a bounded retry/backoff policy and a deadline/recovery path so a broken PAM/fprint service cannot create an indefinite tight authentication loop.
View raw text
### System details Omarchy 4 ### What's wrong? the lock/authentication surface still hard resource bounds: LockView.qml:113-120,170-213 accepts an unbounded password and constructs a matching repeated-character TextMetrics string. Clipboard/keyboard input can therefore force unbounded allocation and layout work on the lock screen. Enforce a small explicit maximum length before storing, measuring, or sending the value to PAM. Service.qml:188-207 forwards that unbounded value into the PAM flow. Apply the same limit at this service boundary as defense in depth and clear/reject oversized input before assigning pendingPassword. The recurring authentication/helper processes (Service.qml:221-239,369-399) have no explicit attempt/deadline budget. In particular, failed fingerprint authentication is retried every 250 ms for the entire lock duration. Add a bounded retry/backoff policy and a deadline/recovery path so a broken PAM/fprint service cannot create an indefinite tight authentication loop.
Validation
AI validator claude-code (claude-opus-5.5) · evaluated revision 1 at product commit 1e43373287af · sealed 2026-10-05T14:29:49Z
Validation of omacom/omarchy#10078 on quattro-proof 1e433732 (upstream quattro 035ce29f product code plus the proof layer). The report's first point holds as an observation: the lock screen sets no password length limit of its own. LockView.qml's password TextInput (LockView.qml:164 upstream) declares no maximumLength, so it keeps Qt's built-in default of 32767 characters; the reproducer inserts 513, 4096 and 100000 characters and finds 513, 4096 and 32767 in the field, each reported in full through passwordTextEdited (Service.qml:488 stores it as enteredPassword; submitPassword, Service.qml:324-339, forwards any non-empty value to PAM). No requirement governs a length bound (SW-REQ-260912-WBS3 only scales the dots of a long password), so whether there should be one, and where, is an open specification question for the maintainers, not a confirmed defect. Linux-PAM's PAM_MAX_RESP_SIZE is 512 bytes (/usr/include/security/_pam_types.h:248 on the box), a reference point only. The report's second point (the fingerprint retry budget) is the question validated under omacom/omarchy#9913 (R-1029); the 250 ms flat retry it describes was replaced by a backoff in upstream #7158. Upstream PR #10082 (draft, by the reporter) proposes limits at the field and at the service.
- ConfirmedReproducible
Reproducible: the lock password field keeps up to Qt's default 32767 characters (no maximumLength in LockView.qml) and reports all of them to the service
Engine: engine-executed run exited 1 and showed the defect signal
Evidence: file test/reports/report-cmulr91070k6l1gw401lz9v1z.sh
Validator's rationale (commentary): Observed with the real LockView.qml in quickshell: maximumLength reads 32767 (Qt's default); inserted 4096 characters stay 4096 in the field and in passwordTextEdited. Whether this is a defect is the open question below: no requirement asks for a bound.
Affects the lock component
Engine: no requirement of the lock component is confirmed as violated
Engine reference checks at 8d111672d2c1 (10/10 ok)
- okcommit8d111672d2c163eb285e76f452781ef36d6b8526
- okbase commit1e43373287afbd6dca4674ad463d5b5db7812358
- okbase ancestry1e43373287afbd6dca4674ad463d5b5db7812358
- okproduct code untouchedthis report's reproducer branch
- okbranchthis report's reproducer branch
- okfiletest/reports/report-cmulr91070k6l1gw401lz9v1z.qml
- okfiletest/reports/report-cmulr91070k6l1gw401lz9v1z.sh
- okrequirementSW-REQ-260912-WBS3
- 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
bash test/reports/report-cmulr91070k6l1gw401lz9v1z.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:
AS-REPORTED: the lock field applies no limit of its own: it takes up to Qt's default 32767 characters and reports them all to the service
Observed on this tree (quickshell 0.3.1, lock plugin shell/plugins/lock): - the password TextInput's maximumLength is 32767 (Qt's built-in default; LockView.qml sets none) - inserting 513 characters leaves 513 in the field; passwordTextEdited reports 513 characters; the masking TextMetrics measures 513 dots - inserting 4096 characters leaves 4096 in the field; passwordTextEdited reports 4096 characters; the masking TextMetrics measures 4096 dots - inserting 100000 characters leaves 32767 in the field; passwordTextEdited reports 32767 characters; the masking TextMetrics measures 32767 dots AS-REPORTED: the lock field applies no limit of its own: it takes up to Qt's default 32767 characters and reports them all to the service
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 toR-830Fingerprint unlock rejected on first attempt after resume (Goodix, race with sleep-lock inhibitor)· decided by agents · verified
- Related PRpr/10082· 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: 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.