mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8221] [Design] Connect imported calls to explicitly selected library evidence #6497
Open
opened 2026-11-01 21:11:40 +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#6497
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/8221
Before submitting
Decision needed
How can an agent move from a statically observed imported call to analysis of a caller-selected candidate library, while retaining both artifacts' identity and clearly distinguishing a file-level candidate from the library actually loaded at runtime?
Context and evidence
I built an unexecuted arm64 Mach-O executable importing
_audit_transformfrom an owned@rpath/libAudit.dylib; its request function calls the import stub and adds one. The executable and library SHA-256 values were unchanged throughout the REA sessions.inspect_machoon the executable reported the_audit_transformimport,source: libAudit, and@rpath/libAudit.dylibdependency. The import inventory explicitly said it may omit metadata and reported a null import address. This is format Evidence, not a resolved filesystem path or proof of runtime binding._audit_requestto local address0x1000004b4;procedure_referencesmarked that local function a thunk toEXTERNAL:0x1.procedure_infoon that external address identified@rpath/libAudit.dylib::_audit_transformand an external function with no body; its pseudocode was null.trace_call_pathreached the local stub but not the external address, consistent with its call-only scope.audit_transformtwice, at the stub and the GOT address0x100004000. Name lookup rejected the ambiguity and asked for an exact address. Stub pseudocode described ajump-as-call; requesting the GOT entry's pseudocode returned null. Kunaprocedure_infoand typedprocedure_referenceswere unavailable. This one fixture does not establish general provider accuracy.inspect_machoexport inventory contained_audit_transformat0x2d8, and both providers decompiled that library function. The library had a different digest and address context from the importing executable. The source fixture establishes the intended association here; static equal names alone do not establish a runtime binding.Expected interaction with targets
Read caller-selected binaries and existing static Evidence. Do not launch the target, search the filesystem implicitly, change the binary or load libraries into a process.
Boundary details (optional)
Distinguish call-site address, local stub, GOT/indirection, provider external symbol, declared dependency, candidate file, export, and actual runtime binding. Preserve both digests, architecture/slice, coordinate spaces, original symbol spelling, library names and relevant source Evidence. Rpaths, install names, weak imports, re-exports, interposition, symbol versions, missing or incomplete inventories, multiple matching candidates and changed files can make a match ambiguous or runtime resolution unknown.
Options and tradeoffs
Explore a bounded workflow that joins retained import/dependency and export facts for explicitly selected files, reports exact observed facts and candidate associations with uncertainty, and offers a follow-up function-analysis input when a provider can identify the export. Consider whether the existing single-target session and Evidence export/import are sufficient for the workflow before introducing a new tool. Keep call-only graph behavior and candidate matching separate; do not automatically follow arbitrary filesystem paths or infer runtime binding.
Verification available so far
I have a prototype or observed results.
Success criteria and open questions
Exercise duplicate names, multiple candidate libraries, missing and weak imports, re-exports, architecture/slice selection, load-path ambiguity, changed files, and provider-specific stub/alias cases. Verify identity and Evidence survive CLI/MCP session transitions and that unknown runtime resolution is not presented as fact. The test above is one Mach-O pair on macOS arm64; no PE, ELF, dynamic-loader execution or autonomous-agent success was tested.
References
Related: #8197, #8168 and #8183. REA
53a4ab78451a0654e9c3beb3d43a5e371a288fcc; macOS arm64, Ghidra 12.1.4, Kuna 1.986.ELF visibility in candidate Evidence
Two explicitly selected, source-built x86-64 ELF shared objects export
audit_targetat0x1340with identical name, binding, type and version, but one declares default visibility and the other protected. LLVM readobj confirmsR_X86_64_64 audit_targetfor the former pointer andR_X86_64_RELATIVEfor the latter. On #8509, REA's portableinspect_native_exportsreturned identical function rows because it did not retain visibility (#8517). Draft #8519 retainsdefault/protected; its real compact/full MCP controls can select the field from each retained export and recover it after offline bundle import. On this macOS host,inspect_binary_layoutrefused its Linux-x64-only provider, so it was not an available relocation-evidence fallback here.This is useful candidate metadata, not an automatic join or proof of what a loader will bind. Default-visible globals can be preempted under the ELF gABI; runtime loader state remains unknown. Both targets remained byte-identical and were never executed. One controlled pair, not general platform or interposition coverage.
cc @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0
Default-visible call through PLT versus protected local call
Two source-built x86-64 ELF shared objects differ only in
audit_targetvisibility. The default-visible object has anR_X86_64_JUMP_SLOT audit_targetrelocation; the protected object has no dynamic relocation for this call. Direct Kuna 1.988 prints the same reconstructedaudit_target(a0) + 2expression for both. On the default object, both real REA/Kuna and REA/Ghidra refusedaudit_targetby name as ambiguous between the local entry and a PLT stub; exact-address recovery traced the caller to the stub asreached, and to the implementation asnot_reachedin the call-only traversal. Ghidra classified the stub as a thunk whose static target is the local definition; Kuna's stub pseudocode showed an indirect slot jump. On the protected object both providers' call-only traces reached the local entry directly. Draft #8519 independently returns the default/protected export visibility. These are provider static observations and traversal outcomes: the default-visible relocation may be interposed and no runtime selection is established.This control makes the task-level distinction concrete: identical displayed names and decompiled expressions do not by themselves identify the declared relocation or a runtime-selected implementation. The two target SHA-256 values (
741f17c72cea92c0316549c9733cdf77c528d890fde6231bdf4cc8ba325aa630,64ceb8aa79339deb52cd010fb319f8a417b4dba79670765da1298fe65c35b273) remained unchanged; neither binary was run. One host, two constructed fixtures; not a general reachability or provider-accuracy claim.@morluto commented on GitHub (Oct 30, 2026):
A follow-up tested multiple caller-selected candidates and existing Evidence retention. I built a second arm64 dylib with the same declared install name
@rpath/libAudit.dyliband the same_audit_transformexport at the same displayed address, but a different SHA-256 and a different implementation. The original executable, original dylib and alternative dylib were not executed and all three digests stayed unchanged. The original fixture links against the first library; this test does not establish that the alternative would be selected by the dynamic loader.Using real REA/Ghidra MCP, I opened the three artifacts sequentially, captured
inspect_machosummary andanalyze_functionEvidence for each, exported a separate bundle and closed each session. In a fresh server I imported all three bundles. A filteredget_evidence_bundlesummary found all three inspection records with distinct artifact paths and digests;inspect_analysis_viewpaged the executable's import and dependency rows, both libraries' export rows, and each library function's pseudocode without starting a provider. Both export pages contained the same name and address, while the retained pseudocode pages differed. Import/export inventory limitations remained explicit and non-exhaustive.This demonstrates a useful existing building block: an agent can preserve and inspect evidence for multiple explicit targets across session changes. It also demonstrates that symbol name, install-name text and displayed address alone cannot select a unique candidate. The scripted caller retained the Evidence IDs and chose which pages to inspect; no automatic association, runtime binding, cross-platform behavior or autonomous agent success was established. Any candidate workflow should retain alternatives rather than silently picking a first match.
@morluto commented on GitHub (Oct 30, 2026):
An independent, unexecuted x86-64 PE control shows a different import shape and exercises a forwarded-export case. REA/Kuna still refuses PE at its documented admission boundary; direct Kuna 1.986 listed the caller and reported its indirect call through IAT address
0x140002038toaudit_transform.Real REA/Ghidra 12.1.4 on the same PE returned a computed call from the caller directly to external
AUDIT.DLL::audit_transform, alongside a separate data-read reference at the same instruction to0x140002038.trace_call_pathreached the external address.inspect_pe_importsidentifiedaudit.dll, the named import and IAT RVA0x2038;inspect_native_exportson the explicitly selected DLL identified its named ordinal-1 export. Opening that DLL separately returned the function's pseudocode. These are static observations, not evidence of the DLL selected or called at runtime.I also built a distinct
audit.dllwhose export forwardsaudit_transformtoaudit_real.audit_transform, plus a separately selectedaudit_real.dllwith a body.inspect_native_exportscorrectly represented the first row withaddress: nulland the forwarder string, and the second with an actual export address; it does not resolve the other file automatically. Ghidra exposed a local thunk at0x180003000and an external symbol; the name was ambiguous until an exact entry was chosen. On this fixture the thunk address had no initialized file-backed mapping, no listed instruction, and pseudocode warned about bad instruction data. Direct Kuna's function inventory for the forwarder was empty; its separate real DLL listed the exported function. These observations argue against treating every matching export or Ghidra entry as a file-backed implementation. All tested target digests were unchanged; no Windows execution, ordinal-only import, delay import or loader resolution was tested.@morluto commented on GitHub (Oct 30, 2026):
A self-built, unexecuted x86-64 ELF control illustrates the symbol-version boundary. The PIE imports
audit_transform@AUDIT_1fromlibaudit.so, as observed independently withllvm-readelf. I built two caller-selected libraries with the same SONAME, export name, displayed address and identical function instructions, but different digests and version definitionsAUDIT_1andAUDIT_2. The source and linker inputs establish which one the executable was linked against; no dynamic loader was run.REA
inspect_native_exportson each library preserved the respective version name and reported complete coverage on this fixture. Both REA/Ghidra 12.1.4 and REA/Kuna 1.986 decompiled the same function text from both libraries, and both found the importing function's call to a local PLT entry. Ghidra's inventory classified two successive thunks leading to an external entry; its image coordinates differed from Kuna's (for the first PLT entry0x101360versus0x1360). The inspected provider inventory and pseudocode did not expose the requiredAUDIT_1version in this run. The versioned import observation above comes fromllvm-readelf, not from those REA provider calls.The existing
inspect_binary_layoutoperation returned its documented Linux-x64-host capability refusal on this macOS host, so this probe does not establish whether its Linux output exposes the needed import version. This is one fixture, not a complete version-resolution rule or a claim about runtime binding. It demonstrates that same name, SONAME, address and even identical pseudocode are insufficient to discard version identity; a cross-file candidate workflow should preserve both required and provided version facts when actually observed, or retain unknown. All three file SHA-256 values stayed unchanged.@morluto commented on GitHub (Oct 31, 2026):
Looping in @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0 for visibility on the Ghidra, Kuna, and REA tool-design investigation.
@morluto commented on GitHub (Oct 31, 2026):
The existing
trace_dylib_resolutionworkflow is an important building block that the earlier report did not exercise. On maine6d061897, I put the same unexecuted importing Mach-O into three disposable directories. ItsLC_RPATHis@loader_pathand its required load is@rpath/libAudit.dylib. Directory one held the original library; directory two held the previously tested different-digest library with the same install name and export; directory three had no library.Real CLI and MCP results agreed on the normalized trace for each directory:
libAudit.dylibcandidate, reported its distinct image SHA-256 and matching install name, and retained the same executable digest.procedure_referencescall separately identified the call site and local thunk to the external symbol. The load-path trace and the call/reference Evidence were separate records; I did not observe an automatic symbol-to-candidate join.This narrows the proposal: for Mach-O, agents can already inspect a bounded static load-path candidate and digest rather than relying only on equal names. The candidate can still change with the selected filesystem root, and this trace does not prove the library actually loaded or the call's runtime binding. An explicit cross-Evidence handoff should reuse these observations, preserve unresolved/outside-root cases and selected artifact identity, and avoid duplicating the existing resolver. All copied files' digests were unchanged; no target was run. This is one Mach-O setup, not PE/ELF or every dyld configuration.
@morluto commented on GitHub (Oct 31, 2026):
Follow-up on the versioned ELF control: I checked existing REA/Ghidra evidence before proposing another format surface.
search_stringsfoundAUDIT_1, and the retainedinspect_native_load_imagemappings included.dynsym,.gnu.version,.gnu.version_r, and.dynstr;list_namesidentified__DT_VERSYM,__DT_VERNEED, and the unversioned externalaudit_transform. Its relocation page returned two rows but did not name the required version. These observations locate relevant material, but in the calls tested do not connect the version string to the imported symbol or select either library.llvm-readelfindependently confirmed that the import requiredAUDIT_1in the fixture.This is one source-built x86-64 ELF on macOS arm64 with real Ghidra 12.1.4 through MCP, not a proof that other available REA workflows cannot recover the association. It supports evaluating existing format-aware parsing or another explicit evidence handoff before adding a provider-specific wrapper. Neither names nor a matching version string establish runtime binding; the target was not executed and its digest was unchanged. A separate coverage inconsistency observed in the load-image view is tracked in #8276.