mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 07:47:29 +00:00
[GH-ISSUE #8288] [Design] Preserve feature-trace evidence when reference ownership is unavailable #6526
Open
opened 2026-11-01 21:11:56 +00:00 by bsakaguchi
·
17 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#6526
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/8288
Before submitting
Decision needed
How should
trace_featureretain a useful match and observed reference when the provider cannot resolve the reference's containing procedure?Context and evidence
Through real REA MCP calls on macOS arm64, using Kuna 1.986 and a self-built, unexecuted Mach-O (SHA-256
ffad1b70c6a5a7ef3f7c3f59126be516520210777d949b35e97c9067f272aa2d):search_procedures({pattern:"evaluate"})returned_evaluateat0x100000430.xrefs({address:"0x100000430"})returned source0x1000004b0.trace_feature({query:"evaluate"})returned onlycapability_unavailable: Kuna does not declareresolve_containing_procedure. It did not return the match or reference. The remediation said to choose another analysis or target.trace_feature({query:"definitely_missing"})succeeded with no matches. With Ghidra 12.1.4 on the same binary, the matching trace succeeded and resolved that reference's owner. This compares provider observations, not complete ground truth.Source inspection at REA commit
b43c329shows the composed workflow returns immediately on containment failure after searching and obtaining xrefs; the existing containment result distinguishes a found owner from a verified absence but has no unavailable state. This also applies to other providers that cannot resolve a source, subject to their actual behavior. The inspected source was unchanged at current main23de10b.Expected interaction with targets
Read existing files or captured data. No target execution or mutation is proposed.
Boundary details (optional)
Keep the observed match, source and target addresses, provenance, and a truthful unknown/unsupported owner distinct from
not_in_procedure. Do not turn cancellation, malformed provider output, or arbitrary errors into a successful empty result. Preserve the provider's reference-coverage limitations.Options and tradeoffs
Consider a partial trace with an explicit per-reference unresolved outcome and reason, or an error carrying partial evidence and an actionable recovery path. Assess schema and compatibility cost, the difference between an unsupported capability and an operational failure, and whether session capability discovery already gives adequate advance notice. Reuse shared observation/evidence contracts where possible.
Verification available so far
I have a prototype or observed results.
Success criteria and open questions
Exercise a real MCP trace with an observed xref and unsupported containment, a no-reference query, and a provider that resolves the owner. Check cancellation and real lookup failures at a production boundary; verify that all returned references and limitations remain attributable. The observed result does not establish how often agents encounter this case.
References
Related reference-coverage discussion: https://github.com/morluto/rea/issues/8184
@morluto commented on GitHub (Oct 31, 2026):
For maintainer visibility: @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0
@morluto commented on GitHub (Oct 31, 2026):
Follow-up: a real
binary_session({detail:"complete"})in the same Kuna session reportstrace_featureasavailable:false,reason:"provider_missing", with remediation to configure a provider forresolve_containing_procedure. The direct operation is also marked unavailable. So capability discovery does warn about the missing dependency; this is not an unadvertised availability claim. The data-dependent behavior remains: a no-match trace succeeds, while the matching trace reaches the unsupported dependency after obtaining evidence and returns an error. Any change should keep discovery consistent with the chosen partial-result semantics.@morluto commented on GitHub (Oct 31, 2026):
Further controls using the public CLI on the same unchanged target:
rea trace <target> evaluate --provider kuna --format jsonexited 1 withcapability_unavailableand the missing containment operation indetails;definitely_missingexited 0 with no matches. The equivalent two Ghidra CLI calls both exited 0, and the matching trace included the reference and resolved owner. Target SHA-256 remained unchanged; it was not executed.Test-scope inspection at
b43c329(the named files were unchanged at23de10b):tests/boundary/mcp/enhancedTools.traceFeatureCoverage.test.tsuses an in-process provider port that supports containment; it covers capped xrefs, xref failure, cancellation and malformed containment.CapabilityInventory.test.tschecks mandatory dependencies separately.scripts/verify-real-kuna.mjsexercises Kuna references, but does not call the composedtrace_feature; the real IDA verifier does exercise a trace. These checks establish useful separate properties, but the inspected Kuna verifier does not check the real-provider composition where xrefs are present and containment is unsupported. This is source inspection, not a claim that the suite was run or that no other test can cover it.After a design decision, a real CLI/MCP regression using a source-owned fixture with a known reference, an empty-result control and preserved provenance could check the chosen contract. Keep malformed-output and cancellation checks at the boundary rather than converting those failures into unknown owners.
@morluto commented on GitHub (Oct 31, 2026):
Recovery control on the same source-owned Mach-O through real Kuna MCP:
search_proceduresfound_evaluateat0x100000430;xrefsreturned0x1000004b0;procedure_callersreturned0x100000480; andprocedure_assemblyfor that caller included0x1000004b0: bl 0x100000430. Ghidra's independent selected function-body observation also associated that source with the caller. The exact name differs by provider (_mainvsentry). Each operation carries its own provider limitations, including omitted reference edges and call-graph scope; static observations do not prove runtime reachability.This is a working, manual recovery for this direct-call example, not a general containment solution. Xrefs include non-call references, the caller list has no source-site identity, and there may be multiple callers or omitted edges.
procedure_infoand typedprocedure_referencesare unavailable for Kuna;analyze_functionsucceeded and explicitly reported typed references unavailable. A useful error or partial-result design could point to the available search/xref/caller/assembly path without presenting its results as automatically joined or complete. Target and ten original project-file hashes remained unchanged; no target execution occurred.@morluto commented on GitHub (Oct 31, 2026):
The same bounded recovery also works with the public one-shot CLI on this fixture:
rea xrefs <target> 0x100000430 --provider kunareturned0x1000004b0;rea function <target> 0x100000430 --provider kunareturned_mainat0x100000480among its caller observations; andrea function <target> 0x100000480 --provider kunaincluded theblinstruction at that xref address. All three exited 0 with individual Evidence records and limitations; the target hash was unchanged. This does not imply that every xref is a call or that a complete join can be inferred for other targets.@morluto commented on GitHub (Oct 31, 2026):
Evidence-retention control with real stdio MCP on REA
b43c329, Kuna 1.986 and the same unexecuted Mach-O: in a new session, I called onlyopen_binary,trace_feature({query:"evaluate"}), andexport_evidence_bundle. The trace returnedcapability_unavailableforresolve_containing_procedure; the exported bundle had zero records and zero unknowns. The error exposes the missing operation but neither the search match nor the observed xref as recoverable Evidence.In that same session I explicitly called
search_procedures({pattern:"evaluate"})andxrefs({address:"0x100000430"}). They returned_evaluateand source0x1000004b0, respectively; a second export contained two Evidence records for those calls. This is a working explicit recovery, with separate observations and their limitations; it does not make the failed composed trace itself recoverable.As a positive control, a separate fresh Ghidra 12.1.4 session on the same artifact successfully ran
trace_featureand the immediately exported bundle contained one completetrace_featurerecord with the match, references and containment results. The two providers' observed references differed, so this is a workflow-retention control, not a provider-accuracy comparison. Both sessions closed successfully; the target SHA-256 remainedffad1b70c6a5a7ef3f7c3f59126be516520210777d949b35e97c9067f272aa2d. No target execution occurred. Inspected trace, workflow-Evidence and Kuna source files were unchanged between the tested revision and current main23de10b.For a chosen partial-result design, verify both the inline failure/partial response and what a subsequent session export can recover. Preserve the existing distinction between unavailable ownership, a verified
not_in_procedure, cancellation and malformed provider output; do not imply that every intermediate call must become a standalone retained record.@morluto commented on GitHub (Oct 31, 2026):
The procedure-alias issue #8330 interacts with this partial-result gap. In a temporary exploratory REA main
60149282build, Kuna procedure search matched both primary and alias names. With real Kuna 1.986 MCP on two source-built ELFs containing direct callers, the previously omitted aliases were then found, buttrace_featurefailed at unsupportedresolve_containing_procedureand returned neither the discovered procedure matches nor their references. An unmodified-main paired run returned successful results without those procedure matches instead.A no-caller control with the same-entry primary/alias symbols returned no xrefs for the entry; the experimental feature trace succeeded and contained both same-address procedure-name matches. Thus this is specifically a reference/containment handoff in these fixtures, not an inherent failure merely from multiple names at one address. The tested change is isolated and incomplete, not an implemented fix; none of the targets were executed or modified. See https://github.com/morluto/rea/issues/8330 for the alias-search design and provenance.
@morluto commented on GitHub (Oct 31, 2026):
An isolated, unmerged design experiment on REA main
60149282preserves this result for a narrow unsupported-capability case. It extends only the trace's output shape with an explicit owner outcome{query_address, found: null, procedure: null, reason}, leaving the primitive containing-procedure contract's found/verified-absence states alone. It retains source and target addresses, adds a residual unknown, and preserves the reference-coverage limitations. This is one possible shape for discussion, not a finished fix.On the original unexecuted Mach-O with real Kuna 1.986,
trace_feature("evaluate")returned the_evaluatematch and0x1000004b0 → 0x100000430reference with owner unknown instead of failing. A no-match query remained empty. Real Ghidra 12.1.4 on the same target still reported the direct reference's owner as found and separate metadata sources asnot_in_procedure. Full and compact MCP output schemas validated for successful tested calls against the advertised schemas; the experimental trace also survived export and a target-free import with its record structurally unchanged. The target digest was unchanged.Paired with the separate alias-search experiment in #8330, the same partial-trace experiment returned two distinct procedure matches and both observed caller addresses on the versioned ELF instead of losing everything on unsupported containment. On a no-caller control it returned both same-address names with no references.
I also exercised the workflow's compiled application boundary with injected failures: cancellation, an already-aborted request, malformed containment, a retryable capability error, and a capability error with incomplete cleanup remained errors; only the injected non-retryable unsupported capability produced the partial result. These are simulated boundary controls, not real-provider cancellation or cleanup verification.
Open design points: this introduces a new
found: nullstate to the trace-specific schema and existing clients may assume a boolean; the prototype reportstruncated: truefor unavailable ownership, which may conflate missing ownership with omitted references; and matching a generic non-retryable capability-error tag alone may not prove every error was an undeclared operation. The trace evidence records provider identity and limitations but does not link a separate per-xref source record in this experiment. A production change needs an explicit error/coverage and Evidence-ownership design plus broader lifecycle and compatibility checks.@morluto commented on GitHub (Oct 31, 2026):
Follow-up to the partial-result experiment: I exercised cancellation at the actual containment boundary through the TypeScript SDK and real Ghidra 12.1.4. An audit-only bridge modification wrote a marker immediately on entering
resolve_containing_procedureand paused; no behavior was changed in the target, and the temporary bridge source was restored afterward. The experimental REA build also contained the earlier alias/partial-trace prototype.On the source-owned Base64 Mach-O, I first started Ghidra and captured its verified process-lineage snapshot. After
trace_featurereached the marker, aborting the SDK request caused the client call to reject with the cancellation reason, rather than return the prototype's partial success. The three recorded launcher/descendant PIDs were no longer present within the bounded poll;binary_sessionthen reported the target open and no cleanup pending. The Evidence summary contained notrace_featurerecord from the cancelled request. Repeating the trace succeeded, including the observed reference and resolved owner, thenclose_binarysucceeded. The target SHA-256 was unchanged. A separate cold-start run also reached the barrier, cancelled, and recovered; its lineage had not yet been observed, so it did not establish process cleanup.This is one deliberately paused real-provider path, not a general proof of cancellation, cleanup, or late-handshake behavior. The MCP cancellation is observed as an SDK rejection; no server-side typed cancellation response is claimed. Other failure injection in the earlier comment remains simulated, and the output schema/error-classification questions remain open.
@morluto commented on GitHub (Oct 31, 2026):
A newer Kuna reference producer makes this composition boundary observable on a string query, without changing REA:
crypto-sample(SHA-2566d276076713030d87100f3a98e551b88de799193d5f9e1b57c1774d583aa77e9), verified Kuna 1.986 / REAd54a4661da20382ad8456564a08569fdd24131c5returns the Base64 alphabet fromtrace_feature, with no references and the documented incomplete-reference limitation.8c74a944d74f8d3349755e05441a9628b4753111finds adatareference at0x10000038cto that string. Direct Kunaxrefs --toassociates it with_audit_base64_characterat0x100000378. REA's separatesearch_stringsandxrefscalls return the string and that source address, buttrace_featurereturns onlycapability_unavailableforresolve_containing_procedureand its generic recovery.get_evidence_bundle(detail: summary)immediately after the failed trace contained no retained records; the subsequent explicit searches produced their own observations.0x100000390with the containing function. The different provider source addresses represent their own observations, not a claim of identical reference semantics. A nonexistent-query control succeeds with no matches for all three sessions. Explicitprocedure_addressfor the owner name, which was independently obtained from direct Kuna output, succeeds; that does not make REA's xref itself provide an owner.All checks used public MCP with full advertised output schemas; the fixture hash stayed unchanged. This is not a verified-release upgrade recommendation or a claim that every newly discovered reference causes a failure. It demonstrates that improved upstream discovery can turn an otherwise successful high-level workflow into an error unless REA preserves the match/reference and marks the unavailable owner honestly. Related structured coverage question: #8184.
@morluto commented on GitHub (Oct 31, 2026):
Draft PR #8368 carries a revised, isolated implementation for review. For a non-retryable unavailable owner lookup with no incomplete cleanup, it retains the match and reference, records
status: "unavailable"with the provider and reason, and leaves reference truncation separate from the unknown owner. Cancellation, retryable errors, malformed output, and incomplete cleanup still fail. This expands the trace output contract, so clients that assume every owner was resolved need to handle the new state.The new public MCP regression fails against the baseline and passes with verified Kuna 1.986. Focused boundary tests and real Ghidra 12.1.4 controls also passed; the PR documents the exact scope and remaining verification limits. The PR is a draft, and its human ownership and readiness declarations remain open.
@morluto commented on GitHub (Oct 31, 2026):
Real-provider recovery control on #8368 (
de0305d), the owned unexecuted Mach-O from the report, and public MCP full output schemas:trace_feature({query:"evaluate"}). The partial trace preserves reference source0x1000004b0withcontaining_procedure.status: "unavailable"and Kuna's reason.resolve_containing_procedure({address:"0x1000004b0"}). Ghidra reports that address inside functionentry, beginning at0x100000480.This is a usable follow-up for this tested target and address, not proof that provider coordinates agree for arbitrary binaries or that switching preserves an existing Ghidra session's annotations. The query supplies an independently recorded Ghidra observation, not a retroactive Kuna observation. A fresh session is appropriate when keeping an existing provider's transient edits matters (#8289). The experiment does not show that an autonomous agent discovers or chooses this sequence.
@morluto commented on GitHub (Oct 31, 2026):
Coordinate caveat to the preceding provider-switch control: #8372 now has a real-provider counterexample where reopening the same binary in a rebased Ghidra project and passing the original Kuna source address succeeds but resolves a different function. The correct corresponding Ghidra address required correlating the source-file mappings; Ghidra correctly resolved each address in its own selected project. This does not invalidate the matching-coordinate control above, but it means a general recovery recommendation should not suggest reusing numeric addresses without establishing coordinate correspondence.
@morluto commented on GitHub (Oct 31, 2026):
While testing #8368, I found and fixed a distinction in the proposed recovery. In an MCP test using REA's IDA adapter and a simulated IDA upstream, the server reported unknown auto-analysis readiness at the containment boundary. The earlier PR branch incorrectly turned that non-retryable
server_healthrefusal into successful unavailable-owner Evidence, losing its readiness diagnostic and recovery instruction.The PR now only converts refusals attributed to
resolve_containing_procedure; the IDA readiness failure remains a typed error. Controlled tests cover readiness becoming unknown both before containment and after its upstream observation, including preservation of the latter's partial Evidence. The new regression failed against the earlier PR branch and passes on66fa52613. A real Kuna 1.986 verifier and real Ghidra 12.1.4 MCP control still pass, with the same normalized trace results as before this refinement. IDA itself was not run.@morluto commented on GitHub (Oct 31, 2026):
Partial-result snapshot follow-up on #8368 (
66fa52613): I exercised a saved Ghidra workflow with a deliberately instrumented disposable bridge. The bridge returnedmethod_unavailableforresolve_containing_procedure; real Ghidra 12.1.4 produced the match and xrefs. This is an injected capability refusal, not a claim that an unmodified Ghidra bridge naturally failed.trace_featureworkflow entry with revision 4.rea trace ... --snapshot <saved>returned the original trace and original refusal reason, with the same Evidence ID; a fresh CLI control without the snapshot returned the new refusal reason. This demonstrates the saved workflow replay for this request and controlled setup.The real verified Kuna partial trace remains a live-cache case: its earlier snapshot retained Evidence but did not produce a replayable workflow entry. Other saved-provider states and real IDA/Hopper remain unverified.
@morluto commented on GitHub (Oct 31, 2026):
Multi-reference control for #8368: on a new owned, unexecuted arm64 Mach-O with two distinct direct call sites to
_goal, verified Kuna 1.986's directxrefsreturned both sites. Baseline REAd54a4661failedtrace_feature("goal")at owner lookup; the PR returned both exact source addresses, each with an unavailable Kuna owner and its own residual unknown, withtruncated:false. Real Ghidra 12.1.4 returned both call sites with the same containing function, plus separate non-procedure references; no claim is made that providers have identical reference inventories. The fixture SHA-256 stayedaab4a4b9cc300f7be8e35d2f869ffea8d30d83391510c3fedce4a1237a844344.The PR's existing real Kuna verifier now compiles a source-owned fixture with two checksum call sites and checks every direct-provider incoming site against the public MCP feature trace, including unavailable owners. It passed with verified Kuna; running the verifier against base failed at the expected owner capability error with cleanup complete. A controlled MCP regression separately covers a shared source across two distinct targets, one capped target, and one unavailable owner; that shared-source case is simulated, not asserted as a real-provider observation.
@morluto commented on GitHub (Oct 31, 2026):
Follow-up on merged #8368: on current main
6e9ee97a69cb16c7150d8b550e705cba055ee4f0, real Kuna 1.986trace_feature({query:"audit_initial"})returned the observed procedure and call site0x1000003e8, withcontaining_procedure.status: "unavailable"and a corresponding residual unknown. Both full and compact advertised schemas were exercised through the TypeScript MCP SDK. A no-match control succeeded with empty matches.On the same unexecuted Mach-O, real Ghidra 12.1.4 fresh analysis resolved that call site's owner as
_audit_dispatch; the selected incomplete-project control reported only the references it observed. Each trace and no-match result, including limitations, matched after export and import to a separate target-free server. Target, selected-project source files, and bundle hashes remained unchanged. One macOS arm64 fixture was tested; this does not independently establish other providers or operational failure/cancellation paths.The separate question of reference discovery coverage remains in #8184; unavailable owner and missing references are different unknowns.