mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8173] [Design] Use independent symbol evidence to match functions when a provider omits origins #4699
Open
opened 2026-10-31 00:52:36 +00:00 by bsakaguchi
·
5 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#4699
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/8173
Before submitting
Decision needed
Can function matching use independently observed, target-bound symbol facts to establish symbol origin when a provider such as Kuna cannot supply it, without treating generated names or data exports as functions?
Context and evidence
Two self-built, unexecuted arm64 Mach-O versions differed only in a small helper's addition versus subtraction. On REA source
47fa6ab3795d547207001ffb01643c0aa39dcad8, Ghidra 12.1.4list_proceduresEvidence letmatch_native_functionspair the three reported functions by observed symbol origin;compare_functionsmarked pseudocode and assembly changed for the helper, with its normal limitations.On the same binaries, Kuna 1.833 inventories had six entries per side. Matching those inventories yielded zero matches, six
only_leftand sixonly_right, withsource_coverage.status: partialand per-rowSymbol origin unavailable; exact-name matching is unavailablelimitations. Those states are explicitly not proof of added or removed functions. Directly comparing the selected helper dossiers marked text changed but overall status unknown. Kuna does not currently supply REAlist_names,procedure_info, orread_bytesobservations for independent matching.Separately, REA
inspect_machoon one of these binaries returned an_adjustexport at the same address as the Kuna procedure. Supplying that retained Evidence inleft_observationswas refused: matching accepts onlylist_names,procedure_info,read_bytes, oranalyze_functionEvidence from the exact provider/profile context. This is an observed UX gap, not evidence that every export is a function: the same inspection listed_global_countand_messageas exports too. #8168 covers those data entries appearing in Kuna's procedure inventory.Expected interaction with targets
Read caller-selected local binaries and existing Evidence; invoke the existing caller-supplied static provider where selected. No target execution or binary modification is proposed.
Boundary details (optional)
Any candidate must preserve exact binary identity, architecture/slice, source names, address-space and image-base mapping, aliases, symbol type and origin, conflicting or incomplete observations, and independent Evidence links. An export name alone does not establish a function body, behavior, or safe one-to-one correspondence. Avoid assuming Ghidra and Kuna addresses agree: on a separate x86-64 PIE fixture their bases differed.
Options and tradeoffs
Explore reusing format-owned symbol Evidence or enriching Kuna inventory with a separately verified native symbol observation, then joining only compatible exact rows. Compare the effort and coverage with the existing Ghidra workflow and with explicit analyst selection. Do not add a raw Kuna command wrapper just for parity; names that cannot be grounded remain unknown.
Verification available so far
I have a prototype or observed results
Success criteria and open questions
Determine whether a format-aware source can safely distinguish function symbols, generated names, imports, aliases and data on Mach-O and ELF, and how it relates to provider addresses. Exercise symbolized, stripped, duplicate/alias, conflicting and rebased inputs; test CLI/MCP Evidence retention and cross-provider behavior. Preserve unknown coverage and do not infer behavioral equivalence. No implementation or other-architecture verification was performed.
References
In a follow-up on the same sessions' exported bundles, supplying the two retained
_adjustdossiers asleft_observationsandright_observationsproduced the same zero Kuna matches and no structural candidates. Ghidra retained three symbol matches and supplied a ready-to-usecompare_functionsinput for_adjust. This is one symbolized fixture, not evidence about all binaries or providers.@morluto commented on GitHub (Oct 30, 2026):
A further real Kuna 1.986 control used the same self-built Mach-O in two REA sessions, with project exports selected by
REA_KUNA_JOBS=1and2. Both_audit_scoredossiers reported the same name and entry, but Kuna did not establish symbol origin, socompare_functionskeptfunction_match: ambiguous. The project-export pseudocode differed on this fixture (notably2.5versus0x4004000000000000and casts); the text dimension was correctlychanged, while overall comparison stayedunknown. Profiles and cache keys differed and the target digest was unchanged.This is consistent with the same unresolved identity boundary even without a binary version change; the currently emitted identity limitation mentions “cross-version identity,” which can be confusing in this same-artifact scenario. It is not proof that same numerical addresses across profiles/providers are always interchangeable. #8215 separately discusses making profile differences discoverable, not relaxing identity or claiming why a particular text changed.
@morluto commented on GitHub (Oct 30, 2026):
A stripped-build follow-up exercised the existing byte-matching route on the two self-built Mach-O versions. I stripped disposable copies with
strip -u -r;nmstill reported the Mach-O header symbol, so this is not a claim that every symbol or metadata source was removed. The fixture targets were not executed and both SHA-256 values were unchanged by the REA sessions.With real REA/Ghidra 12.1.4, each inventory contained two
default-origin generated functions and animportedentry. Inventory-only matching paired the entry by exact symbol and left two rows on each side unpaired. I then capturedprocedure_infobody ranges andread_bytesfor all three functions on each side, exported/imported both Evidence bundles, and supplied those observations. The matcher paired one additional generated function (0x100000430) byidentical-bytes; the modified helper (0x100000410) remained unpaired on each side. Coverage stayed partial with inventory completeness unknown. This validates the documented byte workflow on this fixture; byte identity does not establish source or behavioral equivalence.With REA/Kuna 1.986 on the same copies, inventories contained four rows per side, including the Mach-O header as a procedure candidate.
procedure_inforeturned typed capability unavailability for all eight rows, so the scripted body-range/byte route could not acquire its prerequisite ranges. Matching remained zero pairs, four unpaired per side, with partial coverage and zero byte fingerprints. Separately, #8170 records the unavailable REA/Kunaread_bytesoperation. This is a real-provider control for the stripped case, not proof that all stripped binaries behave this way or that same-address rows should automatically be paired.@morluto commented on GitHub (Oct 31, 2026):
A stripped x86-64 ELF duplicate-body control exercises the existing Ghidra byte route. Two functions on the left and three on the right have identical six-byte bodies; a separate unique six-byte function matches across builds. After collecting real
procedure_infoandread_bytesEvidence, exporting/importing both bundles, and matching, REA returned the repeated bodies as one unresolved two-versus-three group without forcing a pair; it paired the unique body byidentical-bytes. Inventory completeness remained unknown. Neither binary was executed or modified. This confirms the intended ambiguity handling for this constructed case, not a universal equivalence claim.The same control exposed a separate origin problem: Ghidra reports a loader-created stripped ELF entry label as imported, which REA accepts as exact-symbol identity. A different-entry-body control and direct comparison are filed at #8257. This is distinct from Kuna's unavailable origin and reinforces the need to distinguish source-symbol provenance from provider-created role labels.
@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):
Cross-provider matching on the same stripped artifact
I imported previously captured real Ghidra 12.1.4 and Kuna 1.986 Evidence for a self-owned stripped arm64 Mach-O into a fresh, target-free REA
b43c329df779708e43ae297f498a844e45d9c923MCP server. The two inventory records had the same target SHA-256; Ghidra reported three entries and Kuna four. Inventory-onlymatch_native_functionsreturned zero matches, threeonly_left, fouronly_rightand partial source coverage. These mean unpaired within the supplied inventories, not added/deleted functions.Adding the Ghidra-owned body ranges and byte observations for all three entries on the Ghidra side produced three left byte fingerprints but zero Kuna-side fingerprints and still zero matches. Supplying a Ghidra observation on the Kuna side instead was refused with
invalid_request, explicitly requiring the inventory's exact target, provider, profile and document context. This refusal also occurred in the same-target case, so equal artifact digests do not bypass source ownership. Repeating against the separately built other version gave the same counts on this small fixture.This confirms an existing safe boundary and a task-level gap: an analyst can collect independently useful Ghidra observations, but cannot pass them off as Kuna-produced observations to complete a cross-provider match. It does not justify weakening ownership, equating numeric addresses, or assuming an export is a function; a cross-provider join would need explicit mapping/applicability and provenance. The matching calls used imported Evidence only; no provider or target was reopened. Both source targets and the three input bundles retained their SHA-256 values and neither target was executed.