mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8362] [Bug] Kuna call paths can report complete negative despite omitted direct calls #6563
Open
opened 2026-11-01 21:12:16 +00:00 by bsakaguchi
·
6 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#6563
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/8362
Before submitting
Area
Native analysis or decompilation
Observed behavior
On the fixture below,
trace_call_pathwith verified Kuna 1.986 reportsgoal_status: not_reached, complete relationship coverage at both visited nodes, no failures, and no residual unknowns for_main→_goal. But the binary contains two direct call instructions_main→_middle→_goal. REA itself reports the first edge and an xref to_middle; direct Kuna disassembly decodes the second. Ghidra reports the two-edge static path as reached. This is a static evidence discrepancy, not a claim that the target was executed.Reproduction
On macOS arm64, assemble the following and link with
clang -arch arm64 -Wl,-e,_main fixture.s -o fixture:Start REA MCP with
REA_KUNA_COMMANDpointing to verified Kuna 1.986. Callopen_binarywith the fixture andprovider_id: "kuna", then calltrace_call_pathwith{"start":"_main","goal":"_goal"}. As a control,{"start":"_direct_goal","goal":"_goal"}returnsreached. With Ghidra 12.1.4, both positive paths returnreached. Tested with both compact and full advertised MCP schema profiles, with SDK output validation; exporting and importing the evidence into a new MCP session preserved the result.Expected behavior
A negative path result and its relationship coverage should reflect an omitted direct call as unknown or incomplete when the provider cannot establish that its call graph covers the relevant code. An explicit limitation already says targets outside the inventory remain unknown; it should not coexist with an unqualified complete negative for this counterexample. The Ghidra and direct-disassembly results provide independent checks of the static instructions. The appropriate recovery or implementation is open for design; this report does not imply that every omitted data symbol should become a function.
Impact and scope
An agent can retain and reuse a definite-looking negative path despite a known direct static route. Reproduced on this synthetic Mach-O arm64 target in both MCP profiles. Other formats and real-world frequency are not established. The executable was not run, and its digest was unchanged.
REA version
d54a4661daRuntime and platform
Node 24.22.1; macOS 26.3 arm64; Kuna 1.986 verified release; Ghidra 12.1.4 / JDK 21 control.
Target and artifact context
Synthetic Mach-O arm64 executable, SHA-256
788ab9e10b0313cb3a60c3ca59baa0333b271b0ba022122b85408896932ef0b8. Addresses from this build:_main0x1000003c0,_goal0x1000003c8,_middle0x1000003e0.Interface
MCP
Earliest failure stage
Native analysis or reconstruction
Relevant output or evidence
procedure_callees(_main)returns0x1000003e0;xrefs(0x1000003e0)returns0x1000003c0._main → _middle, with both nodes'relationship_coverage.statusset tocompleteandgoal_status: not_reached.kuna disassemble fixture 0x1000003e0 --addr --as code --bytes 8 --jsondecodesbl 0x1000003c8; ret._main → _middle → _goalandreached;_main → _unrelatedis a negative control.Analysis or suspected cause
Source-derived: KunaReferenceQueries.ts assigns complete callee coverage when
node.hasIndirectCallsis false. That flag alone does not establish that the graph covered all direct calls in this fixture. How best to propagate provider inventory/body coverage is an open design question.An unverified build of current Kuna source (
8c74a944d74f8d3349755e05441a9628b4753111) produced a related result: REA reported the first node's callees as empty and complete even though its xref still found the direct call. This is not a verified release or an upgrade recommendation.Additional context
Related to the section classification issue #8352 and the separate Ghidra indirect-reference path issue #8277. A proposed real-provider regression should check the two-hop path, the direct positive and unrelated controls, and coverage semantics rather than only the ordinary positive path. The existing real Kuna reference verifier checks an ordinary expected caller and a reached path; this fixture exercises a different boundary.
cc @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0
Released Kuna 1.988 control
On REA main
53363166f, the released Kuna 1.988 still returned a complete-lookingnot_reachedresult on the original two-hop fixture. Its graph now omits the first_mainto_middleedge entirely:procedure_callees(_main)returned[], whilexrefsreturned the real call site. The path visited only_main, reported its relationship coverage ascomplete, and had no residual unknowns. The separately discovered_direct_goalto_goalpositive control remained reached;_mainto unrelated remained not reached. The existing limitation says targets outside Kuna's discovered function inventory remain unknown.A paired fixture changes the instruction at
_middlefrombl _goaltonop. Direct Kuna 1.988 forced-code disassembly confirmed the differing instructions, yet REA returned the same normalized negative result for both fixtures. Real Ghidra 12.1.4 on the same files returned reached for the original and not reached for the paired control. Full advertised MCP schema was fetched for the Kuna control; the targets were unchanged and not executed. This is one macOS arm64, source-owned static fixture pair, not a prevalence estimate. Updating the recommended Kuna release does not by itself resolve the coverage contract.Conservative producer-side coverage experiment
An isolated unmerged experiment changed Kuna relationship coverage to
unknownwhen the graph does not establish completeness outside its discovered nodes; indirect-call cases remain partial and also carry the inventory limitation. It retains observed edges. With real Kuna 1.986 and 1.988, full-schema stdio MCP, and the original two-hop plus paired NOP fixture, the prior negative becomesunknown; the direct observed positive remainsreached. An unrelated negative also becomesunknown, and even the observed positive hastruncated: trueunder the existing trace contract because its expansion coverage is unknown. This is a deliberate broad tradeoff, not a claim of additional recovered edges. The full real Kuna verifier passed on 1.988 on macOS arm64 with Mach-O and ELF fixtures and complete cleanup; it did not exercise this negative-path case.A separate 1.988 snapshot control saved the old
not_reachedEvidence on main and reopened it under the experiment. The historical Evidence was preserved exactly and the fresh result wasunknownwith a different Evidence ID, but the workflow analysis-profile digest was the same. Before product integration, give the changed producer/derived coverage semantics an appropriate identity and decide snapshot applicability without silently rewriting history. Also consider the usefulness cost: all Kuna negative paths become unknown, not just this fixture, and repeated per-node uncertainty expands results. No automatic provider switch, speculative edge, compatibility shim, or implementation is proposed by this experiment. One host and owned static fixtures; no agent-selection or broad-corpus measurement.Outgoing-xref alternative
Direct released Kuna 1.986 and 1.988
xrefs --from <address> --kind call --jsonon both the original and paired NOP fixtures report_main's call site and target_middle; 1.988 leavesto_functionnull. Querying the exact_middleaddress returns an empty successful result on both binaries, even though forced-code disassembly shows abl _goalin the original and anopin the paired control. Thus outgoing xrefs can recover the first observed edge on this case but cannot alone establish completeness at the omitted middle address or distinguish the two fixtures. The commands were run directly, not through a new REA operation; target hashes were unchanged, binaries were not executed, and no general provider-frequency or performance claim is made. Treat edge discovery and evidence that its source was actually analyzed as distinct facts.A direct 1.988
xrefs --to 0x1000003c8 --kind call --jsoncontrol also produced the same single_direct_goalcall site on both fixtures; it did not report the_middlecall in the original. This does not show that all incoming references are incomplete, but it rules out using this incoming query alone as a proof of absence on the controlled pair.Upstream report: https://github.com/Noelo-Lab/kuna/issues/1406 asks whether an explicitly selected source in this unflagged section should be walked or report that it was not covered. REA's responsibility to avoid unqualified completeness remains independent of the upstream outcome.
Existing discovery-scope PR on Kuna 1.988
The broader #8443 head
b7160bd7separates provider-graph relationship reads from discovery coverage. Real full-schema stdio MCP with Kuna 1.988 on the original two-hop and paired NOP fixtures returnedgoal_status: unknownandsearch_scope.observed_goal_status: not_reached; the observed direct positive remained reached, and the unrelated negative was also unknown. The same control on 1.986 reported partial discovery at the data-classified node; 1.988 omitted that node and reported discovery unknown. The unexecuted target hashes were unchanged. This supports the existing PR's general boundary, rather than a new xrefs wrapper.A 1.988 snapshot containing the older negative was refused by #8443 as a profile mismatch. Manual extraction of the embedded Evidence bundle followed by target-free import preserved the old record exactly; fresh analysis returned unknown under a different profile. This extraction is not a built-in migration workflow. Snapshot and target bytes remained unchanged; one host and controlled fixtures only.
Kuna 1.989 and explicit-source coverage
On the proposed version-bump PR #8691 (
fc2ca7115), real Kuna 1.989 in both full and compact stdio MCP profiles still returned the same complete-lookingnot_reachedfor_mainto_goalon the original call and paired NOP fixtures.procedure_callees(_main)was empty andxrefs(_middle)retained_main's call site. The direct positive remained reached and the unrelated negative remained not reached. Independentxcrun llvm-objdump --disassemble --section=__constshowedbl _goalin the original andnopin the paired fixture. Both target digests were unchanged; neither executable ran.Direct Kuna 1.989
xrefs --from 0x1000003e0 --kind call --jsonnow distinguishes the two fixtures: one call row in the original, none in the NOP control. Both reportcoverage.decoded: true, executable mapping and the non-code section; the notes say the explicitly requested address was decoded and other queries do not walk that section. This addresses the upstream explicit-source case in Noelo-Lab/kuna#1406, but REA's existing graph-based path query still does not consume that direct observation. It is not proof that the whole program's discovery is complete or a recommendation to silently equate a negative xref with absence.As a separate control, current discovery-scope PR #8443 head
ef5a7e68bon the same two fixtures and Kuna 1.989 returnedunknownwithsearch_scope.observed_goal_status: not_reachedin both schema profiles. The direct positive stayed reached; the unrelated negative also became unknown. This confirms the tradeoff for the sampled 1.989 artifacts; it does not recover the missing path or establish broad coverage.Kuna 1.990 and discovery-scope fix
On macOS arm64, I rebuilt the source-owned call and paired NOP Mach-O fixtures above. Independent
llvm-objdumpshowedbl _goalat_middlein one andnopin the other. On the REA 1.990 verification branch187f3d8cc, real Kuna 1.990 returnednot_reachedwith no residual unknowns for_mainto_goalin both binaries; the direct_direct_goalto_goalcontrol returnedreached. On #8443 headef5a7e68b, the same queries returnedunknownwithsearch_scope.observed_goal_status: not_reached, while the direct positive stayedreached._mainto the unrelated function also changed fromnot_reachedtounknown. Both compact and full MCP profiles were exercised; both target hashes (f314f698ea2c0fb730decd6cc087f9f1818d3c83173571416b3e07f1c124f1e0,867753d9b9e1fc62436a24c4db0683cb82c4f469e368e4b99ef52ea3ff74285b) remained unchanged and neither target ran. This confirms the conservative discovery-scope behavior on one controlled fixture pair, not recovery of the missing edge or a prevalence estimate.Explicit-source query on Kuna 1.990
Direct Kuna 1.990
xrefs --from 0x1000003e0 --kind call --jsondistinguished the paired fixtures above: it returned_middleto_goalin the call fixture and zero rows in the NOP fixture. Both responses reportedcoverage.decoded: true,section: __TEXT,__const,code_section: false,executable: true, and a note that this explicitly requested source was decoded while other queries do not walk that section. This confirms the behavior reported fixed upstream in Kuna #1412 for the 1.990 release; it is not whole-program discovery coverage or runtime reachability. REA's current Kunaxrefsadapter invokes the incoming--toform, so this direct query is not an existing REA outgoing-reference workflow. See #8190 for that design boundary.Ghidra control on the rebuilt pair
On #8443 head
ef5a7e68bwith real Ghidra 12.1.4/JDK 21, the same rebuilt fixture pair and compact/full MCP profiles returnedreachedfor_mainto_goalin the call fixture andunknownwith observednot_reachedfor the NOP fixture. The direct positive was reached in both; the unrelated negative was unknown. Both target digests remained unchanged. This is a working explicit Ghidra alternative for recovering this observed path, not proof that Ghidra's negative is complete or that every binary has equivalent coordinates across providers.Same-session investigation and selector recovery
On #8443 with Kuna 1.990, both MCP profiles returned the discovery-qualified unknown path; a separately requested incoming
xrefsat_middlereturned_main's call site. Attempting Kunaprocedure_assemblyat_middlefailed because it was absent from the provider inventory, but its top-level remediation still suggested schema repair. Explicitly selecting Ghidra on the same connection returned the two-edge path and preserved the original Kuna trace Evidence exactly. On separate #8397 head65939bc4a, the same Kuna assembly failure retained the exact address and recommended inventory inspection without schema-repair recovery; the explicit Ghidra handoff again reached the goal. These were separate branch controls, not a combined integration or an automatic provider switch. The target digest remained unchanged; it was not executed.Combined call-scope and selector-recovery control
In a disposable integration checkout combining #8443
ef5a7e68bwith #839765939bc4a, the same 1.990 fixture and real Ghidra 12.1.4 were exercised through compact and full MCP. Kunatrace_call_pathreturnedunknownwith observednot_reached; incomingxrefsfound_main's call to_middle;procedure_assemblyat_middlereturned the inventory-scoped selector guidance without schema-repair recovery. Explicitly selecting Ghidra on the same connection returned the two observed edges to_goal, and the prior Kuna trace remained identical in the retained bundle. Successful tool responses validated against the advertised output schemas. The target SHA-256 stayedf314f698ea2c0fb730decd6cc087f9f1818d3c83173571416b3e07f1c124f1e0and was not executed. This is an uncommitted local integration, not an automatic fallback, autonomous-agent trace, or assertion that either PR contains the other.@morluto commented on GitHub (Oct 31, 2026):
Additional real-provider MCP check on the same fixture, with full output-schema validation:
procedure_callers({"procedure":"_goal"})with verified Kuna 1.986 returns only_direct_goal(0x1000003d0) and marks callers coveragecomplete; it omits_middle(0x1000003e0), even though direct Kuna disassembly decodes itsbl _goal.trace_call_path({"start":"_goal","goal":"_main","direction":"backward"})returnsnot_reached, both visited nodes complete, no failures and no residual unknowns. The normal_goal→_direct_goalbackward control returnsreached._mainin the reverse search. Both providers report_goal→_unrelatedasnot_reachedfor this fixture.get_call_graphalso exposes the omitted caller with complete node coverage under Kuna.xrefs(_goal)finds the ordinary caller and omits_middle; unlike relationship coverage, its existing limitation explicitly says an empty result does not prove no reference exists. Here it is nonempty but still incomplete.An unverified current Kuna source build produced the same reverse results; no release-wide claim is implied. The target was not executed and its hash was unchanged. This extends the same coverage issue to caller queries and reverse traversal, so it should be addressed together, with forward and backward controls in the regression.
Source-derived context: the adapter marks callers complete whenever the graph reports no indirect calls; this fixture shows that absence of indirect calls alone does not prove all direct incoming calls were examined. It does not by itself prescribe where the provider/adapter should establish completeness.
@morluto commented on GitHub (Oct 31, 2026):
A further real-provider control shows the same discovery boundary affects positive paths as well as negative ones. On a new synthetic arm64 Mach-O (SHA-256
4540cb983e8b428e159e15b884c822232bff1f214292bd2b8546e2cd7f7b83d1),_mainhas observed calls to both_middleand_via_one;_via_one → _via_two → _goalis the longer route._middleis in__TEXT,__constand its bytes decode asbl _goal; ret.With verified Kuna 1.986 and REA main
d54a4661, public MCPtrace_call_path(_main, _goal)reports the three-edge route through_via_one,reached,truncated: false, all visited relationship coveragecomplete, and no residual unknowns. Ghidra 12.1.4 reports the two-edge static route through_middle. Direct Kuna forced-code disassembly of_middleconfirms the encodedbltarget, and LLVM disassembly confirms_maincalls_middle. The returned Kuna path is shortest within its returned graph; the experiment does not establish that it is shortest over all statically decodable calls. This fixture was not executed;_middleis in a non-code section, so neither this observation nor Ghidra's static path establishes executable/runtime reachability. Full MCP schemas were validated, and the target digest stayed unchanged.I also tested an isolated unmerged experiment that changes the adapter's no-indirect-call coverage from
completetounknown, leaving observed edges intact. On the original fixture, both the missing forward and backward paths change fromnot_reachedtounknown; the direct positive controls remainreached, and the unrelated negative controls also becomeunknown. On the new fixture, the longer positive route remains available but is markedtruncatedwith residual unknowns. Existing documentation explicitly definestrace_call_path.truncatedthat way. The same change propagates unknown coverage into Kuna function dossiers and changes one observed different-dossier calls comparison fromchangedtounknown; its self-comparison was already unknown for separate identity reasons. These are observations of the experiment, not a proposed finished patch.The design distinction matters: tool-design.md describes
relationship_coverageas completeness of the provider-observed set, while this counterexample concerns discovery beyond that set. A fix needs to distinguish exhaustive retrieval of the observed graph from evidence about discovery or target completeness, and make the scope of negative and shortest-path claims machine-readable. Merely making every Kuna relationshipunknownloses that distinction and has broad comparison consequences. A production change must also consider snapshot/profile invalidation and historical Evidence; this small experiment did not change profiles or test cache migration. Other providers, targets and operating systems remain unverified.@morluto commented on GitHub (Nov 1, 2026):
Explicit provider-switch and offline composition control
On REA #8440 head
025272ee2a9763a3f174a9dba7a8eda8fc722cf3(verifier-only change) with real Kuna 1.986, Ghidra 12.1.4/JDK 21, macOS arm64 and stdio MCP, I used the original source-owned__TEXT,__constfixture from this issue:trace_call_path(_main, _goal)returnednot_reached; its_maindossier was retained. Direct Kuna forced-code disassembly at_middleseparately decodedbl _goal; ret._mainand_middle, and triedbuild_call_pathwith the Kuna_maindossier plus Ghidra_middle. REA returnedinvalid_request, explaining that the Evidence mixes providers. Both original provider records remained retained.The target SHA-256
788ab9e10b0313cb3a60c3ca59baa0333b271b0ba022122b85408896932ef0b8remained unchanged and it was not executed. The fixture places_middlein a non-code section of an executable segment; the result is evidence about static decoding and reported relationships, not runtime execution. This is one target and host. The provider-mixing refusal is an explicit current contract, not itself a defect: joining observations requires a defensible coordinate/provenance policy. It shows an available recovery using a separate Ghidra analysis while keeping Kuna's original result, and why raw cross-provider union should not be assumed safe.@morluto commented on GitHub (Nov 1, 2026):
Existing cross-provider comparison control
Using the same real-provider fixture and session in the preceding control, I passed the retained Kuna
_mainand Ghidraentrydossiers (both at0x1000003c0) tocompare_functions. It returnedfunction_match.status: ambiguous, overallunknown, and all eight dimensions unknown. The calls dimension reported that a common executable coordinate context was not established; the output retained provider-specific limitations and linked both original dossiers. A Ghidra dossier compared with itself returnedsame-entryandunchanged. After bundle export, a fresh target-free server imported the records and produced exactly the same cross-provider comparison Evidence.This is a useful existing way to keep uncertainty visible while inspecting these observations; it does not map coordinates, identify an omitted call, or make the Kuna path exhaustive. The two tools answer different questions, so this comparison is not by itself a contradiction of the path result. The known fixture's hash stayed unchanged and it was not executed. One target, host and provider pair were checked. Related coordinate-mapping design: #8372.
Offline single-provider path control
On the same fixture and host with real Kuna 1.986 and stdio MCP, I retained the
_maindossier and attempted to obtain_middledirectly. Its name lookup failed; selecting0x1000003e0returned an explicit input error explaining that its Mach-O section declares no instructions. Using the available_maindossier inbuild_call_pathreturnedstatus: unknown,search_scope.exhaustive: false, and a limitation that no dossier covers reachable0x1000003e0. After export and import into a fresh target-free session, the complete result matched exactly. The original livetrace_call_pathstill returnednot_reachedfor the same start and goal.This is a useful conservative existing workflow for this fixture, not a workaround that finds the missing edge. It shows the discrepancy is not universal across REA's path tools: offline dossier composition identifies its missing source, while live tracing has already accepted an empty relationship response for the provider-derived address. A fix needs to preserve that distinction and must not claim more complete graph discovery from the dossier's
relationship_coverage: completealone. The static target's SHA-256 was unchanged and it was not executed. One synthetic target and provider release only.@morluto commented on GitHub (Nov 1, 2026):
Provider graph classification and a no-call control
A direct run of released Kuna 1.986 on the original fixture adds a concrete source fact to the diagnosis.
decompile-graph --functions ''emits_mainaskind: normal, but the call destination0x1000003e0askind: data, size0,hasIndirectCalls: false; the graph includes_main → 0x1000003e0as a call and no outgoing call from that destination. Explicitly selecting both addresses withdecompile-graph --addrreturns_main's body and warns that the destination is not executable content and is exported without a body. The destination'scodeCandassemblyare null. The release's graph producer describesdataas a bodyless classification. This is Kuna's classification, not proof of runtime reachability or a reason to reinterpret data as code automatically.On REA
025272ee2using the same installed provider and public stdio MCP, explicitprocedure_callees({procedure:"0x1000003e0"})returned[]withrelationship_coverage: complete; the retained graph-source summary omitted the node'skind. In the same sessionanalyze_functionat that address rejected it because the Mach-O section declares no instructions. The live path nevertheless expanded that address and returnednot_reachedwith complete coverage. The agent sees conflicting practical implications from the two workflows without the graph node classification in the relationship Evidence.For a separate negative control, I rebuilt the same authored source with the destination changed from
bl _goal; rettonop; ret(SHA-256ce7eab76b09d27ee9843c07f7c6b178bd55873269dd47682e2591a33ad69e0e2). Direct forced-code disassembly confirmed those instructions. Kuna'sfunctionsrows andedgesrows were identical to the original fixture's graph, including thedatanode and_main's call to it. REA returned identical normalizedprocedure_calleesandtrace_call_pathresults and coverage for the two fixtures; subject digests and graph source paths/digests differ. The original fixture's forced-code disassembly contains the call; the control does not. Both targets were unchanged during analysis and neither was executed. This is static decoding evidence for two deliberately constructed fixtures, not a runtime claim or frequency estimate.This is an actionable boundary, but not a complete solution to the issue. The current parser retains
node.kind, whileKunaReferenceQueriesmakes coverage depend onhasIndirectCallsand omitskindfrom the recorded source summary. A path expansion of a bodyless provider node is a specific place to preserve the provider's classification and uncertainty; unvisited graph nodes and all callers need separate reasoning. Every Mach-O graph here also contains uncalled data nodes such as the header, so downgrading all graphs merely because any data row exists would be overly broad. Conversely, the identical rows show a graph-only consumer cannot determine which of these two bodies contains a call. Preserve observed edges, distinguish graph retrieval from discovery, and retain the existing conservative treatment of incomplete evidence; no code change or general discovery guarantee is proposed here.A further real Ghidra 12.1.4/JDK 21 stdio MCP control on both exact files returned the two-hop static path on the original and
not_reachedon thenopvariant. Full advertised output schemas were used, and both target hashes remained unchanged. This corroborates the differing static instructions; neither fixture establishes execution or general engine completeness.@morluto commented on GitHub (Nov 1, 2026):
Narrow experiment: useful evidence, not a complete fix
In an isolated, uncommitted REA experiment on main
6e9ee97a, I kept Kuna's observed graph edges, included the parsed nodekindin its source summary, and changed only adatanode's outgoing coverage fromcompletetounknown. This deliberately reuses the existing coverage field to test the consequences; it does not yet distinguish observed-graph retrieval from discovery and is not a proposed final contract.With real Kuna 1.986 and full-schema stdio MCP on the two fixtures above:
procedure_calleesreturnedunknownwith its provider classification; the ordinary_direct_goalnode remainedcomplete._main → _goalsearches becameunknown; the known direct positive remainedreached. The backward_goal → _mainsearch still reportednot_reached, because that traversal never expands the data-labeled node. This targeted change alone cannot resolve the issue.reachedbut becametruncatedwith a residual uncertainty at the bodyless node; Ghidra still found the separate two-hop static path. The input hashes were unchanged and neither target was executed.The persistence control also constrains the design. A baseline Kuna session saved a snapshot containing the old
not_reachedEvidence, with zero primitive and zero workflow cache entries. The experiment reopened that snapshot and produced a freshunknownresult while preserving the original historical record. Because this exploratory patch intentionally changed neither provider nor workflow profile, the two different conclusions had the same profile digest. A production semantic change needs an explicit identity/revision decision covering both primitive relationship outputs and composed paths, alongside a clear historical-Evidence story; this experiment does not implement that decision or a migration. The original snapshot and target hashes remained unchanged.The observed distinction matters more than this patch: the existing documented coverage field describes retrieval of the provider-observed set, while the missing question is discovery of possible calls. Replacing one with the other would discard that separation. A provider-neutral discovery/search-scope fact and explicit unknowns may be cleaner, but still need tests for incoming relationships, positive shortest paths, consumers, snapshots and full/compact clients. These are three synthetic static fixtures on one host, not a runtime or prevalence claim.