Proof Portal

Project overview

Omarchy

ProbeLabsviewing a historical run

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.

Viewing historical run 0e2dd89Oct 1, 2026, 10:11 PMpr/13968Back to current
All requirements
RequirementSW-REQ-260922-Z680SoftwareReview

mergeAppRows and swapProviderRows return fresh maps that drop orphan ids and the replaced batch.

This requirement changed after its last recorded review, so approval is stale. Automated checks pass and 2/2 obligations are satisfied.
PriorityshallTypeguaranteeCategoryfunctionalComponentmenuAssuranceCFindingsLowworst open

Specification

The requirement exactly as authored — its complete prose text and, where present, the formal FRETish sentence it compiles to.

Description

mergeAppRows and swapProviderRows return fresh maps that drop orphan ids and the replaced batch. They list a duplicated incoming id once and never write into their input maps.

FRETish formula
when orphan_id_present | provider_reran the menu_model shall eventually satisfy orphans_dropped & id_listed_once & inputs_not_mutated
View full formal model

Rationale & tags

Why this requirement exists, and how it is categorised.

MenuModel.js lines 98-165; the in-place write they replace was occasionally dropped by the QML engine and compounded into duplicate launcher rows.

Verification & provenance

How this requirement was checked: the review trail, edit history, and the machine-analysis status terms (each ⓘ explains what it means).

Assurance levelC
Formalizationvalid
Realizabilityrealizable
Vacuitychecked_ok
Strategyfretish

Review

Status
in_review
Reviewer
Kimi Zero Warnings · AI agent
Reviewed
Sep 27, 2026, 21:25 UTC

History

Created
Sep 22, 2026, 13:34 UTC · Kimi Dogfood · AI agent
Modified
Sep 30, 2026, 20:37 UTC · Leonid Bugaev

Hazard review

Reviewed Sep 30, 2026, 07:44 UTCby agent:opencode-hazard-ccatalog v1.10.1
  • scenarioreviewedboundaryedge_case

    Worst case: a merge that mutates its input maps mid-render corrupts the live item set the view is drawing from (lost rows, duplicated entries compounding across runs) - the purity half of the contract closes it: both functions build fresh containers and only read their inputs. boundary: the zero cases are pinned - empty/missing maps and arrays normalize to fresh empties, an orphan id (order entry with no item) is dropped rather than carried, and a duplicated incoming id is listed once, first occurrence winning. edge_case: incoming row objects do get order (and providerMenu on the swap path) written onto themselves - the never-write half covers the input maps as the contract states, and call sites pass provider-fresh rows; a static item claiming another provider providerMenu is dropped when that provider reruns (config-owned data at the same authority), provider rows claiming static ids are skipped so static beats provider, and app rows are always replaced wholesale by mergeAppRows.

  • propertyrevieweddeterminismtotality

    determinism: both merges walk the given order then the given rows with a first-wins id policy, so identical inputs produce identical (items, itemOrder) pairs every run. totality: every (source, order, incoming) shape resolves to a defined fresh pair - orphan, duplicate, replaced-provider, and static-claim ids each have exactly one disposition, and no input combination falls through undefined.

  • structuralnot applicable

    Plain object/array construction with no aliasing of source containers into the result (entries are shared by reference intentionally - value records by convention); no eval, encoding, or pointer surface.

  • domainnot applicable

    In-memory map merges over user-owned menu data; no trust boundary is crossed and the traced functions carry no network, crypto, privilege, or wait surface.

Change history

Every recorded revision of this requirement's source file — newest first, each with its commit message and the diff for that change.

Review history

Human and AI-agent approvals of this requirement — the 'why was this approved' lineage, each with the reviewer's justification and the code it cites.

  1. Kimi Zero Warnings · AI agentApprovedSpec conformanceSep 27, 2026 · 5 days agoREVIEW-71

    Read mergeAppRows and swapProviderRows. Both build fresh nextItems/nextOrder maps: orphan ids (no item) and the replaced provider batch are dropped, a duplicated incoming id is listed once via the nextItems guard, and the input maps are never written. The disjunctive condition orphan_id_present | provider_reran covers both entry points; the three conjuncts map to the drop/dedup/fresh-map construction. Formula conforms to the code.

    Cited code (1)

Open known issues

Findings currently open against this requirement — issues its verification surfaced that are not resolved yet. Each links to the full finding.

Obligations

What this requirement must witness to be considered satisfied — the required evidence, and the tests that discharge each one.

1 obligation · 1 discharged

Browse the catalogue
Discharged

Operation either fully completes or has no effect.

Discharging evidence2/2 required witnessed
  • negativerequiredpresent
    Covered by 1 test
  • nominalrequiredpresent
    Covered by 1 test

Formula evidence

The formal formula behind this requirement, the variables it is written over, and the tests that exercise it (each term is explained inline).

FRETish formula

when orphan_id_present | provider_reran the menu_model shall eventually satisfy orphans_dropped & id_listed_once & inputs_not_mutated

Witnesses· 2 scenarios total

  • menu-test.sh:1
    exercises 2 condition scenarios

MC/DC truth table· 7 rows

Each row assigns the formula's conditions (T/F) and shows the Result— the formula's value for that input row, not a test pass/fail. A row proves a condition when flipping only that condition flips the outcome. The test that covers each row is linked.

Covereda test exercises this rowExempteda reviewed mcdc:ignoreNo-actionfalse-result row satisfied by designUncoveredneeds a covering test
#id_listed_onceinputs_not_mutatedorphan_id_presentorphans_droppedprovider_reranResultProvesCovering test
1FFFFFTorphan_id_present
2FFFFTFprovider_reran—
3FFTFFForphan_id_present—
4FTTTTFid_listed_once—
5TFTTTFinputs_not_mutated—
6TTTFTForphans_dropped—
7TTTTTTid_listed_once

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.

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
0
Files
2
Tests
1
At-risk contracts
0

Files to re-check (2)

  • Menu.qmlshell/plugins/menu/Menu.qml
  • MenuModel.jsshell/plugins/menu/MenuModel.js

Tests to re-run (1)

  • menu-test.shtest/shell.d/menu-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.

Sign in to discuss this with the proof team.Sign in