What the PR does. omacom/omarchy#14054 (head 09bfcda4) fixes #14052: an uninstall confirmation left up stayed over the next menu summon, and the Enter meant for the new prompt uninstalled the app. open() now runs cancelDelete() when the confirmation is up, before it opens the prompt or route (Menu.qml:29). The rest of the mirror is proof work (SW-REQ-261002-VJR1, reviews, the fixed known issue, harness inputs), replayed unchanged onto baseline 0c01de03, which carries upstream quattro product code at 393a43d4.
Risk rationale: A one-line guard reusing the dialog's own Cancel path, pinned by a test that fails on the baseline, 62/62 tests passing and a behaviour comparison whose 3 differences are all classified intended. Medium, not low, because 4 prevents_ready disclosures remain (the unapproved compat findings), Menu.qml has no engine-measured code MC/DC, and the fix is not driven through a live shell in this package. Not merge approval.
Read the full review (6 more paragraphs)
Is the fix verified? Audit verdict at the head: pass (run run-a0e7ec14). Test results current: 62 tests, 62 passed, 0 failed, 0 skipped (59 last round; the 3 new ones are the baseline's emoji-search adapter). All 32 changed requirements are observed_pass; 31 obligation cells observed_pass, 17 not_linked (no tagged test). The PR's test passes at the head (10 ok) and fails on the 0c01de03 Menu.qml (reviewer re-run). The 7 behaviour-comparison tests (harness + 6 inputs) passed; a re-run of the 6 inputs reproduces the 3 differences. Code-level MC/DC does not cover Menu.qml, so diffCoverage measures 0 changed decisions.
Compatibility. All four compat sources ran. 4 unapproved findings (prevents_ready): 3 differential (cf-58419914dab2f835, cf-64edcd0cc0114af1, cf-c57a38ab9ab3f83e), classified intended against VJR1: an input, route or select summon over the confirmation; base uninstalls on Enter, head removes nothing. 1 removed_behavior (cf-4d41f5e4cae16ee6): a static check in the out-of-scope proof-of-concept script that pinned the bug. test_diff and mcdc_diff report none. Auditor notes call all 4 acceptable (7 each); those are notes, not approvals.
Questions for a human. Approve or reject each compat finding. Does the next key reach the new prompt in a live shell (not run here)? Is dismissing the confirmation wanted for a same-route summon?
Traceability. Every in-scope changed file maps to a requirement (9/9); coherence single; no spec-gap candidates. 30 of 32 requirements are file-level code_changed matches. The known-issue evidence was captured on an earlier mirror and replayed; its hashes match this tree.
Not caused by this PR. coverage_unmeasured (the .events inputs are data), changed_files_out_of_scope, checks_skipped (13 by configuration) and effects_unavailable (QML) inform only.
Readiness is not_assessed; next decision human_judgement (compat_changes_unapproved), reviewer authority. Nothing here is an approval.
AI-generated review opinion derived from the evidence package. It is not a verdict, does not change readiness, and must be confirmed by a human reviewer.
11 context notes (info — not a finding)
- AI · confirmedUpstream 09bfcda4: a summon now cancels a pending uninstall confirmation before it opens the prompt or route (SW-REQ-261002-VJR1)
open() gains
if (root.deleteConfirmOpen) root.cancelDelete()(Menu.qml:29) before it dispatches to openDmenu() or openRoute(). Before, the only place the confirmation was cleared was onOpenedChanged (Menu.qml:91), and a summon over an open menu keeps opened true, so the dialog stayed up with Uninstall preselected and took the next Enter: the key meant for the new prompt removed the app's desktop file and cancelled the prompt (#14052). cancelDelete() is the dialog's own Cancel path (Menu.qml:860): it removes nothing. VJR1 is new proof work that states the rule; the executable line is the upstream line unchanged. - AI · confirmedSW-REQ-260922-8CQ4 (uninstall confirmation): text unchanged; trace re-review and derived verification state only
8CQ4's clauses are unchanged. Its trace was re-reviewed with citations (requestDeleteSelected, cancelDelete and confirmDelete are byte-identical; a summon now reaches the cancel arm from open()), and its derived verification_state moved from failing (on the baseline 0c01de03) to not_started because its only failing signal was the known issue this PR fixes. Proof work, not upstream.
- AI · confirmedThe other 30 changed requirements are file-level matches with trace re-review stamps only
Menu.qml carries a file-level fingerprint, so any edit to it stales every requirement traced to the file. All of them were re-reviewed with citations: only open() changed, and every other function is byte-identical (shifted by 3 lines). Their clauses and FRETish are unchanged (review.changes: code_changed). 50RE (open() dispatch) gains the new requirement in the same
// Implements:line; its dispatch on mode is unchanged. PRNV, CYB9 and 74BZ (route resolution) are traced to Menu.qml by the baseline's own// Implements:line above resolveRoute (Menu.qml:959), so the PR's edit to the file stales them too; resolveRoute and openRoute are untouched by the PR. - AI opinion — unverifiedThe behaviour-comparison harness and its 6 new inputs have observed outcomes (passed)
The harness test/bdiff/harness.mjs and the 6 seq-delete-confirm-*.events inputs trace to VJR1. The behaviour-diff run (219 inputs over 5 partitions, base 0c01de03, head 59a53289) executed each input at the base and the head with no harness error, and every difference it found is classified intended, so the package records each as passed (observedBy behavior_diff). The 3 summon inputs witness the summon-over-confirmation row; Enter, Escape and the Cancel button on the dialog itself are the controls and print identical output at base and head. The reviewer re-ran the head's harness (pinned, as test/bdiff/README.md requires) on the 6 inputs against the 0c01de03 and the head shell tree: the 3 summon inputs differ exactly as recorded (input digests match; base removes firefox and cancels the request; head removes nothing and the request gets its answer) and the 3 controls print identical output. All 12 outputs are byte-identical to the previous round's re-run.
- AI opinion — unverifiedCompat sources: all four ran; test_diff and mcdc_diff report no finding
review.compat checked test_diff (1 existing test file changed, 0 findings), mcdc_diff (87 decisions at the base, 88 at the head, 0 findings; the same counts as last round), removed_behavior (1 finding) and differential (219 inputs over 5 partitions, 3 findings). Same finding ids as the previous round. The 4 findings are unapproved; each is argued below. The package lists 28 auditor notes: the same acceptable-assessment note recorded 7 times for each of the 4 findings. They are notes for the maintainers, not approvals.
- AI opinion — unverifiedDisclosure changed_files_out_of_scope: the proof-of-concept script is outside the verification scope (informational)
pocs/menu-qml-static.sh is listed under review.codeChanges.outOfScopeFiles; review.codeChanges maps 9/9 in-scope changed files and no changed file is unmapped. coverage_unmeasured (informs) names the 6 new .events inputs: they are data for the behaviour comparison, not code with lines to cover.
- AI opinion — unverifiedAnalysis bounds: no change-effects analysis for QML
review.effects is absent (disclosure effects_unavailable), so call-path statements here come from reading the code. The test and the harness replay the real Menu.qml and ConfirmDialog.qml functions under node vm.
- AI opinion — unverifiedMirror composition: upstream change vs proof work
Evaluated 59a53289 = proof baseline 0c01de03 (upstream
quattroproduct code at 393a43d4) + 25e987c0 (upstream 09bfcda4: the 3-line hunk in Menu.qml and the new test; its diff equals the upstream PR diff except the hunk offset, re-checked againstgh pr diff, which is unchanged since the previous round) + 16 proof commits (VJR1 and its variables, spec conformance review REVIEW-261002-MV7M, evidence-backed trace re-reviews of the Menu.qml requirements, the static-check removal, the harness key events and 6 inputs, 9 annotation lines in the test that exist only on the mirror, known-issue evidence re-stamps and history ordering; 65aabc2e rebuilds KI-MENU-OPEN-LEAVES-CONFIRM from the baseline's record with this PR's changes re-applied, 37d7006a holds its evidence capture) + the empty record commit 59a53289 at the tip. Against the previous mirror 393ae3b8:git range-diffshows the upstream commit and all 16 proof commits replayed with identical patches. The mirror's diff against its baseline is byte-identical to the previous mirror's diff against 311d29c7, re-checked; the only tree difference between the two mirrors is the baseline move itself (6 files: proof.yaml, the emoji search's requirement and review, its MC/DC adapter test, one comment line in EmojiSearch.js, the README), none of which this PR or the files its test reads touch. Against 0c01de03 the only product file that changes is Menu.qml (the hunk plus the// Implements:line); upstream's Menu.qml is unchanged from 821ae589 (the PR's base) to 393a43d4, re-checked. Audit verdict at the head: pass (178 checks passed, 13 skipped by configuration, 28 not applicable);proof change freshnessof this package against 0c01de03: fresh (the base did not move). - AI opinion — unverifiedThe baseline carries the XTNR trace review for omarchy-menu.jsonc; this mirror leaves it unchanged
The baseline (since 311d29c7, unchanged in 0c01de03) carries the trace review for its file-level
Implements: STK-REQ-260922-XTNRon line 2 of default/omarchy/omarchy-menu.jsonc, and the mirror does not touch the XTNR record or the .jsonc file (empty diff against 0c01de03). Its citations still say what they claim: the jsonc annotation (line 2), the XTNR AC-001 acceptance tag in menu-acceptance-test.sh (line 12) and the XTNR nominal tag in menu-dispatcher-test.sh (line 48). XTNR is not among the package's changed requirements; suspect_clean and spec_lint_trace_review_evidence_current pass. - AI opinion — unverifiedKI-MENU-OPEN-LEAVES-CONFIRM: the record is unchanged from last round and consistent; small wording leftovers
Re-checked on this tree (the record's patch is the previous round's, replayed; the baseline move does not touch it). poc_quality notes: real_infrastructure (line 92) says the static PoC pinned CNF1 on the baseline and that this change removes the anchor; current_deployment_relevance (line 95) scopes anchor CNF1 to the baseline and says open() now cancels; its claim that upstream Menu.qml has not changed since 821ae589 holds through 393a43d4. risk is correctness (line 11), matching the 3 Oct severity justification (line 58); severity medium agrees with honest_severity and customer_impact. remediation (line 19) and the note (line 21) name PR #14054 and VJR1. Also consistent: status fixed; affected requirements add VJR1; pocs/menu-qml-static.sh is no longer an evidence manifest; reproducer_command is the PR's test, bound by its
Reproduces:marker (test line 93), and the tripwire mutation names exactly the guarded call at Menu.qml:29. Leftover (wording only, no gate fails on it): the description, kept from the baseline, still cites(anchor CNF1)in the present tense, an anchor that no longer exists on this tree; and release_disposition ship_with_known_issue is moot once fixed. Not edited by this review. - AI opinion — unverifiedNote: the PR description's verification line still names the previous evaluation
The upstream PR body's 'Independent verification' line cites the evaluated merge 393ae3b on
quattroat 393a43d with 59 tests passed. This package evaluates 59a53289 on baseline 0c01de03 (same upstream code) with 62 passed, 0 failed, 0 skipped, plus the same 7 behaviour-comparison tests. The 3-test difference is the baseline's emoji-search adapter, not this PR. Wording only.