mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8289] [Design] Surface ephemeral annotation loss when switching analysis providers #6527
Open
opened 2026-11-01 21:11:56 +00:00 by bsakaguchi
·
8 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
morluto/rea#6527
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @morluto on GitHub (Oct 31, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/8289
Before submitting
Decision needed
How should an agent discover that explicitly switching providers will retire an edited ephemeral Ghidra database and discard its live annotations, including when the next provider later fails on first use?
Context and evidence
Real MCP on macOS arm64, Ghidra 12.1.4, Kuna 1.986 and REA
b43c329:_evaluatetoaudit_switch_testusingannotate_native_function. The renamed selector works._evaluateworks again. The switch response contained the target identity, with no transition-specific annotation-loss notice.get_evidence_bundle(detail:"summary")still listed the completed annotation record. It is historical Evidence, not a restored edited database.The annotation tool description and its Evidence already say edits are ephemeral and discarded on close;
open_binarysays same-target/same-profile reopen retains edits. The question is whether the fact that a provider switch closes that database is sufficiently visible at the decision point. In this run,binary_session(detail:"complete")after the rename exposed no field identifying unsaved annotation state.Two controlled failure boundaries: if a test-only Kuna wrapper fails its initial
--versionprobe, the switch returns an error and the Ghidra rename remains available. If the wrapper allows the first version probe but fails the next one,open_binarysucceeds; the first Kuna operation fails, and reopening Ghidra restores the original name rather than the rename. This is fault injection, not a claim about natural failure frequency. It is not a failedopen_binaryrestoration test.Source inspection shows a different-target/profile transition retires the previous client; the relevant source was unchanged at main
23de10b. The target SHA-256 remainedffad1b70c6a5a7ef3f7c3f59126be516520210777d949b35e97c9067f272aa2d.Expected interaction with targets
Read an existing binary, use existing ephemeral Ghidra metadata edits and provider switching. No target execution or mutation is proposed.
Boundary details (optional)
Keep same-profile reopen semantics, caller-selected provider and evidence history. Do not claim an Evidence bundle or immutable snapshot restores a live edited project. Avoid imposing an approval workflow without a product decision. Existing project sessions have different read-only semantics.
Options and tradeoffs
Consider accurately surfacing edit lifetime and impending retirement in session state and the open contract, a transition result describing the retired session, or a separate non-destructive way to retain edited work. Compare these with #8165's checkpoint and #6405's annotation export/replay proposals. A post-switch notice alone cannot prevent a surprise; an implicit provider switch or silent replay would need its own semantics and authority review.
Verification available so far
I have a prototype or observed results.
Success criteria and open questions
Exercise same-profile reopen, successful provider and target switches after edits, failure before and after retirement, cancellation, and cleanup failure using real CLI/MCP and controlled boundaries as applicable. Check that the user can identify what remains recoverable and that any prior Evidence remains attributable. No autonomous agent-selection study has been run.
References
Related: https://github.com/morluto/rea/issues/8165 and https://github.com/morluto/rea/issues/6405
Kuna 1.990 provider-switch control
On the 1.990 validation branch and macOS arm64, separate compact/full MCP sessions opened an owned arm64 Mach-O in real Ghidra 12.1.4 and renamed its function at
0x100000328toaudit_switch_1990withset_address_name. Reopening the same target with Ghidra preserved the rename. Explicitly switching to real Kuna 1.990 and then back to Ghidra returned successful open responses; the renamed selector no longer resolved, while the original_audit_valueselector resolved to the same address. The provider-switch result contained target identity and no transition-specific edit-loss notice. The original rename Evidence remained exactly present in the retained bundle. The target SHA-2560e0ecf82c96e4918ee2ca1287dc25513d8fd13d5ab7fa5b98db00ad342f03930remained unchanged. This repeats the known ephemeral-session behavior on one fixture and the newer provider version; it does not establish agent behavior, cancellation or a durable edited-database recovery.Invalid target switch control
On the same Ghidra 12.1.4 / Kuna 1.990 validation setup, separate compact and full MCP sessions renamed
0x100000328toaudit_switch_1990, then attempted to open a nonexistent target with Kuna selected.open_binaryreturnedtarget_unavailablewith a path-specific recovery message, and the renamed Ghidra selector still resolved afterward in each session. The source target SHA-256 stayed unchanged. This tests a target-validation refusal before retirement, not cancellation, cleanup failure, or failures after a provider has been replaced.@morluto commented on GitHub (Oct 31, 2026):
For maintainer visibility: @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0
@morluto commented on GitHub (Oct 31, 2026):
Controlled failed-open restoration follow-up, separate from the earlier first-use failure: in a disposable copy of the built MCP runtime, a one-line test injection returned a tagged cancellation at the replacement client's health check, after REA retired the previous client. The public MCP session still used real Ghidra 12.1.4: the rename was observed before the switch and after same-profile reopen. The Kuna switch returned
cancelledwithcleanup:complete;binary_sessionthen reported the original Ghidra binding open with no cleanup pending. But the renamed selector was no longer found and the original name was present. The completed annotation record remained in retained Evidence, and the target hash stayed unchanged.This tests the restoration path under an injected transition failure, not a naturally occurring cancellation or a transport-cancellation race. The injected runtime is not production code. An earlier setup attempt failed to load Ghidra scripts due to a symlinked test-runtime path and is excluded; copying the bridge scripts into that disposable runtime allowed the real annotation to complete.
Source inspection:
BinarySession.#restorecreates a fresh prior-provider client, while the existing synthetic composition testcloses a failed candidate and reopens the previous targetchecks target/client lifecycle, not preservation of metadata within an edited real Ghidra session. This makes the distinction between reopening the target and restoring the edited state concrete. A regression should preserve that distinction, report the actual transition outcome, and retain the existing cancellation and cleanup guarantees; it should not infer a safe editable checkpoint from an Evidence bundle.@morluto commented on GitHub (Oct 31, 2026):
Evidence-retrieval control: on both the unmodified successful provider switch and the separately injected failed-open restoration,
analyze_function({procedure:"0x100000430",detail:"complete"})returned a renamed dossier before retirement and the original_evaluatedossier afterward. The post-restoration dossier reused the same Evidence ID as the pre-edit observation; the edited dossier had a different ID.inspect_analysis_viewusing the edited dossier's retained ID still returned the renamed pseudocode.get_evidence_bundle(detail:"summary")listed both names and IDs for the same subject/provider/profile/address, without an explicit current-vs-historical flag in these rows.This is useful preservation, not a stale live dossier on this fixture; the requested current read reflected the fresh Ghidra session. It does leave the caller to retain the sequence or re-query when deciding which observation reflects the current live database. The two runs closed successfully and the target hash stayed unchanged. The failed-open control used the test-only injected cancellation described above; the successful-switch control used the unmodified runtime.
@morluto commented on GitHub (Oct 31, 2026):
Agent guidance control: the packaged
Function annotations in Ghidrasection says changes are session-scoped and later MCP calls observe them until close; it also distinguishes annotation Evidence from comparison inputs and tells callers to export needed Evidence. In public CLI/MCP guidance search, the queryGhidra annotationsfinds that section first. The section does not explicitly say that anopen_binaryprovider switch retires the active database. A query phrasedswitch provider annotationsinstead matches a broad parent whose terms occur under different subsections; see #8290 for the separate search-design question. This is guidance/source inspection and scripted retrieval, not an autonomous agent trial.@morluto commented on GitHub (Oct 31, 2026):
Manual recovery control, including an omitted name, regular-comment clear and inline comment, is recorded in https://github.com/morluto/rea/issues/6405#issuecomment-6541990498. It required selecting a specific retained record and explicitly reapplying its complete readback; this is not automatic replay or a general checkpoint.
@morluto commented on GitHub (Oct 31, 2026):
Real MCP transport-cancellation control at the retirement boundary: a disposable copy of the built MCP runtime added only a test barrier immediately after the prior provider client successfully closed and before the existing cancellation check. A real Ghidra 12.1.4 session renamed
_evaluate; the TypeScript MCP SDK then requested an explicit switch to real Kuna 1.986. Once the barrier confirmed retirement, the SDK aborted the request. The SDK rejected with the caller's cancellation and the barrier independently observed the server request signal as aborted. REA's existing cancellation/restoration code then ran;binary_sessionreported Ghidra open andcleanup_pending:false, the renamed selector was absent,_evaluateresolved, one annotation Evidence record was still retained, andclose_binarysucceeded.A separate barrier control released the same boundary without cancellation: the switch succeeded and switching back also returned the original name, as expected for an ephemeral database. Both used the same source-owned Mach-O; its SHA-256 stayed unchanged. The barrier changes scheduling to make this exact point reproducible, so this is not a frequency measurement, a claim about cancellation during other cleanup stages, or an unmodified-runtime race reproduction. Unlike the previous injected error, this test sent a real SDK/MCP cancellation and observed the server-side signal. The SDK rejection itself does not expose the server's final cancelled response.
@morluto commented on GitHub (Oct 31, 2026):
Positive boundary control: on a source-owned RV64 ELF in real REA
b43c329/ Ghidra 12.1.4 MCP, I renamed a function in a fresh ephemeral session and then requested the same target with Kuna, which is not admitted for RISC-V.open_binaryreturnedcapability_unavailable; afterward the Ghidra session remained open with no cleanup pending, the edited selector still resolved, and a typed global READ remained accessible. The target hash stayed unchanged; the session closed normally.This is a target-admission rejection before a successful provider transition, not evidence that edits survive the successful Ghidra-to-Kuna switch reported here. It is a useful preservation control for any transition/recovery regression. More context: #8195.
@morluto commented on GitHub (Oct 31, 2026):
Different-target switch with the same provider
I exercised the outstanding target-switch case through real stdio MCP on REA
b43c329df779708e43ae297f498a844e45d9c923and Ghidra 12.1.4. After renaming a function and adding an entry comment in owned target A's ephemeral database, I opened a different owned target B with Ghidra, verified a function on B, and reopened A. All opens succeeded; the edited selector was then absent and A's original selector succeeded. The open response contained the selected target's identity without a transition-specific annotation-loss notice. Both targets' hashes were unchanged, neither executed, and close succeeded.While B was active, Evidence summary still found A's annotation by operation and identified A's digest; the complete retained bundle returned its historical name and comment. Thus switching targets preserves that recorded observation in this run, not the live Ghidra edit. I opened #8307 for the separate question of retrieving one selected historical annotation without transferring the whole bundle. This is one successful Ghidra-to-Ghidra target transition, not a cancellation, cleanup-failure or autonomous-agent test.