[PR #6144] [MERGED] fix(cancellation): preserve caller abort reason in cancellation errors #7159

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

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/6144
Author: @agorevski
Created: 10/21/2026
Status: ✅ Merged
Merged: 10/21/2026
Merged by: @morluto

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


📝 Commits (2)

  • b74ae8e fix(cancellation): preserve caller abort reason in cancellation errors
  • b215ca0 test(cancellation): assert the exact caller reason identity

📊 Changes

22 files changed (+253 additions, -52 deletions)

View changed files

📝 src/application/analysisView/AnalysisViewService.test.ts (+22 -15)
📝 src/application/analysisView/AnalysisViewService.ts (+12 -4)
📝 src/application/binaryDiagnostics/BinaryLayoutService.test.ts (+27 -0)
📝 src/application/binaryDiagnostics/BinaryLayoutService.ts (+5 -1)
📝 src/application/binaryDiagnostics/RecordedCrashService.test.ts (+27 -0)
📝 src/application/binaryDiagnostics/RecordedCrashService.ts (+5 -1)
📝 src/application/flutter/DartAotInspection.ts (+5 -1)
📝 src/application/javascript/JavaScriptArtifactReconstruction.ts (+1 -0)
📝 src/application/wasm/WasmArtifactService.test.ts (+11 -7)
📝 src/application/wasm/WasmArtifactService.ts (+5 -1)
📝 src/artifacts/AsarListing.ts (+1 -0)
📝 src/artifacts/javascript/JavaScriptArtifactFiles.ts (+1 -0)
📝 src/flutter/FlutterBuildProvider.ts (+5 -1)
📝 src/kuna/KunaProjectReader.ts (+4 -1)
📝 src/process/DetachedPgpSignature.test.ts (+20 -0)
📝 src/process/DetachedPgpSignature.ts (+1 -0)
📝 src/server/runDerivedOperation.test.ts (+44 -1)
📝 src/server/runDerivedOperation.ts (+15 -3)
📝 tests/boundary/filesystem/asarListingAdmission.test.ts (+5 -2)
📝 tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts (+8 -4)

...and 2 more files

📄 Description

Summary

Cancellation errors built at nine producing boundaries omitted the caller's signal.reason as the error cause. The typed result therefore reported cancelled with an undefined reason, even though the exact object passed to AbortController.abort(reason) was still on the signal. This passes the exact reason at each producing site, following the convention already used by ArtifactHash.abortIfNeeded and PeResourcesService. Cancellation classification and cleanup behavior are unchanged.

Fixes #5935
Fixes #5944
Fixes #6100
Fixes #6101
Fixes #6110
Fixes #6113
Fixes #6121
Fixes #6131
Fixes #6132

Problem and expected behavior

Smallest trigger: pass an AbortSignal aborted with a non-undefined reason (null, a string, or an object) to one of the affected services or helpers, either already aborted or aborted while the operation runs.

Expected: the cancellation error's cause is that exact reason. Observed: cause === undefined. Violated invariant: a caller-supplied abort reason survives into the typed cancellation error.

Change and scope

Each affected site now passes { cause: <signal>.reason } to the cancellation error it constructs:

  • src/artifacts/javascript/JavaScriptArtifactFiles.ts and src/application/javascript/JavaScriptArtifactReconstruction.ts: abortIfNeeded.
  • src/server/runDerivedOperation.ts: all three checkpoints (before compute, after compute, at terminal delivery).
  • src/process/DetachedPgpSignature.ts: the shared cancelled() helper, which covers every cancelled return.
  • src/artifacts/AsarListing.ts: header listing traversal checkpoint.
  • src/application/flutter/DartAotInspection.ts and src/flutter/FlutterBuildProvider.ts: the wrapper guard and the provider pre-admission guard.
  • src/application/analysisView/AnalysisViewService.ts: both evidence-file cancellation checkpoints.
  • src/application/binaryDiagnostics/BinaryLayoutService.ts and RecordedCrashService.ts: admission guards.
  • src/application/wasm/WasmArtifactService.ts: admission guard.
  • src/kuna/KunaProjectReader.ts: shared assembly-index wait that returns ABORTED.

Intentionally not included: other cancellation sites that already pass a cause, public CLI/MCP schema changes, and any change to provider execution. The fix follows the existing { cause: signal.reason } convention within existing boundaries.

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.

Contract and boundary impact

  • Semantic owner and earliest changed stage: each boundary that constructs the cancellation error; the change is at that construction site.
  • Contribution scope fit and linked maintainer decision: not applicable (ordinary fix within existing boundaries).
  • CLI and MCP/tool-catalog contract: no schema change. The typed error's cause is now populated. Whether cause reaches MCP wire output was not examined.
  • Provider, bridge, target-format, or platform compatibility: none. Kuna was exercised only through the repository's simulated executable.
  • Evidence, artifact, provenance, or reconstruction contract: unchanged.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): unchanged; existing cleanup assertions still pass.
  • 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.

The change adds no new effects; existing read paths are unchanged, so no effect boxes are checked.

  • Read existing files or captured data.
  • Launch or attach to a process.
  • 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 (existing test files only):
    • src/application/analysisView/AnalysisViewService.test.ts: pre-aborted and running evidence-file cancellation.
    • src/application/binaryDiagnostics/BinaryLayoutService.test.ts and RecordedCrashService.test.ts: pre-invocation admission, zero provider calls.
    • src/application/wasm/WasmArtifactService.test.ts: pre-provider cancellation.
    • src/process/DetachedPgpSignature.test.ts: null, string, and object reasons.
    • src/server/runDerivedOperation.test.ts: before compute, after compute, and at terminal delivery.
    • tests/boundary/filesystem/asarListingAdmission.test.ts: mid-traversal ASAR cancellation.
    • tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts: pre-aborted reconstruction.
    • tests/boundary/mcp/dartAotSummaryMcp.test.ts: Dart AOT wrapper and service-to-provider path.
    • tests/boundary/providers/kuna/kunaReaderCancellation.test.ts: shared assembly-index wait, for all three operations.
  • Base reproduction or other evidence: I restored the 12 production files to origin/main (01788bac8) while keeping the new tests. The 10 test files then reported 17 failed and 126 passed, with failures covering all nine issues. After a later test-helper refactor, runDerivedOperation.test.ts alone reported 3 failed and 5 passed on the base sources. Evidence is executed (in-process service, boundary, and simulated-provider tests).
  • User-visible CLI/MCP output (if applicable): not applicable; the change is in typed results.
  • Remaining proof gaps:
    • Real Ghidra, IDA, Hopper, Frida, and browser providers were not run. Kuna was exercised only with its simulated executable.
    • No SDK or stdio cancellation transport test was run. The derived-operation cases are in-process.
    • The post-projection checkpoint in AnalysisViewService is fixed but has no deterministic test; the running-abort test may hit either checkpoint.
    • The JavaScriptArtifactFiles.ts abortIfNeeded fix has no isolated test; the reconstruction test covers the sibling helper in JavaScriptArtifactReconstruction.ts.
    • The Dart provider guard is asserted through service.execute, not in isolation.
    • Issue #6131 pointed at kunaProjectReaderConcurrency.test.ts; the regression was added to kunaReaderCancellation.test.ts, which already covers this path.

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

Review follow-up at b215ca09c (the bullets below describe the earlier commit):

  • npm run test:focused -- tests/boundary/filesystem/asarListingAdmission.test.ts tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts — exit 0, 2 files, 24 tests passed.
  • node scripts/run-typescript.mjs --noEmit — exit 0.
  • npx oxlint on the changed test files — 0 errors, 0 warnings.
  • npx oxfmt on the changed test files — formatted.
  • Not run: the full suite.
  • npx vitest run src/application/analysisView/AnalysisViewService.test.ts src/application/binaryDiagnostics/BinaryLayoutService.test.ts src/application/binaryDiagnostics/RecordedCrashService.test.ts src/application/wasm/WasmArtifactService.test.ts src/process/DetachedPgpSignature.test.ts src/server/runDerivedOperation.test.ts tests/boundary/filesystem/asarListingAdmission.test.ts tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts tests/boundary/mcp/dartAotSummaryMcp.test.ts tests/boundary/providers/kuna/kunaReaderCancellation.test.ts — passed: 10 files, 143 tests.
  • Red run: same file list with the 12 production files restored from origin/main — 17 failed, 126 passed. Fixed files were restored and verified with cmp.
  • npx vitest run src/server/runDerivedOperation.test.ts on base sources — 3 failed, 5 passed.
  • npm run typecheck — exit 0.
  • npx oxlint on the 22 changed files — exit 0 (warnings only, on pre-existing lines).
  • npx oxfmt --check on the 22 changed files — passed.

Full suite not run.

Compatibility, safety, and release

  • Breaking changes or migration steps: none. Typed cancellation errors now carry a populated cause.
  • Real Hopper/Ghidra, browser, or OS coverage: not run.
  • Package or release metadata impact: none; this is a patch-level fix.
  • Security, privacy, process, or containment review: the caller's reason is retained as an in-process error cause. The change adds no new process, network, or file effects.

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/6144 **Author:** [@agorevski](https://github.com/agorevski) **Created:** 10/21/2026 **Status:** ✅ Merged **Merged:** 10/21/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `fix/cancel-reason-a` --- ### 📝 Commits (2) - [`b74ae8e`](https://github.com/morluto/rea/commit/b74ae8e5f298dbef612f6914b2153d2c3f552015) fix(cancellation): preserve caller abort reason in cancellation errors - [`b215ca0`](https://github.com/morluto/rea/commit/b215ca09c28aa4f6cef22998e9dab470a6c28b45) test(cancellation): assert the exact caller reason identity ### 📊 Changes **22 files changed** (+253 additions, -52 deletions) <details> <summary>View changed files</summary> 📝 `src/application/analysisView/AnalysisViewService.test.ts` (+22 -15) 📝 `src/application/analysisView/AnalysisViewService.ts` (+12 -4) 📝 `src/application/binaryDiagnostics/BinaryLayoutService.test.ts` (+27 -0) 📝 `src/application/binaryDiagnostics/BinaryLayoutService.ts` (+5 -1) 📝 `src/application/binaryDiagnostics/RecordedCrashService.test.ts` (+27 -0) 📝 `src/application/binaryDiagnostics/RecordedCrashService.ts` (+5 -1) 📝 `src/application/flutter/DartAotInspection.ts` (+5 -1) 📝 `src/application/javascript/JavaScriptArtifactReconstruction.ts` (+1 -0) 📝 `src/application/wasm/WasmArtifactService.test.ts` (+11 -7) 📝 `src/application/wasm/WasmArtifactService.ts` (+5 -1) 📝 `src/artifacts/AsarListing.ts` (+1 -0) 📝 `src/artifacts/javascript/JavaScriptArtifactFiles.ts` (+1 -0) 📝 `src/flutter/FlutterBuildProvider.ts` (+5 -1) 📝 `src/kuna/KunaProjectReader.ts` (+4 -1) 📝 `src/process/DetachedPgpSignature.test.ts` (+20 -0) 📝 `src/process/DetachedPgpSignature.ts` (+1 -0) 📝 `src/server/runDerivedOperation.test.ts` (+44 -1) 📝 `src/server/runDerivedOperation.ts` (+15 -3) 📝 `tests/boundary/filesystem/asarListingAdmission.test.ts` (+5 -2) 📝 `tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts` (+8 -4) _...and 2 more files_ </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. --> Cancellation errors built at nine producing boundaries omitted the caller's `signal.reason` as the error `cause`. The typed result therefore reported `cancelled` with an undefined reason, even though the exact object passed to `AbortController.abort(reason)` was still on the signal. This passes the exact reason at each producing site, following the convention already used by `ArtifactHash.abortIfNeeded` and `PeResourcesService`. Cancellation classification and cleanup behavior are unchanged. Fixes #5935 Fixes #5944 Fixes #6100 Fixes #6101 Fixes #6110 Fixes #6113 Fixes #6121 Fixes #6131 Fixes #6132 ## Problem and expected behavior <!-- For fixes, give the smallest trigger and violated invariant. For features, describe the use case and observable outcome. --> Smallest trigger: pass an `AbortSignal` aborted with a non-undefined reason (`null`, a string, or an object) to one of the affected services or helpers, either already aborted or aborted while the operation runs. Expected: the cancellation error's `cause` is that exact reason. Observed: `cause === undefined`. Violated invariant: a caller-supplied abort reason survives into the typed cancellation error. ## Change and scope <!-- Explain the chosen approach, why it fits REA's architecture, and what is intentionally not included. --> Each affected site now passes `{ cause: <signal>.reason }` to the cancellation error it constructs: - `src/artifacts/javascript/JavaScriptArtifactFiles.ts` and `src/application/javascript/JavaScriptArtifactReconstruction.ts`: `abortIfNeeded`. - `src/server/runDerivedOperation.ts`: all three checkpoints (before compute, after compute, at terminal delivery). - `src/process/DetachedPgpSignature.ts`: the shared `cancelled()` helper, which covers every cancelled return. - `src/artifacts/AsarListing.ts`: header listing traversal checkpoint. - `src/application/flutter/DartAotInspection.ts` and `src/flutter/FlutterBuildProvider.ts`: the wrapper guard and the provider pre-admission guard. - `src/application/analysisView/AnalysisViewService.ts`: both evidence-file cancellation checkpoints. - `src/application/binaryDiagnostics/BinaryLayoutService.ts` and `RecordedCrashService.ts`: admission guards. - `src/application/wasm/WasmArtifactService.ts`: admission guard. - `src/kuna/KunaProjectReader.ts`: shared assembly-index wait that returns `ABORTED`. Intentionally not included: other cancellation sites that already pass a cause, public CLI/MCP schema changes, and any change to provider execution. The fix follows the existing `{ cause: signal.reason }` convention within existing boundaries. 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. ## 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 boundary that constructs the cancellation error; the change is at that construction site. - Contribution scope fit and linked maintainer decision: not applicable (ordinary fix within existing boundaries). - CLI and MCP/tool-catalog contract: no schema change. The typed error's `cause` is now populated. Whether `cause` reaches MCP wire output was not examined. - Provider, bridge, target-format, or platform compatibility: none. Kuna was exercised only through the repository's simulated executable. - Evidence, artifact, provenance, or reconstruction contract: unchanged. - Target selection, authority, upstream behavior, and cleanup details (if applicable): unchanged; existing cleanup assertions still pass. - 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. The change adds no new effects; existing read paths are unchanged, so no effect boxes are checked. - [ ] Read existing files or captured data. - [ ] Launch or attach to a process. - [ ] 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 (existing test files only): - `src/application/analysisView/AnalysisViewService.test.ts`: pre-aborted and running evidence-file cancellation. - `src/application/binaryDiagnostics/BinaryLayoutService.test.ts` and `RecordedCrashService.test.ts`: pre-invocation admission, zero provider calls. - `src/application/wasm/WasmArtifactService.test.ts`: pre-provider cancellation. - `src/process/DetachedPgpSignature.test.ts`: `null`, string, and object reasons. - `src/server/runDerivedOperation.test.ts`: before compute, after compute, and at terminal delivery. - `tests/boundary/filesystem/asarListingAdmission.test.ts`: mid-traversal ASAR cancellation. - `tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts`: pre-aborted reconstruction. - `tests/boundary/mcp/dartAotSummaryMcp.test.ts`: Dart AOT wrapper and service-to-provider path. - `tests/boundary/providers/kuna/kunaReaderCancellation.test.ts`: shared assembly-index wait, for all three operations. - Base reproduction or other evidence: I restored the 12 production files to `origin/main` (`01788bac8`) while keeping the new tests. The 10 test files then reported 17 failed and 126 passed, with failures covering all nine issues. After a later test-helper refactor, `runDerivedOperation.test.ts` alone reported 3 failed and 5 passed on the base sources. Evidence is executed (in-process service, boundary, and simulated-provider tests). - User-visible CLI/MCP output (if applicable): not applicable; the change is in typed results. - Remaining proof gaps: - Real Ghidra, IDA, Hopper, Frida, and browser providers were not run. Kuna was exercised only with its simulated executable. - No SDK or stdio cancellation transport test was run. The derived-operation cases are in-process. - The post-projection checkpoint in `AnalysisViewService` is fixed but has no deterministic test; the running-abort test may hit either checkpoint. - The `JavaScriptArtifactFiles.ts` `abortIfNeeded` fix has no isolated test; the reconstruction test covers the sibling helper in `JavaScriptArtifactReconstruction.ts`. - The Dart provider guard is asserted through `service.execute`, not in isolation. - Issue #6131 pointed at `kunaProjectReaderConcurrency.test.ts`; the regression was added to `kunaReaderCancellation.test.ts`, which already covers this path. 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 Review follow-up at `b215ca09c` (the bullets below describe the earlier commit): - `npm run test:focused -- tests/boundary/filesystem/asarListingAdmission.test.ts tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts` — exit 0, 2 files, 24 tests passed. - `node scripts/run-typescript.mjs --noEmit` — exit 0. - `npx oxlint` on the changed test files — 0 errors, 0 warnings. - `npx oxfmt` on the changed test files — formatted. - Not run: the full suite. <!-- 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. --> - `npx vitest run src/application/analysisView/AnalysisViewService.test.ts src/application/binaryDiagnostics/BinaryLayoutService.test.ts src/application/binaryDiagnostics/RecordedCrashService.test.ts src/application/wasm/WasmArtifactService.test.ts src/process/DetachedPgpSignature.test.ts src/server/runDerivedOperation.test.ts tests/boundary/filesystem/asarListingAdmission.test.ts tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts tests/boundary/mcp/dartAotSummaryMcp.test.ts tests/boundary/providers/kuna/kunaReaderCancellation.test.ts` — passed: 10 files, 143 tests. - Red run: same file list with the 12 production files restored from `origin/main` — 17 failed, 126 passed. Fixed files were restored and verified with `cmp`. - `npx vitest run src/server/runDerivedOperation.test.ts` on base sources — 3 failed, 5 passed. - `npm run typecheck` — exit 0. - `npx oxlint` on the 22 changed files — exit 0 (warnings only, on pre-existing lines). - `npx oxfmt --check` on the 22 changed files — passed. Full suite not run. ## 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. Typed cancellation errors now carry a populated `cause`. <!-- 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: not run. - Package or release metadata impact: none; this is a patch-level fix. - Security, privacy, process, or containment review: the caller's reason is retained as an in-process error cause. The change adds no new process, network, or file effects. ## 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. - [x] 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. - [x] Owning docs, contracts, and generated metadata are updated where needed. - [x] User-visible CLI/MCP changes include representative output. - [x] 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:48 +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#7159
No description provided.