mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #4005] [Bug] SIGINT during process capture cleanup emits successful Evidence #1591
Closed
opened 2026-10-16 21:07:35 +00:00 by bsakaguchi
·
5 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#1591
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 @coygeek on GitHub (Oct 15, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/4005
Before submitting
Area
Process capture or runtime observation
Observed behavior
When SIGINT arrives while
capture-processremoves its owned capture root, the CLI waits for cleanup and exits with status 130 but emits ordinary successfulcapture_process_scenarioEvidence. The public CLI filesystem-boundary probe below reproduced this at the reported baseline. The injected delay and signal delivery are controlled test conditions, not an observed uninstrumented cleanup delay.Reproduction
Use the source baseline in REA version on a supported process-capture host. From the repository root, run the following public CLI probe. The preload simulates a short filesystem cleanup delay and delivers SIGINT to that same CLI process when its capture-root removal begins. It preserves the real removal, PTY capture, signal wrapper, result validation, and Evidence projection. This is a production filesystem-boundary injection, not a claim that an uninstrumented cleanup delay was observed.
Expected behavior
After cleanup settles, cancellation before completion should return a typed
cancelledresult, retain completed observations as partial Evidence, and preserve exit status 130. The target's observed normal exit can remain in those partial facts.docs/mcp-contracts.md:418-456includes process capture in the shared cancellation contract, describes partial observations and cancellation instead of success, and keeps CLI signal guards active through cleanup.Impact and scope
JSON consumers can accept a success-shaped operation record after interruption if they use the Evidence alone. Both executed CLI reproductions retained status 130, so honoring the nonzero status is an observed workaround. Cleanup completed and no owned root was retained. The evidence establishes the cleanup-time window, not its frequency without instrumentation. No MCP runtime reproduction was executed.
REA version
rea 6.5.0 at source commit
4692bb3330; source freshness checked at origin/main6fcfc5b5e0Runtime and platform
Node 24.18.0; macOS arm64
Target and artifact context
Harmless Node command printing
done; native PTY process capture. Only capture-rootfs.promises.rmwas delayed. The Darwin helper root was excluded. No network service or external analysis provider was used.Interface
CLI
Earliest failure stage
Cleanup, cancellation, or lifecycle
Relevant output or evidence
The executed self-signal hook returned:
Here
code: nullis the probe's projection of an absent top-level error code. A separate parent driver delivering SIGINT during a 1000 ms capture-root removal delay reproduced the same normal Evidence and status 130. Both used real removal, PTY capture, signal handling, result validation, and Evidence projection; neither retained the owned root.Source freshness checked against current
origin/main6fcfc5b5e0c063300cd5278dd8bad5b1ab1374f6. The cited production files and contract documentation are unchanged from the reproduced baseline; the source-derived failure still holds. The full runtime reproduction was not rerun for this freshness check.Typed outcome or recovery expected
Return
cancelledwith completed capture facts in partial observations after cleanup, while retaining status 130. Preserve successful output without a signal and the distinct cleanup-incomplete outcome when owned cleanup fails.Analysis or suspected cause
Source-derived:
src/process/capture/ProcessHarness.ts:363-457awaits resource cleanup and returnsresolveProcessResultwithout receiving or rechecking the cancellation signal.captureProcessScenarioreturnsok(capture)after the awaited run at line 879.src/application/process/ProcessCli.ts:84-94closes the resource scope and projects success without a final signal check.src/cli/commandCancellation.tspreserves the signal-derived process status but returns the operation value unchanged.Additional context
Related closed #1232 concerns an interrupted CLI leaving its target alive, and closed #1233 concerns cancellation waiting through post-exit settlement. Here cleanup succeeds, but cancellation during that cleanup still publishes success. Open #3923 concerns firmware-provider completion; its affected code and operations differ. Open PR #2893 concerns CDP browser cleanup, and #3263 tests cancellation during a filesystem snapshot lookup; neither covers the process-capture final-cleanup result.
@XinwangTao commented on GitHub (Oct 15, 2026):
Confirmed — a SIGINT that arrives during capture-root removal still yields successful capture-process Evidence while the CLI exits with status 130. The signal wrapper / cleanup path should mark the run as interrupted and emit cancelled (or at least non-success) Evidence instead of projecting a normal success, so downstream consumers don't treat an interrupted capture as a completed observation.
@yankikucuk commented on GitHub (Oct 15, 2026):
Working on this. Reproduced with your preload probe on a clean build: status 130 with ordinary successful Evidence. The run now rechecks the request signal once owned cleanup has settled and resolves through the existing cancellation path, so the probe returns code
cancelledwithcleanup: completeand the completed capture (observed normal exit) retained inpartial_observation, status 130 preserved. Failed runs and cleanup-incomplete outcomes are unchanged. Draft PR follows shortly.@morluto commented on GitHub (Oct 15, 2026):
Reproduced on
bde139c5dusing the actual public CLI, a harmless owned Node workload, and a preload seam that delivers SIGINT while realfs.promises.rmof the owned capture root is pending. Before repair, exit status was 130 but stdout was ordinary successful Evidence. The non-interrupted control returned success and removed the root.Local repair in
src/process/capture/ProcessHarness.tsthreads the existing request signal into finalization and checks it after awaited cleanup and before resolving the result. Existing primary errors and cleanup-failure precedence are preserved. Normal workload exit remains an observation, not proof that the cancelled request completed successfully.The repaired public CLI control returns success; interrupted finalization returns
cancelledwith the observed exit code 0 retained underdetails.partial_observation, cleanup complete, and the temporary root verified absent. One warm control/interrupted pair took approximately 1.739s/1.842s; no before/after performance claim is made. The regression also exercises real cleanup rather than replacing removal with a stub.Active SIGINT/SIGTERM CLI cleanup, MCP post-exit descendant cancellation, and producer tests passed (35 tests in that focused run). No globally installed server or released package has been updated; the patch is local and uncommitted.
@morluto commented on GitHub (Oct 16, 2026):
Fixed on
mainin 0e1f0bf2d. Process capture checks cancellation after awaited cleanup and before publishing success, preserving completed capture facts as partial Evidence.The public CLI cleanup-delay signal reproduction was verified to return cancellation with exit status 130 and removed owned roots. The interleaving is controlled, not a frequency measurement.
Hosted main CI is still pending; this closure is based on the implemented fix and scoped regression evidence.
@XinwangTao commented on GitHub (Oct 16, 2026):
Agreed with the fix direction — rechecking the request signal after awaited cleanup and before resolving is exactly the right point, since the previous code only checked cancellation before the finalization window. Keeping the observed exit code under partial_observation while emitting cancelled preserves both the signal semantics and the useful capture facts. Thanks for threading this through the shared finalizer.