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 onto baseline 1e433732, which carries upstream quattro product code at 035ce29f.
Risk rationale: A one-line guard reusing the dialog's own Cancel path, pinned by a test that fails on the baseline, 69/69 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-2f01c127). Test results current: 69 tests, 69 passed, 0 failed, 0 skipped (7 more than last round, from the baseline move). 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 1e433732 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 that pinned the bug, in the out-of-scope PoC script. test_diff and mcdc_diff report none. Auditor notes call all 4 acceptable; 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 (no effects analysis for QML). 30 of 32 requirements are file-level code_changed matches. The known issue is fixed, bound to the PR's test, with evidence captured on this mirror; upstream #14052 awaits a response.
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.
12 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 1e433732) 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 1e433732, head fe3afbf4) 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 1e433732 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 (92 decisions at the base, 93 at the head, 0 findings; both counts are 5 above last round's, matching the baseline's new code-level MC/DC target for the lock's FingerprintModel.js, and the base-to-head step is still 1), 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.
evidence package showlists 32 auditor notes: the same acceptable-assessment note recorded 8 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, and the scope approximations note that no uncodified connection can be detected without call-level impact: the absence of spec-gap candidates proves nothing here. Per-test coverage attribution (which test exercises which changed line) is also not available for this project. 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 fe3afbf4 = proof baseline 1e433732 (upstream
quattroproduct code at 035ce29f) + 34b29714 (upstream 09bfcda4: the 3-line hunk in Menu.qml and the new test; its patch equalsgh pr difftoday, and the PR head has not moved) + 17 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-captures and history ordering) + the empty record commit fe3afbf4 at the tip. Against the previous mirror 59a53289,git range-diffshows the upstream commit and 7 proof commits replayed with identical patches; the rest differ only in known-issue evidence stamps and history. Per file, the mirror's diff against its baseline equals the previous mirror's diff against 0c01de03 for every product, test, harness and spec file; only 10 known-issue and evidence records differ (re-captures after the replay, and the baseline's upstream reference kept). Menu.qml and ConfirmDialog.qml are the same blobs at 821ae589 (the PR's base), 393a43d4 and 035ce29f; upstreamquattrois now 3 commits past 035ce29f (65c0f330), none touching shell/plugins/menu or ConfirmDialog.qml. Audit verdict at the head: pass (178 checks passed, 13 skipped by configuration, 28 not applicable);proof change freshnessof this package against 1e433732: fresh (the base did not move). - AI opinion — unverifiedXTNR's trace review for omarchy-menu.jsonc is the baseline's; this mirror leaves it unchanged
The upstream refresh added the Install/Remove > Service > Microsoft rows to default/omarchy/omarchy-menu.jsonc, and the baseline 1e433732 re-reviewed the file-level
Implements: STK-REQ-260922-XTNRon line 2 for it. The mirror does not touch the XTNR record or the .jsonc file (empty diff against 1e433732). 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: fixed, bound to the PR's test, carries the upstream reference; small wording leftovers
Re-checked on this tree. status fixed (line 27); affected requirements add VJR1; 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; pocs/menu-qml-static.sh is no longer an evidence manifest. remediation (line 19) and the note (line 21) name PR #14054 and VJR1. New this round: the record keeps the baseline's upstream_report (line 108): #14052, response pending since 4 Oct (line 116, 'No maintainer response yet. Open fix PR(s): #14054.'). poc_quality notes: real_infrastructure (line 132) says the static PoC pinned CNF1 on the baseline and that this change removes the anchor; current_deployment_relevance (line 135) says Menu.qml has not changed since 821ae589, which holds through 035ce29f. risk is correctness (line 11), matching the 3 Oct severity justification (line 59); severity medium.proof known-issue check --id KI-MENU-OPEN-LEAVES-CONFIRM: clean. Leftovers (wording only, no gate fails on them): the description (line 3), kept from the baseline, still cites(anchor CNF1)in the present tense, an anchor that no longer exists on this tree; release_disposition ship_with_known_issue (line 26) is moot once fixed. Not edited by this review. - AI opinion — unverifiedKI evidence: the red-reproducer run is now captured on this mirror's own history
proof/evidence/ki-menu-open-leaves-confirm.yaml records profile known_issue_reproducer, command
bash test/shell.d/menu-uninstall-confirm-test.sh, status pass, observed_result known_issue_not_reproduced, polarity RED reproducer, requirements 8CQ4 and VJR1, with the tripwire mutation in its input set. Its revision 4bc75950 is an ancestor of fe3afbf4 (a commit of this mirror); between it and the tip only known-issue records change, not Menu.qml, ConfirmDialog.qml or the test. Last round's gap (a capture from an earlier mirror, replayed) is closed. Its freshness hash for the test matches this tree (sha256:a49e7e88...), known_issue_reproducer_consistent and known_issue_reproducer_present_and_resolves pass, and the reviewer re-ran the test on this tree (10 ok; fails on the 1e433732 Menu.qml). - 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 59a5328 on
quattroat 393a43d with 62 tests passed. This package evaluates fe3afbf4 on baseline 1e433732 (upstream 035ce29f) with 69 passed, 0 failed, 0 skipped, plus the same 7 behaviour-comparison tests. The 7-test difference comes with the baseline move, not this PR. Wording only.