[PR #6151] [CLOSED] fix(cancellation): preserve the caller abort reason #7168

Closed
opened 2026-11-01 21:45:52 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/6151
Author: @agorevski
Created: 10/21/2026
Status: ❌ Closed

Base: main ← Head: fix/cancel-reason-b


📝 Commits (2)

  • fb60a30 fix(cancellation): preserve the caller abort reason
  • 92bfd19 test(apple): drop duplicate assetutil cancellation test

📊 Changes

18 files changed (+338 additions, -38 deletions)

View changed files

📝 src/application/CallPathTracing.ts (+14 -4)
📝 src/application/javascript/JavaScriptRecoveryService.test.ts (+15 -0)
📝 src/application/javascript/JavaScriptRecoveryService.ts (+5 -1)
📝 src/artifacts/NativeDmgArtifactReader.ts (+7 -1)
📝 src/artifacts/ZipArtifactReader.ts (+3 -1)
📝 src/dotnet/ManagedStaticProvider.ts (+10 -2)
📝 src/ida/IdaOperationRunner.ts (+8 -2)
📝 src/ida/IdaSessionClient.test.ts (+29 -0)
📝 src/ida/IdaSessionClient.ts (+28 -7)
📝 src/javascript/recovery/WakaruCommand.ts (+6 -2)
📝 src/rizin/RizinDebugSessionManager.ts (+56 -15)
📝 src/wasm/WabtArtifactProvider.test.ts (+2 -0)
📝 src/wasm/WabtFailures.ts (+4 -1)
📝 tests/boundary/providers/RizinDebugSessionManagers.test.ts (+51 -0)
📝 tests/boundary/providers/managed/managedHashCancellation.test.ts (+24 -0)
📝 tests/boundary/providers/native/nativeDmgArtifactReader.test.ts (+50 -1)
📝 tests/boundary/providers/native/zipBackpressureCancellation.test.ts (+3 -1)
📝 tests/composition/callPathParserOperation.test.ts (+23 -0)

📄 Description

Summary

Cancelled operations returned AnalysisCancelledError (or an artifact cancelled failure) without the caller's exact AbortSignal.reason. The cause was undefined, a process or command wrapper (ExecFileOutputCancelledError, OwnedCommandFailure), or another cancellation error. Each producing checkpoint now records the caller's reason, and the two wrappers are unwrapped. Error tags, status classification, and cleanup behavior are unchanged.

Fixes #5822
Fixes #5959
Fixes #5960
Fixes #5964
Fixes #5985
Fixes #5987
Fixes #5998
Fixes #5999
Fixes #6002
Fixes #6032

Problem and expected behavior

Smallest trigger: controller.abort(reason) with an object reason, either before admission or during a provider call, for IDA, Rizin, trace_call_path, JavaScript recovery and static application analysis, managed static analysis, Apple asset catalogs, ZIP member streams, WABT, and native DMG.

Violated invariant: the cancellation must carry the caller's exact reason (error.cause === signal.reason, or ArtifactReaderFailure.cancellation.reason === signal.reason), and no wrapper may replace it.

Change and scope

Each producer passes signal.reason as the cancellation cause at its own checkpoints: admission, queued waits, post-provider and post-completion checks, and subprocess rejection. Native DMG unwraps ExecFileOutputCancelledError.cause, and WABT uses cause.cancellation?.reason. Rizin uses the signal reason only when the signal is aborted, so non-cancellation causes are kept.

Not included: changes to cleanup or ownership, error tags, CLI/MCP schemas, or shared helper extraction. The Wakaru launch and recovery-file checkpoint changes are included, but only the pre-admission recovery path has a dedicated test.

Follow the contribution scope.
Unresolved scope, authority, side effects, or required verification block
integration. Link the required maintainer scope decision for new providers or
capabilities involving target execution, injection, mutation, or protection
recovery; ordinary fixes within existing boundaries may state "not applicable".
Draft PRs may leave the scope decision pending and the readiness and merge checklists
unchecked. Maintainers can help resolve open questions.

Contribution scope: not applicable. This is a bug fix inside existing provider and application boundaries, with no new provider or capability.

Contract and boundary impact

  • Semantic owner and earliest changed stage: each adapter or application cancellation producer named above. Classification and projection code is not changed.
  • Contribution scope fit and linked maintainer decision: not applicable (ordinary fix within existing boundaries).
  • CLI and MCP/tool-catalog contract: no schema or tool change. CLI/MCP output was not executed for this change, and whether any transport serializes cause is unknown.
  • Provider, bridge, target-format, or platform compatibility: no provider contract change. Native DMG and Apple assetutil paths were exercised through a mocked process seam and a process.platform override on Linux, not on macOS.
  • Evidence, artifact, provenance, or reconstruction contract: partial observations and retained outputs are unchanged. Caller-supplied reason objects are now attached as in-process error cause values.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable. No target execution order or cleanup ordering changed.
  • Generated metadata (docs/public/product-catalog.json), package, or installation impact (CI generates and validates ignored catalogs and skills/; edit authored instructions in .agents/skills/reverse-engineer-anything/ and never commit build outputs): none.

Expected effects (check known effects; use documentation-only on its own).
Unchecked items do not establish absence; leave uncertainties visible.

  • Read existing files or captured data. (Pre-existing in the touched analysis paths; this change adds none.)
  • Launch or attach to a process. (Pre-existing in the touched paths: Rizin, WABT, and macOS DMG/assetutil; this change adds none.)
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration.
  • Contact network services.
  • Recover protected code or work around protections.
  • Documentation or usability only; no target interaction.
  • Not sure yet; investigation or maintainer guidance needed.

Evidence and regression coverage

  • Tests added or updated:
    • src/ida/IdaSessionClient.test.ts: admission and in-flight cancellation keep the caller reason (5822).
    • tests/boundary/providers/RizinDebugSessionManagers.test.ts: refused start and in-flight command cancellation keep the caller reason (5959).
    • tests/composition/callPathParserOperation.test.ts: cancellation after a relationship observation keeps the caller reason (5960).
    • src/application/javascript/JavaScriptRecoveryService.test.ts: pre-cancelled recovery keeps the caller reason (5964).
    • tests/boundary/providers/managed/managedHashCancellation.test.ts: entry cancellation keeps the caller reason (5985).
    • tests/boundary/javascript/javascriptApplicationCancellation.test.ts: terminal-publication cancellation keeps the ArtifactReaderFailure reason (5987).
    • src/artifacts/apple/AppleAssetCatalogAnalysis.test.ts: assetutil cancellation keeps the caller reason (5998).
    • tests/boundary/providers/native/zipBackpressureCancellation.test.ts: backpressure cancellation keeps the caller reason (5999).
    • src/wasm/WabtArtifactProvider.test.ts: the cancelled outcome keeps the caller reason, not the command wrapper (6002).
    • tests/boundary/providers/native/nativeDmgArtifactReader.test.ts: system verify cancellation keeps the caller reason, not the process wrapper (6032).
  • Base reproduction or other evidence: for each issue, the regression test was run with that issue's source files restored to base 01788bac8 and failed with the assertion shown below. Restoring the fixed files made it pass again.
  • User-visible CLI/MCP output (if applicable): not applicable. No CLI or MCP output was captured for this change.
  • Remaining proof gaps:
    • No real Ghidra, IDA, Hopper, Frida, or browser provider was run. IDA uses the RecordingIdaMcp fake; Rizin uses a fake provider process (Rizin is not installed); WABT uses simulated tools with Node child processes.
    • Apple assetutil and native DMG (hdiutil) were not run on macOS. They use a mocked execFileOutput and a process.platform override.
    • Wakaru is not installed. The launcher-rejection and recovery-file checkpoint branches have no dedicated test.
    • Static JavaScript application analysis: only the terminal-publication checkpoint is tested; the admission, validation, and graph checkpoints changed without their own tests.
    • MCP/CLI transport behavior for these cancellations was not re-run.
    • The full test suite was not run; only the 64 related test files listed below.

For evidence-bearing changes:

  • Observed, derived, and inferred claims remain distinguishable.
  • Artifact identity, source provenance, and failed attempts remain preserved.
  • Unsupported, incomplete, unavailable, or uncertain outcomes remain visible.

Validation performed

Merge follow-up: main was merged into the branch (bb865e5b6) to resolve a conflict in src/artifacts/apple/AppleAssetCatalogAnalysis.ts, keeping main's cancellationCause unwrapping. The branch's Apple test now uses vi.spyOn on execFileOutput instead of a module mock, which conflicted with the existing assetutil stop test. After the merge:

  • node scripts/run-typescript.mjs --noEmit — exit 0.
  • npm run test:focused -- <9 cancellation-related files> — 9 files, 138 passed, 3 skipped.
  • npx oxlint on the changed Apple files — 0 errors; warnings only.
  • npx oxfmt --check on the changed Apple files — formatted.
  • Not run: the full suite.

Earlier validation (before the merge):

Base for all "fails on base" checks: 01788bac8. Each check restored only that issue's source files from base, ran the named test, and then restored the fixed files.

  • npm run build:cached — exit 0; "Tasks: 3 successful, 3 total".
  • npx vitest run $(grep -rlE "CallPathTracing|JavaScriptAnalysisControl|JavaScriptArtifactAnalysis|JavaScriptArtifactReconstruction|JavaScriptRecoveryService|NativeDmgArtifactReader|ZipArtifactReader|AppleAssetCatalogAnalysis|ManagedStaticProvider|IdaOperationRunner|IdaSessionClient|RecoveryFiles|WakaruCommand|RizinDebugSessionManager|WabtFailures|WabtArtifactProvider|JavaScriptApplicationService|traceCallPath|wasmLateCancellation" src tests --include=*.test.ts) — "Test Files 64 passed (64)".
  • Base failure, npx vitest run src/ida/IdaSessionClient.test.ts -t "admission and in-flight" — FAIL: expected undefined to be { reason: 'admission' }.
  • Base failure, npx vitest run tests/boundary/providers/RizinDebugSessionManagers.test.ts -t "refused start and in-flight" — FAIL: expected undefined to be { reason: 'before start' }.
  • Base failure, npx vitest run tests/composition/callPathParserOperation.test.ts -t "caller abort reason" — FAIL: expected undefined to be { reason: 'stop after observation' }.
  • Base failure, npx vitest run src/application/javascript/JavaScriptRecoveryService.test.ts -t "pre-cancelled recovery" — FAIL: expected undefined to be { reason: 'stop before recovery' }.
  • Base failure, npx vitest run tests/boundary/providers/managed/managedHashCancellation.test.ts -t "entry" — FAIL: expected undefined to be { Object (reason) }.
  • Base failure, npx vitest run tests/boundary/javascript/javascriptApplicationCancellation.test.ts -t "terminal publication race" — FAIL: expected undefined to be { Object (reason) }.
  • Base failure, npx vitest run src/artifacts/apple/AppleAssetCatalogAnalysis.test.ts -t "assetutil subprocess" — FAIL: expected undefined to be { reason: 'stop during assetutil' }.
  • Base failure, npx vitest run tests/boundary/providers/native/zipBackpressureCancellation.test.ts — FAIL: expected undefined to be { reason: 'stop during backpressure' }.
  • Base failure, npx vitest run src/wasm/WabtArtifactProvider.test.ts -t "cancelled outcome" — FAIL: expected Error: Command cancelled. … to be DOMException (the command wrapper was returned as the cause).
  • Base failure, npx vitest run tests/boundary/providers/native/nativeDmgArtifactReader.test.ts -t "system verify command" — FAIL: expected AbortError: The operation was aborted … to be { reason: 'stop during verify' } (the process wrapper was returned).
  • npm run typecheck — exit 0.
  • npx oxlint <the 25 changed files> — exit 0, 0 errors. Pre-existing size and complexity warnings remain.
  • npx oxfmt --check <the 25 changed files> — "All matched files use the correct format."

Compatibility, safety, and release

  • Breaking changes or migration steps: none. Error tags and messages are unchanged; cause is now populated where it was undefined or a wrapper.
  • Real Hopper/Ghidra, browser, or OS coverage: none run (see proof gaps).
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: no containment, cleanup, or process-ownership code changed. Caller reason objects may contain arbitrary caller data and now appear as in-process cause values; whether any output path serializes cause is unverified.

Author readiness

Human owner: @agorevski

  • I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work.
  • I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps.
  • I declare this PR ready for initial maintainer review.

Before merge

  • This PR addresses a concrete problem or an agreed enhancement.
  • Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff.
  • The PR has one focused outcome and the title follows type(scope): outcome.
  • Related issue is linked, or the reason for not linking one is stated above.
  • Tests cover changed observable behavior and meaningful failure paths.
  • Owning docs, contracts, and generated metadata are updated where needed.
  • User-visible CLI/MCP changes include representative output.
  • I checked the final diff for secrets, unrelated cleanup, and unsupported claims.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/morluto/rea/pull/6151 **Author:** [@agorevski](https://github.com/agorevski) **Created:** 10/21/2026 **Status:** ❌ Closed **Base:** `main` ← **Head:** `fix/cancel-reason-b` --- ### 📝 Commits (2) - [`fb60a30`](https://github.com/morluto/rea/commit/fb60a30e5fb86707ff251eb0ea4cb6fa5d0009ed) fix(cancellation): preserve the caller abort reason - [`92bfd19`](https://github.com/morluto/rea/commit/92bfd192b98020025aa0a93a33f0dfa7977ffe83) test(apple): drop duplicate assetutil cancellation test ### 📊 Changes **18 files changed** (+338 additions, -38 deletions) <details> <summary>View changed files</summary> 📝 `src/application/CallPathTracing.ts` (+14 -4) 📝 `src/application/javascript/JavaScriptRecoveryService.test.ts` (+15 -0) 📝 `src/application/javascript/JavaScriptRecoveryService.ts` (+5 -1) 📝 `src/artifacts/NativeDmgArtifactReader.ts` (+7 -1) 📝 `src/artifacts/ZipArtifactReader.ts` (+3 -1) 📝 `src/dotnet/ManagedStaticProvider.ts` (+10 -2) 📝 `src/ida/IdaOperationRunner.ts` (+8 -2) 📝 `src/ida/IdaSessionClient.test.ts` (+29 -0) 📝 `src/ida/IdaSessionClient.ts` (+28 -7) 📝 `src/javascript/recovery/WakaruCommand.ts` (+6 -2) 📝 `src/rizin/RizinDebugSessionManager.ts` (+56 -15) 📝 `src/wasm/WabtArtifactProvider.test.ts` (+2 -0) 📝 `src/wasm/WabtFailures.ts` (+4 -1) 📝 `tests/boundary/providers/RizinDebugSessionManagers.test.ts` (+51 -0) 📝 `tests/boundary/providers/managed/managedHashCancellation.test.ts` (+24 -0) 📝 `tests/boundary/providers/native/nativeDmgArtifactReader.test.ts` (+50 -1) 📝 `tests/boundary/providers/native/zipBackpressureCancellation.test.ts` (+3 -1) 📝 `tests/composition/callPathParserOperation.test.ts` (+23 -0) </details> ### 📄 Description <!-- PR title: type(optional-scope): imperative outcome The title becomes the squash-merge commit subject and generated changelog entry. --> ## Summary <!-- What user, agent, or maintainer problem does this solve? Link the issue with "Fixes #123" when applicable. Keep the prior behavior, expected contract, and new behavior understandable without private context. --> Cancelled operations returned `AnalysisCancelledError` (or an artifact `cancelled` failure) without the caller's exact `AbortSignal.reason`. The cause was `undefined`, a process or command wrapper (`ExecFileOutputCancelledError`, `OwnedCommandFailure`), or another cancellation error. Each producing checkpoint now records the caller's reason, and the two wrappers are unwrapped. Error tags, status classification, and cleanup behavior are unchanged. Fixes #5822 Fixes #5959 Fixes #5960 Fixes #5964 Fixes #5985 Fixes #5987 Fixes #5998 Fixes #5999 Fixes #6002 Fixes #6032 ## Problem and expected behavior <!-- For fixes, give the smallest trigger and violated invariant. For features, describe the use case and observable outcome. --> Smallest trigger: `controller.abort(reason)` with an object `reason`, either before admission or during a provider call, for IDA, Rizin, `trace_call_path`, JavaScript recovery and static application analysis, managed static analysis, Apple asset catalogs, ZIP member streams, WABT, and native DMG. Violated invariant: the cancellation must carry the caller's exact reason (`error.cause === signal.reason`, or `ArtifactReaderFailure.cancellation.reason === signal.reason`), and no wrapper may replace it. ## Change and scope <!-- Explain the chosen approach, why it fits REA's architecture, and what is intentionally not included. --> Each producer passes `signal.reason` as the cancellation cause at its own checkpoints: admission, queued waits, post-provider and post-completion checks, and subprocess rejection. Native DMG unwraps `ExecFileOutputCancelledError.cause`, and WABT uses `cause.cancellation?.reason`. Rizin uses the signal reason only when the signal is aborted, so non-cancellation causes are kept. Not included: changes to cleanup or ownership, error tags, CLI/MCP schemas, or shared helper extraction. The Wakaru launch and recovery-file checkpoint changes are included, but only the pre-admission recovery path has a dedicated test. Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). Unresolved scope, authority, side effects, or required verification block integration. Link the required maintainer scope decision for new providers or capabilities involving target execution, injection, mutation, or protection recovery; ordinary fixes within existing boundaries may state "not applicable". Draft PRs may leave the scope decision pending and the readiness and merge checklists unchecked. Maintainers can help resolve open questions. Contribution scope: not applicable. This is a bug fix inside existing provider and application boundaries, with no new provider or capability. ## Contract and boundary impact <!-- Short answers are welcome. Complete applicable lines; mark unresolved facts as "unknown". Use "none" or "not applicable" only when established. --> - Semantic owner and earliest changed stage: each adapter or application cancellation producer named above. Classification and projection code is not changed. - Contribution scope fit and linked maintainer decision: not applicable (ordinary fix within existing boundaries). - CLI and MCP/tool-catalog contract: no schema or tool change. CLI/MCP output was not executed for this change, and whether any transport serializes `cause` is unknown. - Provider, bridge, target-format, or platform compatibility: no provider contract change. Native DMG and Apple `assetutil` paths were exercised through a mocked process seam and a `process.platform` override on Linux, not on macOS. - Evidence, artifact, provenance, or reconstruction contract: partial observations and retained outputs are unchanged. Caller-supplied reason objects are now attached as in-process error `cause` values. - Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable. No target execution order or cleanup ordering changed. - Generated metadata (`docs/public/product-catalog.json`), package, or installation impact (CI generates and validates ignored catalogs and `skills/`; edit authored instructions in `.agents/skills/reverse-engineer-anything/` and never commit build outputs): none. Expected effects (check known effects; use documentation-only on its own). Unchecked items do not establish absence; leave uncertainties visible. - [x] Read existing files or captured data. (Pre-existing in the touched analysis paths; this change adds none.) - [x] Launch or attach to a process. (Pre-existing in the touched paths: Rizin, WABT, and macOS DMG/assetutil; this change adds none.) - [ ] Inject instrumentation or run scripts/code. - [ ] Change process memory, registers, files, or configuration. - [ ] Contact network services. - [ ] Recover protected code or work around protections. - [ ] Documentation or usability only; no target interaction. - [ ] Not sure yet; investigation or maintainer guidance needed. ## Evidence and regression coverage <!-- State whether evidence is executed, source-derived, or proposed. For fixes, show the original failure and explain how the regression would fail on the affected base revision when practical. Include the most useful proof inline; link long logs or artifacts, or put them in optional details. Documentation-only changes can use source, link, or rendered-document checks. --> - Tests added or updated: - `src/ida/IdaSessionClient.test.ts`: admission and in-flight cancellation keep the caller reason (5822). - `tests/boundary/providers/RizinDebugSessionManagers.test.ts`: refused start and in-flight command cancellation keep the caller reason (5959). - `tests/composition/callPathParserOperation.test.ts`: cancellation after a relationship observation keeps the caller reason (5960). - `src/application/javascript/JavaScriptRecoveryService.test.ts`: pre-cancelled recovery keeps the caller reason (5964). - `tests/boundary/providers/managed/managedHashCancellation.test.ts`: entry cancellation keeps the caller reason (5985). - `tests/boundary/javascript/javascriptApplicationCancellation.test.ts`: terminal-publication cancellation keeps the `ArtifactReaderFailure` reason (5987). - `src/artifacts/apple/AppleAssetCatalogAnalysis.test.ts`: assetutil cancellation keeps the caller reason (5998). - `tests/boundary/providers/native/zipBackpressureCancellation.test.ts`: backpressure cancellation keeps the caller reason (5999). - `src/wasm/WabtArtifactProvider.test.ts`: the `cancelled` outcome keeps the caller reason, not the command wrapper (6002). - `tests/boundary/providers/native/nativeDmgArtifactReader.test.ts`: system verify cancellation keeps the caller reason, not the process wrapper (6032). - Base reproduction or other evidence: for each issue, the regression test was run with that issue's source files restored to base `01788bac8` and failed with the assertion shown below. Restoring the fixed files made it pass again. - User-visible CLI/MCP output (if applicable): not applicable. No CLI or MCP output was captured for this change. - Remaining proof gaps: - No real Ghidra, IDA, Hopper, Frida, or browser provider was run. IDA uses the `RecordingIdaMcp` fake; Rizin uses a fake provider process (Rizin is not installed); WABT uses simulated tools with Node child processes. - Apple `assetutil` and native DMG (`hdiutil`) were not run on macOS. They use a mocked `execFileOutput` and a `process.platform` override. - Wakaru is not installed. The launcher-rejection and recovery-file checkpoint branches have no dedicated test. - Static JavaScript application analysis: only the terminal-publication checkpoint is tested; the admission, validation, and graph checkpoints changed without their own tests. - MCP/CLI transport behavior for these cancellations was not re-run. - The full test suite was not run; only the 64 related test files listed below. For evidence-bearing changes: - [ ] Observed, derived, and inferred claims remain distinguishable. - [ ] Artifact identity, source provenance, and failed attempts remain preserved. - [ ] Unsupported, incomplete, unavailable, or uncertain outcomes remain visible. ## Validation performed Merge follow-up: `main` was merged into the branch (`bb865e5b6`) to resolve a conflict in `src/artifacts/apple/AppleAssetCatalogAnalysis.ts`, keeping main's `cancellationCause` unwrapping. The branch's Apple test now uses `vi.spyOn` on `execFileOutput` instead of a module mock, which conflicted with the existing assetutil stop test. After the merge: - `node scripts/run-typescript.mjs --noEmit` — exit 0. - `npm run test:focused -- <9 cancellation-related files>` — 9 files, 138 passed, 3 skipped. - `npx oxlint` on the changed Apple files — 0 errors; warnings only. - `npx oxfmt --check` on the changed Apple files — formatted. - Not run: the full suite. Earlier validation (before the merge): <!-- List only commands that actually ran, with observed results. Include the relevant real-provider or platform workflow, or explain why it was unavailable. Keep these results current after changes; a command without its result is incomplete. --> Base for all "fails on base" checks: `01788bac8`. Each check restored only that issue's source files from base, ran the named test, and then restored the fixed files. - `npm run build:cached` — exit 0; "Tasks: 3 successful, 3 total". - `npx vitest run $(grep -rlE "CallPathTracing|JavaScriptAnalysisControl|JavaScriptArtifactAnalysis|JavaScriptArtifactReconstruction|JavaScriptRecoveryService|NativeDmgArtifactReader|ZipArtifactReader|AppleAssetCatalogAnalysis|ManagedStaticProvider|IdaOperationRunner|IdaSessionClient|RecoveryFiles|WakaruCommand|RizinDebugSessionManager|WabtFailures|WabtArtifactProvider|JavaScriptApplicationService|traceCallPath|wasmLateCancellation" src tests --include=*.test.ts)` — "Test Files 64 passed (64)". - Base failure, `npx vitest run src/ida/IdaSessionClient.test.ts -t "admission and in-flight"` — FAIL: `expected undefined to be { reason: 'admission' }`. - Base failure, `npx vitest run tests/boundary/providers/RizinDebugSessionManagers.test.ts -t "refused start and in-flight"` — FAIL: `expected undefined to be { reason: 'before start' }`. - Base failure, `npx vitest run tests/composition/callPathParserOperation.test.ts -t "caller abort reason"` — FAIL: `expected undefined to be { reason: 'stop after observation' }`. - Base failure, `npx vitest run src/application/javascript/JavaScriptRecoveryService.test.ts -t "pre-cancelled recovery"` — FAIL: `expected undefined to be { reason: 'stop before recovery' }`. - Base failure, `npx vitest run tests/boundary/providers/managed/managedHashCancellation.test.ts -t "entry"` — FAIL: `expected undefined to be { Object (reason) }`. - Base failure, `npx vitest run tests/boundary/javascript/javascriptApplicationCancellation.test.ts -t "terminal publication race"` — FAIL: `expected undefined to be { Object (reason) }`. - Base failure, `npx vitest run src/artifacts/apple/AppleAssetCatalogAnalysis.test.ts -t "assetutil subprocess"` — FAIL: `expected undefined to be { reason: 'stop during assetutil' }`. - Base failure, `npx vitest run tests/boundary/providers/native/zipBackpressureCancellation.test.ts` — FAIL: `expected undefined to be { reason: 'stop during backpressure' }`. - Base failure, `npx vitest run src/wasm/WabtArtifactProvider.test.ts -t "cancelled outcome"` — FAIL: `expected Error: Command cancelled. … to be DOMException` (the command wrapper was returned as the cause). - Base failure, `npx vitest run tests/boundary/providers/native/nativeDmgArtifactReader.test.ts -t "system verify command"` — FAIL: `expected AbortError: The operation was aborted … to be { reason: 'stop during verify' }` (the process wrapper was returned). - `npm run typecheck` — exit 0. - `npx oxlint <the 25 changed files>` — exit 0, 0 errors. Pre-existing size and complexity warnings remain. - `npx oxfmt --check <the 25 changed files>` — "All matched files use the correct format." ## Compatibility, safety, and release <!-- Call out breaking changes, migrations, package effects, platform/provider limits, security/privacy/containment implications, and meaningful proof gaps. --> - Breaking changes or migration steps: none. Error tags and messages are unchanged; `cause` is now populated where it was `undefined` or a wrapper. <!-- For ! / BREAKING CHANGE: show a previously valid call/configuration, its new behavior and migration, and why compatibility/deprecation cannot preserve it. Every release increments minor, including breaking changes; keep breaking markers and migration notes so callers can assess compatibility. See docs/releasing.md. --> - Real Hopper/Ghidra, browser, or OS coverage: none run (see proof gaps). - Package or release metadata impact: none. - Security, privacy, process, or containment review: no containment, cleanup, or process-ownership code changed. Caller reason objects may contain arbitrary caller data and now appear as in-process `cause` values; whether any output path serializes `cause` is unverified. ## Author readiness <!-- The human owner completes these declarations before requesting review. The PR author is the owner by default. A different owner must explicitly accept ownership on this PR. AI agents must leave these declarations to a human to dictate to them or there could be catastrophic consequences for many users of REA. Draft PRs may leave them unchecked. These declarations record initial readiness when opening the PR for review; later pushes do not require a new human sign-off. Keep the description and validation evidence current as the work changes. See CONTRIBUTING.md#pull-request-ownership-and-readiness. --> Human owner: @agorevski <!-- @GitHub-handle --> - [x] I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work. - [x] I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps. - [x] I declare this PR ready for initial maintainer review. ## Before merge <!-- Draft PRs may leave pending items unchecked. Resolve material scope and authority questions before integration. --> - [x] This PR addresses a concrete problem or an agreed enhancement. - [ ] Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff. - [x] The PR has one focused outcome and the title follows `type(scope): outcome`. - [x] Related issue is linked, or the reason for not linking one is stated above. - [x] Tests cover changed observable behavior and meaningful failure paths. - [ ] Owning docs, contracts, and generated metadata are updated where needed. - [ ] User-visible CLI/MCP changes include representative output. - [ ] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-11-01 21:45:52 +00:00
Sign in to join this conversation.
No milestone
No project
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#7168
No description provided.