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 020a8c0Sep 29, 2026, 09:27 AMquattroBack to current
All requirements
RequirementSW-REQ-260927-66FWSoftwareReview

When the JSONC stripper sees a comma, it drops the comma only when the comma sits outside each string literal.

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

Specification

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

Description

When the JSONC stripper sees a comma, it drops the comma only when the comma sits outside each string literal. The next non-whitespace character after the comma must be a closing brace or bracket. A comma inside a string literal is data and stays unchanged.

FRETish formula
the menu_model shall always satisfy trailing_comma_dropped <=> (!comma_in_string & next_char_closes_json)
View full formal model

Rationale & tags

Why this requirement exists, and how it is categorised.

MenuModel.js stripJsonc uses a string-aware single-pass scanner. The pre-fix string-blind regex corrupted labels such as "x, ]y" while the parse still succeeded.

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 Fix Jsonc Refresh · AI agent
Reviewed
Sep 27, 2026, 19:16 UTC

History

Created
Sep 27, 2026, 15:24 UTC · Leonid Bugaev
Modified
Sep 27, 2026, 19:20 UTC · Kimi Fix Jsonc Refresh · AI agent

Hazard review

Reviewed Sep 27, 2026, 19:20 UTCby agent:kimi-fix-jsonc-refreshcatalog v1.10.0
  • scenarioreviewedmalformed_inputboundaryedge_case

    malformed_input: JSONC trailing commas are legal-but-non-JSON input the stripper must normalize WITHOUT touching string-literal bytes. Both FMEA modes (label corruption; silently mutated user-privilege command, e.g. mv f{.bak,} / awk '{print $1, }') lived here pre-fix. The equivalence formula and witnessed rows now forbid them. boundary: the stripper drops a comma at EOF with no closing byte (lenient row, witnessed). edge_case: escaped quote before comma+closer inside a string ('a", ]b') witnessed verbatim.

  • propertyrevieweddeterminism

    The scanner is a single left-to-right pass with no environment, ordering, or timing inputs. Identical bytes always strip identically. A 20k-case differential fuzz against an independent reference scanner found 0 mismatches (2026-09-27).

  • domainnot applicable

    No domain workload tags (HTTP/crypto/IPC frameworks); the component parses a local user-authored config file into a menu model.

  • structuralnot applicable

    Implementation is GC'd JavaScript (QML JS engine). No manual memory, pointer arithmetic, binary framing, or format strings exist here. The structural catalog targets C-family hazards that cannot exist here.

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. UnknownApprovedSpec conformanceSep 27, 2026 · 6 days agoREVIEW-21

    Equivalence formula matches the stripJsonc scanner: a comma is dropped iff it sits outside every string literal and the next non-whitespace byte is a closing brace or bracket; string-literal commas are copied verbatim. The three predicate-violated rows are unreachable in a correct build: the scanner drops only before }/], always drops there when outside a string, and never drops inside a string.

    Cited code (2)

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

Behavior when inputs are syntactically or structurally invalid.

If it were violatedMedium

FMEA mode (a): the stripper silently corrupts a label like "x, ]y" to "x ]y" while the parse still succeeds - the user sees a wrong row name. FMEA mode (b), the realistic payload: an action such as mv f{.bak,} or awk '{print $1, }' loses its in-string comma to the string-blind strip. The MUTATED command then runs with the user's full privileges on row activation. mv loses its brace expansion and targets a literal filename; awk silently changes output format for downstream pipelines. No error surfaces in either mode because JSON.parse accepts the stripped text; the corruption is invisible until the command misbehaves. Fixed on this branch by the string-aware scanner; the grading records the pre-fix worst case this requirement now forbids.

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

the menu_model shall always satisfy trailing_comma_dropped <=> (!comma_in_string & next_char_closes_json)

Variables

NameTypeDirectionDescription
comma_in_string—The comma sits inside a JSON string literal.
next_char_closes_json—The next non-whitespace character after the comma is } or ].
trailing_comma_dropped—The comma is dropped from the stripped JSON before parsing.

Witnesses· 2 scenarios total

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

MC/DC truth table· 5 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
#comma_in_stringnext_char_closes_jsontrailing_comma_droppedResultProvesCovering test
1FFFTnext_char_closes_json
2FFTFtrailing_comma_droppedExempted · defensive — the scanner drops a comma only when the next non-whitespace byte is a closing brace or bracket; a drop before any other byte needs a broken string copy (reviewed: REVIEW-21)
3FTFFnext_char_closes_jsonExempted · defensive — a comma outside every string whose next non-whitespace byte closes JSON is always dropped, by the pre-fix regex and by the string-aware scanner alike; keeping it needs a broken build (reviewed: REVIEW-21)
4FTTTcomma_in_string
5TTTFcomma_in_stringExempted · defensive — the scanner copies string-literal bytes verbatim, so an in-string comma is never dropped; dropping one is the pre-fix defect this branch removes (reviewed: REVIEW-21)

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

If you change this

Requirements
0
Files
1
Tests
1
At-risk contracts
0

Files to re-check (1)

  • 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