[PR #5352] [MERGED] feat(environment): render more read tools from the state and describe responses #6889

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

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/5352
Author: @earakely-scale
Created: 10/20/2026
Status: ✅ Merged
Merged: 10/21/2026
Merged by: @morluto

Base: main ← Head: feat/environment-state-coverage


📝 Commits (4)

  • 95c8c9d feat(environment): render more read tools from the state and describe responses
  • 2a926a0 fix(environment): keep rendered documents and quoted samples inside their budgets
  • 82838a5 chore: merge main (d7ca93cc) into environment state coverage
  • 87cea71 test(environment): pin the replay card this branch serves

📊 Changes

26 files changed (+1582 additions, -249 deletions)

View changed files

📝 docs/agent-environments.md (+42 -8)
📝 docs/mcp-contracts.md (+1 -1)
➕ docs/specs/agent-environments/state-coverage/plan.md (+32 -0)
➕ docs/specs/agent-environments/state-coverage/spec.md (+99 -0)
➕ docs/specs/agent-environments/state-coverage/tasks.md (+16 -0)
➕ docs/specs/agent-environments/state-coverage/verification.md (+123 -0)
📝 docs/web-network-captures.md (+35 -17)
📝 src/application/environment/environmentBundle.test.ts (+3 -2)
📝 src/application/environment/environmentReplay.ts (+19 -29)
📝 src/application/environment/environmentSource.ts (+53 -1)
📝 src/application/environment/environmentState.test.ts (+3 -3)
📝 src/application/environment/environmentState.ts (+11 -9)
📝 src/application/environment/environmentStateAnswer.test.ts (+11 -0)
📝 src/application/environment/environmentTools.test.ts (+271 -22)
📝 src/application/environment/environmentTools.ts (+175 -22)
📝 src/contracts/analysisViewToolContracts.ts (+1 -1)
📝 src/domain/analysisView/EnvironmentStateAccumulator.ts (+2 -2)
📝 src/domain/analysisView/EnvironmentStateExtraction.ts (+78 -47)
📝 src/domain/analysisView/environmentStateMerge.ts (+6 -1)
📝 src/domain/analysisView/environmentStateRules.ts (+117 -42)

...and 6 more files

📄 Description

Summary

Raises how much of an environment the environment-state view (#5319) renders from its state, and makes served tools say what they return. Read-only documents hold every non-entity GET read with one initial request line, identity can come from an ...Id/..._id field when no fixed name identifies the items (proved by two distinct items), single entities wrapped in a one-element array ({"posts":[{...}]}) are located, served tool descriptions summarise each tool's recorded response, and served tools carry MCP annotations. On 44 recorded captures, 1,011 of 1,277 read tools render from the state, against 625 without this change.

Refs morluto/rea#4933 (design discussion; scope decision requested there).

Builds on #5319, now merged; the diff against main is this change only.

Problem and expected behavior

Half of the read tools still replayed recordings: settings, configuration and other singleton reads had no place in the state unless the capture wrote them, lists keyed by orgId-style fields had no identity, Ghost-style detail responses wrap their entity in an array, and agents saw only a method and path per tool. The expected outcome is a state that covers those reads and tool descriptions an agent can choose from.

Change and scope

  • EnvironmentStateExtraction.ts: documents for every non-entity GET read with one initial request line, written or not; not-entity is retired and path-varies names a read under more than one path. Identity inference still requires listed items, as #5319 does.
  • environmentStateRules.ts: suffix identity candidates after IDENTITY_NAMES, accepted only when two items in one recording show them distinct; pointers /0 and /<member>/0 for a one-element array.
  • environmentTools.ts: a response summary per tool from its first JSON-like recorded exchange (fields of an object, an array of objects, or an envelope's list), plus the manifest's statuses, charged to the catalog reservation.
  • serveEnvironment.ts: readOnlyHint, destructiveHint, idempotentHint and openWorldHint: false per tool; the card is unchanged.
  • Not included: lossless big integers, list filters and pagination, cross-endpoint entity linking.

Follow the contribution scope.

Contract and boundary impact

  • Semantic owner and earliest changed stage: the state view's extraction rules and the served tool catalog
  • Contribution scope fit and linked maintainer decision: a further agent-environment increment of #4933; scope decision requested there
  • CLI and MCP/tool-catalog contract: inspect_analysis_view environment-state results gain document views and the path-varies reason, lose not-entity; served tool descriptions and MCP annotations change; no new tool
  • Provider, bridge, target-format, or platform compatibility: none
  • Evidence, artifact, provenance, or reconstruction contract: documents copy recorded values with their record ordinal, like entities
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable; no target interaction
  • 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): the generated catalog picks up the updated view description; no package or installation 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: read-only documents, suffix identity (including the two-item proof and empty first recordings), array-wrapped items with a trailing-slash Ghost-like path, the merged view's rules about non-lists, tool descriptions for object, array, enveloped and non-JSON responses and the catalog budget, and advertised annotations.
  • Real captures, outside the suite: 44 recorded captures (39 HAR, 5 browser scenario), measured on the merged code with and without this change: 1,011 of 1,277 read tools state-backed against 625 (216 item, 416 list, 379 document views against 214, 409 and 2); no-identity 216 to 32, not-entity 310 to none.
  • Remaining proof gaps: agent tokens, CPU time and peak memory were not measured; the state Evidence grows with documents (about 19% on these captures before the merge).

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 the merged tree (this branch plus #5319's branch at 6ad63bcc): npm run check:fast, npm run format:check, npx knip, npm run scan:todos, npm run docs:check: passed.
  • npm run jscpd: 3.39% duplicated lines over 3362 files (gate 3.5%).
  • npx vitest run --project domain --project services: 344 files, 5914 tests passed, 5 pre-existing skips.
  • npm run build:cached, then npm run test:focused -- serve and tool-definition adapters, serve MCP and CLI boundaries, export CLI, analysis-view MCP and CLI boundaries, compact input-schema budget and two contract tests: 10 files, 98 tests passed.
  • After merging main (#5319 squashed, #5349): npm run check:fast passed; npx vitest run src/domain/analysisView src/application src/server/environment src/contracts: 137 files, 1801 tests passed, 5 pre-existing skips.
  • Review round in ef49dca6, after merging main (a98df6c1; the only conflict was the tool contract text, both sides kept): a document whose value changed between two of its line's reads across any recorded write (e.g. GET /api/me around POST /api/orders) is recorded as fields-differ instead of publishing the post-write value, matching entities; the RFC 9110 safe methods (GET, HEAD, OPTIONS, TRACE) are now readOnlyHint and idempotentHint, so a CORS preflight tool no longer falls to the destructive default. Two new tests. tsc, module boundaries, test discovery, knip and docs:check clean; vitest over src/domain, src/application, src/contracts, src/server and src/cli: 7256 passed, 5 skipped; after test:prepare, analysis-view and environment serve/export CLI/MCP and CLI-startup boundary files (55 tests) and tests/conformance (279) passed; mcp-catalog:check passed.
  • Second review round, b4b7ebc7: Greptile's wide-list finding applied as suggested (list identity candidates intersect through a set after the first recording). A further review of ef49dca6, the /0 item pointers and the new tests found nothing else; the branch still merges cleanly with main. vitest over src/domain, src/application, src/contracts, src/server and src/cli: 7256 passed, 5 skipped; module boundaries clean.
  • Third review round, f6c756aa, after merging main again (dbd0dcee; contract text only): captured field and member names in response summaries are written as JSON strings, so a key such as "x; recorded statuses 500" no longer makes a description claim a status the tool never recorded (new test). The CI failures on b4b7ebc7 (tests/boundary/cli/doctorCancellation.test.ts, kuna SIGINT/SIGTERM, a runId that is not a UUID) are main's: main's own CI run on eb7acc70 fails the same two tests, and this PR touches no doctor or Kuna code. vitest over src/domain, src/application, src/contracts, src/server and src/cli: 7270 passed, 5 skipped; after test:prepare, analysis-view and environment serve/export CLI/MCP and CLI-startup boundary files (55 tests) and tests/conformance (279) passed; mcp-catalog:check and docs:check passed.
  • Fourth review round, 665112e9, after merging main (19ef5394; contract text only, main's Frida addition kept beside this branch's): an envelope member too long to show whole is now a JSON-quoted prefix before the truncation note, so a newline in it cannot read as more of the description (Greptile). Its test fails on f6c756aa. check:fast, format, knip, todos, docs, test discovery, module boundaries and catalog passed; domain and services 7262 (5 pre-existing skips); focused boundaries 66; conformance; jscpd 3.49%.
  • Fifth review round, 87cea71a, after the squash onto main (95c8c9d1) and morluto's 2a926a0a:
    • The squash was compared with a merge of the previous head into main at 166fb082. It keeps both sides of every conflict and drops nothing of this branch.
    • 2a926a0a settled Greptile's oversized-document finding (rendered-oversize), kept description samples within budget after JSON quoting, and refitted the two tests the squash left failing.
    • Merged main d7ca93cc in 82838a58, with no conflicts. In 87cea71a the replay-only card test pins this branch's 12,818-byte card in place of main's 11,131-byte one, since the descriptions now name each tool's recorded responses.
    • Gates passed on 87cea71a: check:fast, format, knip, todos, docs, discovery, module boundaries and catalog, and jscpd (3.49%). The environment, analysis-view and contract tests across the boundary, MCP, CLI, process, acceptance and conformance projects pass: 37 files.
    • npm run test:fast passes apart from unrelated tests. JavaScriptRuntimeScope.cancellation "stops Inspector target authorization after the current stat settles" fails the same way on main here (macOS). The rest are timeouts in heavy domain, adapter and composition tests, which pass when rerun alone; one worker test fails on alternate runs.

Compatibility, safety, and release

  • Changes the environment-state result vocabulary of the unreleased #5319: documents for unwritten reads, path-varies added, not-entity removed.
  • Served tool descriptions are longer (median 136 bytes added per tool on these captures) and tools carry annotations; the card's tool shape is unchanged.
  • Gates ran on Node v22.23.1; the pinned 24.18.0 is not installed on this machine.

Author readiness

Human owner: @earakely-scale

  • 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.

🤖 Generated with Claude Code


🔄 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/5352 **Author:** [@earakely-scale](https://github.com/earakely-scale) **Created:** 10/20/2026 **Status:** ✅ Merged **Merged:** 10/21/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `feat/environment-state-coverage` --- ### 📝 Commits (4) - [`95c8c9d`](https://github.com/morluto/rea/commit/95c8c9d1573fcdf759da4edcf07e86a0a7c826c1) feat(environment): render more read tools from the state and describe responses - [`2a926a0`](https://github.com/morluto/rea/commit/2a926a0a1b1b01aa5b3dac800570f36d69192dfd) fix(environment): keep rendered documents and quoted samples inside their budgets - [`82838a5`](https://github.com/morluto/rea/commit/82838a58cae6ea242756cfca8495073027314e87) chore: merge main (d7ca93cc) into environment state coverage - [`87cea71`](https://github.com/morluto/rea/commit/87cea71a4e471e97871adf53d67a1b51b2601ca9) test(environment): pin the replay card this branch serves ### 📊 Changes **26 files changed** (+1582 additions, -249 deletions) <details> <summary>View changed files</summary> 📝 `docs/agent-environments.md` (+42 -8) 📝 `docs/mcp-contracts.md` (+1 -1) ➕ `docs/specs/agent-environments/state-coverage/plan.md` (+32 -0) ➕ `docs/specs/agent-environments/state-coverage/spec.md` (+99 -0) ➕ `docs/specs/agent-environments/state-coverage/tasks.md` (+16 -0) ➕ `docs/specs/agent-environments/state-coverage/verification.md` (+123 -0) 📝 `docs/web-network-captures.md` (+35 -17) 📝 `src/application/environment/environmentBundle.test.ts` (+3 -2) 📝 `src/application/environment/environmentReplay.ts` (+19 -29) 📝 `src/application/environment/environmentSource.ts` (+53 -1) 📝 `src/application/environment/environmentState.test.ts` (+3 -3) 📝 `src/application/environment/environmentState.ts` (+11 -9) 📝 `src/application/environment/environmentStateAnswer.test.ts` (+11 -0) 📝 `src/application/environment/environmentTools.test.ts` (+271 -22) 📝 `src/application/environment/environmentTools.ts` (+175 -22) 📝 `src/contracts/analysisViewToolContracts.ts` (+1 -1) 📝 `src/domain/analysisView/EnvironmentStateAccumulator.ts` (+2 -2) 📝 `src/domain/analysisView/EnvironmentStateExtraction.ts` (+78 -47) 📝 `src/domain/analysisView/environmentStateMerge.ts` (+6 -1) 📝 `src/domain/analysisView/environmentStateRules.ts` (+117 -42) _...and 6 more files_ </details> ### 📄 Description ## Summary Raises how much of an environment the `environment-state` view (#5319) renders from its state, and makes served tools say what they return. Read-only documents hold every non-entity `GET` read with one initial request line, identity can come from an `...Id`/`..._id` field when no fixed name identifies the items (proved by two distinct items), single entities wrapped in a one-element array (`{"posts":[{...}]}`) are located, served tool descriptions summarise each tool's recorded response, and served tools carry MCP annotations. On 44 recorded captures, 1,011 of 1,277 read tools render from the state, against 625 without this change. Refs morluto/rea#4933 (design discussion; scope decision requested there). Builds on #5319, now merged; the diff against main is this change only. ## Problem and expected behavior Half of the read tools still replayed recordings: settings, configuration and other singleton reads had no place in the state unless the capture wrote them, lists keyed by `orgId`-style fields had no identity, Ghost-style detail responses wrap their entity in an array, and agents saw only a method and path per tool. The expected outcome is a state that covers those reads and tool descriptions an agent can choose from. ## Change and scope - `EnvironmentStateExtraction.ts`: documents for every non-entity `GET` read with one initial request line, written or not; `not-entity` is retired and `path-varies` names a read under more than one path. Identity inference still requires listed items, as #5319 does. - `environmentStateRules.ts`: suffix identity candidates after `IDENTITY_NAMES`, accepted only when two items in one recording show them distinct; pointers `/0` and `/<member>/0` for a one-element array. - `environmentTools.ts`: a response summary per tool from its first JSON-like recorded exchange (fields of an object, an array of objects, or an envelope's list), plus the manifest's statuses, charged to the catalog reservation. - `serveEnvironment.ts`: `readOnlyHint`, `destructiveHint`, `idempotentHint` and `openWorldHint: false` per tool; the card is unchanged. - Not included: lossless big integers, list filters and pagination, cross-endpoint entity linking. Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). ## Contract and boundary impact - Semantic owner and earliest changed stage: the state view's extraction rules and the served tool catalog - Contribution scope fit and linked maintainer decision: a further agent-environment increment of #4933; scope decision requested there - CLI and MCP/tool-catalog contract: `inspect_analysis_view` environment-state results gain document views and the `path-varies` reason, lose `not-entity`; served tool descriptions and MCP annotations change; no new tool - Provider, bridge, target-format, or platform compatibility: none - Evidence, artifact, provenance, or reconstruction contract: documents copy recorded values with their record ordinal, like entities - Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable; no target interaction - 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): the generated catalog picks up the updated view description; no package or installation 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: read-only documents, suffix identity (including the two-item proof and empty first recordings), array-wrapped items with a trailing-slash Ghost-like path, the merged view's rules about non-lists, tool descriptions for object, array, enveloped and non-JSON responses and the catalog budget, and advertised annotations. - Real captures, outside the suite: 44 recorded captures (39 HAR, 5 browser scenario), measured on the merged code with and without this change: 1,011 of 1,277 read tools state-backed against 625 (216 item, 416 list, 379 document views against 214, 409 and 2); `no-identity` 216 to 32, `not-entity` 310 to none. - Remaining proof gaps: agent tokens, CPU time and peak memory were not measured; the state Evidence grows with documents (about 19% on these captures before the merge). 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 the merged tree (this branch plus #5319's branch at 6ad63bcc): `npm run check:fast`, `npm run format:check`, `npx knip`, `npm run scan:todos`, `npm run docs:check`: passed. - `npm run jscpd`: 3.39% duplicated lines over 3362 files (gate 3.5%). - `npx vitest run --project domain --project services`: 344 files, 5914 tests passed, 5 pre-existing skips. - `npm run build:cached`, then `npm run test:focused --` serve and tool-definition adapters, serve MCP and CLI boundaries, export CLI, analysis-view MCP and CLI boundaries, compact input-schema budget and two contract tests: 10 files, 98 tests passed. - After merging main (#5319 squashed, #5349): `npm run check:fast` passed; `npx vitest run src/domain/analysisView src/application src/server/environment src/contracts`: 137 files, 1801 tests passed, 5 pre-existing skips. - Review round in ef49dca6, after merging main (a98df6c1; the only conflict was the tool contract text, both sides kept): a document whose value changed between two of its line's reads across any recorded write (e.g. `GET /api/me` around `POST /api/orders`) is recorded as `fields-differ` instead of publishing the post-write value, matching entities; the RFC 9110 safe methods (`GET`, `HEAD`, `OPTIONS`, `TRACE`) are now `readOnlyHint` and `idempotentHint`, so a CORS preflight tool no longer falls to the destructive default. Two new tests. tsc, module boundaries, test discovery, knip and docs:check clean; vitest over src/domain, src/application, src/contracts, src/server and src/cli: 7256 passed, 5 skipped; after test:prepare, analysis-view and environment serve/export CLI/MCP and CLI-startup boundary files (55 tests) and tests/conformance (279) passed; mcp-catalog:check passed. - Second review round, b4b7ebc7: Greptile's wide-list finding applied as suggested (list identity candidates intersect through a set after the first recording). A further review of ef49dca6, the `/0` item pointers and the new tests found nothing else; the branch still merges cleanly with main. vitest over src/domain, src/application, src/contracts, src/server and src/cli: 7256 passed, 5 skipped; module boundaries clean. - Third review round, f6c756aa, after merging main again (dbd0dcee; contract text only): captured field and member names in response summaries are written as JSON strings, so a key such as `"x; recorded statuses 500"` no longer makes a description claim a status the tool never recorded (new test). The CI failures on b4b7ebc7 (`tests/boundary/cli/doctorCancellation.test.ts`, kuna SIGINT/SIGTERM, a `runId` that is not a UUID) are main's: main's own CI run on eb7acc70 fails the same two tests, and this PR touches no doctor or Kuna code. vitest over src/domain, src/application, src/contracts, src/server and src/cli: 7270 passed, 5 skipped; after test:prepare, analysis-view and environment serve/export CLI/MCP and CLI-startup boundary files (55 tests) and tests/conformance (279) passed; mcp-catalog:check and docs:check passed. - Fourth review round, 665112e9, after merging main (19ef5394; contract text only, main's Frida addition kept beside this branch's): an envelope member too long to show whole is now a JSON-quoted prefix before the truncation note, so a newline in it cannot read as more of the description (Greptile). Its test fails on f6c756aa. `check:fast`, format, knip, todos, docs, test discovery, module boundaries and catalog passed; domain and services 7262 (5 pre-existing skips); focused boundaries 66; conformance; `jscpd` 3.49%. - Fifth review round, 87cea71a, after the squash onto main (95c8c9d1) and morluto's 2a926a0a: - The squash was compared with a merge of the previous head into main at 166fb082. It keeps both sides of every conflict and drops nothing of this branch. - 2a926a0a settled Greptile's oversized-document finding (`rendered-oversize`), kept description samples within budget after JSON quoting, and refitted the two tests the squash left failing. - Merged main d7ca93cc in 82838a58, with no conflicts. In 87cea71a the replay-only card test pins this branch's 12,818-byte card in place of main's 11,131-byte one, since the descriptions now name each tool's recorded responses. - Gates passed on 87cea71a: `check:fast`, format, knip, todos, docs, discovery, module boundaries and catalog, and `jscpd` (3.49%). The environment, analysis-view and contract tests across the boundary, MCP, CLI, process, acceptance and conformance projects pass: 37 files. - `npm run test:fast` passes apart from unrelated tests. `JavaScriptRuntimeScope.cancellation` "stops Inspector target authorization after the current stat settles" fails the same way on main here (macOS). The rest are timeouts in heavy domain, adapter and composition tests, which pass when rerun alone; one worker test fails on alternate runs. ## Compatibility, safety, and release - Changes the environment-state result vocabulary of the unreleased #5319: documents for unwritten reads, `path-varies` added, `not-entity` removed. - Served tool descriptions are longer (median 136 bytes added per tool on these captures) and tools carry annotations; the card's tool shape is unchanged. - Gates ran on Node v22.23.1; the pinned 24.18.0 is not installed on this machine. ## Author readiness Human owner: @earakely-scale - [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. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-11-01 21:43:51 +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#6889
No description provided.