Skip to content

fix: prevent stale-index and cross-app semantic recovery; release v0.7.24 - #288

Merged
avifenesh merged 1 commit into
mainfrom
fix/semantic-recovery-snapshot-scope
Oct 24, 2026
Merged

avifenesh merged 1 commit into
mainfrom
fix/semantic-recovery-snapshot-scope

Conversation

@avifenesh

@avifenesh avifenesh commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator

A semantic AT-SPI recovery could replace the cached tree without showing the caller its new indices, or rebind a name-only target after its original owner disappeared.

Keep refreshed nodes local, invalidate cached indices before accepted recovery resolution/dispatch, and require fresh get_app_state before indexed actions. Pin explicit/observed PIDs, require a matching observed window/backend and root-PID link when recovering through a window, and reject unproved ownership. Actions are never replayed after dispatch. Prepare 0.7.24 so the installed standalone server receives the same correction as the embedded sync.

Validation: the original stale-index and cross-app regressions failed before; additional observed-PID rollover, unobserved window, backend-collision and missing-PID cases also failed before correction. All 21 recovery tests and 524 library tests pass (2 subprocess harness entries ignored); auxiliary/integration targets pass. All 33 Pi tests pass against the actual server; all-target Clippy, formatting, generated catalog, 18 SDK Zod schemas, MCP safety, plugin install/tamper/cache tests and agnix pass.

A fresh review of the complete release patch reports no remaining blockers after the identity cases were corrected. Real GTK/Qt owner-loss behavior was not newly exercised; the regression tests run the production cache/selector/dispatch paths with controlled AT-SPI calls.

Thanks @ilysenko for the review that found these cases in the embedded sync. Refs ilysenko/codex-desktop-linux#1620 (review).


Note

Medium Risk
Changes core desktop action targeting and cache semantics; incorrect recovery could click the wrong control, but the patch narrows recovery to verified PID/window identity and forces fresh observation after recovery.

Overview
Release v0.7.24 tightens semantic AT-SPI recovery in perform_action so a one-shot retry after a stale target cannot silently retarget the wrong UI or leave agents using outdated element_index values.

Recovery now requires provable identity from the last get_app_state snapshot (observed PID and/or exact window_id + compositor backend). Name-only scopes, unobserved window_id, PID rollover, and backend/window mismatches are rejected instead of rebinding to another app’s tree. Refreshed recovery trees stay local to the retry: the server clears the cached snapshot before dispatch and tells callers to call get_app_state again before further index-based actions. action_recovery_target_pid no longer lets freshly discovered window PIDs override the originally scoped process.

Packaging and docs are bumped to 0.7.24 (Cargo/npm/plugins, changelog, Pi generated catalog, perform_action tool text, and skill procedure notes). New regression tests cover stale-index misuse, cross-app rebinding, and identity edge cases.

Reviewed by Cursor Bugbot for commit 6278944. Configure here.

@cursor

cursor Bot commented Oct 24, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: 0fc878f5-ccb6-42bc-a793-0a894d058441)

@revuto-review revuto-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is an auto review done by revuto.


Revuto completed the review and found no evidence-backed concerns.

@avifenesh

Copy link
Copy Markdown
Collaborator Author

Independent complete-patch review is finished: no remaining concrete blockers. Review reproduced and corrected observed-PID rollover, unobserved/exact-backend window identity and missing root-PID proof in addition to the original stale-index/name-only cases.

Verified 0.7.24 manifest/launcher/version parity, mirrored skills and generated catalog against the built server. Before/after receipts are recorded locally; final 524 library tests, 21 recovery cases, 33 real-server Pi tests, auxiliary suites, Clippy/fmt/schema/MCP/plugin/agnix checks pass. Patch digest: 2fdc0b4217275106f5a4e2083350b045e836c44fd5544cd903326c339d88a614.

Thanks @ilysenko for catching the index and recovery-scope defects.

@avifenesh
avifenesh merged commit e15efb8 into main Oct 24, 2026
24 checks passed
@avifenesh
avifenesh deleted the fix/semantic-recovery-snapshot-scope branch October 24, 2026 13:14
@avifenesh

Copy link
Copy Markdown
Collaborator Author

Released 0.7.24. All 18 publication jobs passed; all 12 assets and registry digests were verified. Updated local binaries, five npm globals and the Codex plugin. Ten fresh MCP probes report 0.7.24 and 18 tools. The isolated Hermes server was reconnected and reports 0.7.24. Active chat-owned transports remain for their hosts to reconnect.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant