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-995GitHub issuePublicValidated· Reproduced

lock/authentication surface needs hard resource bounds

Reported by vip32 · filed Sep 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: 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?
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: 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

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

Should the lock screen limit the length of a typed or pasted password, and where?

What the code does today

(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).

Options (listed neutrally — the choice is the maintainers')
  1. AKeep the current behaviour, no limit of its own
  2. BThe password field shall accept at most N characters, N chosen by the maintainers
  3. 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.

Raised inomacom/omarchy#10078 (upstream) R-995 (this report)

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

lock/authentication surface needs hard resource boundsrevision 1 · captured 2026-09-28 21:24 UTC via poll

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

Validator's summary (commentary, not evidence)

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.

  • Not confirmedAffects a componentlock

    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

engine-runexit 1 · expected exit 0 · defect exit 1 · 662 ms · 2026-10-05T14:29:48Z→ showed the defect
test/reports/report-cmulr91070k6l1gw401lz9v1z.shon this report's reproducer branch @ 8d111672d2+ test/reports/report-cmulr91070k6l1gw401lz9v1z.qml
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:

Matched lines (engine, over the full output)
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 output · 742 bytes
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

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.