[PR #7133] fix(browser): report an out-of-range generated position as a selection fault #7665

Open
opened 2026-11-03 13:39:29 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/7133
Author: @amyanger
Created: 10/25/2026
Status: 🔄 Open

Base: main ← Head: fix/web-source-position-out-of-range


📝 Commits (1)

  • 0255065 fix(browser): report an out-of-range generated position as a selection fault

📊 Changes

5 files changed (+195 additions, -27 deletions)

View changed files

📝 src/application/WebSourceLocationService.test.ts (+47 -0)
📝 src/application/WebSourceLocationService.ts (+33 -16)
📝 src/domain/webSourcePosition.test.ts (+56 -1)
📝 src/domain/webSourcePosition.ts (+31 -9)
📝 tests/acceptance/webSourceLocationCli.test.ts (+28 -1)

📄 Description

Summary

trace_web_source_location (CLI trace-web-source-location) reported a well-formed generated_position past the end of the selected script as an invalid_format issue on ["generated_position"], with no bounds. It now reports an out_of_range issue on the coordinate that is past the end, ["generated_position","line"] or ["generated_position","column"], with minimum and maximum, as #6979 did for script_index and #7067 did for record_ordinals.

Fixes #7132

Problem and expected behavior

Smallest trigger: a manifest whose selected script is the one-line text generated, and generated_position {line: 2, column: 0} or {line: 1, column: 999}. Both are valid integers inside the input schema, so the request is well formed; the coordinate is only outside the retained script. invalid_format tells the caller its input is malformed and gives no valid range. Expected: the same caller-selection fault shape the two precedents use, naming the coordinate and its bounds.

Change and scope

  • src/domain/webSourcePosition.ts: the existing line scan now lives in resolveWebSourcePosition, which returns {offset} for a position inside the text, {field, maximum} naming the coordinate past the end, or undefined for coordinates that are not valid integers. webSourceOffset keeps its signature and returns the offset from that result, so its other caller (TraceSourceMap.ts) is unchanged. One scan computes both the offset and the bound, so a rejected position does not rescan the text and the two answers cannot disagree on line terminators.
  • src/application/WebSourceLocationService.ts: a new admitGeneratedOffset helper builds the out_of_range issue inline, as WebNetworkCaptureService.ts and LocalWebScriptArtifacts.ts do. Line bounds are 1 to the last line. Column bounds are 0 to that line's UTF-16 length. The message names the value and the bound, for example No line 2; the retained script ends at line 1 (one-based lines). Since ccdeda7a2 and b4b5c37ab, main checks the position in trace after verifyPairing and wraps failures in incomplete(...) so partial_observation is retained. The helper is called at that same point and its error goes through incomplete(...) too, so the new issue keeps partial_observation. The undefined case keeps the previous invalid_format issue through the file's invalid() helper; the input schema (z.int().min(1) / z.int().min(0)) rejects those coordinates before this point.
  • Not included: TraceSourceMap.ts reports out-of-range original positions as a recorded result (outside-embedded-text), not an input error, so it is left alone.

Contribution scope: ordinary fix within an existing boundary; maintainer scope decision not applicable.

Contract and boundary impact

  • Semantic owner and earliest changed stage: WebSourceLocationService.trace (admitGeneratedOffset), after artifact acquisition and the pairing check, before decoding. Consumers are the CLI and MCP error projections, which pass path, reason, minimum and maximum through unchanged.
  • Contribution scope fit and linked maintainer decision: not applicable.
  • CLI and MCP/tool-catalog contract: the input issue for this one rejection changes from invalid_format on ["generated_position"] to out_of_range on ["generated_position","line" | "column"] with bounds. The error code stays invalid_request and the exit code stays 1. No advertised schema changes.
  • Provider, bridge, target-format, or platform compatibility: none.
  • Evidence, artifact, provenance, or reconstruction contract: none. Successful results, Evidence and normalized_result are unchanged.
  • Target selection, authority, upstream behavior, and cleanup details: not applicable.
  • Generated metadata, package, or installation impact: none.

Expected effects:

  • 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:
    • tests/acceptance/webSourceLocationCli.test.ts: the existing CLI out-of-range case now asserts out_of_range on ["generated_position","line"] with minimum: 1, maximum: 1, and a new stdio MCP call asserts out_of_range on ["generated_position","column"] with maximum equal to the script length.
    • src/application/WebSourceLocationService.test.ts: line past the end, column past the end of a CRLF-terminated line, and column past the end of the last line, with bounds and messages.
    • src/domain/webSourcePosition.test.ts: resolveWebSourcePosition bounds for empty text, a trailing CRLF, lone CR, U+2028/U+2029 and a surrogate pair, and undefined for invalid coordinates. The existing webSourceOffset tests are unchanged and pass.
  • Base reproduction (executed, macOS arm64, Node 24.22.1, built CLI at fc43e285e): with the acceptance fixture's manifest, script and map, trace-web-source-location ... 1 0 --json exits 0 with generated_offset: 0; ... 2 0 --json and ... 1 999 --json exit 1 with {"path":["generated_position"],"reason":"invalid_format","message":"Selected generated position is outside the retained script text (one-based lines; zero-based UTF-16 columns)."}.
  • Final tests against base code: npm run test:focused -- src/domain/webSourcePosition.test.ts src/application/WebSourceLocationService.test.ts tests/acceptance/webSourceLocationCli.test.ts with the branch's test files on fc43e285e: 15 failed. 11 are the new domain cases (resolveWebSourcePosition does not exist on base), 3 are the service out-of-range cases (received invalid_format on ["generated_position"]), and 1 is the acceptance test.
  • User-visible CLI/MCP output (branch, same fixture):
    {"code":"invalid_request","issues":[{"path":["generated_position","line"],"reason":"out_of_range","message":"No line 2; the retained script ends at line 1 (one-based lines).","minimum":1,"maximum":1}]}
    {"code":"invalid_request","issues":[{"path":["generated_position","column"],"reason":"out_of_range","message":"No column 999 on line 1; it ends at column 9 (zero-based UTF-16 columns).","minimum":0,"maximum":9}]}
    
    (code and details.issues from --json, other fields trimmed.)
  • Mutation check (executed): 11 one-line mutants of the final diff, each run with npm run test:local -- src/domain/webSourcePosition.test.ts src/application/WebSourceLocationService.test.ts. Every mutant failed at least one test: exclusive column end, column maximum +1, line maximum -1, last line skipped, webSourceOffset dropping the offset, CRLF counted as two breaks, minimum always 0, reason reverted to invalid_format, path without the coordinate, line and column messages swapped, and invalid coordinates given a limit.
  • Review: an independent adversarial review differentially compared the bound with webSourceOffset over more than 1000 rejected positions built from empty text, CR, LF, CRLF, U+2028/U+2029 and surrogate pairs. For each, the reported maximum was accepted and maximum + 1 was rejected. It found no consumer, doc, fixture or golden depending on the old issue shape; the one assertion on the old path is updated here. A /code-review pass found no correctness bug and flagged that a first version scanned the text twice through two copies of the line loop; that is why the scan is shared in this version. A second adversarial review of the final diff compared base's webSourceOffset with the new wrapper over 400,000 random inputs (texts of CR, LF, U+2028/U+2029, lone surrogate halves, U+0085, VT and FF; positions including -1, -0, 1.5, NaN, Infinity, 2^53 and non-numbers) and found no difference in any result. It also confirmed the reported bounds are tight on those inputs.
  • Remaining proof gaps: no real browser capture was used. The tool reads a caller-selected manifest, script and map from disk and does not launch a browser, so the CLI and stdio MCP runs above exercise the real path. Linux and Windows were not run locally; the change has no platform-specific code.

Boundary regressions covered: input issue path, reason and bounds for a caller selection fault through CLI and MCP. Lifecycle regressions: not applicable; no resource ownership changes.

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

Ported onto main 570abe95f on 2026-10-27, after ccdeda7a2 and b4b5c37ab restructured this code and made the PR conflict. Main CI is red on that commit for reasons outside this diff. Runs on the ported commit:

  • npm run test:focused -- src/application/WebSourceLocationService.test.ts src/domain/webSourcePosition.test.ts tests/acceptance/webSourceLocationCli.test.ts: 42 passed. The acceptance case asserts the out_of_range issue together with main's partial_observation.
  • npm run check:fast: passed
  • npm run test:changed -- --base 570abe95f: 11 files, 114 tests passed
  • npm run check: only knip failed, on unused exports in javascriptStaticAnalysisHelpers.ts, androidJniLibraryFacts.ts, androidManifestComponents.ts and objcSwiftMetadata.ts. npm run knip on clean 570abe95f prints the same four entries and exits 1. The other five tasks passed.
  • Mutation check on the ported helper (executed): reason reverted to invalid_format, path without the coordinate and minimum always 0 each fail src/application/WebSourceLocationService.test.ts. An offset off by one fails tests/acceptance/webSourceLocationCli.test.ts (generated_offset 1 instead of 0).
  • /code-review (high) on the ported commit: no correctness bug. It flagged seven cleanup and test-quality items, none of them new to the port. The resolved === undefined branch cannot run because the input schema rejects those coordinates first; it keeps the previous invalid_format issue rather than inventing a new one. webSourceOffset stays as a wrapper so TraceSourceMap.ts is unchanged. The minimum ternary, the hand-built AnalysisInputError next to invalid(), service-test fixture plumbing, overlap between service and domain tests, and the acceptance maximum: fixture.source.length tied to a one-line ASCII fixture are left as they are to keep this port the same change that was reviewed before. I can fold any of them in if a maintainer prefers.

Runs on the original version of this PR, before the port:

  • npm run test:focused -- src/domain/webSourcePosition.test.ts src/application/WebSourceLocationService.test.ts tests/acceptance/webSourceLocationCli.test.ts src/javascript/sourceMaps/TraceSourceMap.test.ts: 71 passed
  • npm run check:fast: exit 0
  • npm run test:changed -- --base fc43e285eaae2155d32e2ca0ab5d2181a4e2f1b5: 10 files, 103 tests passed
  • npm run check: exit 0. The only diagnostic in a touched file is the existing max-lines-per-function warning on WebSourceLocationService.trace, which this diff does not change.
  • npm run verify:test-discovery: discovered all 2485 test files exactly once
  • Built CLI reproduction on base and branch: results above

Compatibility, safety, and release

  • Breaking changes or migration steps: none. The error code and exit status are unchanged; only the issue reason, path and bounds for this rejection become more specific, as in #6979 and #7067, which shipped as fix.
  • Real Hopper/Ghidra, browser, or OS coverage: macOS arm64 only. No browser is involved in this tool.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: no new reads, processes or network access. The message contains only the caller's coordinates and line or column counts, not script text.

Author readiness

Human owner: @amyanger

  • 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/7133 **Author:** [@amyanger](https://github.com/amyanger) **Created:** 10/25/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `fix/web-source-position-out-of-range` --- ### 📝 Commits (1) - [`0255065`](https://github.com/morluto/rea/commit/025506586a116fa715f395c4d54402eb1ed7e5d1) fix(browser): report an out-of-range generated position as a selection fault ### 📊 Changes **5 files changed** (+195 additions, -27 deletions) <details> <summary>View changed files</summary> 📝 `src/application/WebSourceLocationService.test.ts` (+47 -0) 📝 `src/application/WebSourceLocationService.ts` (+33 -16) 📝 `src/domain/webSourcePosition.test.ts` (+56 -1) 📝 `src/domain/webSourcePosition.ts` (+31 -9) 📝 `tests/acceptance/webSourceLocationCli.test.ts` (+28 -1) </details> ### 📄 Description ## Summary `trace_web_source_location` (CLI `trace-web-source-location`) reported a well-formed `generated_position` past the end of the selected script as an `invalid_format` issue on `["generated_position"]`, with no bounds. It now reports an `out_of_range` issue on the coordinate that is past the end, `["generated_position","line"]` or `["generated_position","column"]`, with `minimum` and `maximum`, as #6979 did for `script_index` and #7067 did for `record_ordinals`. Fixes #7132 ## Problem and expected behavior Smallest trigger: a manifest whose selected script is the one-line text `generated`, and `generated_position` `{line: 2, column: 0}` or `{line: 1, column: 999}`. Both are valid integers inside the input schema, so the request is well formed; the coordinate is only outside the retained script. `invalid_format` tells the caller its input is malformed and gives no valid range. Expected: the same caller-selection fault shape the two precedents use, naming the coordinate and its bounds. ## Change and scope - `src/domain/webSourcePosition.ts`: the existing line scan now lives in `resolveWebSourcePosition`, which returns `{offset}` for a position inside the text, `{field, maximum}` naming the coordinate past the end, or `undefined` for coordinates that are not valid integers. `webSourceOffset` keeps its signature and returns the offset from that result, so its other caller (`TraceSourceMap.ts`) is unchanged. One scan computes both the offset and the bound, so a rejected position does not rescan the text and the two answers cannot disagree on line terminators. - `src/application/WebSourceLocationService.ts`: a new `admitGeneratedOffset` helper builds the `out_of_range` issue inline, as `WebNetworkCaptureService.ts` and `LocalWebScriptArtifacts.ts` do. Line bounds are 1 to the last line. Column bounds are 0 to that line's UTF-16 length. The message names the value and the bound, for example `No line 2; the retained script ends at line 1 (one-based lines).` Since ccdeda7a2 and b4b5c37ab, main checks the position in `trace` after `verifyPairing` and wraps failures in `incomplete(...)` so `partial_observation` is retained. The helper is called at that same point and its error goes through `incomplete(...)` too, so the new issue keeps `partial_observation`. The `undefined` case keeps the previous `invalid_format` issue through the file's `invalid()` helper; the input schema (`z.int().min(1)` / `z.int().min(0)`) rejects those coordinates before this point. - Not included: `TraceSourceMap.ts` reports out-of-range original positions as a recorded result (`outside-embedded-text`), not an input error, so it is left alone. Contribution scope: ordinary fix within an existing boundary; maintainer scope decision not applicable. ## Contract and boundary impact - Semantic owner and earliest changed stage: `WebSourceLocationService.trace` (`admitGeneratedOffset`), after artifact acquisition and the pairing check, before decoding. Consumers are the CLI and MCP error projections, which pass `path`, `reason`, `minimum` and `maximum` through unchanged. - Contribution scope fit and linked maintainer decision: not applicable. - CLI and MCP/tool-catalog contract: the input issue for this one rejection changes from `invalid_format` on `["generated_position"]` to `out_of_range` on `["generated_position","line" | "column"]` with bounds. The error `code` stays `invalid_request` and the exit code stays 1. No advertised schema changes. - Provider, bridge, target-format, or platform compatibility: none. - Evidence, artifact, provenance, or reconstruction contract: none. Successful results, Evidence and `normalized_result` are unchanged. - Target selection, authority, upstream behavior, and cleanup details: not applicable. - Generated metadata, package, or installation impact: none. Expected effects: - [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: - `tests/acceptance/webSourceLocationCli.test.ts`: the existing CLI out-of-range case now asserts `out_of_range` on `["generated_position","line"]` with `minimum: 1, maximum: 1`, and a new stdio MCP call asserts `out_of_range` on `["generated_position","column"]` with `maximum` equal to the script length. - `src/application/WebSourceLocationService.test.ts`: line past the end, column past the end of a CRLF-terminated line, and column past the end of the last line, with bounds and messages. - `src/domain/webSourcePosition.test.ts`: `resolveWebSourcePosition` bounds for empty text, a trailing CRLF, lone CR, U+2028/U+2029 and a surrogate pair, and `undefined` for invalid coordinates. The existing `webSourceOffset` tests are unchanged and pass. - Base reproduction (executed, macOS arm64, Node 24.22.1, built CLI at `fc43e285e`): with the acceptance fixture's manifest, script and map, `trace-web-source-location ... 1 0 --json` exits 0 with `generated_offset: 0`; `... 2 0 --json` and `... 1 999 --json` exit 1 with `{"path":["generated_position"],"reason":"invalid_format","message":"Selected generated position is outside the retained script text (one-based lines; zero-based UTF-16 columns)."}`. - Final tests against base code: `npm run test:focused -- src/domain/webSourcePosition.test.ts src/application/WebSourceLocationService.test.ts tests/acceptance/webSourceLocationCli.test.ts` with the branch's test files on `fc43e285e`: 15 failed. 11 are the new domain cases (`resolveWebSourcePosition` does not exist on base), 3 are the service out-of-range cases (received `invalid_format` on `["generated_position"]`), and 1 is the acceptance test. - User-visible CLI/MCP output (branch, same fixture): ```json {"code":"invalid_request","issues":[{"path":["generated_position","line"],"reason":"out_of_range","message":"No line 2; the retained script ends at line 1 (one-based lines).","minimum":1,"maximum":1}]} {"code":"invalid_request","issues":[{"path":["generated_position","column"],"reason":"out_of_range","message":"No column 999 on line 1; it ends at column 9 (zero-based UTF-16 columns).","minimum":0,"maximum":9}]} ``` (`code` and `details.issues` from `--json`, other fields trimmed.) - Mutation check (executed): 11 one-line mutants of the final diff, each run with `npm run test:local -- src/domain/webSourcePosition.test.ts src/application/WebSourceLocationService.test.ts`. Every mutant failed at least one test: exclusive column end, column maximum +1, line maximum -1, last line skipped, `webSourceOffset` dropping the offset, CRLF counted as two breaks, minimum always 0, reason reverted to `invalid_format`, path without the coordinate, line and column messages swapped, and invalid coordinates given a limit. - Review: an independent adversarial review differentially compared the bound with `webSourceOffset` over more than 1000 rejected positions built from empty text, CR, LF, CRLF, U+2028/U+2029 and surrogate pairs. For each, the reported maximum was accepted and maximum + 1 was rejected. It found no consumer, doc, fixture or golden depending on the old issue shape; the one assertion on the old path is updated here. A `/code-review` pass found no correctness bug and flagged that a first version scanned the text twice through two copies of the line loop; that is why the scan is shared in this version. A second adversarial review of the final diff compared base's `webSourceOffset` with the new wrapper over 400,000 random inputs (texts of CR, LF, U+2028/U+2029, lone surrogate halves, U+0085, VT and FF; positions including -1, -0, 1.5, NaN, Infinity, 2^53 and non-numbers) and found no difference in any result. It also confirmed the reported bounds are tight on those inputs. - Remaining proof gaps: no real browser capture was used. The tool reads a caller-selected manifest, script and map from disk and does not launch a browser, so the CLI and stdio MCP runs above exercise the real path. Linux and Windows were not run locally; the change has no platform-specific code. Boundary regressions covered: input issue path, reason and bounds for a caller selection fault through CLI and MCP. Lifecycle regressions: not applicable; no resource ownership changes. 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 Ported onto main `570abe95f` on 2026-10-27, after ccdeda7a2 and b4b5c37ab restructured this code and made the PR conflict. Main CI is red on that commit for reasons outside this diff. Runs on the ported commit: - `npm run test:focused -- src/application/WebSourceLocationService.test.ts src/domain/webSourcePosition.test.ts tests/acceptance/webSourceLocationCli.test.ts`: 42 passed. The acceptance case asserts the `out_of_range` issue together with main's `partial_observation`. - `npm run check:fast`: passed - `npm run test:changed -- --base 570abe95f`: 11 files, 114 tests passed - `npm run check`: only `knip` failed, on unused exports in `javascriptStaticAnalysisHelpers.ts`, `androidJniLibraryFacts.ts`, `androidManifestComponents.ts` and `objcSwiftMetadata.ts`. `npm run knip` on clean `570abe95f` prints the same four entries and exits 1. The other five tasks passed. - Mutation check on the ported helper (executed): reason reverted to `invalid_format`, path without the coordinate and minimum always 0 each fail `src/application/WebSourceLocationService.test.ts`. An offset off by one fails `tests/acceptance/webSourceLocationCli.test.ts` (`generated_offset` 1 instead of 0). - `/code-review` (high) on the ported commit: no correctness bug. It flagged seven cleanup and test-quality items, none of them new to the port. The `resolved === undefined` branch cannot run because the input schema rejects those coordinates first; it keeps the previous `invalid_format` issue rather than inventing a new one. `webSourceOffset` stays as a wrapper so `TraceSourceMap.ts` is unchanged. The `minimum` ternary, the hand-built `AnalysisInputError` next to `invalid()`, service-test fixture plumbing, overlap between service and domain tests, and the acceptance `maximum: fixture.source.length` tied to a one-line ASCII fixture are left as they are to keep this port the same change that was reviewed before. I can fold any of them in if a maintainer prefers. Runs on the original version of this PR, before the port: - `npm run test:focused -- src/domain/webSourcePosition.test.ts src/application/WebSourceLocationService.test.ts tests/acceptance/webSourceLocationCli.test.ts src/javascript/sourceMaps/TraceSourceMap.test.ts`: 71 passed - `npm run check:fast`: exit 0 - `npm run test:changed -- --base fc43e285eaae2155d32e2ca0ab5d2181a4e2f1b5`: 10 files, 103 tests passed - `npm run check`: exit 0. The only diagnostic in a touched file is the existing `max-lines-per-function` warning on `WebSourceLocationService.trace`, which this diff does not change. - `npm run verify:test-discovery`: discovered all 2485 test files exactly once - Built CLI reproduction on base and branch: results above ## Compatibility, safety, and release - Breaking changes or migration steps: none. The error code and exit status are unchanged; only the issue reason, path and bounds for this rejection become more specific, as in #6979 and #7067, which shipped as `fix`. - Real Hopper/Ghidra, browser, or OS coverage: macOS arm64 only. No browser is involved in this tool. - Package or release metadata impact: none. - Security, privacy, process, or containment review: no new reads, processes or network access. The message contains only the caller's coordinates and line or column counts, not script text. ## Author readiness Human owner: @amyanger - [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. - [ ] 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>
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#7665
No description provided.