Proof Portal
Omarchy
ProbeLabsviewing a historical runA 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.
Users reach system actions, settings, and applications through the Omarchy menu.
Specification
The requirement exactly as authored — its complete prose text and, where present, the formal FRETish sentence it compiles to.
Users reach system actions, settings, and applications through the Omarchy menu. Scripts pose picker and input prompts and read back the answer. Menu rows reflect current system state without stale or contradictory display.
Rationale & tags
Why this requirement exists, and how it is categorised.
Rationale & tags
Why this requirement exists, and how it is categorised.
The menu is the primary UX surface of omarchy and its top churn/bug hotspot. bin/omarchy-menu history shows 304 commits, 13 bug fixes, and 3 cascade episodes. Its rows make claims about system state that must not lie.
Verification & provenance
How this requirement was checked: the review trail, edit history, and the machine-analysis status terms (each ⓘ explains what it means).
Review
- Status
- in_review
- Reviewer
- Kimi Zero Warnings · AI agent
- Reviewed
- Sep 27, 2026, 23:08 UTC
History
- Created
- Sep 22, 2026, 13:33 UTC · Kimi Dogfood · AI agent
- Modified
- Sep 27, 2026, 22:35 UTC · Leonid Bugaev
Hazard review
- scenarioreviewednominalerror_handlingboundaryconcurrency_scale
Story-level partitions that decompose through the nine derived menu requirements: nominal (menu presents and routes verbs, pickers return answers) through J0AN and X6Z5, error_handling (unknown verbs and missing options answer loudly) through the dispatcher and dmenu protocol children such as SNZG and B839, boundary (comma-before-closing-brace text kept verbatim through JSONC trailing-comma stripping, per AC-002) through PPDW. Menu rows reflecting current state without stale display is the sum of the state-query children. Catalog 1.11.0 re-review: input_domain not applicable, the byte-level domains are stated on SW-REQ-260922-E4J2, SW-REQ-260922-3T3F and SW-REQ-260922-Q6ZS. concurrency_scale applied, scripts pose overlapping picker and input prompts; supersession is stated on SYS-REQ-260922-X6Z5.
- propertynot applicable
Story-level intent; the verbatim-text property is specified and witnessed at child PPDW, and no algebraic property is stated at this level.
- structuralnot applicable
Stakeholder story with no implementation at this level; the menu parser structural surfaces are recorded on the children.
- domainnot applicable
Menu actions execute with user privileges from the user's own config; no privilege boundary is crossed and no domain class applies_when fires for the story as written.
Change history
Every recorded revision of this requirement's source file — newest first, each with its commit message and the diff for that change.
Obligations
What this requirement must witness to be considered satisfied — the required evidence, and the tests that discharge each one.
3 obligations · 3 discharged
Browse the catalogueEvidence tagged via <REQ> is witnessed by a requirement that satisfies this one — normal for stakeholder / aggregate requirements, which are proven through the requirements that refine them.
Happy-path behavior with valid inputs.
- nominalrecommendedpresentCovered by 1 test
Behavior when operations fail or dependencies are unavailable.
- negativerequiredpresentCovered by 3 tests
Behavior at limits, thresholds, and edge-of-range values.
- boundaryrecommendedpresentCovered by 1 test
- nominalrecommendedpresentCovered by 2 tests
Acceptance criteria
Stakeholder conditions for satisfaction, traced to the derived requirements and evidence that discharge them.
Acceptance criteria
Stakeholder conditions for satisfaction, traced to the derived requirements and evidence that discharge them.
Stakeholder-authored conditions defining when the requirement is satisfied, traced to derived requirements / evidence.
- AC-001verify: test
Opening the menu (omarchy menu toggle) presents the menu UI and routes summon/close verbs to the correct plugin targets. A pick in a script-driven select or input prompt returns the chosen answer to the calling script.
Derived requirementsAcceptance test - AC-002verify: test
A menu entry whose label or action contains a comma before a closing brace or bracket keeps its text verbatim. The menu displays and executes it exactly as written. JSONC trailing-comma stripping must never mutate it silently.
Derived requirementsAcceptance test
Its place
How this requirement connects — what proves it, what it affects, and what it rests on. Authored links only here; automatically derived links come from the audit index.
Loading graph…
Trace evidence
The concrete artifacts linked to this requirement — implementing code, verifying tests, documents, and the findings raised against it.
No findings affect this requirement
Nothing was flagged against this requirement in the pinned run.
Impact
Blast radius — authored trace links only (automatically derived links come from the audit index and aren't shown here).
Impact
Blast radius — authored trace links only (automatically derived links come from the audit index and aren't shown here).
If you change this
Requirements (66)
- Dynamic rows (apps, provider enumerations) replace their…menu · SYS
- All when/checked/disabled expressions evaluate in one…menu · SYS
- Menu action scripts (plugin picker, share, timezone,…menu · SYS
- omarchy-menu routes each verb…menu · SYS
- Activating a row runs its action, follows its link, or…menu · SYS
- The default JSONC and the user extension merge into one…menu · SYS
- A route string (exact id, declared alias, or normalized…menu · SYS
- A filter query narrows to visible, selectable rows whose…menu · SYS
- A script-driven select/input prompt delivers the picked…menu · SYS
- swapProviderRows drops exactly the rows carrying the re-run…menu · SW
- mergeAppRows and swapProviderRows return fresh maps that…menu · SW
- The rewrite touches only the plain $(reader) form, mapping…menu · SW
- The menu discards a guard batch that exits nonzero or by…menu · SW
- Applied guard results drive the viewmenu · SW
- The generated guard script holds exactly one if-line per…menu · SW
- The prelude's omarchy-pkg-present/missing shadows agree…menu · SW
- A value command shared by several guards (emenu · SW
- When no item declares a guard, the guard script is empty…menu · SW
- Binds Hyprland reports as dispatcher __lua are shown with…menu · SW
- When the fast signature (directory path + mtime per image…menu · SW
- Every picker row carries the plugin id as tab subtextmenu · SW
- Cancelling the timezone picker exits 1 before any…menu · SW
- Delete with the cursor on an app row opens an uninstall…menu · SW
- Clipboard mode writes the clipboard to a tempmenu · SW
- A code:N binding shows the keysym resolved from the…menu · SW
- The listing matches the requested formats…menu · SW
- A file chooser exit status above 1 sends a critical 'Could…menu · SW
- enable offers disabled pluginsmenu · SW
- When the fast signature differs, the script rebuilds rows…menu · SW
- When no plugin matches the verb, the script sends a 'No…menu · SW
- The script applies a picked timezone with sudo timedatectl…menu · SW
- A converter that refuses a video records an emptymenu · SW
- The pipeline detects video paths by extension and…menu · SW
- open(payload) dispatches on modemenu · SW
- When the rows do not fit, the list height ends mid-rowmenu · SW
- An unknown verb prints 'omarchy-menumenu · SW
- toggle, summon, close, refresh, and ping each exec the…menu · SW
- After the first filter keystroke or submenu move, the card…menu · SW
- When no row is selectable, the menu shows no cursor at all…menu · SW
- Drilling in pushes the previous menu on the navigation stackmenu · SW
- A dmenu option may lead with a glyph TAB and trail a…menu · SW
- Cursor movement lands on the next selectable row in the…menu · SW
- Row selection follows the pointer only after it genuinely…menu · SW
- Unparseable input (after stripping), non-object JSON, and…menu · SW
- An entry with action is an action, with target a link,…menu · SW
- A user entry overrides the default per key while keeping…menu · SW
- The parser strips full-line // comments and trailing commas…menu · SW
- The merged item tree is addressable by idmenu · SW
- A route matching no id and no alias resolves to the literal…menu · SW
- Absent an exact id, a route equal to a declared alias…menu · SW
- When a route resolves to an action item with a non-empty…menu · SW
- An exact id match wins over every aliasmenu · SW
- When a route resolves to a link item, the menu opens at the…menu · SW
- A menu action may exactly match the bare-summon grammarmenu · SW
- A row matches only when every query term appears in its…menu · SW
- Scores tier exact label, whole-word app name, label prefix,…menu · SW
- Search lists current-menu matches before deeper (drilldown)…menu · SW
- finishRequest with no active request or no done file just…menu · SW
- When the done file exists but the selection file is empty…menu · SW
- With no prompt, or no options from arguments or stdin, a…menu · SW
- finishRequest with a null selection (Escape/cancel) creates…menu · SW
- finishRequest with a selection writes the value to the…menu · SW
- Once the done file exists, the script prints a non-empty…menu · SW
- The select payload carries mode=select, prompt, options,…menu · SW
- A summon can arrive while a select/input request is still…menu · SW
- The menu can issue an answer while the write for an earlier…menu · SW
Files to re-check (12)
- Menu.qmlshell/plugins/menu/Menu.qml
- MenuModel.jsshell/plugins/menu/MenuModel.js
- omarchy-menu-keybindingsbin/omarchy-menu-keybindings
- omarchy-menu-imagesbin/omarchy-menu-images
- omarchy-menu-pluginbin/omarchy-menu-plugin
- omarchy-menu-timezonebin/omarchy-menu-timezone
- omarchy-menu-sharebin/omarchy-menu-share
- omarchy-menu-filebin/omarchy-menu-file
- omarchy-menubin/omarchy-menu
- BarWidget.qmlshell/plugins/menu/BarWidget.qml
- omarchy-menu-inputbin/omarchy-menu-input
- omarchy-menu-selectbin/omarchy-menu-select
Tests to re-run (15)
- menu-acceptance-test.shtest/shell.d/menu-acceptance-test.sh
- menu-dispatcher-test.shtest/shell.d/menu-dispatcher-test.sh
- menumodel-replay.test.mjstest/node/menumodel-replay.test.mjs
- menu-test.shtest/shell.d/menu-test.sh
- menu-guards-test.shtest/shell.d/menu-guards-test.sh
- menu-share-test.shtest/shell.d/menu-share-test.sh
- menu-compositor-test.shtest/shell.d/menu-compositor-test.sh
- report-reproducers.test.mjstest/node/report-reproducers.test.mjs
- menu-dmenu-test.shtest/shell.d/menu-dmenu-test.sh
- keybindings-menu-test.shtest/shell.d/keybindings-menu-test.sh
- menu-images-test.shtest/shell.d/menu-images-test.sh
- menu-plugin-test.shtest/shell.d/menu-plugin-test.sh
- menu-timezone-test.shtest/shell.d/menu-timezone-test.sh
- menu-file-test.shtest/shell.d/menu-file-test.sh
- menu-pointer-lifecycle-test.shtest/shell.d/menu-pointer-lifecycle-test.sh
What this rests on
Discussions
Discuss this with the proof team. Nothing changes in your audit automatically — you open a request and a staff member records any outcome inside the thread.