[PR #5651] [MERGED] fix(javascript): preserve path reasons, module coverage, and property provenance #7014

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

📋 Pull Request Information

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

Base: main ← Head: cursor/js-analysis-evidence-2cbb


📝 Commits (9)

  • dc7addd fix(javascript): preserve selected path host resolution reasons
  • 6c66ffb fix(javascript): count summary coverage in module units
  • c7170bd fix(javascript): connect direct property reads to return and argument flow
  • 36a8eb3 fix(javascript): count return wrappers against expression depth
  • e77f8a8 fix(javascript): describe ELOOP as unresolved symlink traversal
  • ffba34a test(javascript): skip symlink traversal fixtures on Windows
  • efb47d4 fix(javascript): describe ENAMETOOLONG as a path or component limit
  • 568f7af style(javascript): format return-depth and object-read changes
  • 2265265 test(ida): expect unchanged invalid requests to be nonretryable

📊 Changes

13 files changed (+319 additions, -10 deletions)

View changed files

📝 src/application/javascript/JavaScriptArtifactReconstruction.ts (+19 -2)
📝 src/application/javascript/JavaScriptSemanticGraphBuilder.test.ts (+50 -0)
📝 src/application/javascript/JavaScriptSemanticGraphBuilder.ts (+10 -0)
📝 src/application/javascript/JavaScriptSemanticGraphFlowProjection.ts (+61 -0)
📝 src/domain/analysisView/analysisView.test.ts (+48 -0)
📝 src/domain/analysisView/javascriptApplicationView.ts (+3 -1)
📝 src/domain/javascript/javascriptSemanticAnalysis.unions.test.ts (+31 -0)
📝 src/domain/javascript/javascriptSemanticCalls.ts (+9 -1)
📝 src/domain/javascript/javascriptSemanticIr.ts (+7 -0)
📝 src/domain/javascript/javascriptSemanticReturns.ts (+7 -2)
📝 src/ida/IdaOperationFailures.test.ts (+4 -3)
📝 src/javascript/analysis/JavaScriptAnalysisWorkerSchemas.ts (+1 -0)
📝 tests/boundary/filesystem/javascriptApplicationInputSelection.test.ts (+69 -1)

📄 Description

Summary

JavaScript application analysis dropped selected-path host reasons, mixed module and graph-node counts in summary coverage, and lost a directly returned or passed property in backward provenance.

Fixes #5623, #5585, #5464, #5648.

#5469, #5466, and #5377 were rechecked on current main and already have producing-boundary fixes there (a4dbb36d8, 2b2e362a0, and the call resolver's definite-initializer gate). This diff does not change them. Their issues stay open.

Problem and expected behavior

resolveSelectedInput classified ENOENT and ENOTDIR as invalid input and EACCES/EPERM as access denied. ELOOP and ENAMETOOLONG fell through to a later filesystem catch and became ArtifactOperationError reason io with no selected path. Both are caller/host-resolution failures and should stay invalid_request with input_path and the host code. ELOOP covers a cycle and a chain past the host traversal limit, so the message must not assert that a cycle exists. ENAMETOOLONG covers a long component and a long full path, so the message must not claim only a filename was too long.

Summary coverage used completeCoverage(moduleCount, graph.nodes.length). Examined and total must be the same module population. Non-module nodes stay in summary.coverage.application.

return settings.index and take(settings.index) already evaluated the literal, but graph projection only aliased identifier references inside the return or argument range. The member read is a separate occurrence owned by object projection. Backward provenance must reach that literal. return settings.index + "!" must not gain a "products" edge. Query status may stay ambiguous because the receiver identifier remains a candidate alias.

Erased TypeScript and Flow wrappers still count toward the expression-depth budget. Unwrapping a return before evaluation restarted that budget at zero.

Change and scope

Host path classification happens in resolveSelectedInput, next to the existing missing-path and permission cases. Later uncategorized filesystem IO during analysis still uses the service io reason. The ELOOP message names a loop or a traversal past the host limit. The ENAMETOOLONG message names a host path or component length limit.

Summary coverage counts modules for both examined and total. An empty module set stays complete-within-view at 0/0.

Return sites and call arguments record the unwrapped value expression. Return and argument flow alias the object-read occurrence at that range. Evaluation still receives the original return expression, so wrapper depth stays inside the existing budget. The occurrence lookup is owned by the object projection and indexed once per IR and graph state. Parentheses and arrow expression bodies use the same unwrapped range. Concatenation and other wider expressions do not match the member-read range.

The IDA procedure-lookup test now expects invalid_request to be non-retryable, matching the projector change already on this branch's base. No IDA behavior change.

Follow the contribution scope.
Ordinary evidence and diagnostic fixes inside existing JavaScript analysis boundaries. No new provider, target execution, injection, mutation, or protection recovery. Maintainer scope decision: not applicable.

Contract and boundary impact

  • Semantic owner and earliest changed stage: selected-input resolution in JavaScriptArtifactReconstruction; summary projection in projectJavaScriptApplicationView; value-expression ranges on the semantic IR, consumed by return and argument graph flow. Expression-depth accounting stays in evaluateSemanticExpression.
  • Contribution scope fit and linked maintainer decision: existing analysis contracts; maintainer scope decision not applicable.
  • CLI and MCP/tool-catalog contract: same operations. invalid_request replaces a path-less io failure for ELOOP and ENAMETOOLONG. Summary coverage.examined and coverage.total are both module counts. Backward provenance can include the literal behind a direct property read or argument. Worker callable return sites gain valueExpressionLocation.
  • Provider, bridge, target-format, or platform compatibility: none for engine selection. Path messages include the host code and the caller-selected path. The symlink fixtures skip Windows, where realpath does not report ELOOP for these cases. The overlong-name case still runs there.
  • Evidence, artifact, provenance, or reconstruction contract: the selected path and host code stay on the input issue. Object projection still owns the read occurrence. Flow adds a resolved aliases edge from that occurrence to the return or argument node. Concatenated returns do not inherit the property literal. A return past the wrapper-depth budget stays expression-depth unknown.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable.
  • 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: selected-path ENAMETOOLONG on every platform; a two-link cycle and a 60-link acyclic chain skipped on Windows; JavaScript summary coverage with one extra non-module node; backward provenance for a local copy, a direct return, parentheses, an arrow expression body, direct and parenthesized arguments, an identifier argument, and a concatenated return that must not reach "products"; a return wrapped in 300 as expressions stays expression-depth unknown and keeps the inner literal range. The IDA missing-procedure cases now expect retryable: false.
  • Base reproduction or other evidence: before the projection change, graph queries for viaMember, parenthesized member returns, arrow expression bodies, and direct member arguments did not reach the "products" literal with candidates on or off. The return-site value was already the literal. Source-map mapping tests and the nested var callback test still pass.
  • User-visible CLI/MCP output (if applicable): not replayed. The boundary test calls the application service and checks the projected invalid_request issue, including the selected path. inspect-artifact already retained these host reasons and was not changed.
  • Remaining proof gaps: public CLI and MCP were not replayed. Later filesystem IO after input resolution can still be a generic io failure. #5302 was not verified. soleWriteReachesRead still treats a stable initializer as a reaching write and was not confirmed as a user-visible bug. Windows ELOOP behavior was not executed here. A full path at PATH_MAX was not executed; the message covers that host code without a separate fixture. The Electron IPC CLI failure was spawn E2BIG and was not reproduced locally.

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 226526532, before this push:

  • npx oxfmt --check on the flow projection, the unions test, and the IDA failure test — formatted.
  • npm run check:fast — typecheck and lint, 2 successful, 24.923s.
  • npm run test:local -- src/ida/IdaOperationFailures.test.ts src/domain/javascript/javascriptSemanticAnalysis.unions.test.ts — 2 files, 61 tests passed.

CI on efb47d44b failed oxfmt for the unions test and object-read projection, and eight IDA lookup cases still expected invalid_request to be retryable. That retryable bit was removed on the base commit. The Electron IPC CLI shard failed with spawn E2BIG before an assertion.

On efb47d44b: npm run check:fast passed and the input-selection boundary file passed with 7 tests. On e77f8a8f7: unions source tests, 28 passed, including the 300-wrapper return. On c7170bd06: graph, analysis view, worker schema, and call-resolution source tests were 135 passed, and source-map mapping boundary tests were 6 passed.

Not run: npm run check:pr, public CLI/MCP replay, Windows, a PATH_MAX fixture, or a Flameox profile.

Compatibility, safety, and release

  • Breaking changes or migration steps: none for request shape. Callers that treated ELOOP or ENAMETOOLONG as artifact io, or that compared summary examined/total against all graph nodes, will see invalid_request and module-unit coverage. Worker consumers of callable return sites must accept valueExpressionLocation.
  • Real Hopper/Ghidra, browser, or OS coverage: Linux filename-length, symlink-cycle, and 60-link chain behavior in the boundary test. No Hopper, Ghidra, browser, or Windows run.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: diagnostic classification and static provenance only. No new process authority.

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/5651 **Author:** [@morluto](https://github.com/morluto) **Created:** 10/20/2026 **Status:** ✅ Merged **Merged:** 10/20/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `cursor/js-analysis-evidence-2cbb` --- ### 📝 Commits (9) - [`dc7addd`](https://github.com/morluto/rea/commit/dc7addd749e759cd46092a340bf91cad8aafe82e) fix(javascript): preserve selected path host resolution reasons - [`6c66ffb`](https://github.com/morluto/rea/commit/6c66ffb4bd9caf053a31eeb8dd9683584aae86a6) fix(javascript): count summary coverage in module units - [`c7170bd`](https://github.com/morluto/rea/commit/c7170bd0673c1d82af53d15e139a3621ea7ce0d7) fix(javascript): connect direct property reads to return and argument flow - [`36a8eb3`](https://github.com/morluto/rea/commit/36a8eb32f219c4d8e91c89d612c36403ebd0d0ca) fix(javascript): count return wrappers against expression depth - [`e77f8a8`](https://github.com/morluto/rea/commit/e77f8a8f77131eb670d6436c3915c3ff34b6e214) fix(javascript): describe ELOOP as unresolved symlink traversal - [`ffba34a`](https://github.com/morluto/rea/commit/ffba34a8f540bca03cc3f06bf44b77f4393d0eb2) test(javascript): skip symlink traversal fixtures on Windows - [`efb47d4`](https://github.com/morluto/rea/commit/efb47d44b96729c31d0351868f0560413a6a06b4) fix(javascript): describe ENAMETOOLONG as a path or component limit - [`568f7af`](https://github.com/morluto/rea/commit/568f7afb0a820e9b561878297742caa904399a9d) style(javascript): format return-depth and object-read changes - [`2265265`](https://github.com/morluto/rea/commit/22652653276458b89690592444ca45d47a8a106d) test(ida): expect unchanged invalid requests to be nonretryable ### 📊 Changes **13 files changed** (+319 additions, -10 deletions) <details> <summary>View changed files</summary> 📝 `src/application/javascript/JavaScriptArtifactReconstruction.ts` (+19 -2) 📝 `src/application/javascript/JavaScriptSemanticGraphBuilder.test.ts` (+50 -0) 📝 `src/application/javascript/JavaScriptSemanticGraphBuilder.ts` (+10 -0) 📝 `src/application/javascript/JavaScriptSemanticGraphFlowProjection.ts` (+61 -0) 📝 `src/domain/analysisView/analysisView.test.ts` (+48 -0) 📝 `src/domain/analysisView/javascriptApplicationView.ts` (+3 -1) 📝 `src/domain/javascript/javascriptSemanticAnalysis.unions.test.ts` (+31 -0) 📝 `src/domain/javascript/javascriptSemanticCalls.ts` (+9 -1) 📝 `src/domain/javascript/javascriptSemanticIr.ts` (+7 -0) 📝 `src/domain/javascript/javascriptSemanticReturns.ts` (+7 -2) 📝 `src/ida/IdaOperationFailures.test.ts` (+4 -3) 📝 `src/javascript/analysis/JavaScriptAnalysisWorkerSchemas.ts` (+1 -0) 📝 `tests/boundary/filesystem/javascriptApplicationInputSelection.test.ts` (+69 -1) </details> ### 📄 Description <!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Summary JavaScript application analysis dropped selected-path host reasons, mixed module and graph-node counts in summary coverage, and lost a directly returned or passed property in backward provenance. Fixes #5623, #5585, #5464, #5648. #5469, #5466, and #5377 were rechecked on current `main` and already have producing-boundary fixes there (`a4dbb36d8`, `2b2e362a0`, and the call resolver's definite-initializer gate). This diff does not change them. Their issues stay open. ## Problem and expected behavior `resolveSelectedInput` classified `ENOENT` and `ENOTDIR` as invalid input and `EACCES`/`EPERM` as access denied. `ELOOP` and `ENAMETOOLONG` fell through to a later filesystem catch and became `ArtifactOperationError` reason `io` with no selected path. Both are caller/host-resolution failures and should stay `invalid_request` with `input_path` and the host code. `ELOOP` covers a cycle and a chain past the host traversal limit, so the message must not assert that a cycle exists. `ENAMETOOLONG` covers a long component and a long full path, so the message must not claim only a filename was too long. Summary coverage used `completeCoverage(moduleCount, graph.nodes.length)`. Examined and total must be the same module population. Non-module nodes stay in `summary.coverage.application`. `return settings.index` and `take(settings.index)` already evaluated the literal, but graph projection only aliased identifier references inside the return or argument range. The member read is a separate occurrence owned by object projection. Backward provenance must reach that literal. `return settings.index + "!"` must not gain a `"products"` edge. Query status may stay ambiguous because the receiver identifier remains a candidate alias. Erased TypeScript and Flow wrappers still count toward the expression-depth budget. Unwrapping a return before evaluation restarted that budget at zero. ## Change and scope Host path classification happens in `resolveSelectedInput`, next to the existing missing-path and permission cases. Later uncategorized filesystem IO during analysis still uses the service `io` reason. The `ELOOP` message names a loop or a traversal past the host limit. The `ENAMETOOLONG` message names a host path or component length limit. Summary coverage counts modules for both examined and total. An empty module set stays `complete-within-view` at 0/0. Return sites and call arguments record the unwrapped value expression. Return and argument flow alias the object-read occurrence at that range. Evaluation still receives the original return expression, so wrapper depth stays inside the existing budget. The occurrence lookup is owned by the object projection and indexed once per IR and graph state. Parentheses and arrow expression bodies use the same unwrapped range. Concatenation and other wider expressions do not match the member-read range. The IDA procedure-lookup test now expects `invalid_request` to be non-retryable, matching the projector change already on this branch's base. No IDA behavior change. Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). Ordinary evidence and diagnostic fixes inside existing JavaScript analysis boundaries. No new provider, target execution, injection, mutation, or protection recovery. Maintainer scope decision: not applicable. ## Contract and boundary impact - Semantic owner and earliest changed stage: selected-input resolution in `JavaScriptArtifactReconstruction`; summary projection in `projectJavaScriptApplicationView`; value-expression ranges on the semantic IR, consumed by return and argument graph flow. Expression-depth accounting stays in `evaluateSemanticExpression`. - Contribution scope fit and linked maintainer decision: existing analysis contracts; maintainer scope decision not applicable. - CLI and MCP/tool-catalog contract: same operations. `invalid_request` replaces a path-less `io` failure for `ELOOP` and `ENAMETOOLONG`. Summary `coverage.examined` and `coverage.total` are both module counts. Backward provenance can include the literal behind a direct property read or argument. Worker callable return sites gain `valueExpressionLocation`. - Provider, bridge, target-format, or platform compatibility: none for engine selection. Path messages include the host code and the caller-selected path. The symlink fixtures skip Windows, where `realpath` does not report `ELOOP` for these cases. The overlong-name case still runs there. - Evidence, artifact, provenance, or reconstruction contract: the selected path and host code stay on the input issue. Object projection still owns the read occurrence. Flow adds a resolved `aliases` edge from that occurrence to the return or argument node. Concatenated returns do not inherit the property literal. A return past the wrapper-depth budget stays `expression-depth` unknown. - Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable. - 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. - [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: selected-path `ENAMETOOLONG` on every platform; a two-link cycle and a 60-link acyclic chain skipped on Windows; JavaScript summary coverage with one extra non-module node; backward provenance for a local copy, a direct return, parentheses, an arrow expression body, direct and parenthesized arguments, an identifier argument, and a concatenated return that must not reach `"products"`; a return wrapped in 300 `as` expressions stays `expression-depth` unknown and keeps the inner literal range. The IDA missing-procedure cases now expect `retryable: false`. - Base reproduction or other evidence: before the projection change, graph queries for `viaMember`, parenthesized member returns, arrow expression bodies, and direct member arguments did not reach the `"products"` literal with candidates on or off. The return-site value was already the literal. Source-map mapping tests and the nested `var` callback test still pass. - User-visible CLI/MCP output (if applicable): not replayed. The boundary test calls the application service and checks the projected `invalid_request` issue, including the selected path. `inspect-artifact` already retained these host reasons and was not changed. - Remaining proof gaps: public CLI and MCP were not replayed. Later filesystem IO after input resolution can still be a generic `io` failure. #5302 was not verified. `soleWriteReachesRead` still treats a stable initializer as a reaching write and was not confirmed as a user-visible bug. Windows `ELOOP` behavior was not executed here. A full path at `PATH_MAX` was not executed; the message covers that host code without a separate fixture. The Electron IPC CLI failure was `spawn E2BIG` and was not reproduced locally. 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 `226526532`, before this push: - `npx oxfmt --check` on the flow projection, the unions test, and the IDA failure test — formatted. - `npm run check:fast` — typecheck and lint, 2 successful, 24.923s. - `npm run test:local -- src/ida/IdaOperationFailures.test.ts src/domain/javascript/javascriptSemanticAnalysis.unions.test.ts` — 2 files, 61 tests passed. CI on `efb47d44b` failed `oxfmt` for the unions test and object-read projection, and eight IDA lookup cases still expected `invalid_request` to be retryable. That retryable bit was removed on the base commit. The Electron IPC CLI shard failed with `spawn E2BIG` before an assertion. On `efb47d44b`: `npm run check:fast` passed and the input-selection boundary file passed with 7 tests. On `e77f8a8f7`: unions source tests, 28 passed, including the 300-wrapper return. On `c7170bd06`: graph, analysis view, worker schema, and call-resolution source tests were 135 passed, and source-map mapping boundary tests were 6 passed. Not run: `npm run check:pr`, public CLI/MCP replay, Windows, a `PATH_MAX` fixture, or a Flameox profile. ## Compatibility, safety, and release - Breaking changes or migration steps: none for request shape. Callers that treated `ELOOP` or `ENAMETOOLONG` as artifact `io`, or that compared summary examined/total against all graph nodes, will see `invalid_request` and module-unit coverage. Worker consumers of callable return sites must accept `valueExpressionLocation`. - Real Hopper/Ghidra, browser, or OS coverage: Linux filename-length, symlink-cycle, and 60-link chain behavior in the boundary test. No Hopper, Ghidra, browser, or Windows run. - Package or release metadata impact: none. - Security, privacy, process, or containment review: diagnostic classification and static provenance only. No new process authority. ## 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 - [ ] 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. <!-- CURSOR_AGENT_PR_BODY_END --> <div><a href="https://cursor.com/agents/bc-6223bf66-a56f-5cfe-8ea0-09de4a0a2cbb?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-6223bf66-a56f-5cfe-8ea0-09de4a0a2cbb&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:42 +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#7014
No description provided.