mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8219] [Design] Link native API boundary types to inspectable type identities #6493
Closed
opened 2026-11-01 21:11:38 +00:00 by bsakaguchi
·
2 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#6493
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/8219
Before submitting
Decision needed
Can an agent move from a recovered function parameter or return type to the correct inspectable database type without guessing from a display name, while keeping inferred decompiler types and database type identities distinct?
Context and evidence
On macOS arm64, Ghidra 12.1.4 and REA
53a4ab78451a0654e9c3beb3d43a5e371a288fcc, a headless script created two different 4-byte structures namedRecordin a self-owned project:/audit/wire/Recordwithwire_id, and/audit/memory/Recordwithmemory_flags. It assigned a pointer to the wire type as an existing function parameter and the memory type to a defined global data object. These are caller-authored project facts, not claims about original source types.In an REA MCP session using the read-only project copy,
procedure_infoandinspect_native_apireported the parameter asRecord *; the latter retainedsignature_source: user_defined, high-function provenance and the type-lock observation, but no exact category identity.inspect_native_data_typeforRecordor/Recordreturned unavailable, as documented for exact lookup. Both full structure paths succeeded with their distinct fields. The known global address successfully returned/audit/memory/Record, illustrating an existing discovery path that does not identify the function parameter's type.A separate read-only Ghidra headless script inspected the same decompiler
HighFunctionparameter: displayRecord *, decompiler type path/audit/wire/Record *, pointee path/audit/wire/Record, locked true. The database manager separately contained pointer type/audit/wire/Record *64. Through REA, lookup of the high-function pointer path returned unavailable, whereas the exact saved pointer path returned its pointee/audit/wire/Record. Thus attaching the high-function display or path as if it were always a lookup-ready database ID would be incorrect, even though the underlying pointee can be established on this fixture.REA closed successfully; the source-project regular-file digests and target digest were unchanged by its session. The target was not executed. One Ghidra fixture is not evidence that every decompiler type is a persistent database type or that an agent would choose the wrong one.
Expected interaction with targets
Read the selected project's existing analysis and typed observations; no new edit or target execution is proposed.
Boundary details (optional)
Preserve the exact function/parameter ordinal, source and type-lock facts, pointer layers, category and archive identity where the producer establishes them. Distinguish an ephemeral decompiler type from an exact database entry, keep absent or ambiguous identity unknown, and do not infer that caller-applied types describe original source or runtime layouts. Never choose one of multiple same-named types by display spelling.
Options and tradeoffs
Consider a bounded type-identity link on the existing native API boundary or a follow-up focused on one selected function parameter, returning lookup-ready database references only when verified. Separately evaluate a paged type search for cases without a known function or typed address; enumeration alone does not solve the parameter-to-type association. Reuse
inspect_native_data_typefor layouts rather than duplicating all fields in every API result.Verification available so far
I have a prototype or observed results
Success criteria and open questions
Exercise duplicate names/categories, database-backed and decompiler-only types, pointer/typedef/array layers, missing types, archives, renamed types, selected-project state, and recursion. Validate source identity and SDK schemas; test real provider and unavailable providers. Ensure bounded output and no automatic claims of source-level type authority. A controlled agent trace would be needed to measure discoverability.
References
Existing exact-type contract #492; related analyst-hypothesis question #8166 and Ghidra project continuity #8165. The bridge currently uses
DataType.getDisplayName()for boundarydata_typeinReaGhidraBridge.java.Imported dSYM type handoff
On Ghidra 12.1.4 with an explicitly selected disposable project created from an owned arm64 Mach-O and its adjacent dSYM, real REA
analyze_functionreported the parameter ofaudit_recordasSample *, withsignature_source: imported, a type-lock observation, andghidra-high-functionprovenance. Its pseudocode named fieldscountandscale. The exposed display spelling did not include an exact database identity;inspect_native_data_typeforSample,/Sample, and/DWARF/fixture.c/Samplereturned unavailable.A separate read-only headless inspection of a copy of the project found the saved struct's actual category path, which encoded the full compilation source path with escaped slashes. Supplying that exact identity to REA returned an 8-byte structure with
countat offset 0 andscaleat offset 4. Thus this was a lookup-identity/discoverability gap, not absence of the type. The exact path depended on this fixture's source path; it is not a path the agent can safely infer from the display string. Ghidra's import reported unrecoverable frame/register DWARF expressions, so not all debug facts were established. REA's initial project sessions in both profiles left all ten original project-file digests and the executable unchanged; the target SHA-256 wasc244f7d7d9fa9b7f4cfcb1f69d69cc1f83ad98fe38b0293b223b3ca7d9076363, and it was not executed. This extends the earlier user-authored same-name control to an imported-debug case; it does not imply all decompiler types have resolvable database identities. Related dSYM selection: #1193.Existing value-flow path on the imported dSYM fixture
The previous control has an important existing workaround: the complete
analyze_functiondossier'snative_value_flow.parameters[0].data_typereported the HighFunction pointer path, even thoughnative_api.parameters[0].data_typecontained onlySample *. In fresh real REA/Ghidra sessions in both compact and full MCP profiles, I passed that value-flow path unchanged toinspect_native_data_type. It resolved as a pointer and suppliedreferenced_type; querying that returned theSamplestructure and bothcountandscalefields. No external path discovery was needed for this particular chain, and the target SHA-256 remained unchanged.This corrects any implication that the complete dossier offered no usable route on this fixture. It does not turn every HighFunction path into a lookup-ready database ID: the earlier user-authored same-name control above had a HighFunction pointer path that exact lookup could not resolve. The agent also needs the native-value-flow facet to be available, and a complete dossier can be larger than the API-boundary question requires. A design should preserve the distinction between the observed HighFunction type and a verified inspectable identity; where no link can be established, report that explicitly rather than guessing or claiming the type is absent. No autonomous-agent or latency measurement was made.
Ghidra producer ownership control
On a read-only copy of the selected dSYM project, a headless Ghidra 12.1.4 script inspected the actual
HighFunctionparameter type and its pointee. The decompiler'sSample *was aPointerDataTypeassociated with the program manager butmanager.contains(type)was false. Lookup of its path returned a different database pointer object that Ghidra considered equivalent. Its pointee, by contrast, was aStructureDBthe manager contained, and exact lookup returned that same object. This explains why the previous value-flow path happened to resolve without establishing that the decompiler pointer itself was a persisted database object.For an explicit negative control, the script constructed an unattached 12-byte structure with the same category path and name as the 8-byte project structure. Exact path lookup returned the existing project object, but
isEquivalentreturned false and the manager did not contain the constructed object. This is an intentionally synthetic collision, not evidence of a natural decompiler failure. It demonstrates that path equality and a non-null lookup alone cannot establish that a decompiler type is the database object. Conversely, this single positiveisEquivalentresult does not establish a general equivalence or provenance rule. A production link should distinguish a manager-owned identity from any independently justified equivalent-type relationship, and leave unresolved cases unknown; it must not call Ghidra'sresolveif that would alter project data. Target SHA-256 remainedc244f7d7d9fa9b7f4cfcb1f69d69cc1f83ad98fe38b0293b223b3ca7d9076363and the target was not executed.Bounded view and compact catalog
On the imported-dSYM control above, real Ghidra MCP in compact and full input/output profiles returned an
analyze_functionsummary whose retained parent could be queried withinspect_analysis_viewfacetvalue_flow_parameters. The one-row page exposed the same observed HighFunction path; passing it toinspect_native_data_typereturned a pointer and then, viareferenced_type, the structure and both fields. This avoids delivering the complete dossier for that workflow, though it does not avoid constructing or retaining it. No token or performance measurement was made. The earlier non-resolving HighFunction pointer control and the synthetic same-path collision still apply.The compact advertised input schema did not enumerate this facet, and the existing description mentioned high p-code without naming
value_flow_parameters. Draft #8782 names the usable bounded view and warns about lookup/identity; it does not supply a verified type identity or resolve this issue.@morluto commented on GitHub (Oct 30, 2026):
A related but separate component case is in #8224: a real packed Ghidra structure exposed bit-field component
type_id: /uint:3, but an exact database query for that returned path was unavailable. The headless Ghidra control reported the field's base type as/uint, which REA could inspect separately. Union, enum and array category paths in the same project did resolve. This reinforces distinguishing ephemeral/component type representations from inspectable database identities; it does not assume the HighFunction pointer-path issue here has the same cause.@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.