mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 07:47:29 +00:00
[GH-ISSUE #8178] [Design] Disambiguate analysis addresses from file offsets in decompilation #6465
Open
opened 2026-11-01 21:11:21 +00:00 by bsakaguchi
·
6 comments
No Branch/Tag specified
main
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/procedure-reference-stacked
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#6465
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/8178
Before submitting
Decision needed
How should an analyst unambiguously select a Ghidra analysis address versus a source-file offset for
procedure_pseudo_code, and how should a fallback be communicated when a bare hexadecimal value can mean either?Context and evidence
The current documented contract intentionally tries a
0xvalue as a procedure address and, if no procedure resolves, falls back to a file offset. The result retains the offset and mapped address in Evidence. Other procedure operations use analysis-address semantics.Observed on REA
47fa6ab3795d547207001ffb01643c0aa39dcad8, Ghidra 12.1.4 and macOS arm64 through stdio MCP: a self-created x86-64 raw image containedc3, 3190bytes, thenb8 2a 00 00 00 c3. I opened it withformat=raw-binary,architecture=x86_64, andentry_point=0x10; a Ghidra seed explicitly definedother_functionat analysis address0x30(file offset0x20).list_proceduresreturned entries at0x10and0x30only.procedure_assemblywithprocedure: "0x20"returned no procedure at that analysis address.procedure_pseudo_codewith the same value succeeded and returnedother_functionat0x30, because it treated0x20as a file offset.0x30;raw_result.selectionrecorded the mapping. This is not a hidden or undocumented fallback, but the normalized pseudocode itself did not say why the requested-looking coordinate changed.procedure_pseudo_codewithprocedure: "ram:0x20"reported no procedure there, avoiding fallback on this fixture. The qualified address syntax is provider-specific, and users must know the address space.No target bytes were executed or modified. This demonstrates a potentially surprising decision point, not a claim that the implementation violates its documented contract or that every address-space selector works across targets.
Expected interaction with targets
Read a caller-selected binary and query the existing owned Ghidra analysis session. The question concerns input interpretation and Evidence, not target mutation.
Boundary details (optional)
Preserve the caller's coordinate kind and original value, selected mapping and provider address, ambiguity and partial coverage. Avoid returning an unrelated body as though it answered an explicit analysis-address request. A change to existing bare hexadecimal fallback may be breaking; do not infer a coordinate kind silently where the request expressly supplies one.
Options and tradeoffs
Compare an explicit provider-neutral address/file-offset selector, a clearly documented qualified-address path with useful discovery, or a conspicuous inline fallback indicator alongside existing Evidence. Retaining today's fallback offers convenience for old callers but leaves bare hex ambiguous; requiring explicit
file-offset:changes behavior. Compare affected CLI/MCP, batch and workflow consumers rather than adding a separate provider-specific decompile tool.Verification available so far
I have a prototype or observed results
Success criteria and open questions
Exercise a raw image where an absent analysis address is also a valid source offset mapping to a different procedure, exact procedure addresses, explicitly selected file offsets, ambiguous source mappings, qualified address spaces and CLI/MCP parity. Check that errors and returned Evidence preserve the original selection and actual coordinate.
References
Documented behavior:
github.com/morluto/rea@47fa6ab379/docs/ghidra-provider.md (loaded-addresses-and-file-offsets)A follow-up in the same real MCP fixture explicitly selected
procedure: "file-offset:0x20"and returned the function at0x30with the same file-offset and mapped-address Evidence.ram:0x20still reported no procedure. This verifies both explicit paths on this one defaultramaddress space.Batch consumer follow-up
On draft PR #8470 head
3dc41af77444eea9ca2eaf63bf0adb0a31dc9ce2, real Ghidra 12.1.4/JDK 21, Node 24.22.1 and macOS arm64, I used a separate source-owned arm64 Mach-O whose file offset0x430maps to analysis entry0x100000430. In public stdio MCP, both full and compact advertised schemas acceptedbatch_decompilewith["file-offset:0x430", "0x430", "0x100000430"]. All three items succeeded with identical pseudocode. The explicit and bare offset items hadprocedure.status: "unknown"because the separate entry-lookup operation did not accept/resolve those values; the exact analysis-address item was resolved. The explicit-offset item's nested lookup failure had a generic invalid-input message, despite the containing batch successfully decompiling that selector.An individual
procedure_pseudo_codefor the bare offset retainedraw_result.selectionwith file offset 1072, mapped address and procedure address0x100000430; the successful batch item did not retain that producer mapping. This illustrates a consumer handoff question alongside #8350, without proving general coordinate equivalence. It also demonstrates why skipping decompilation after entry lookup fails would lose a valid result. The fixture hash was unchanged and the target was not executed. This is one fixture and host, not an agent-selection or performance measurement. Related #8350 tracks per-item producer provenance; #8470 improves lookup recovery but does not solve this batch mapping.A separate compact stdio MCP control on the same real Ghidra PR head saved the successful explicit-offset batch before making any individual decompile call. The batch-only export contained one record and no separate decompile source or link. After explicitly calling
procedure_pseudo_codefor the same selector, a second export contained that separate observation with the 1072 →0x100000430mapping. Each bundle was imported into a fresh target-free server; the batch result survived exactly, and the mapping was present only in the second bundle. The batch did not link to the separately requested observation. Target and bundle hashes remained unchanged during inspection. This is a manually requested extra observation and offline handoff on one fixture, not an automatic recovery, agent trial, or proof about all batch sources.Ambiguous PE mapping follow-up
On REA #8768 working tree based on
9ebbe67e, real Ghidra 12.1.4 and a deliberately modified PE where file offset0x400maps to both0x180001000and0x180002000, explicit offset decompilation refused the ambiguous mapping. Selecting bare0x180001000through the CLI decompiled a function; selecting bare0x180002000failed after the automatic file-offset fallback, reporting that0x180002000had no loaded source mapping. In the same fixture, MCPresolve_containing_procedurereturnedfound: falseandinspect_native_instructionreturnedstatus: dataat0x180002000in both output profiles. A separate CLI request usingram:0x180002000avoided fallback and reported no procedure at that requested address.The unexecuted, synthetic PE SHA-256 stayed
9288ce1a1a3e4aae2a47ba0fc97c466c6258285ddff1cf4efdb62cfb52151595. This demonstrates an unhelpful failure after fallback, not successful selection of a different function or proof that qualified syntax works across address spaces. #8772 and #8768 address ambiguity reporting; they do not change this pre-existing fallback.Discovering the qualified space for the PE control
In the same synthetic PE and real Ghidra sessions,
inspect_native_load_imagewith complete detail returned Ghidra's observeddefault_address_space: "ram"in both output profiles, while independent PE load-image verification wasunsupported. Using that observed space to constructram:0x180002000for MCPprocedure_pseudo_codereturned the no-procedure-at-requested-address issue without attempting the bare-hex file-offset fallback. The target digest remained unchanged. This supplies one provider-observed route to a strict qualified selector; it is not independently verified PE load-image equivalence and does not prove how every non-default or encoded address space should be selected. The returned no-procedure error still has generic input-schema remediation.The same real PE control also returned
observations.default_address_space: "ram"wheninspect_native_load_imageomitteddetailin both MCP output profiles; this result was complete Evidence rather than a summary in that invocation. Independent verification remainedunsupported. This is one fixture and does not establish default delivery for every result size or transport.Same numeric selector on a Mach-O
On a second source-owned arm64 Mach-O with real Ghidra 12.1.4,
inspect_native_load_imagereported the observed default spaceram. In both MCP output profiles,procedure_pseudo_codewith bare0x328succeeded viaraw_result.selectionshowing file offset 808 mapped to procedure0x100000328, whileram:0x328returned no procedure at the requested analysis address. This demonstrates a different successful function selection under fallback on this fixture; the qualified form preserved analysis-coordinate intent. The target remained unexecuted and SHA-256 stayedae0f2a349b22332113ab60ab4c78024eb18153c76bdeefb01c4b1d89a26c0003. It does not establish a general address conversion or coverage for non-default spaces. PR #8768 advertises this existing qualified route without changing the fallback.Packed PE address control
On #8470 head
842cf7cd155e1247f12c0743ed04144e6a6b152f, Ghidra 12.1.4/JDK 21, Node 24.22.1 and macOS arm64, a self-built UPX 5.3.0 packed x86-64 PE was opened through public MCP. Askingprocedure_pseudo_codefor bare0x140001000in compact and full profiles fell back to treating that value as a file offset, then reported no source mapping and recommended inspecting mappings. Asking forram:0x140001000instead reported no procedure at that analysis address and recommended inventory discovery. In a separately unpacked copy, the bare selector decompiled a function at that address through Ghidra in both profiles (tested on the Kuna 1.990 validation branch). The packed file SHA-256 remained7d2b97acb6ecdba9ff9422fbb13516f41251f90faff3670cc878eb0a6f180dfa; neither file was executed or modified. This demonstrates the impact of coordinate fallback on a packed-versus-unpacked handoff, not automatic unpack detection or a general claim about address spaces. The control used the knownramspace; it did not independently inspect the space in this fixture.@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):
Explicit file offset across a rebased project
On REA
b43c329df779708e43ae297f498a844e45d9c923, real Ghidra 12.1.4 stdio MCP analyzed the same source-owned arm64 Mach-O in two sessions: a fresh import and a caller-selected, read-only project whose image base had been changed from0x100000000to0x180000000before the REA session.procedure_pseudo_code({procedure:"file-offset:0x2d8"})returned the same body in each. Its recorded selection mapped source offset728to0x1000002d8in the fresh import and0x1800002d8in the selected project. Bare0x2d8reached the same results via the documented fallback.For the rebased project,
rea decompile <target> --file-offset 0x2d8 --provider ghidra --format json --full-outputreturned the same Evidence ID and explicit offset/mapped-address/procedure-address selection as MCP. This gives a concrete supported handoff when the caller has an authoritative source offset. As controls,procedure_addressandprocedure_assemblyrejectedfile-offset:0x2d8; their selectors have different semantics, so the mapped analysis address from the decompile Evidence is needed for those operations.The target SHA-256 and ten source-project regular-file hashes remained unchanged through the REA calls. The target was not executed. This is one non-overlapping mapping and one rebased project; ambiguous mappings, altered target bytes and other providers are not established by this control.
@morluto commented on GitHub (Oct 31, 2026):
Real Ghidra duplicate-file-mapping control
In a disposable Ghidra 12.1.4 project for a source-owned arm64 Mach-O, a headless script created a second initialized executable block backed by the same original FileBytes at source offset
0x2d8, then defined a second function there. Ghidra independently reported mappings[0x1000002d8, 0x110000000]. This deliberately edits the disposable project before testing; REA subsequently selects it read-only.On REA
b43c329df779708e43ae297f498a844e45d9c923through real stdio MCP:procedure_pseudo_code({procedure:"file-offset:0x2d8"})and bare"0x2d8"refused ambiguity and listed both candidate analysis addresses; neither chose a function.entryandaudit_duplicateseparately.address_to_file_offsetreturned728for each address.inspect_native_load_imageretained both initialized, non-overlay mappings with the same source-file index and offset; its independent verification status was unsupported for Mach-O.rea decompile <target> --file-offset 0x2d8 --provider ghidra --format json --full-outputalso exited 1. The CLI's top-level message was generic invalid input, while its nested issue named both candidates and advised selecting an explicit analysis address.The target SHA-256 and all ten source-project regular-file hashes were unchanged through REA MCP and CLI calls. No target was executed. This verifies one genuine same-source, two-loaded-address ambiguity and the exact-address recovery; it does not establish behavior for overlays, multiple distinct source files, or all address spaces.
@morluto commented on GitHub (Oct 31, 2026):
Distinct source-file identity control
I created a separate disposable Ghidra 12.1.4 project in which the admitted arm64 Mach-O maps its original file offset
0x2d8at0x1000002d8, while a different 1,024-byteforeign.binmaps its own offset0x2d8at0x110000000. The foreign block and its function were explicitly authored before the REA session; Ghidra independently confirmed one mapping for each FileBytes object.On REA
b43c329df779708e43ae297f498a844e45d9c923, real Ghidra MCPprocedure_pseudo_code({procedure:"file-offset:0x2d8"})selected the target-backedentryat0x1000002d8, not the foreign function. An explicit analysis-address request selectedaudit_foreignand returned its distinct0x2abody.address_to_file_offsetaccepted the target address as offset728and refused the foreign address with0 authoritative target-file mappings.inspect_native_load_imagepreserved both source digests and their distinct source-file indices; its independent Mach-O verification was unsupported.The equivalent CLI
decompile --file-offset 0x2d8returned the same Evidence ID and target selection as MCP; CLIaddress-to-file-offsetlikewise refused the foreign address. This contrasts with the same-FileBytes duplicate mapping above, where REA correctly refused ambiguity. Target and ten project-file hashes stayed unchanged during the REA calls; no target was executed. This is one different-source control, not proof of all partial-source, overlay or changed-project cases.@morluto commented on GitHub (Oct 31, 2026):
A separate real CLI handoff detail for selector design: UI trace and
address_to_file_offsetreport file offsets as JSON numbers, butrea decompile --file-offsetaccepts only a0x-prefixed hexadecimal string. On the owned UI fixture, passing decimal2208failed argument validation; converting that same offset to0x8a0succeeded and produced the same handler body as its explicit analysis address.rea decompile --schemaadvertises the hex pattern, while--helpdescribes an offset without stating the required format. A second decimal input failed the same way.This is a representation/discoverability question, not evidence that REA confuses the supplied offset's coordinate kind. It is independent of the incorrect UI-node offset documented in #8198. Consider a clear accepted-format example or a lossless numeric handoff while retaining explicit coordinate semantics; no autonomous-agent failure rate was measured.
@morluto commented on GitHub (Oct 31, 2026):
A separate selected-project control shows why source-file and provider address selectors must stay explicit even when both are mapped: https://github.com/morluto/rea/issues/8328#issuecomment-6547720199
On a page-aligned rebased Mach-O project, bare
0x2000intentionally selected the existing Ghidra function at analysis address0x2000;file-offset:0x2000selected a different function at analysis address0x3000, with the mapping retained in raw Evidence. The CLI--file-offsetroute agreed with MCP. Neither result is a violation of the existing selector contract. The example illustrates the danger of passing a separately observed file-derived VM value as an analysis address without proving its coordinate mapping; the value happened to equal a file offset only in this constructed fixture.