mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8169] [Bug] Ghidra project digest mismatch is hidden behind generic provider startup failure #4694
Closed
opened 2026-10-31 00:52:32 +00:00 by bsakaguchi
·
7 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#4694
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 30, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/8169
Before submitting
Area
MCP or agent integration
Observed behavior
Opening a selected binary with
REA_GHIDRA_PROJECT_PATHpointing to a project imported from a different binary returns a normalopen_binarytarget binding; the first Ghidra-backedprocedure_pseudo_codethen fails. The error isexecution_failure, with the generic instruction to runrea doctor. The actual cause,Ghidra imported-byte digest does not match the admitted target, appears only inside captured Ghidra process output.close_binarysubsequently succeeds.Reproduction
On macOS arm64, use Ghidra 12.1.4 to import and save a self-built Mach-O in a project. Configure
REA_GHIDRA_PROJECT_PATHandREA_GHIDRA_PROGRAM_NAMEfor that project; start an REA stdio MCP server.open_binarya different self-built Mach-O usingprovider_id: ghidra, then requestprocedure_pseudo_codeby address. The mismatch was rejected once in this test. Target A SHA-256 wasc9ef0167227d5901b84a70ede5fb212caaa68574252c6da29b295faff0971f73; project B was imported from SHA-256ffad1b70c6a5a7ef3f7c3f59126be516520210777d949b35e97c9067f272aa2d.Expected behavior
Preserve the integrity refusal and expose the verified target/project import digest mismatch as the top-level actionable reason, with guidance to select the matching target or project.
rea doctorchecks installation readiness and cannot choose the intended matching project. Do not infer a mismatch from generic process exit or human-readable log text without a structured producer signal.Impact and scope
The mismatch was safely refused; the issue is attribution and recovery UX. Reproduced on one macOS fixture and one stdio session; other platforms and releases are unverified.
REA version
Source checkout
47fa6ab3795d547207001ffb01643c0aa39dcad8; server version 6.8.0.Runtime and platform
Node 24.22.1, macOS arm64, Ghidra 12.1.4, JDK 21.
Target and artifact context
Two self-built arm64 Mach-O binaries and a local Ghidra project.
Interface
MCP
Earliest failure stage
Native analysis or reconstruction
Relevant output or evidence
Observed top-level error:
execution_failure, messageAnalysis could not complete. Run rea doctor ...,details.diagnostics.failure_message: Ghidra exited before bridge startup. Captured process output containsIllegalStateException: Ghidra imported-byte digest does not match the admitted targetfromReaGhidraBridge.java. Related: #1048 and #2147 (existing-project support and identity binding).A follow-up on one MCP connection repeated the mismatch, called
close_binarysuccessfully, then opened the matching binary and project.procedure_pseudo_codereturned the expectedadjustfunction; the final close succeeded. This verifies that recovery sequence on this fixture, not failure attribution on other hosts.Controlled bridge failure and doctor follow-up
On REA
46c13b998, Ghidra 12.1.4 and macOS arm64, a separate isolated checkout deliberately replaced its bridge script with one that throws a known exception. This was an injected fault, not a naturally observed broken installation. Real stdio MCPopen_binarybound an owned ELF, thenlist_proceduresreturnedexecution_failure; its captured diagnostics contained the injected exception and GhidraREPORT SCRIPT ERROR, even though the Ghidra process exit code was zero. The normalized error response serialized to 19,292 UTF-8 bytes; this is a size observation, not a token or latency measurement. REA removed the owned runtime and the target digest remained unchanged.Following the error advice,
rea doctor --provider ghidra --target <same ELF> --format jsonreturned scopedhealthy: trueand did not detect the injected bridge failure. Doctor checks installation and target readiness, not execution of this bridge; its result is not contradictory. This control is a different failure from the project digest mismatch above. It illustrates why startup recovery needs a truthful separation between setup checks and observed execution failure, while preserving captured diagnostic evidence. Do not classify arbitrary Ghidra log lines as trusted structured reasons.Existing fix: mismatch and same-connection recovery
On unmodified #8379 head
0212145b0feb1ee8267af53e19c727d89d0ffba0, real Ghidra 12.1.4 stdio MCP with compact and full profiles selected an owned project imported from one Mach-O while opening a different owned Mach-O. The first pseudocode request returnedconfiguration_invalid, named the imported SHA-256 mismatch at the top level, and advised selecting the matching target or project. After closing that failed binary, I opened the matching target on the same MCP connection and read the project-authored function name successfully. The selected project files and both target hashes (510a23fc3c152175b9977130b3b1711d580e47d22a085cdee6a4e0c9dea2c51aand0e0ecf82c96e4918ee2ca1287dc25513d8fd13d5ab7fa5b98db00ad342f03930) remained unchanged. This is a mismatch control on one host, not a test of missing import identity or all startup failures.Existing fix: CLI mismatch control
On unmodified #8379 head
0212145b0feb1ee8267af53e19c727d89d0ffba0, realrea decompile --provider ghidra --format jsonagainst the mismatched target and saved project returned exit 1 andconfiguration_invalid, identifying the imported SHA-256 mismatch and offering target/project selection guidance. A separate invocation with the matching target succeeded and returned the project-authored name. The project and both target hashes (510a23fc3c152175b9977130b3b1711d580e47d22a085cdee6a4e0c9dea2c51a,0e0ecf82c96e4918ee2ca1287dc25513d8fd13d5ab7fa5b98db00ad342f03930) remained unchanged. This is one macOS/Ghidra mismatch control, not a missing-identity or broad platform test.Packed-program restoration mismatch control
On macOS arm64 and real Ghidra 12.1.4, I imported an owned
.gzfprogram into a new expanded project, then selected a different source-owned Mach-O. In both compact and full stdio MCP profiles, #8820 headf3c0336c5bound the target lazily, and the first pseudocode request returnedexecution_failurewith generic doctor guidance; the underlying diagnostics contained the digest mismatch. With the same project and targets, unmodified #8379 head0212145b0returnedconfiguration_invalid, explicitly identified the imported SHA-256 mismatch, and advised selecting the matching target or project without fresh-import fallback. After closing each failed selection, reopening the matching target on the same connection succeeded. Successful outputs validated against their advertised schemas. Both target hashes and all regular source-project files stayed unchanged; neither executable was run.This adds the explicit
.gzf-to-expanded-project route to the earlier selected-project controls. It does not establish missing-digest behavior, Windows transport, or cancellation behavior for real Ghidra.@morluto commented on GitHub (Oct 31, 2026):
Looping in @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0 for visibility on the Ghidra, Kuna, and REA tool-design investigation.
@morluto commented on GitHub (Oct 31, 2026):
Additional real-provider control on main
e6d061897, macOS arm64 and Ghidra 12.1.4: in a new disposable project imported from the originalworkflowMach-O, I explicitly cleared the program's recorded executable SHA-256 through a headless Ghidra script. A separate read-only headless process of the saved project reportedgetExecutableSHA256() = unknown. This is a deliberately constructed unknown-identity case, not a claim about its frequency in ordinary projects.With that project selected and the same original binary, real MCP
open_binarysucceeded but the first query failed with genericexecution_failure; captured bridge output saidGhidra imported-byte digest does not match the admitted target. A separate selected project with a known digest from a different binary produced the same public error and captured bridge message. A matching known-digest project and target succeeded. Both projects and both input files retained their content hashes during the REA calls, and all sessions closed.The bridge currently groups null and unequal values; in this Ghidra version, clearing the value read back as the string
unknown, which also takes the unequal branch. The refusal remains appropriate when identity cannot be established, but a structured recovery should distinguish identity unavailable from a verified mismatch rather than promoting the common log text as proof that two known digests differ. Project selection must still remain explicit; no automatic fresh-import fallback is implied.@morluto commented on GitHub (Oct 31, 2026):
Real CLI recovery control on REA
b43c329, Ghidra 12.1.4 / JDK 21:REA_GHIDRA_PROJECT_PATHselected a caller-owned project containingworkflow; the requested target was a different source-owned arm64 Mach-O.rea decompile <different-target> entry --provider ghidra --format jsonexited 1 with genericexecution_failureand advice to runrea doctor. Captured Ghidra diagnostics contained the imported-byte digest mismatch; no pseudocode was returned.rea doctor --provider ghidra --target <different-target> --format jsonreturned exit 0 andhealthy:trueboth before and after the failed decompile: its target and explicitly scoped Ghidra checks passed. This is installation/target-format readiness, not proof the selected project contains that target. The report also hadenvironment_healthy:falsebecause other unrequested integrations/registrations were missing. Running the exact genericrea doctor --format jsonreturned exit 1 for those broader environment findings, but did not identify the project/target mismatch; its Ghidra installation inspection was available.Using the same selected project with its matching
workflowtarget, the same CLI decompile succeeded. The two target hashes and all 10 original project-file hashes remained unchanged; neither target was executed. This establishes that the suggested doctor path did not diagnose this fixture, not that doctor promises or should perform deep project admission. A structured mismatch from the producing bridge remains the more precise recovery path.@morluto commented on GitHub (Oct 31, 2026):
Side-by-side CLI control on REA
b43c329/ Ghidra 12.1.4, with scopedrea doctor --provider ghidra --target <target>followed byrea decompilefor each case:configuration_invalid, names the missing program and selection settingexecution_failure/ doctor advice; captured bridge output says digest mismatchThe absent-digest project's saved value was independently checked as
unknownin the earlier headless control linked above. Refusing an unverified identity is correct; an unavailable identity should remain distinct from a known unequal digest when designing any structured startup signal. The existing typed missing-program recovery shows the UX distinction the agent can already receive in a different failure mode; this does not meandoctorcurrently promises deep project verification.Both target hashes and all recorded original project files (10 in the matched project, 9 in the cleared-digest project) were unchanged; the targets were not executed. One host and fixture family only.
@morluto commented on GitHub (Oct 31, 2026):
Headless identity check and project-copy control
I tested a possible manual diagnosis with Ghidra 12.1.4 itself, on disposable copies of the two owned projects from the earlier matrix. An
analyzeHeadless ... -process workflow -noanalysis -readOnly -postScriptscript printed the selected program path,getExecutableSHA256()and language. The known project printed the same SHA-256 as the matching target and a different SHA-256 from the other target; the deliberately cleared project printedunknown. Both processes exited 0. This checks the recorded import digest, not every possible source of project integrity, and an unknown value cannot establish either equality or mismatch.A practical caution: Ghidra's bundled headless documentation describes
-readOnlyin process mode as discarding script/analysis changes to existing program files; it does not promise byte-for-byte immutability of all project storage. In two independent copies of the known project, the headless run removedidata/~journal.bakand changedidata/~index.bak, while the other regular project files matched their pre-run hashes. The copied unknown project had no regular-file content changes in this check. This observation does not establish that the program itself changed or that all projects behave this way. All 10 and 9 recorded files in the original projects still matched their prior hashes, and both target digests were unchanged.Therefore a recovery recipe should preserve the caller's original project and use a safely acquired private copy before running headless inspection, rather than equating Ghidra's
-readOnlyflag with a guarantee that the entire project directory remains untouched. Copy consistency and lock/active-writer handling still require their own checks; this experiment does not establish them. The existing REA design already uses a private copy, and the earlier runtime result remains a generic startup error—this manual diagnostic does not change it.@morluto commented on GitHub (Oct 31, 2026):
Exploratory structured startup refusal
On a disposable checkout of REA main
d54a4661, I tried a non-integrated prototype for this exact failure. Instead of exiting before a bridge exists, the Java bridge classifies the imported digest as a valid unequal SHA-256 or an unavailable/malformed identity, opens its existing authenticated transport in a failure-only state, and returns a distinct structured code to the startup request. The client prototype projects those codes to differentconfiguration_invalidmessages and recovery guidance. It does not infer identity from captured log text or admit analysis after failed identity validation.With real Ghidra 12.1.4 on macOS arm64 and public stdio MCP, the previously constructed project whose digest was cleared returned
import_identity_unavailable; the project with a known different digest returnedimport_identity_mismatch; the matching project/target succeeded. For both refusals, a secondlist_documentsrequest also failed with the corresponding structured reason. In the mismatch case, opening the matching target on the same MCP connection and requesting pseudocode succeeded. All sessions closed successfully, and the target and selected source-project file hashes were unchanged. Successful calls used the SDK's full advertised schemas.This is feasibility evidence, not a proposed ready-to-merge implementation. The experiment covered one local Unix-socket host and two project fixtures. It did not verify malformed or truncated bridge responses, late handshakes, unauthorized connections, cancellation or cleanup failure, Windows loopback transport, fresh-import errors, or multiple concurrent waiters. The rough projection also assumes a project setting; that attribution must be correct for fresh-import mode before integration. A production design must retain the primary failure alongside cleanup uncertainty, never expose capabilities for a refused program, and distinguish a missing identity from a verified mismatch without promising that retry or project editing will repair it. The original failure and matching recovery remain documented above.
@morluto commented on GitHub (Oct 31, 2026):
Further prototype controls: classification now happens only when those codes arrive during the authenticated startup ping; a later remote error with the same code stays a remote operation error. On the real selected-project fixtures, both stdio MCP and
rea decompile --format jsonreturned distinct unavailable/mismatch diagnostics, a matching target succeeded, and the selected projects and target files stayed unchanged. The mismatch was also recoverable by opening the matching target on the same MCP connection.The production-client boundary fixture exercised the two startup codes, retained cleanup ownership and a successful cleanup retry, a late remote error, and cancellation after the identity refusal had reached final cleanup. These are controlled fixture outcomes, not real-Ghidra cancellation tests. The wider client file passed 97 tests before the extra final-cleanup cancellation case was added; a focused run of the six relevant cases including that addition passed. The Java bridge sources compiled against Ghidra 12.1.4.
For fresh-import attribution, I temporarily forced the test-only bridge to report a missing digest during an otherwise real import. The CLI returned the unavailable-identity reason without blaming
REA_GHIDRA_PROJECT_PATH; the bridge source and target were restored unchanged. This injection does not show that Ghidra naturally loses the digest. The prototype remains unmerged and needs a source-owned real-provider regression, Windows and protocol/failure coverage, and review of its error and lifecycle semantics before it is ready for integration.