[PR #6299] [MERGED] feat(captures): make the HAR/SAZ/qlog decoder heap configurable #7267

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

📋 Pull Request Information

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

Base: main ← Head: cursor/capture-decoder-heap-d806


📝 Commits (3)

  • 6bb21c6 feat(captures): make the HAR/SAZ/qlog decoder heap configurable
  • 0353b89 fix(captures): defer decoder startup and share one parsed heap
  • 89e913c merge(main): keep capture decoder and regex worker heap settings

📊 Changes

21 files changed (+634 additions, -56 deletions)

View changed files

📝 .agents/skills/reverse-engineer-anything/SKILL.md (+4 -1)
📝 docs/web-network-captures.md (+20 -8)
📝 src/application/Doctor.test.ts (+1 -0)
📝 src/application/SetupRegistrationEnvironment.ts (+1 -0)
📝 src/browser/history/CaptureFailures.test.ts (+10 -3)
📝 src/browser/history/CaptureFailures.ts (+23 -9)
📝 src/browser/history/CaptureRelease.ts (+20 -5)
📝 src/browser/history/HistoricalCaptureDecoder.ts (+77 -12)
📝 src/browser/history/HistoricalCaptureFormatAdapter.ts (+6 -0)
📝 src/browser/history/NodeCaptureAdapter.test.ts (+1 -1)
📝 src/browser/history/NodeCaptureAdapter.ts (+30 -9)
📝 src/cli/webNetworkCaptureCommands.ts (+1 -1)
📝 src/composition/webNetworkCaptures.ts (+8 -5)
➕ src/config/captureDecoderHeap.test.ts (+260 -0)
➕ src/config/captureDecoderHeap.ts (+105 -0)
📝 src/config/environment.ts (+3 -0)
📝 src/setupEnvironment.test.ts (+2 -0)
📝 tests/acceptance/setup/registrationRuntimeEnvironmentCli.test.ts (+5 -0)
📝 tests/acceptance/tools/historicalCaptureResources.test.ts (+24 -2)
➕ tests/boundary/cli/captureDecoderHeapDoctor.test.ts (+28 -0)

...and 1 more files

📄 Description

Summary

Part of #6176.

HAR, SAZ, and qlog decoding used a fixed 192 MiB Node old-generation heap and told operators that inherited NODE_OPTIONS could not raise it. REA_CAPTURE_DECODER_OLD_GENERATION_MIB keeps that 192 MiB default and lets the process that starts REA choose another value inside a documented floor and maximum.

Problem and expected behavior

Operators with large captures could not raise the owned decoder heap. Host memory and NODE_OPTIONS do not, because the decoder passes --max-old-space-size itself and removes inherited NODE_OPTIONS.

Unset behavior stays 192 MiB. A value from 8 to 16384 MiB is the effective old generation. Any other value fails configuration and names REA_CAPTURE_DECODER_OLD_GENERATION_MIB. It does not fall back to 192. Doctor reports that failure as runtime-configuration:REA_CAPTURE_DECODER_OLD_GENERATION_MIB and still prints its JSON report. rea doctor and help do not construct the capture service. The inspect command and MCP server composition do, and they refuse an invalid value. Setup copies a caller-selected value through SELECTED_REGISTRATION_SETTINGS.

Recovery, capability, and limitation text name the setting, the effective mebibytes, the source (default or setting), the default, the floor, the maximum, and how to change it. That text uses the heap the selected Node adapter launches. The 8 MiB semi-space stays fixed. The 32 MiB input, 96 MiB reply, and 64-level nesting budgets stay fixed.

Change and scope

src/config/captureDecoderHeap.ts is the only parser. Startup (parseEnvironment / parseConfig), doctor, and setup registration use that schema. createWebNetworkCaptureService resolves the environment once and passes that parsed heap to each NodeCaptureAdapter. HistoricalCaptureDecoder reuses an agreeing adapter heap and reports the selected adapter's heap. The adapter passes the effective value as --max-old-space-size. On Windows under Bun, the Job Object commit limit follows that value plus the existing 512 MiB reserve.

CLI registration builds the capture service only when inspect-web-network-capture runs. MCP server composition still builds it at startup.

The floor is 8 MiB because the decoder also passes --max-semi-space-size=8, and a smaller old generation aborts Node during isolate startup instead of enforcing a limit. The maximum is 16384 MiB, the same ceiling REA already uses for one isolated JavaScript analysis worker. Node will start with a larger flag; this maximum is REA's refusal.

This branch now includes main through #6301. REA_REGEX_WORKER_HEAP_REQUEST_MIB stays main's setting. Both settings remain in SELECTED_REGISTRATION_SETTINGS, the environment schema, and the shared doctor, setup, and client-configuration tests.

Follow the contribution scope.
This is configuration of an existing offline decoder admission. It does not add a provider or a capability that executes, injects, mutates, or recovers a target. Maintainer scope decision: not applicable. The product decision to make this ceiling a setting is recorded in #6176.

Contract and boundary impact

  • Semantic owner and earliest changed stage: captureDecoderHeap.ts parses the setting. createWebNetworkCaptureService resolves it once. NodeCaptureAdapter stores that fact and applies it when the decoder process is launched. Reports read the selected adapter's fact.
  • Contribution scope fit and linked maintainer decision: ordinary configuration inside the existing capture decoder. Not applicable.
  • CLI and MCP/tool-catalog contract: no new tool arguments. An invalid value no longer throws during CLI registration. Memory failures and capture limitations name the setting and the effective heap. Tool catalog text is unchanged.
  • Provider, bridge, target-format, or platform compatibility: Node enforces the V8 flag. Bun still ignores it. Windows Bun commit limit follows the configured mebibytes. Other Bun hosts still have no decoder heap limit.
  • Evidence, artifact, provenance, or reconstruction contract: memory-failure details add old_generation_heap_source. Capture identity and the original file are unchanged.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): the decoder still only reads the selected capture and still removes its private runtime. No target mutation.
  • 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): skill guidance names the setting. No package or catalog source change.

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/config/captureDecoderHeap.test.ts locks the default, a 256 MiB override, the command line, invalid values at startup, parseConfig, adapter construction, and service composition. It also locks a parsed heap passed through without re-reading a conflicting environment, and a decoder whose HAR adapter is 256 MiB and whose SAZ adapter is 512 MiB while the decoder environment is empty: limitations and the exhaustion report say 256 MiB, source setting. tests/boundary/cli/captureDecoderHeapDoctor.test.ts runs compiled doctor --json with the setting 7. Doctor, setup registration, and client-configuration tests cover the same invalid and selected values, and after the main merge they also keep the regex worker heap cases. tests/acceptance/tools/historicalCaptureResources.test.ts covers a real HAR exhaustion and a successful small capture. NodeCaptureAdapter.test.ts mocks captureDecoderProcessMemoryLimitBytes to return null.
  • Base reproduction or other evidence: before this change the heap was the constant 192 and failure text said inherited NODE_OPTIONS could not raise it. CLI registration also threw on an invalid value before doctor could report it. The new tests fail if the setting is ignored, an invalid value falls back to 192, doctor fails before printing JSON, or a report uses a heap other than the one the selected adapter launches.
  • User-visible CLI/MCP output (if applicable): a real HAR exhaustion on this Linux Node host returned resource_constraint with message The har decoder exhausted its 192 MiB V8 old-generation heap (source default) and remediation beginning The effective REA_CAPTURE_DECODER_OLD_GENERATION_MIB value is 192 MiB (source default; default 192 MiB, floor 8 MiB, maximum 16384 MiB). Set REA_CAPTURE_DECODER_OLD_GENERATION_MIB in the environment that starts REA to a decimal integer from 8 to 16384, then restart REA. The successful two-record capture limitations contain that same sentence. CLI --json for the exhaustion contains the setting name and source default. doctor --json with the setting 7 exits 1, writes no stderr, and includes runtime-configuration:REA_CAPTURE_DECODER_OLD_GENERATION_MIB with classification config_drift.
  • Remaining proof gaps: Windows Bun Job Object behavior was not executed here. The commit-limit formula is the existing javaScriptWorkerMemoryLimitBytes helper applied to the resolved mebibytes. A heap above 192 MiB was checked on the command line and in projected failures, not by exhausting a 256 MiB decoder. The unavailable-bound refusal is covered by mocking the helper, not by running Bun on Windows.

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

On merge commit 89e913c30 (main parent 9512a8080, previous PR head 0353b89ae):

  • npm run check:fast — passed (typecheck and lint, 2 tasks successful).
  • npm run format:check — passed.
  • npm run test:local -- src/config/captureDecoderHeap.test.ts src/browser/history/CaptureFailures.test.ts src/browser/history/NodeCaptureAdapter.test.ts src/application/Doctor.test.ts src/setupEnvironment.test.ts — passed, 104 tests.
  • npm run test:focused -- tests/boundary/cli/captureDecoderHeapDoctor.test.ts tests/boundary/browser/historicalCaptureDecoder.test.ts tests/acceptance/tools/historicalCaptureResources.test.ts tests/boundary/filesystem/clientConfigurationEnvironment.test.ts tests/acceptance/setup/registrationRuntimeEnvironmentCli.test.ts — passed, 71 tests with 11 skipped (24 decoder boundary, 1 CLI doctor, 1 HAR acceptance, 40 client-configuration with 10 skipped, 16 registration with 1 skipped).
  • Real Hopper, Ghidra, browser, or other provider workflows were not required. The HAR decoder path and doctor --json ran on Node.js v22.23.4 on Linux.

Compatibility, safety, and release

  • Breaking changes or migration steps: none. An unset variable keeps 192 MiB. A value outside 8 to 16384 MiB, or a non-decimal value, is a configuration error. CLI help and doctor no longer throw while registering the inspect command.
  • Real Hopper/Ghidra, browser, or OS coverage: Linux Node HAR decoder exhaustion, a successful small capture, and doctor with an invalid heap setting. Windows Bun was not run.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: the setting only raises or lowers this owned decoder's old generation, and 16384 MiB is the hard maximum. It does not grant target authority. The decoder still deletes inherited NODE_OPTIONS before launch.

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/6299 **Author:** [@morluto](https://github.com/morluto) **Created:** 10/22/2026 **Status:** ✅ Merged **Merged:** 10/22/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `cursor/capture-decoder-heap-d806` --- ### 📝 Commits (3) - [`6bb21c6`](https://github.com/morluto/rea/commit/6bb21c64ecd52f12c62a42b503ccc7e3cd932c33) feat(captures): make the HAR/SAZ/qlog decoder heap configurable - [`0353b89`](https://github.com/morluto/rea/commit/0353b89aeab153a6bf092f3e6411e98c84eef8b2) fix(captures): defer decoder startup and share one parsed heap - [`89e913c`](https://github.com/morluto/rea/commit/89e913c30b4b3792195fd6194afdbaaf5ff43228) merge(main): keep capture decoder and regex worker heap settings ### 📊 Changes **21 files changed** (+634 additions, -56 deletions) <details> <summary>View changed files</summary> 📝 `.agents/skills/reverse-engineer-anything/SKILL.md` (+4 -1) 📝 `docs/web-network-captures.md` (+20 -8) 📝 `src/application/Doctor.test.ts` (+1 -0) 📝 `src/application/SetupRegistrationEnvironment.ts` (+1 -0) 📝 `src/browser/history/CaptureFailures.test.ts` (+10 -3) 📝 `src/browser/history/CaptureFailures.ts` (+23 -9) 📝 `src/browser/history/CaptureRelease.ts` (+20 -5) 📝 `src/browser/history/HistoricalCaptureDecoder.ts` (+77 -12) 📝 `src/browser/history/HistoricalCaptureFormatAdapter.ts` (+6 -0) 📝 `src/browser/history/NodeCaptureAdapter.test.ts` (+1 -1) 📝 `src/browser/history/NodeCaptureAdapter.ts` (+30 -9) 📝 `src/cli/webNetworkCaptureCommands.ts` (+1 -1) 📝 `src/composition/webNetworkCaptures.ts` (+8 -5) ➕ `src/config/captureDecoderHeap.test.ts` (+260 -0) ➕ `src/config/captureDecoderHeap.ts` (+105 -0) 📝 `src/config/environment.ts` (+3 -0) 📝 `src/setupEnvironment.test.ts` (+2 -0) 📝 `tests/acceptance/setup/registrationRuntimeEnvironmentCli.test.ts` (+5 -0) 📝 `tests/acceptance/tools/historicalCaptureResources.test.ts` (+24 -2) ➕ `tests/boundary/cli/captureDecoderHeapDoctor.test.ts` (+28 -0) _...and 1 more files_ </details> ### 📄 Description <!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Summary Part of #6176. HAR, SAZ, and qlog decoding used a fixed 192 MiB Node old-generation heap and told operators that inherited `NODE_OPTIONS` could not raise it. `REA_CAPTURE_DECODER_OLD_GENERATION_MIB` keeps that 192 MiB default and lets the process that starts REA choose another value inside a documented floor and maximum. ## Problem and expected behavior Operators with large captures could not raise the owned decoder heap. Host memory and `NODE_OPTIONS` do not, because the decoder passes `--max-old-space-size` itself and removes inherited `NODE_OPTIONS`. Unset behavior stays 192 MiB. A value from 8 to 16384 MiB is the effective old generation. Any other value fails configuration and names `REA_CAPTURE_DECODER_OLD_GENERATION_MIB`. It does not fall back to 192. Doctor reports that failure as `runtime-configuration:REA_CAPTURE_DECODER_OLD_GENERATION_MIB` and still prints its JSON report. `rea doctor` and help do not construct the capture service. The inspect command and MCP server composition do, and they refuse an invalid value. Setup copies a caller-selected value through `SELECTED_REGISTRATION_SETTINGS`. Recovery, capability, and limitation text name the setting, the effective mebibytes, the source (`default` or `setting`), the default, the floor, the maximum, and how to change it. That text uses the heap the selected Node adapter launches. The 8 MiB semi-space stays fixed. The 32 MiB input, 96 MiB reply, and 64-level nesting budgets stay fixed. ## Change and scope `src/config/captureDecoderHeap.ts` is the only parser. Startup (`parseEnvironment` / `parseConfig`), doctor, and setup registration use that schema. `createWebNetworkCaptureService` resolves the environment once and passes that parsed heap to each `NodeCaptureAdapter`. `HistoricalCaptureDecoder` reuses an agreeing adapter heap and reports the selected adapter's heap. The adapter passes the effective value as `--max-old-space-size`. On Windows under Bun, the Job Object commit limit follows that value plus the existing 512 MiB reserve. CLI registration builds the capture service only when `inspect-web-network-capture` runs. MCP server composition still builds it at startup. The floor is 8 MiB because the decoder also passes `--max-semi-space-size=8`, and a smaller old generation aborts Node during isolate startup instead of enforcing a limit. The maximum is 16384 MiB, the same ceiling REA already uses for one isolated JavaScript analysis worker. Node will start with a larger flag; this maximum is REA's refusal. This branch now includes `main` through #6301. `REA_REGEX_WORKER_HEAP_REQUEST_MIB` stays main's setting. Both settings remain in `SELECTED_REGISTRATION_SETTINGS`, the environment schema, and the shared doctor, setup, and client-configuration tests. Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). This is configuration of an existing offline decoder admission. It does not add a provider or a capability that executes, injects, mutates, or recovers a target. Maintainer scope decision: not applicable. The product decision to make this ceiling a setting is recorded in #6176. ## Contract and boundary impact - Semantic owner and earliest changed stage: `captureDecoderHeap.ts` parses the setting. `createWebNetworkCaptureService` resolves it once. `NodeCaptureAdapter` stores that fact and applies it when the decoder process is launched. Reports read the selected adapter's fact. - Contribution scope fit and linked maintainer decision: ordinary configuration inside the existing capture decoder. Not applicable. - CLI and MCP/tool-catalog contract: no new tool arguments. An invalid value no longer throws during CLI registration. Memory failures and capture limitations name the setting and the effective heap. Tool catalog text is unchanged. - Provider, bridge, target-format, or platform compatibility: Node enforces the V8 flag. Bun still ignores it. Windows Bun commit limit follows the configured mebibytes. Other Bun hosts still have no decoder heap limit. - Evidence, artifact, provenance, or reconstruction contract: memory-failure details add `old_generation_heap_source`. Capture identity and the original file are unchanged. - Target selection, authority, upstream behavior, and cleanup details (if applicable): the decoder still only reads the selected capture and still removes its private runtime. No target mutation. - 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): skill guidance names the setting. No package or catalog source change. 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. - [ ] 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/config/captureDecoderHeap.test.ts` locks the default, a 256 MiB override, the command line, invalid values at startup, `parseConfig`, adapter construction, and service composition. It also locks a parsed heap passed through without re-reading a conflicting environment, and a decoder whose HAR adapter is 256 MiB and whose SAZ adapter is 512 MiB while the decoder environment is empty: limitations and the exhaustion report say 256 MiB, source setting. `tests/boundary/cli/captureDecoderHeapDoctor.test.ts` runs compiled `doctor --json` with the setting `7`. Doctor, setup registration, and client-configuration tests cover the same invalid and selected values, and after the main merge they also keep the regex worker heap cases. `tests/acceptance/tools/historicalCaptureResources.test.ts` covers a real HAR exhaustion and a successful small capture. `NodeCaptureAdapter.test.ts` mocks `captureDecoderProcessMemoryLimitBytes` to return null. - Base reproduction or other evidence: before this change the heap was the constant 192 and failure text said inherited `NODE_OPTIONS` could not raise it. CLI registration also threw on an invalid value before doctor could report it. The new tests fail if the setting is ignored, an invalid value falls back to 192, doctor fails before printing JSON, or a report uses a heap other than the one the selected adapter launches. - User-visible CLI/MCP output (if applicable): a real HAR exhaustion on this Linux Node host returned `resource_constraint` with message `The har decoder exhausted its 192 MiB V8 old-generation heap (source default)` and remediation beginning `The effective REA_CAPTURE_DECODER_OLD_GENERATION_MIB value is 192 MiB (source default; default 192 MiB, floor 8 MiB, maximum 16384 MiB). Set REA_CAPTURE_DECODER_OLD_GENERATION_MIB in the environment that starts REA to a decimal integer from 8 to 16384, then restart REA.` The successful two-record capture limitations contain that same sentence. CLI `--json` for the exhaustion contains the setting name and `source default`. `doctor --json` with the setting `7` exits 1, writes no stderr, and includes `runtime-configuration:REA_CAPTURE_DECODER_OLD_GENERATION_MIB` with `classification` `config_drift`. - Remaining proof gaps: Windows Bun Job Object behavior was not executed here. The commit-limit formula is the existing `javaScriptWorkerMemoryLimitBytes` helper applied to the resolved mebibytes. A heap above 192 MiB was checked on the command line and in projected failures, not by exhausting a 256 MiB decoder. The unavailable-bound refusal is covered by mocking the helper, not by running Bun on Windows. 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 On merge commit `89e913c30` (`main` parent `9512a8080`, previous PR head `0353b89ae`): - `npm run check:fast` — passed (typecheck and lint, 2 tasks successful). - `npm run format:check` — passed. - `npm run test:local -- src/config/captureDecoderHeap.test.ts src/browser/history/CaptureFailures.test.ts src/browser/history/NodeCaptureAdapter.test.ts src/application/Doctor.test.ts src/setupEnvironment.test.ts` — passed, 104 tests. - `npm run test:focused -- tests/boundary/cli/captureDecoderHeapDoctor.test.ts tests/boundary/browser/historicalCaptureDecoder.test.ts tests/acceptance/tools/historicalCaptureResources.test.ts tests/boundary/filesystem/clientConfigurationEnvironment.test.ts tests/acceptance/setup/registrationRuntimeEnvironmentCli.test.ts` — passed, 71 tests with 11 skipped (24 decoder boundary, 1 CLI doctor, 1 HAR acceptance, 40 client-configuration with 10 skipped, 16 registration with 1 skipped). - Real Hopper, Ghidra, browser, or other provider workflows were not required. The HAR decoder path and `doctor --json` ran on Node.js v22.23.4 on Linux. ## Compatibility, safety, and release - Breaking changes or migration steps: none. An unset variable keeps 192 MiB. A value outside 8 to 16384 MiB, or a non-decimal value, is a configuration error. CLI help and doctor no longer throw while registering the inspect command. - Real Hopper/Ghidra, browser, or OS coverage: Linux Node HAR decoder exhaustion, a successful small capture, and doctor with an invalid heap setting. Windows Bun was not run. - Package or release metadata impact: none. - Security, privacy, process, or containment review: the setting only raises or lowers this owned decoder's old generation, and 16384 MiB is the hard maximum. It does not grant target authority. The decoder still deletes inherited `NODE_OPTIONS` before launch. ## 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. - [x] 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-d912cecc-68c2-58d9-95b2-4a200e86d806?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-d912cecc-68c2-58d9-95b2-4a200e86d806&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:46:36 +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#7267
No description provided.