mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8328] [Design] Recover procedure lookup using independent export evidence #6545
Open
opened 2026-11-01 21:12:06 +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#6545
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/8328
Before submitting
Decision needed
When a selected provider cannot resolve a requested procedure name, should REA help the caller find independently observed, target-bound symbol candidates and explicitly hand a chosen address back to that provider? What evidence is needed before presenting any candidate as callable?
Context and evidence
On current REA
a989c0eand Kuna 1.986, a synthetic arm64 Mach-O dylib had an export trie containing_audit_exported_functionat0x3b0and_audit_exported_dataat0x4000, but its conventional symbol-table count was deliberately zeroed.dyld_info -exportsand REAinspect_macho(detail: "complete")returned both exports;nmreported no symbols.In real stdio MCP with Kuna:
search_procedures("audit_exported_function")returned no rows;list_proceduresreturnedsub_3b0.procedure_addressrejected both the bare name and exact underscored export name. Its recovery suggested correcting the input schema; the message mentioned procedure search, which did not find this spelling.procedure_pseudo_code({procedure: "0x3b0"})succeeded and returned asub_3b0body adding seven.With Ghidra 12.1.4 on the same target, procedure search and exact
_audit_exported_functionlookup returned0x3b0, and address-selected pseudocode succeeded. This control does not establish cross-provider address equivalence generally. The original compiler-produced dylib, before the synthetic symbol-table transformation, supplied the function's known source and export name. The modified file was never run, its runtime signature validity was not checked, and its hash stayed unchanged. This is a constructed edge case, not a prevalence claim. Direct Kuna behavior and full fixture construction are in upstream Kuna #1349.Expected interaction with targets
Read an explicitly selected artifact and query its selected static provider. No target execution, modification or provider switch is proposed.
Boundary details (optional)
An export name alone does not establish function identity: this same fixture exports data, and #8168 demonstrates that blanket export-to-procedure promotion is unsafe. Preserve exact artifact/slice identity, address coordinates, name spelling, aliases, collisions, reexports, source provenance and provider-specific address mapping. Missing matches or unavailable mapping remain unknown. Do not silently choose a candidate or discard the caller's selected provider. Existing
inspect_macho→ explicit address handoff worked here; it is not automatically a general solution for every format or rebase.Options and tradeoffs
Compare focused recovery guidance, a bounded candidate lookup that returns independent Evidence and asks the caller to select, or a richer existing procedure-resolution contract. Any automatic join would require independently justified function and address correspondence. Avoid duplicating the entire provider API or claiming untyped exports are executable functions.
Verification available so far
I have observed results. Test both providers and relevant real formats, multiple names/addresses, same-name data, reexports, stripped exports, rebased projects and malformed/partial sources before integration. Confirm CLI/MCP and Evidence retention; the synthetic fixture does not establish shipped-binary frequency or autonomous-agent behavior.
References
Related but distinct: #8173 (cross-version matching using independent symbol evidence), #8183 (references when general name inventory is unavailable), #8168 (data symbols presented as procedures), and Kuna #1349. @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0
Export coordinates and Ghidra xrefs control
On REA #8753 working tree based on main
9ebbe67e, real Ghidra 12.1.4 and two self-built, unexecuted x86-64 libraries,rea inspect-native-exportsreported ELFknown_exportvalue0x1340and PEknown_exportaddress0x180001000. On the ELF,rea xrefswith the raw0x1340value returned an empty list, while the analyzed name and Ghidra's rebased address0x101340returned the same five source addresses, including the stored pointer slot0x1033e0. On the PE, the inspected0x180001000address and analyzed name returned the same five sites. This is an address-coordinate control, not proof of comprehensive references or a universal conversion rule. ELF SHA-2565b8bb1398a664530924f4cc47d0eb84927c67e1f6ed634cdd6ec7cf3b769cd09and PE SHA-256d07b32e13602615f31471e365946b04b92abe3ff2d484dffc4acef8fdbd3c232stayed unchanged. The recovery guidance being tested in #8753 explicitly says to resolve or verify coordinates in the selected provider; it does not automatically map exports.Same ELF with Kuna 1.989
On the same unexecuted ELF fixture and PR #8753 checkout, direct Kuna 1.989
xrefs --to known_exportand--to 0x1340resolved the target at0x1340and reported thedynamic-relocationspointer from0x33e0. The Ghidra coordinate0x101340had no Kuna target name, reporteddecoded: false, and yielded zero data rows. REA/Kuna CLI returned empty address lists for the name and both numeric selectors: its raw Evidence identified the corresponding selected target, but REA omitted the pointer row as already tracked in #8510. The ELF digest remained5b8bb1398a664530924f4cc47d0eb84927c67e1f6ed634cdd6ec7cf3b769cd09. This is a two-provider contrast for one fixture; it does not establish a general address conversion or imply that either empty REA result proves absence.Checking the coordinate with existing Ghidra tools
On the same x86-64 ELF fixture and real Ghidra 12.1.4, CLI
inspect-native-instructionat the raw export value0x1340returnedstatus: outside-memory; at provider address0x101340it returnedstatus: decodedand mnemonicPUSH.inspect-native-load-imagereported independent verificationstatus: unsupportedfor ELF, but retained Ghidra's observedimage_base: 0x100000and.textmapping starting at0x101340. These observations can help an analyst detect this fixture's coordinate mismatch; they do not constitute verified ELF load-image equivalence or a general conversion rule. CLIsearch --kind procedures known_exportalso identified the analyzed function at0x101340; default string search did not identify that function. Target SHA-256 remained5b8bb1398a664530924f4cc47d0eb84927c67e1f6ed634cdd6ec7cf3b769cd09and it was never executed.@morluto commented on GitHub (Oct 31, 2026):
Reference-finding follow-up on a second synthetic export-trie-only Mach-O, with an actual source-authored direct caller as well as exported data.
dyld_info -exportsand REAinspect_machoreported_audit_exported_functionat0x3a8,_audit_callerat0x3c0, and_audit_exported_dataat0x4000;nmreported no symbols. Independentotoolon the original pre-transformation dylib showedblat0x3d4to the function, followed by address formation/load of the data.On current REA
a989c0ewith real Kuna 1.986, searching for and resolving the function's export name failed as in the original report. A caller who explicitly chose theinspect_machofunction candidate's address could then obtainxrefs(0x3a8) = [0x3d4],procedure_callers(0x3a8) = [0x3c0], caller assembly containing the direct branch, and a reachedtrace_call_path(0x3c0, 0x3a8). Ghidra 12.1.4 resolved the exact name and also found the direct site and caller. The separate export for data reinforces that the selection requires more than an export name. Kuna's data xref was the address-forming instruction0x3d8; Ghidra reported0x3dc; those observations have different semantics and should not be silently equated.This is an explicit multi-call, same-target handoff with separate Evidence records, not proof that REA automatically connects the export Evidence to the xref, that all references were found, or that the function executes. The transformed file's runtime validity was not checked; its digest was unchanged and it was not run. A task-oriented recovery could preserve the selected source Evidence and ambiguity without replacing existing address-based calls.
@morluto commented on GitHub (Oct 31, 2026):
The same name-to-address handoff now reproduces without the hand-edited symbol-table fixture. I compiled the three-symbol dylib from the previous comment, made a separate copy and ran Apple's documented
strip -N.nmreported no symbols,dyld_info -exportsretained both function names and the data name, andcodesign --verifyexited 0 for the ad-hoc linker signature.On current REA
a989c0ewith real Kuna 1.986,inspect_machoexposed the exported function at0x3a8, name search/lookup missed it, and explicit address xrefs found its direct call site at0x3d4; caller lookup and path tracing also succeeded. Ghidra 12.1.4 resolved the exact exported spelling on the same stripped file. The data export remained distinct, and the stripped target's hash did not change during analysis. The file was not executed; a valid signature check does not establish runtime behavior or prevalence. Full reproducible compiler andstrip -Ncommands are in Kuna #1349.@morluto commented on GitHub (Oct 31, 2026):
Shipped-artifact follow-up: on this host, Xcode 26.5 (17F42)'s universal
libSwiftToolsSupport.dylibcontains 2,810 arm64 export records according todyld_info, while its external-defined nlist range has five entries. One export,_$s10TSCUtility10BuildFlagsV011cxxCompilerC0SaySSGvg, is at0x6d868; an independent static instruction listing places code there.REA
a989c0eexplicitly selected with Kuna 1.986 refused to open the universal source because this provider does not yet support a selected universal slice (#8193). I usedlipo -thin arm64to make a separate caller-owned file; its bytes matched the selected source slice exactly. On that distinct target,inspect_macho(detail: "summary")retained the complete inspection, and the firstinspect_analysis_viewexport page contained the named row and address.search_proceduresreturned no matching name andprocedure_addressrejected it with generic schema recovery; explicitly passing the selected address toprocedure_pseudo_codesucceeded assub_6d868. The export page itself marked the source inventory non-exhaustive, and the handoff did not automatically link the separate Evidence records.Direct Kuna on the original universal file with explicit
--slice arm64also missed the name and decompiled the address; upstream details and digests are in Kuna #1349. Source and derivative hashes remained unchanged, neither was executed, and no full-corpus prevalence or runtime behavior is claimed. This is a bounded manual workflow on one symbol; it does not make all exported names callable or establish generic FAT-to-provider coordinate correspondence.@morluto commented on GitHub (Oct 31, 2026):
Follow-up on the same shipped Xcode library and explicit arm64 derivative: an exact requested export,
_$ss6ResultO8TSCBasics5Error_pRs_rlE6tryMapyAByqd__sAD_pGqd__xKXElF, appeared at0x46518on page 44 of the retainedinspect_machoexports view using the default limit of 64. On REAa989c0ewith Kuna 1.986,search_proceduresreturned no matches andprocedure_addressrejected the name; explicitly selecting the export address produced pseudocode. An attemptednamefilter on the Mach-O view was rejected as an unknown argument. The view currently supports offset and limit, and requesting all 2,810 retained export rows in one call also worked.This shows a concrete navigation tradeoff for the candidate-lookup option in this issue: for a known name, the caller can page through the inventory or retrieve it all, but the retained view cannot return just the matching candidate. The page's exhaustion applies to the retained view; its source inventory was marked non-exhaustive. The example does not establish autonomous-agent behavior, runtime reachability, or that arbitrary exports are procedures. Source and derivative hashes were unchanged, and neither was executed.
@morluto commented on GitHub (Oct 31, 2026):
Existing-workflow control for the candidate-lookup options: on REA
a989c0e, a source-built x86-64 ELF library with twoaudit_transformdynamic-symbol rows (AUDIT_1at0x1334, hidden version;AUDIT_2at0x133a, default version) was independently checked withllvm-readelf.inspect_native_exports(detail:"summary")followed byinspect_analysis_viewwithcollection:"exports", names:["audit_transform"]returned both versioned rows. Matching-row pagination preserved their distinct original indices and a source Evidence bundle export/import reproduced the filtered view without opening a provider. A query for the display spellingaudit_transform@AUDIT_1returned no rows; the contract matches ELF source names and exposes the version separately. No blanket splitting on@is proposed, since a spelling needs its own identity semantics.This existing PE/ELF view is a useful model for evaluating a bounded Mach-O lookup: retain parent identity and coverage, distinguish aliases and versions, and allow explicit selection. It does not by itself establish that the static export is callable or that coordinates map to a selected provider. On this exact library both Ghidra and Kuna refused the unversioned procedure name as ambiguous, and Ghidra's analysis addresses differed from ELF values. The target was not executed or changed. The separate Kuna search/alias discrepancy observed during this control is tracked in #8330.
@morluto commented on GitHub (Oct 31, 2026):
I tested a disposable local design experiment on current main
d54a4661d: exact source-name selection for the existing retained Mach-O exports view, using the same bounded matching-row selection primitive as the native PE/ELF exports view. This is not a production patch or a proposal to auto-select a function.inspect_analysis_viewrequest found the exact requested export at0x46518, with original source index 2804. Looking up that index in the unfiltered view returned the identical original row. The earlier manual walk needed 44 pages for this name after obtaining the same kind of parent inspection; this is a call-count comparison, not a timing or token benchmark.source_exhaustive: false, and the incomplete-inventory warning remained present even for an empty page. Page exhaustion is not evidence of absence from the artifact.dyld_info -exportsreported an explicitly reexported function, a local function and an exported data symbol. The filtered view retained three separate original rows: the reexport hadreexport: true, sourceaudit-dependency, and a null local address; the data and function remained unclassified export rows. Neither artifact was executed or changed.rea inspect-analysis-view --evidence-bundle ...returned the same normalized view. Existing Mach-O view source tests passed (10 tests); they do not constitute new production regression coverage.The experiment exposes contract work rather than settling it: it admits
namesin the shared request shape and rejects non-export facets at runtime, and adds source indices only to filtered rows. A real design should make facet applicability and source-row identity clear in the advertised schema without relying on that inconsistent prototype. It still needs malformed/duplicate source rows, universal slices, non-UTF-8 identity, alias collisions and CLI/MCP schema-client coverage. Neither the selected export nor its address was promoted to a callable function, and provider coordinate correspondence remains a separate question.@morluto commented on GitHub (Oct 31, 2026):
Rebased-project control for the proposed export-to-provider handoff, on REA main
d54a4661d:I built an unexecuted arm64 Mach-O dylib with two distinct exported functions, aligned 4096 bytes apart. Independent
dyld_info -exportsandnmreported_audit_firstat0x1000and_audit_secondat0x2000; the functions add 11 and 22 respectively. Its__TEXThas preferred VM address and file offset zero, so in this specific file the second function's export VM address also corresponds to source-file offset0x2000.After importing it into a disposable Ghidra 12.1.4 project, I deliberately changed that project's image base from 0 to the page-aligned value
0x1000before opening it in REA. Ghidra's project then located_audit_firstat0x2000and_audit_secondat0x3000.inspect_machostill returned the file-derived_audit_secondaddress0x2000. In the selected Ghidra project, passing that bare value toprocedure_pseudo_codesucceeded but returned_audit_first; passing_audit_secondor the provider address0x3000returned the intended function.procedure_pseudo_code({procedure:"file-offset:0x2000"})returned_audit_second. Itsraw_result.selectionrecords source offset 8192 and mapped/provider address0x3000.address_to_file_offsetseparately mapped0x2000to 4096 and0x3000to 8192.inspect_native_load_imageretained a matching measured__textsource mapping and image base, while reportingstatus: unsupportedfor independent Mach-O verification.rea decompile ... 0x2000andrea decompile ... --file-offset 0x2000gave the same respective bodies and Evidence IDs as MCP. With a fresh Ghidra import and with fresh Kuna, bare0x2000instead selected_audit_secondon this same file.This strengthens the need to keep source VM address, source-file offset, and provider analysis address distinct when presenting or handing off an export candidate. The offset happens to equal the source VM value in this fixture; do not generalize that equality or treat all exports as code. The selected project and target SHA-256s remained unchanged during all REA calls, the target was not executed, and selected-project memory need not be byte-identical to the file. The deliberately constructed overlapping coordinates show a possible failure mode, not its prevalence or an automatic REA handoff; the manual bare-address request obeyed the existing address contract.