mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8260] [Design] Preserve per-function producer provenance across decompile export resume #6516
Open
opened 2026-11-01 21:11:49 +00:00 by bsakaguchi
·
7 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#6516
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/8260
Before submitting
Decision needed
How should a resumed
decompile_alldirectory retain the exact provider observation or project-export identity that produced each function, especially when successful files come from different completed exports with the same target and analysis profile?Context and evidence
On REA
53a4ab78451a0654e9c3beb3d43a5e371a288fcc, Kuna 1.986 and an unexecuted owned arm64 Mach-O, I used two isolated cache directories with the same target, wrapper binary, jobs, export key and profile. A test-only wrapper injected an upstream worker stall for_adjustin the first export; a second clean cache produced a complete export. This deliberately induced condition does not establish natural timeout frequency.A two-function
decompile_allagainst the partial cache wrote_evaluateand recorded_adjustas failed. Resuming against the same partial cache retried only_adjust, kept the successful file's SHA-256 unchanged, and failed again. Resuming against the separately built clean cache skipped_evaluate, wrote_adjust, and kept the original successful file's digest unchanged. The append-only journal retained both failed attempts and the later success, and the final index recorded both files and their digests.Separate real
procedure_pseudo_codecalls show that the two_evaluatestrings are identical in this sample, but theirraw_result.sourcevalues point to different project directories and different full project-export C-file SHA-256 values. Their Evidence IDs differ. The journal and final index carry per-function output digests and limitations, target/provider/profile, but no project-export source digest or per-function Evidence ID. Each separately exporteddecompile_allEvidence bundle in this test contained one composeddecompile_allrecord,raw_result: null, and noevidence_links; it did not retain per-function source records. Therefore the directory and those bundles alone cannot identify which producer export supplied each successful function. This is an observed provenance limitation, not a claim that the two sampled bodies differ or that the directory's file hashes are wrong.Expected interaction with targets
Read a caller-selected binary and launch an owned static provider; write only the explicitly selected export directory, Evidence bundles and existing owned cache. The target is not executed or modified.
Boundary details
Keep each file's digest, exact source observation, provider/profile and project-export identity distinct from output paths and cache lookup keys. Preserve per-function failure caveats and append-only recovery history. An export key is not a content digest of each completed project. A resumed directory can legitimately combine attempts; do not assert cross-run pseudocode equivalence or retain every full body inline solely to establish provenance.
Options and tradeoffs
Consider optional retained per-function source Evidence or a compact authenticated source descriptor in journal entries and final index, with explicit unknown for earlier records. Assess bundle closure, storage size, cancellation, resume compatibility and migration without inventing a new result from an unavailable source. Compare this with existing per-function output digests and limitations before expanding the contract.
Verification available so far
I have a prototype or observed results.
Success criteria and open questions
Exercise mixed success/failure, same-cache retry, independently completed export, missing/tampered source, cancellation and existing-journal compatibility. Verify CLI and MCP plus source Evidence retrieval without overwriting caller files. This report does not propose silently rebuilding or deleting a cache.
References
#8167 tracks retrying a failed cached Kuna function; #8226 tracks loss of per-item failure association in
batch_decompile. This question concerns provenance of successfully written directory files across resume, whose existing journal does retain per-function caveats.@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 mixed partial-cache / clean-cache resume scenario also works through the public CLI: the control in #8167 ran three
rea decompile-all --format jsonprocesses, retained the first successful file unchanged, and wrote the failed file after selecting the separately prepared clean cache. The final index and journal kept output hashes and per-function caveats; each CLI response was composeddecompile_allEvidence withraw_result: nullandevidence_links: []. The directory records therefore still do not identify the exact project-export producer for each successful file in this control. This extends the observed interface coverage; the injected stall and independent caches do not establish natural failure frequency or semantic equivalence of exports.@morluto commented on GitHub (Oct 31, 2026):
A complementary Ghidra control on REA
60149282: an export created from a fresh import could not be resumed in a separate session selecting a saved, byte-edited Ghidra project for the same target. Their target SHA-256 and provider matched, but their committed profile digests differed. REA rejected the resume and kept all directory-file hashes unchanged; resuming under the original fresh-import profile then skipped the verified function. The target and selected source-project files were unchanged. This is a working cross-profile safety boundary, distinct from this issue's same-profile, different producer-export identity.The mismatch error does not identify the differing component and recommends inspecting the input schema; I filed that separate recovery issue as #8349. One fixture and Ghidra version were tested; no target execution.
@morluto commented on GitHub (Oct 31, 2026):
The same-profile provenance problem also occurs with Ghidra's live session edits, without separate Kuna caches. On REA
60149282and real Ghidra 12.1.4 MCP, I used an owned unexecuted Mach-O where_evaluatecalls_adjust:_evaluateto a new directory wrote a file referring to_adjust.annotate_native_functionrenamed_adjusttoaudit_new_adjustin the ephemeral session. A freshprocedure_pseudo_code(_evaluate)then referred toaudit_new_adjust._evaluateskipped the verified existing file and kept its digest and old reference. Resuming the directory foraudit_new_adjustwrote the renamed callee alongside it. The index retained both file hashes but no per-file session-edit revision; its top-level limitations were empty. The manifest's provider profile digest was the same before and after the rename._evaluateto a new directory after the rename produced the updated call name. Individual pre/post pseudocode Evidence IDs were distinct; thedecompile_allEvidence records had null raw results and no source Evidence links in this run.Keeping the verified existing file is consistent with
resume's documented no-overwrite behavior; the issue is that the resulting directory alone does not establish whether its files were produced before or after the session edit. This is a concrete mixed-state control for any per-file provenance design, not evidence of a semantic behavior change or a recommendation to overwrite caller files. Compact MCP schemas were fetched before calls; the target digest stayed unchanged and the target was not executed. One fixture and provider version were tested.@morluto commented on GitHub (Nov 3, 2026):
A source-level follow-up on the current
decompile_allboundary narrows the design choice (this is not a new runtime reproduction):publishOnereceives the actualprocedure_pseudo_codeexecution before writing its file, but its journal record keeps the output-file digest, body fact and caveats rather than the execution's source. This is the earliest point where the producer's source can be associated with the committed file.isSourceEvidenceRetainableexcludes those pseudocode bodies because retaining every body in the in-memory ledger would duplicate the file-backed export. Simply adding a document selector to force source Evidence would change parameters and defeat that resource boundary; a fix should not do so implicitly.A possible direction is a bounded, provider-owned source observation recorded with each journal outcome at commit time, preserving only facts actually available; assess whether any separate retained record can be retrieved and authenticated without copying every function body into memory. A digest or Evidence ID by itself would not make the corresponding source record retrievable. Resume should preserve earlier records and their unknowns, including after a matching existing-file commit; any schema change needs its own old-journal and torn-write tests. This is a design direction, not a completed implementation or a claim that current Ghidra output already supplies revision identity.
@morluto commented on GitHub (Nov 3, 2026):
A further public MCP control on REA
00159ef7c, Kuna 1.989 and Ghidra 12.1.4 (macOS arm64) exported one selected function for each provider, then inspected the index and bundle before a separate direct pseudocode request. Advertised output schemas validated. In each case the index's written row had address, name, output path/digest, body and limitations, but no producer observation; thedecompile_allEvidence had no links and its bundle had no pseudocode record. The selected target's SHA-256 remained unchanged and it was not executed.I ran a cold control and a separate control that first waited for
procedure_assembly. In the cold control the subsequent Kuna pseudocode observation reportedsource.kind: single-function. In the warm control it reportedsource.kind: project-exportwith the C-file digest and byte range. The corresponding sampled Ghidra pseudocode observations hadraw_result: nullin both controls. These are separate direct observations, not a claim that the existing directory record identifies its own producer. They demonstrate that even for the same target, a future record must capture what each export call actually observed; a provider profile or inferred source from a later query is insufficient. One function, one host and these provider versions were tested.@morluto commented on GitHub (Nov 3, 2026):
Ghidra's
DomainObject.getModificationNumber()documentation describes a change/undo/redo counter intended for uses such as cache invalidation; it does not claim a globally unique or content-addressed revision.I exercised Ghidra 12.1.4 headless on the owned arm64 fixture using a disposable project, without executing or modifying the target. The script explicitly ended GhidraScript's outer transaction before the probe, as REA's bridge does. In two independent fresh imports, both counters were 438 before an edit and 439 after a committed rename, although one session named the function
rea_revision_probeand the other named itrea_revision_other. A subsequent aborted rename restored the respective committed name and moved both counters to 441. The simple read between measurements left 438 unchanged. These are observations for this fixture, not a general determinism or uniqueness guarantee; Ghidra also logged DWARF expression errors during analysis.An initial probe left the script's outer transaction open; a nested abort had not completed its rollback when measured. That run is not evidence of REA behavior: the bridge explicitly ends the outer transaction first. The counter may help label changes within one identified session, but the measured collision shows that the counter alone cannot identify a program state across sessions or establish content equivalence. A durable record would need a separately owned session identity and semantics for in-flight changes; this check does not establish those or propose persisting a Ghidra database.