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-877GitHub issuePublicDecided· Duplicate

Menu opens in time quadratic to its row count (231-row keybindings menu spends 111ms in redundant height passes)

Reported by mihb123 · filed Sep 7, 2026 · open at source

Decided: Duplicate — decided by agents · verified 4 days ago.

At a glance

1 · What is claimed?
  • ConfirmedReproducible: one 231-row menu rebuild runs 232 height passes walking 27,027 rows (one full re-walk per appended row)
  • Not confirmedAffects the menu component
  • LinkedMatches known issue KI-MENU-OPEN-QUADRATIC
2 · What does it affect?
AreaIn the audited areamenu· 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: No requirement says how much work opening a menu may do, so the known issue is filed under the list-height requirement (SW-REQ-260922-B757) for now. Should we add a requirement that bounds menu-open cost, for example linear in the number of rows?
  • Open question for maintainers: #10631 doesn't change the 232-pass / 27,027-row cost: the height functions still read displayModel.count, so QML still re-evaluates the binding on every appended row. Computing the height once per rebuild, and again when the panel size changes, would make it linear (see #10601). Would you take that approach instead?
  • Affects the menu component — no requirement of the menu component is confirmed as violated
5 · What happens next?
Decided by agents and verified by a second, independent agent — see the decision.

Original report

Menu opens in time quadratic to its row count (231-row keybindings menu spends 111ms in redundant height passes)revision 1 · captured 2026-09-28 21:23 UTC via poll

System details

Omarchy4.0.2-1
Quickshell0.3.1 (Arch package)
Hyprland0.56.2
Kernel7.1.9-arch1-2
CPUIntel Core i5-10210U
GPUIntel CometLake-U GT2 [UHD Graphics]

What's wrong?

Summary

Opening the Omarchy menu costs time proportional to the square of its row count.

On a stock 4.0.2 install, SUPER + K (keybindings, 231 rows) spends ~139ms inside the shell building the menu, and the whole key press-to-visible path takes a ~420-460ms median. A 400-row menu spends ~285ms in the shell. The per-row cost climbs with` the row count, which is the giveaway — it should be flat.

This is not specific to the keybindings menu: the root menu, Apps, the theme picker and every omarchy menu select caller go through the same code.
issue-body.md

View raw text
### System details
| | |
|---|---|
| Omarchy | 4.0.2-1 |
| Quickshell | 0.3.1 (Arch package) |
| Hyprland | 0.56.2 |
| Kernel | 7.1.9-arch1-2 |
| CPU | Intel Core i5-10210U |
| GPU | Intel CometLake-U GT2 [UHD Graphics] |

### What's wrong?

#### Summary

Opening the Omarchy menu costs time proportional to the **square** of its row count.

On a stock 4.0.2 install, `SUPER + K` (keybindings, 231 rows) spends ~139ms inside the shell building the menu, and the whole key press-to-visible path takes a ~420-460ms median. A 400-row menu spends ~285ms in the shell. The per-row cost climbs with` the row count, which is the giveaway — it should be flat.

This is not specific to the keybindings menu: the root menu, Apps, the theme picker and every `omarchy menu select` caller go through the same code.
[issue-body.md](https://github.com/user-attachments/files/31897190/issue-body.md)
  • issue-body.md

Same defect, also reported as

Validation

AI validator claude-code (claude-opus-5.5) · evaluated revision 1 at product commit 1e43373287af · sealed 2026-10-04T21:45:45Z

Validator's summary (commentary, not evidence)

Re-validation of omacom/omarchy#10601 on quattro-proof 1e433732 (upstream quattro 035ce29f product code plus the proof layer). The menu code these checks run is unchanged since the previous validation (311d29c7..1e433732 merges upstream 035ce29f, whose only menu changes are two data rows in the stock omarchy-menu.jsonc (Install/Remove > Service > Microsoft), the image-picker helper bin/omarchy-menu-images and one display property on the bar's menu button; Menu.qml, MenuModel.js, ConfirmDialog.qml and omarchy-menu-select are byte-identical, and the rest is lock-screen and other non-menu upstream changes plus proof-layer records), and the result holds. Opening a long menu does work that grows with the square of its row count: the visibleRowsHeight binding walks the whole list again every time a row is appended. The reproducer runs the real Menu.qml height functions in the Qt 6 QML engine (offscreen): building a 231-row menu runs 232 height passes that walk 27,027 rows in total, and a 462-row menu runs 463 passes that walk 107,415. We also measured the real entry path in a running shell, with a read-only counter on foldedListHeight: omarchy-menu-select with 231 options walks 54,516 rows in 466 height passes, and with 462 options 108,339 rows. A linear rebuild would walk at most 2 rows per option. No requirement yet limits how much work opening a menu may do, so this validation does not claim a requirement violation, and whether the menu component is affected stays unconfirmed until such a requirement exists. The baseline already tracks the defect as KI-MENU-OPEN-QUADRATIC (open). #10631 doesn't change the 232-pass / 27,027-row cost, in the reproducer or in the running shell. The reproducer was re-run on 1e433732 with identical output; the live-shell runs are reused from 20d4e6ae (author-recorded): Menu.qml, MenuModel.js and omarchy-menu-select are unchanged since then apart from comment-only trace lines, and the two stock-menu rows added since (Install/Remove > Service > Microsoft) are outside what these runs exercise.

  • ConfirmedReproducible

    Reproducible: one 231-row menu rebuild runs 232 height passes walking 27,027 rows (one full re-walk per appended row)

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

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

  • Not confirmedAffects a componentmenu

    Affects the menu component

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

    Validator's rationale (commentary): The cost is in shell/plugins/menu/Menu.qml: the visibleRowsHeight binding and the row walks it triggers. No requirement limits menu-open cost yet, so there is no requirement violation to point to, and this claim stays unconfirmed until one is written.

  • Matches known issue KI-MENU-OPEN-QUADRATIC

    Engine: the known issue exists; whether the report duplicates it is settled by a human disposition; it affects the mapped requirement(s) SW-REQ-260922-B757

    Evidence: known_issue KI-MENU-OPEN-QUADRATIC · requirement SW-REQ-260922-B757

    Validator's rationale (commentary): The baseline known issue KI-MENU-OPEN-QUADRATIC records exactly this defect (rows walked quadratically when a menu opens) and links #10601.

Engine reference checks at 1e43373287af (9/9 ok)
  • okcommit1e43373287afbd6dca4674ad463d5b5db7812358
  • okbase commit1e43373287afbd6dca4674ad463d5b5db7812358
  • okbase ancestry1e43373287afbd6dca4674ad463d5b5db7812358
  • okproduct code untouchedthis report's reproducer branch
  • okbranchthis report's reproducer branch
  • okfiletest/reports/report-cmulr8ysi0jwr1gw4fjmt9khq.sh
  • okrequirementSW-REQ-260922-B757
  • okcomponentmenu
  • okknown issueKI-MENU-OPEN-QUADRATIC

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.

10 earlier checks — superseded by the newest one above

Each new check of the report replaces the previous one; only the newest result above counts. Earlier results are kept for the record.

  • Reproduced— checked report revision 1 on Oct 4, 2026; earlier check, superseded
  • Reproduced— checked report revision 1 on Oct 3, 2026; earlier check, superseded
  • Reproduced— checked report revision 1 on Oct 3, 2026; earlier check, superseded
  • Reproduced— checked report revision 1 on Oct 2, 2026; earlier check, superseded
  • Reproduced— checked report revision 1 on Oct 2, 2026; earlier check, superseded
  • Reproduced— checked report revision 1 on Oct 2, 2026; earlier check, superseded
  • Reproduced— checked report revision 1 on Oct 2, 2026; earlier check, superseded
  • Reproduced— checked report revision 1 on Oct 1, 2026; earlier check, superseded
  • Reproduced— checked report revision 1 on Oct 1, 2026; earlier check, superseded
  • Reproduced— checked report revision 1 on Sep 29, 2026; earlier check, superseded

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 · 201 ms · 2026-10-04T21:45:44Z→ showed the defect
test/reports/report-cmulr8ysi0jwr1gw4fjmt9khq.shon this report's reproducer branch @ 1e43373287
sh test/reports/report-cmulr8ysi0jwr1gw4fjmt9khq.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 DEFECT:

Matched lines (engine, over the full output)
DEFECT: 231-row menu open: 232 height passes walked 27027 rows (linear bound 462; triangular sum 26796) -- the height binding re-walks the whole list on every append
DEFECT: 462-row menu open: 463 height passes walked 107415 rows (linear bound 924; triangular sum 106953) -- the height binding re-walks the whole list on every append
Observed output · 334 bytes
DEFECT: 231-row menu open: 232 height passes walked 27027 rows (linear bound 462; triangular sum 26796) -- the height binding re-walks the whole list on every append
DEFECT: 462-row menu open: 463 height passes walked 107415 rows (linear bound 924; triangular sum 106953) -- the height binding re-walks the whole list on every append

Needs: linux · the Qt 6 'qml' runtime (qt6-declarative, QtQuick) run offscreen, and node >= 18 to extract the QML under test (exits 2 with SETUP: otherwise); no Quickshell or compositor · ran on linux/amd64

Author's comparative runs — commentary, not engine evidence
  • author-recordedon this baseline with upstream PR omacom/omarchy#10631 head a78528c9 merged · exit 1
    sh test/reports/report-cmulr8ysi0jwr1gw4fjmt9khq.sh
    DEFECT: 231-row menu open: 232 height passes walked 27027 rows ... 462-row menu open: 463 height passes walked 107415 rows
  • author-recordedon live shell (Quickshell 0.3.1, headless sway), this baseline; read-only counter on foldedListHeight in a private copy [run on 20d4e6ae, same menu code] · exit 1
    omarchy-menu-select 'Big N' with N = 231 and 462 options
    231 options: 466 height passes, 54516 rows walked; 462 options: 465 passes, 108339 rows walked
  • author-recordedon live shell, this baseline with upstream PR omacom/omarchy#10631 head a78528c9 merged [run on 20d4e6ae, same menu code] · exit 1
    same
    231 options: 466 height passes, 54516 rows walked; 462 options: 465 passes, 108339 rows walked

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.