[PR #5772] [MERGED] fix(windows): retain native handles when close is unconfirmed #7049

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

📋 Pull Request Information

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

Base: main ← Head: cursor/ownership-cleanup-829e


📝 Commits (7)

  • 0ac5825 fix(windows): retain native handles whose close is unconfirmed
  • 6a8d161 test(process): keep scratch until inherited pipes close
  • 93c2d0f fix(windows): retry admitted file closes before runtime removal
  • e76622b fix(windows): resume a close after part of the owner is released
  • 9ef52c6 test(process): signal only an owned inherited-pipe descendant
  • 78b2faa fix(windows): do not close a handle again after a failed close
  • f56cbbc fix(windows): stop using a close-blocked pipe for I/O

📊 Changes

14 files changed (+1022 additions, -43 deletions)

View changed files

📝 native/windows/README.md (+15 -2)
📝 native/windows/src/authority.hpp (+133 -14)
📝 native/windows/src/filesystem.cc (+52 -4)
➕ native/windows/src/handle_close.hpp (+206 -0)
➕ native/windows/src/handle_close_test.cc (+254 -0)
📝 native/windows/src/process.cc (+21 -6)
📝 src/process/DarwinProcessRunTokenReader.ts (+3 -0)
📝 src/process/ExecFileOutput.test.ts (+110 -1)
📝 src/process/ExecFileOutput.ts (+6 -4)
➕ src/windows/WindowsHandleClose.test.ts (+53 -0)
📝 src/windows/WindowsOwnedProcess.test.ts (+5 -2)
📝 src/windows/WindowsOwnedProcess.ts (+39 -8)
📝 src/windows/WindowsPrivateRuntime.test.ts (+94 -0)
📝 src/windows/WindowsPrivateRuntime.ts (+31 -2)

📄 Description

Summary

Fixes #4505. Fixes #5616.

Windows native owners no longer drop a handle when CloseHandle fails, and they do not close that numeric value again. An open liveness probe can observe a reused value, so only a probe that says the value is gone drops it. Stoppable command settlement still waits for inherited stdio pipes before a caller may remove scratch files. A private-runtime file whose close fails stays on that runtime and is closed again before the runtime tree walk. A runtime whose root directory handle is already released resumes with its parent handles. A process whose settlement was already observed retries process close alone.

Problem and expected behavior

Handle::reset called CloseHandle and then overwrote the stored value. A failed close discarded the only record of that kernel object, so a later close could not retry it and a reused numeric value could be closed by mistake. Treating a later open probe as proof that the same object is still owned has the same reuse hazard.

WindowsPrivateRuntime.readFile called native close from finally and then dropped the file wrapper. A failed close left ancestor directory handles reachable only from GC, so a later runtime_close could not retry that file and could fail with a sharing violation.

After the root directory handle was released, a failed parent close made the next runtime close walk that invalid handle and skip the remaining parents. After the job handle was released, process cleanup retried through kill() and process_poll, which still need that job.

PR #5587 (closed, not merged) would have destroyed execFileOutput readers after the stop grace. An inherited-pipe descendant keeps those pipes open until it exits. Destroying the readers settles the helper while that descendant is still using the compiler scratch root. Current main already waits for pipe close; the scratch root must still be present when that descendant finishes.

Change and scope

The Windows close gate lives with the handle owner. After a failed CloseHandle, GetHandleInformation decides the next step: a value that is still open, or whose liveness cannot be read, stays owned and is not closed again; a value that is no longer in the handle table is dropped and never closed again. Dying owners park survivors for the next runtime, process, or file close. An incomplete snapshot writer that cannot be closed stays on the runtime. A published snapshot still returns its digest when a source close fails; those source handles are retried by runtime close. Broken-pipe output still returns the bytes already read and leaves a failed read-handle close for process_close.

The private runtime keeps an admitted file wrapper when close fails and retries that same wrapper in #releaseAdmittedFiles before runtime_close. A failed retry remains on the runtime, and the tree walk does not start while the file is still owned. treeReleased is set only after the root directory handle is released, so a later close resumes with the parent handles.

Once a Windows owned process has observed settlement and ended its local streams, #releasePending stays set until process_close returns. Later cleanup calls that close again and does not kill or poll.

execFileOutput documents that settlement waits for the pipes it created. The Darwin helper removes its scratch root only after that settlement and does not signal processes it did not launch. The inherited-pipe regression does not signal a descendant after settlement, and on an earlier failure it signals only a command line that still contains that test's path.

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: Handle in native/windows/src/authority.hpp owns close. WindowsPrivateRuntime owns admitted file wrappers whose close failed and the runtime's released-tree stage. WindowsOwnedProcess owns the close-only retry after settlement. execFileOutput owns settlement of the pipes it created. Scratch removal stays with the Darwin helper after that settlement.
  • Contribution scope fit and linked maintainer decision: not applicable. This stays inside existing Windows handle ownership and stoppable-command settlement. It does not add target execution, injection, mutation, or protection recovery.
  • CLI and MCP/tool-catalog contract: none.
  • Provider, bridge, target-format, or platform compatibility: Windows native close failures now surface as the existing Failure (constraint, path, Win32 code) and keep the owner open. Sharing-lock retries 32/33 are unchanged. A repeated native close of a value whose CloseHandle already failed does not call CloseHandle again.
  • Evidence, artifact, provenance, or reconstruction contract: a snapshot digest remains the byte outcome when source-handle close fails. The unresolved handles stay on the runtime. Pipe settlement is not recorded as process-family completion.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): no new process-group or descendant signals. Non-inherited compiler children are still not owned. Job-object kill-on-close is unchanged. A failed close keeps the numeric value until a probe says it is gone, and does not close it again. Failed admitted-file closes are retried on the same wrapper before runtime removal. A released runtime root is not walked again. A settled process is not killed again in order to finish handle close.
  • 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.
  • 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: src/windows/WindowsHandleClose.test.ts compiles native/windows/src/handle_close_test.cc with injected close and liveness results, including that an open probe after a failed close does not close again. src/windows/WindowsPrivateRuntime.test.ts keeps a failed admitted-file close and retries that wrapper before runtime_close, and it refuses the tree walk while that close is still failing. src/windows/WindowsOwnedProcess.test.ts expects a failed process close to be retried with process_close only. src/process/ExecFileOutput.test.ts spawns an inherited-pipe descendant that outlives the stop grace and records whether its scratch directory still exists, and it does not signal that descendant after settlement.
  • Base reproduction or other evidence: on current main, Handle::reset ignored CloseHandle's result and replaced the value. readFile dropped the file wrapper after a failed close. Process cleanup retried a partial close through kill and poll. PR #5587's reader destruction is absent from main (mergedAt null). The inherited-pipe test deletes scratch only after execFileOutput settles; the descendant writes scratchExists: true and the helper rejects ETIMEDOUT / killed: true. Destroying readers at the grace period would delete scratch before that write.
  • User-visible CLI/MCP output (if applicable): none.
  • Remaining proof gaps: CloseHandle and GetHandleInformation were not executed. MinGW was not installed, so the Windows addon was not cross-built. Real Windows runtime behavior is unverified. The pipe regression ran on Linux only; Swift and macOS were not rerun. A descendant that does not inherit the helper pipes is still outside this owner. The runtime parent-resume path is source-derived; it has no Windows execution.

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

  • g++ -std=c++17 -Wall -Wextra -Werror -I native/windows/src native/windows/src/handle_close_test.cc -o /tmp/handle-close-test && /tmp/handle-close-test — exit 0, including after the close-block change.
  • npm run test:local -- src/windows/WindowsHandleClose.test.ts src/process/ExecFileOutput.test.ts — 2 files, 32 tests passed (Node v24.18.0). The inherited-pipe case passed in about 7s with scratchExists: true.
  • npm run test:local -- src/windows/WindowsHandleClose.test.ts — passed again after the close-block change.
  • npm run test:local -- src/windows/WindowsPrivateRuntime.test.ts — 13 tests passed, including the retained file-close retry.
  • npm run test:local -- src/windows/WindowsOwnedProcess.test.ts src/process/ExecFileOutput.test.ts — 51 tests passed after the close-resume and descendant-signal changes. The inherited-pipe case passed again.
  • npm run verify:test-discovery — discovered all 1881 test files exactly once.
  • npm run check:fast — typecheck and lint succeeded. The close-block commit did not change TypeScript, and the cached check passed.
  • npm run format:check — all matched files use the correct format before the later commits; oxfmt was run on the TypeScript files changed after that.
  • npx oxlint on the touched TypeScript files — no new errors. Existing DarwinProcessRunTokenReader.ts size warnings and the pre-existing WindowsOwnedProcess parameter-count warning remain.

Compatibility, safety, and release

  • Breaking changes or migration steps: none. Callers that treated a failed native close as success now receive the Win32 failure and must retry the same owner. The numeric value is not replaced, and a later close does not call CloseHandle on it again.
  • Real Hopper/Ghidra, browser, or OS coverage: no Hopper, Ghidra, browser, or Windows OS run. Linux covered the inherited-pipe ordering, the owned-process close retry, and the injected close decision.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: failed closes no longer forget a live kernel object and no longer close a number that a later probe merely says is open. Terminal invalidity does not call CloseHandle again. No broader process-tree authority was added. An unconfirmed number that cannot be recorded is left open until process exit rather than closed. A failed admitted-file close stays on the runtime that opened it. The inherited-pipe test does not signal a process after settlement or a PID whose command line is no longer that descendant.

Author readiness

Human owner: @morluto

  • 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.
Open in Web Open in Cursor 

🔄 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/5772 **Author:** [@morluto](https://github.com/morluto) **Created:** 10/21/2026 **Status:** ✅ Merged **Merged:** 10/21/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `cursor/ownership-cleanup-829e` --- ### 📝 Commits (7) - [`0ac5825`](https://github.com/morluto/rea/commit/0ac5825f7b598b52082c8cba278aeb0b53eb46f3) fix(windows): retain native handles whose close is unconfirmed - [`6a8d161`](https://github.com/morluto/rea/commit/6a8d161b49cbd2daf42721422b59a4d33f596699) test(process): keep scratch until inherited pipes close - [`93c2d0f`](https://github.com/morluto/rea/commit/93c2d0f9437b734e996bc02a030c312e28e3508f) fix(windows): retry admitted file closes before runtime removal - [`e76622b`](https://github.com/morluto/rea/commit/e76622bf88fc255eee4c326582fe2fe6816a2f99) fix(windows): resume a close after part of the owner is released - [`9ef52c6`](https://github.com/morluto/rea/commit/9ef52c6506b4c181352dbe99e600854555ebd9ea) test(process): signal only an owned inherited-pipe descendant - [`78b2faa`](https://github.com/morluto/rea/commit/78b2faa848d54c655a38def0b309730d3040ed3a) fix(windows): do not close a handle again after a failed close - [`f56cbbc`](https://github.com/morluto/rea/commit/f56cbbc87d9dcbcd2a30979ff65cd99c9057957a) fix(windows): stop using a close-blocked pipe for I/O ### 📊 Changes **14 files changed** (+1022 additions, -43 deletions) <details> <summary>View changed files</summary> 📝 `native/windows/README.md` (+15 -2) 📝 `native/windows/src/authority.hpp` (+133 -14) 📝 `native/windows/src/filesystem.cc` (+52 -4) ➕ `native/windows/src/handle_close.hpp` (+206 -0) ➕ `native/windows/src/handle_close_test.cc` (+254 -0) 📝 `native/windows/src/process.cc` (+21 -6) 📝 `src/process/DarwinProcessRunTokenReader.ts` (+3 -0) 📝 `src/process/ExecFileOutput.test.ts` (+110 -1) 📝 `src/process/ExecFileOutput.ts` (+6 -4) ➕ `src/windows/WindowsHandleClose.test.ts` (+53 -0) 📝 `src/windows/WindowsOwnedProcess.test.ts` (+5 -2) 📝 `src/windows/WindowsOwnedProcess.ts` (+39 -8) 📝 `src/windows/WindowsPrivateRuntime.test.ts` (+94 -0) 📝 `src/windows/WindowsPrivateRuntime.ts` (+31 -2) </details> ### 📄 Description <!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Summary Fixes #4505. Fixes #5616. Windows native owners no longer drop a handle when `CloseHandle` fails, and they do not close that numeric value again. An open liveness probe can observe a reused value, so only a probe that says the value is gone drops it. Stoppable command settlement still waits for inherited stdio pipes before a caller may remove scratch files. A private-runtime file whose close fails stays on that runtime and is closed again before the runtime tree walk. A runtime whose root directory handle is already released resumes with its parent handles. A process whose settlement was already observed retries process close alone. ## Problem and expected behavior `Handle::reset` called `CloseHandle` and then overwrote the stored value. A failed close discarded the only record of that kernel object, so a later close could not retry it and a reused numeric value could be closed by mistake. Treating a later open probe as proof that the same object is still owned has the same reuse hazard. `WindowsPrivateRuntime.readFile` called native `close` from `finally` and then dropped the file wrapper. A failed close left ancestor directory handles reachable only from GC, so a later `runtime_close` could not retry that file and could fail with a sharing violation. After the root directory handle was released, a failed parent close made the next runtime close walk that invalid handle and skip the remaining parents. After the job handle was released, process cleanup retried through `kill()` and `process_poll`, which still need that job. PR #5587 (closed, not merged) would have destroyed `execFileOutput` readers after the stop grace. An inherited-pipe descendant keeps those pipes open until it exits. Destroying the readers settles the helper while that descendant is still using the compiler scratch root. Current `main` already waits for pipe close; the scratch root must still be present when that descendant finishes. ## Change and scope The Windows close gate lives with the handle owner. After a failed `CloseHandle`, `GetHandleInformation` decides the next step: a value that is still open, or whose liveness cannot be read, stays owned and is not closed again; a value that is no longer in the handle table is dropped and never closed again. Dying owners park survivors for the next runtime, process, or file close. An incomplete snapshot writer that cannot be closed stays on the runtime. A published snapshot still returns its digest when a source close fails; those source handles are retried by runtime close. Broken-pipe output still returns the bytes already read and leaves a failed read-handle close for `process_close`. The private runtime keeps an admitted file wrapper when `close` fails and retries that same wrapper in `#releaseAdmittedFiles` before `runtime_close`. A failed retry remains on the runtime, and the tree walk does not start while the file is still owned. `treeReleased` is set only after the root directory handle is released, so a later close resumes with the parent handles. Once a Windows owned process has observed settlement and ended its local streams, `#releasePending` stays set until `process_close` returns. Later cleanup calls that close again and does not kill or poll. `execFileOutput` documents that settlement waits for the pipes it created. The Darwin helper removes its scratch root only after that settlement and does not signal processes it did not launch. The inherited-pipe regression does not signal a descendant after settlement, and on an earlier failure it signals only a command line that still contains that test's path. 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 - Semantic owner and earliest changed stage: `Handle` in `native/windows/src/authority.hpp` owns close. `WindowsPrivateRuntime` owns admitted file wrappers whose close failed and the runtime's released-tree stage. `WindowsOwnedProcess` owns the close-only retry after settlement. `execFileOutput` owns settlement of the pipes it created. Scratch removal stays with the Darwin helper after that settlement. - Contribution scope fit and linked maintainer decision: not applicable. This stays inside existing Windows handle ownership and stoppable-command settlement. It does not add target execution, injection, mutation, or protection recovery. - CLI and MCP/tool-catalog contract: none. - Provider, bridge, target-format, or platform compatibility: Windows native close failures now surface as the existing `Failure` (constraint, path, Win32 code) and keep the owner open. Sharing-lock retries 32/33 are unchanged. A repeated native close of a value whose `CloseHandle` already failed does not call `CloseHandle` again. - Evidence, artifact, provenance, or reconstruction contract: a snapshot digest remains the byte outcome when source-handle close fails. The unresolved handles stay on the runtime. Pipe settlement is not recorded as process-family completion. - Target selection, authority, upstream behavior, and cleanup details (if applicable): no new process-group or descendant signals. Non-inherited compiler children are still not owned. Job-object kill-on-close is unchanged. A failed close keeps the numeric value until a probe says it is gone, and does not close it again. Failed admitted-file closes are retried on the same wrapper before runtime removal. A released runtime root is not walked again. A settled process is not killed again in order to finish handle close. - 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. - [ ] 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: `src/windows/WindowsHandleClose.test.ts` compiles `native/windows/src/handle_close_test.cc` with injected close and liveness results, including that an open probe after a failed close does not close again. `src/windows/WindowsPrivateRuntime.test.ts` keeps a failed admitted-file close and retries that wrapper before `runtime_close`, and it refuses the tree walk while that close is still failing. `src/windows/WindowsOwnedProcess.test.ts` expects a failed process close to be retried with `process_close` only. `src/process/ExecFileOutput.test.ts` spawns an inherited-pipe descendant that outlives the stop grace and records whether its scratch directory still exists, and it does not signal that descendant after settlement. - Base reproduction or other evidence: on current `main`, `Handle::reset` ignored `CloseHandle`'s result and replaced the value. `readFile` dropped the file wrapper after a failed close. Process cleanup retried a partial close through kill and poll. PR #5587's reader destruction is absent from `main` (`mergedAt` null). The inherited-pipe test deletes scratch only after `execFileOutput` settles; the descendant writes `scratchExists: true` and the helper rejects `ETIMEDOUT` / `killed: true`. Destroying readers at the grace period would delete scratch before that write. - User-visible CLI/MCP output (if applicable): none. - Remaining proof gaps: `CloseHandle` and `GetHandleInformation` were not executed. MinGW was not installed, so the Windows addon was not cross-built. Real Windows runtime behavior is unverified. The pipe regression ran on Linux only; Swift and macOS were not rerun. A descendant that does not inherit the helper pipes is still outside this owner. The runtime parent-resume path is source-derived; it has no Windows execution. For evidence-bearing changes: - [x] Observed, derived, and inferred claims remain distinguishable. - [x] Artifact identity, source provenance, and failed attempts remain preserved. - [x] Unsupported, incomplete, unavailable, or uncertain outcomes remain visible. ## Validation performed - `g++ -std=c++17 -Wall -Wextra -Werror -I native/windows/src native/windows/src/handle_close_test.cc -o /tmp/handle-close-test && /tmp/handle-close-test` — exit 0, including after the close-block change. - `npm run test:local -- src/windows/WindowsHandleClose.test.ts src/process/ExecFileOutput.test.ts` — 2 files, 32 tests passed (Node v24.18.0). The inherited-pipe case passed in about 7s with `scratchExists: true`. - `npm run test:local -- src/windows/WindowsHandleClose.test.ts` — passed again after the close-block change. - `npm run test:local -- src/windows/WindowsPrivateRuntime.test.ts` — 13 tests passed, including the retained file-close retry. - `npm run test:local -- src/windows/WindowsOwnedProcess.test.ts src/process/ExecFileOutput.test.ts` — 51 tests passed after the close-resume and descendant-signal changes. The inherited-pipe case passed again. - `npm run verify:test-discovery` — discovered all 1881 test files exactly once. - `npm run check:fast` — typecheck and lint succeeded. The close-block commit did not change TypeScript, and the cached check passed. - `npm run format:check` — all matched files use the correct format before the later commits; `oxfmt` was run on the TypeScript files changed after that. - `npx oxlint` on the touched TypeScript files — no new errors. Existing `DarwinProcessRunTokenReader.ts` size warnings and the pre-existing `WindowsOwnedProcess` parameter-count warning remain. ## Compatibility, safety, and release - Breaking changes or migration steps: none. Callers that treated a failed native close as success now receive the Win32 failure and must retry the same owner. The numeric value is not replaced, and a later close does not call `CloseHandle` on it again. - Real Hopper/Ghidra, browser, or OS coverage: no Hopper, Ghidra, browser, or Windows OS run. Linux covered the inherited-pipe ordering, the owned-process close retry, and the injected close decision. - Package or release metadata impact: none. - Security, privacy, process, or containment review: failed closes no longer forget a live kernel object and no longer close a number that a later probe merely says is open. Terminal invalidity does not call `CloseHandle` again. No broader process-tree authority was added. An unconfirmed number that cannot be recorded is left open until process exit rather than closed. A failed admitted-file close stays on the runtime that opened it. The inherited-pipe test does not signal a process after settlement or a PID whose command line is no longer that descendant. ## Author readiness Human owner: @morluto - [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 - [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. - [ ] User-visible CLI/MCP changes include representative output. - [x] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. <!-- CURSOR_AGENT_PR_BODY_END --> <div><a href="https://cursor.com/agents/bc-0dc694ee-816d-5a6e-bcf4-a9fc97b1829e?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a href="https://cursor.com/background-agent?bcId=bc-0dc694ee-816d-5a6e-bcf4-a9fc97b1829e&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-11-01 21:44:58 +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#7049
No description provided.