mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #4475] [Bug] Firmware read-handle close failures discard outcomes and lose cleanup ownership #1771
Closed
opened 2026-10-16 21:10:06 +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#1771
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 16, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/4475
Before submitting
Area
Evidence, artifacts, or reconstruction
Observed behavior
Source-only: firmware hash, snapshot and report readers own raw FileHandles only in local variables. Each closes in
finally; a failed close replaces a successful read or its original error and loses the exact descriptor owner. The provider can retry process/workspace/tree cleanup, but retains no failed read-handle owner. Removing a workspace does not prove its open descriptors closed.Reproduction
NOT_ENOUGH_INFO: no injected-close runtime reproduction was performed for this report. Source inspection at main
fe2a398dd9; proposed check: inject one real descriptor close failure after successful hash/report parsing and after a primary parse/read failure, then retry provider.close(). Assert exact-handle retry and preservation of the original outcome.Expected behavior
AGENTS.md requires retaining resources whose cleanup failed and preserving producing-boundary ownership. Reuse the canonical owned regular-file lifecycle; transfer the exact owner into provider cleanup and preserve primary errors or completed observations through close/retry.
Impact and scope
Source-derived: persistent or transient close failure can leak a readable descriptor and erase the meaningful read outcome. Natural failure frequency and real-provider impact are unknown. This is distinct from the blocking acquisition in #3887 and the final cancellation translation in #3923.
REA version
6.5.0; main
fe2a398dd9, source inspection.Runtime and platform
Source review on macOS arm64; Node 24.18.0. Native Linux firmware producer not run.
Target and artifact context
Firmware snapshot, configured tool hash and producer JSON report.
Interface
CLI and MCP (shared provider; reachability is source-derived).
Earliest failure stage
Cleanup, cancellation, or lifecycle
Relevant output or evidence
Evidence provenance: source-derived. Local runtime verification: not performed. Exact descriptor-close regression and full native Linux producer behavior remain unverified.
Typed outcome or recovery expected
A typed failure retains the primary outcome and exact cleanup capability; confirmed retry clears cleanup uncertainty, failed retry keeps that same owner.
Analysis or suspected cause
The helper's local finally block is the only descriptor owner. Existing workspace and process owners cannot substitute for descriptor ownership. A narrow nonblocking-open repair for #3887 does not itself resolve this lifecycle gap.
Additional context
AI-assisted source audit; no runtime reproduction or performance claim.
@AayushJB03 commented on GitHub (Oct 16, 2026):
Hi @morluto I want to work on this bug #4475.
Could you assign it to me.
Its new to me but I'd like to understand how this works
@qorvr commented on GitHub (Oct 16, 2026):
Resolved in #4493 (
qorvr:fix/firmware-read-handle-cleanup).Root Cause
Admitted file handles opened via
openRegularFile/withOwnedRegularFileinreadFirmwareReport,snapshotFirmware, andhashFirmwareFiledid not supply failure retention callbacks or interceptRegularFileCleanupFailure. When descriptor close failed:provider.close().cleanupResourcesonProviderCleanupError.Resolution
retainFailedCloseoptions and callbacks tohashFirmwareFile,snapshotFirmware, andreadFirmwareReport.readFirmwareCommandReportto catchRegularFileCleanupFailure, generatingProviderCleanupErrorthat attachescompletedReportand records descriptor paths incleanupResources.PendingFirmwareCleanupandFirmwareProviderwith descriptor tracking (descriptors: Map<OwnedFileHandle, string>and#unrootedDescriptors), retrying descriptor cleanup during#retryCleanup()uponclose().finishFirmwareWorkspace.@N0zoM1z0 commented on GitHub (Oct 16, 2026):
Additional runtime test evidence for this lifecycle follow-up: the two firmware failures reproduce on the unmodified main base
9d940c2f284cc6f75b27900336e52ceeba4aa2af.A fresh detached worktree, locked
npm ci, thennpm run test:focused -- tests/boundary/firmware/firmwareIntegration.test.tsgives 33 passed / 2 failed, with a clean worktree:retains a setup-failed publication tree for provider cleanup retryretains the complete firmware result when published output cleanup stays uncertainThe first receives
ProviderAdapterErrorwith nested primary/cleanup diagnostics; the expected shape has the earlier flat cleanup diagnostics. The second expectsProviderCleanupErrorbut receives an adapter failure. Whether the producing contract or expectations need correction remains undiagnosed.CI failure and exact assertions. CI checked merge
eedae92d406015895a6d0eced5035da1b9ead07a(Electron head84d9cf5db+ that main base). This is boundary-test reproduction using the existing fake extractor fixtures, not a real firmware-provider claim. It isolates the failures outside the Electron diff; #4475 is the related lifecycle/cleanup ownership discussion.@qorvr commented on GitHub (Oct 16, 2026):
Thanks @N0zoM1z0 for isolating and detailing the reproduction on main base
9d940c2f.Both failures have been diagnosed and resolved in #4493:
1.
retains a setup-failed publication tree for provider cleanup retryanalysisErrorWithCleanupFailure), when both a primary analysis setup error and a cleanup failure occur, the resultingProviderAdapterErrorcarries the cleanup failure insidedetails.cleanup_error. The test expectation onmainwas asserting the older flat structure (details.diagnostics.previous_error).tests/boundary/firmware/firmwareIntegration.test.tswas updated to assert the nestedcleanup_error.details.diagnostics.previous_error, matching the standardized composite error contract.2.
retains the complete firmware result when published output cleanup stays uncertainsrc/firmware/FirmwarePublication.ts.publishedResult !== undefined), subsequent descriptor closure failures occurred with no primary extraction error.FirmwarePublication.tswas mistakenly wrapping this in an adapter failure (analysisErrorWithCleanupFailure) instead of surfacing the pure cleanup failure.FirmwarePublication.ts, whenpublishedResult !== undefinedand descriptor closure fails without a primary extraction error, the method now directly re-throwscleanup(ProviderCleanupError) while preservingpublishedResulton the error.Linux Fixture Portability Note
Additionally,
tests/fixtures/firmware/provider.tshad a path assertionendsWith("/true")which failed on Debian/Ubuntu environments whererealpath("/usr/bin/true")resolves to/usr/bin/gnutrue. This was updated to.endsWith("true").All 35 tests in
tests/boundary/firmware/firmwareIntegration.test.tspass cleanly in #4493.@morluto commented on GitHub (Oct 17, 2026):
Additional related ownership repair in
0a51b246c: failure/cancellation of a firmware stream no longer bypasses its descriptor owner, including failed-close retry.Firmware now uses the existing owner-preserving
readArtifactFileChunksfor hashing, snapshot/range copying and publication. Destroying a pipeline no longer closes the source descriptor outside its owner. The canonical source also owns cancellation: competing pipeline signals and obsolete stream-error reinterpretation were removed after snapshot/range controls reproduced EIO being replaced by cancellation (2 failed, 29 passed in that intermediate candidate).Final validation on Node 24.18.0: 46 focused tests across four files passed, including actual native file growth from 128 MiB to one byte above the unchanged allowance, successful and denied close for both operations, exact-owner retry, a stable file exactly at the allowance, same-read EIO/cancellation, and existing finalization/mixed-owner/publication controls. Docs checks and five conformance tests passed. Native file IO and controlled faults on Darwin; no Linux firmware engines or public CLI growth reproduction claimed. Two separately selected Linux workspace checks were skipped on this host.
Bounded completed snapshot comparison against immediate parent
8451d2839: 32 MiB sparse source, identical size/digest, two alternating warm repeats/build plus separate first processes. Warm medians baseline/candidate: elapsed 0.07248/0.06984 s, CPU 0.06910/0.06844 s, sampled process-family RSS 64790528/57565184 bytes, result JSON tokens 51/51 (cl100k_base). No speed/memory improvement is established by these repeats; true cold, CLI/MCP/whole-agent/schema/request/retry and native-engine costs are unmeasured. Heavy Qodo tests remained stopped.Related remaining shared error-model defect: #4628. After a composite cleanup dependency resolves, its old wrapper still projects execution_failure while the typed primary survives in diagnostics. The firmware patch preserves the corrected primary and exact cleanup ownership; it does not claim to repair that shared post-recovery projection.
@morluto commented on GitHub (Oct 18, 2026):
Closing as fixed on
mainafter reconciling this report with the landed owner/consumer changes.Evidence scope: this closure uses the landed source, regression coverage and validation already recorded in the linked commits/thread. No new local tests or native-provider reproduction were run during this backlog pass; previously documented platform and real-provider gaps still apply.