[PR #5655] [MERGED] ci: keep npm download caches from Turbo snapshot growth #7017

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

📋 Pull Request Information

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

Base: main ← Head: cursor/ci-setup-cache-retention-3aef


📝 Commits (6)

  • 2dfc264 ci: keep npm download caches from Turbo snapshot growth
  • 5f0368d fix(ci): declare cache retention types for strict checks
  • 83075c7 fix(ci): keep compatible caches and qualification read-only
  • f2101c3 fix(ci): retain caches after failed default-branch runs
  • 8950ecc test(cli): pass application trace input as a file
  • d76d303 fix(ci): retain deep and Knip snapshots without deleting a repeated id

📊 Changes

9 files changed (+1172 additions, -24 deletions)

View changed files

📝 .github/actions/npm-cache/action.yml (+13 -3)
➕ .github/workflows/cache-retention.yml (+57 -0)
📝 .github/workflows/ci.yml (+8 -0)
📝 docs/testing.md (+32 -9)
➕ scripts/ci/cache-retention.d.mts (+61 -0)
➕ scripts/ci/cache-retention.mjs (+358 -0)
📝 tests/acceptance/applications/electronIpcListenerCallsiteCli.test.ts (+5 -5)
📝 tests/boundary/filesystem/ciCachePolicy.test.ts (+174 -7)
➕ tests/boundary/filesystem/ciCacheRetention.test.ts (+464 -0)

📄 Description

Summary

Warm npm ci stays about 6–13 seconds only while the shared npm download cache survives. The Actions cache was already at the 10 GB repository cap, mostly from a new Turbo snapshot on every trusted commit. This keeps two generations of each snapshot family and one download-cache writer per host so parallel jobs do not fill that budget with duplicates.

Rebased onto main 0add6a5aa after #5634 merged. The fast and deep static split is unchanged. Retention now also prunes the rea-static-deep-v1 and knip-meta-v1 families that split publishes.

Problem and expected behavior

Almost every CI job checks out, sets up Node, restores the npm download cache, and runs npm ci. On run 39451548945 (fast code PR) those install steps were short when the cache hit: npm ci 5–13 seconds, cache restore 2–8 seconds, setup-node 4–9 seconds, checkout 3–8 seconds. The same run's test shards then spent 9–16 minutes executing. Queue waits of 6–18 minutes were larger than setup.

The cache inventory at the first measurement was 69 entries and 10.053 GB:

Family Entries Size
rea-portable-build-v2 29 4360.6 MB
rea-static-v1 27 3771.8 MB
npm-download 12 2154.5 MB

Two Linux x64 user keys each appear twice, both on refs/heads/main, with different cache versions (04d00cc68e25ee34… and 05667df5472f1bd3…). A restore matches the version as well as the key, so those records are not duplicates.

Trusted default-branch runs should keep publishing the current Turbo snapshot and the npm download cache, and should drop superseded copies before they evict the download cache. Pull requests stay restore-only. Every job still runs npm ci.

Change and scope

Follow the contribution scope.
CI orchestration and one retention script, rebased onto the merged fast/deep split. No provider execution, target mutation, or product kernel change. Maintainer scope decision: not applicable.

  • .github/actions/npm-cache saves only when the job opts in and the event is already a trusted default-branch push, schedule, or manual run. An exact-key miss restores the newest same-OS, same-architecture download cache so a lockfile change can reuse tarballs. npm ci still checks the lockfile.
  • Writers: Static checks (Linux x64), the package matrix for every other included host, and the Windows curated lane. Deep static checks restore only. Other jobs restore only.
  • Cache deletion is not part of the reusable CI workflow. ci-full-pr.yml and release qualification call that workflow with actions: read, and a nested workflow cannot raise the caller token. .github/workflows/cache-retention.yml runs after that CI run finishes with success, failure, timed_out, or cancelled, and only when the run was a push, schedule, or manual dispatch on this repository's default branch. It checks out that commit. On ubuntu-latest it deletes older rea-static-v1, rea-static-deep-v1, and rea-portable-build-v2 entries for that runner's OS and architecture, and older knip-meta-v1 entries for that OS, keeping two generations plus the key that run saved. A fast run that did not publish a deep or Knip snapshot still leaves the two newest entries in those families.
  • scripts/ci/cache-retention.mjs deletes an npm download record only when another record has the same key, cache version, and git ref, keeping the most recently accessed copy. A different version or ref stays. One cache id is one record: a repeated id keeps the later access time when its key, version, ref, size, and creation time agree, and an inconsistent repeat deletes nothing. An unsafe prefix, a keep key outside the prefix, a foreign key in the list, a missing version or ref, or an incomplete page list deletes nothing. scripts/ci/cache-retention.d.mts is the declaration strict typecheck uses to import that module.
  • The static job does not set its own token permissions. Build stays actions: read. ci.yml has no actions: write.
  • The Electron IPC CLI test passes application Evidence through a JSON file. Main still places the full document on argv, and Test shard 2 failed with spawn E2BIG on that path. The CLI already accepts a JSON file path. Main already expects an unchanged invalid IDA procedure lookup to be nonretryable, so this branch does not change that test.

Not done, with the reason:

  • Caching or uploading node_modules. A warm npm ci is already 6–13 seconds. The local install is 674 MB and 21,352 files, and another cache of that size would compete with the full 10 GB budget.
  • Skipping Portable tests when code is false. Run 39462018286 spent 417 seconds queued for a 3 second no-op, but ruleset main merge requirements requires the check name Portable tests.
  • Changing the Turbo remote-cache credential policy. #5634 already sets TURBO_TOKEN and TURBO_CACHE for trusted default-branch and release writes. This PR leaves that policy as it is on main.
  • Shallow classify clones. plan.mjs needs merge-base history. Classify itself was 15–17 seconds; the queue in front of it was minutes.

Contract and boundary impact

  • Semantic owner and earliest changed stage: CI cache ownership in the follow-up retention workflow, after a trusted default-branch CI run finishes.
  • Contribution scope fit and linked maintainer decision: CI orchestration only. Not applicable.
  • CLI and MCP/tool-catalog contract: none. The trace command already accepts a JSON file path.
  • Provider, bridge, target-format, or platform compatibility: none. Hosted runners still install with npm ci.
  • Evidence, artifact, provenance, or reconstruction contract: none.
  • 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.

The network contact is the existing GitHub cache API, used to list and delete this repository's superseded Actions caches.

Evidence and regression coverage

  • Tests added or updated: tests/boundary/filesystem/ciCacheRetention.test.ts and tests/boundary/filesystem/ciCachePolicy.test.ts. Retention refuses npm prefixes, foreign keys, missing version or ref, and incomplete lists, and does not delete until every list succeeds. Equal keys with a different version or ref are kept. A repeated cache id is one snapshot. An inconsistent repeat deletes nothing. The policy test requires save: "true" only on the three writers, keeps deletion out of ci.yml, checks the follow-up workflow's conclusion, event, repository, and branch guards, and checks that the deep and Knip keep keys are the keys those jobs publish with this run's SHA.
  • Base reproduction or other evidence: the inventory above was measured before this rebase. A read-only dry-run on this head, with synthetic keep keys that are not stored, selected npm duplicate deletions 0, deep deletions 0, Knip deletions 0, static deletions 27 (3,741,402,754 bytes), and portable deletions 28 (4,071,842,398 bytes). It did not call DELETE. Comparable job timings are from the linked runs, not from this branch's CI. Run 39477343573 failed Source tests and Test shard (2/5) on the pre-rebase head. Main now has the IDA nonretryable assertion. The Electron argv failure is still the shape of the test on main.
  • User-visible CLI/MCP output (if applicable): none.
  • Remaining proof gaps: this branch has not yet had a trusted main run, so the byte reduction is the dry-run selection, not an observed post-merge inventory. The retention workflow file runs from the default branch, so it does not run until after merge. A restore that is still in flight for a snapshot older than the two retained generations can miss and rebuild. The repeated-id case is covered by injected list rows; a live page shift was not reproduced against GitHub. actionlint on .github/workflows/ci.yml and .github/workflows/cache-retention.yml passed 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

  • npm run test:focused -- tests/boundary/filesystem/ciCacheRetention.test.ts tests/boundary/filesystem/ciCachePolicy.test.ts — 27 passed, Node v24.18.0.
  • npm run test:focused -- tests/acceptance/applications/electronIpcListenerCallsiteCli.test.ts — 2 passed, Node v24.18.0.
  • npm run check:fast — typecheck and lint passed, Node v24.18.0.
  • npm run format:check — passed.
  • npm run knip — no findings.
  • go run github.com/rhysd/actionlint/cmd/actionlint@v1.7.7 -shellcheck= -pyflakes= .github/workflows/ci.yml .github/workflows/cache-retention.yml — exit 0.
  • CACHE_RETENTION_DRY_RUN=true node scripts/ci/cache-retention.mjs against morluto/rea — npm duplicate deletions 0; deep 0; Knip 0; static 27 and portable 28 as counted above; no DELETE.

Compatibility, safety, and release

  • Breaking changes or migration steps: none.
  • Real Hopper/Ghidra, browser, or OS coverage: not applicable. No provider lane behavior changes.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: cache-retention.yml has actions: write and is not called by qualification. Its job runs for a CI workflow_run whose conclusion is success, failure, timed_out, or cancelled, whose head repository is this repository, whose head branch is the default branch, and whose event is push, schedule, or workflow_dispatch. The script refuses prefixes outside rea-static-v1-<os>-<arch>-, rea-static-deep-v1-<os>-<arch>-, rea-portable-build-v2-<os>-<arch>-, and knip-meta-v1-<os>-, and it refuses download records that are not npm-download-* or that lack a 64-character version and a refs/ scope. Pull requests do not run the workflow.

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/5655 **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/ci-setup-cache-retention-3aef` --- ### 📝 Commits (6) - [`2dfc264`](https://github.com/morluto/rea/commit/2dfc2642075bc0c9a29b701047dca70e75617555) ci: keep npm download caches from Turbo snapshot growth - [`5f0368d`](https://github.com/morluto/rea/commit/5f0368db054250e6526d43020b70139781e8f88f) fix(ci): declare cache retention types for strict checks - [`83075c7`](https://github.com/morluto/rea/commit/83075c71e93c5fe9ed66dd2679ef8d092cd72b8a) fix(ci): keep compatible caches and qualification read-only - [`f2101c3`](https://github.com/morluto/rea/commit/f2101c3c429d67eac0e3b45b28ad51f0f88ba850) fix(ci): retain caches after failed default-branch runs - [`8950ecc`](https://github.com/morluto/rea/commit/8950ecc63fc89193498c96d5df3567fd2888b80a) test(cli): pass application trace input as a file - [`d76d303`](https://github.com/morluto/rea/commit/d76d3032ce072f0f2c2272489152a698651b7f48) fix(ci): retain deep and Knip snapshots without deleting a repeated id ### 📊 Changes **9 files changed** (+1172 additions, -24 deletions) <details> <summary>View changed files</summary> 📝 `.github/actions/npm-cache/action.yml` (+13 -3) ➕ `.github/workflows/cache-retention.yml` (+57 -0) 📝 `.github/workflows/ci.yml` (+8 -0) 📝 `docs/testing.md` (+32 -9) ➕ `scripts/ci/cache-retention.d.mts` (+61 -0) ➕ `scripts/ci/cache-retention.mjs` (+358 -0) 📝 `tests/acceptance/applications/electronIpcListenerCallsiteCli.test.ts` (+5 -5) 📝 `tests/boundary/filesystem/ciCachePolicy.test.ts` (+174 -7) ➕ `tests/boundary/filesystem/ciCacheRetention.test.ts` (+464 -0) </details> ### 📄 Description <!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Summary Warm `npm ci` stays about 6–13 seconds only while the shared npm download cache survives. The Actions cache was already at the 10 GB repository cap, mostly from a new Turbo snapshot on every trusted commit. This keeps two generations of each snapshot family and one download-cache writer per host so parallel jobs do not fill that budget with duplicates. Rebased onto main `0add6a5aa` after #5634 merged. The fast and deep static split is unchanged. Retention now also prunes the `rea-static-deep-v1` and `knip-meta-v1` families that split publishes. ## Problem and expected behavior Almost every CI job checks out, sets up Node, restores the npm download cache, and runs `npm ci`. On run [39451548945](https://github.com/morluto/rea/actions/runs/39451548945) (fast code PR) those install steps were short when the cache hit: `npm ci` 5–13 seconds, cache restore 2–8 seconds, setup-node 4–9 seconds, checkout 3–8 seconds. The same run's test shards then spent 9–16 minutes executing. Queue waits of 6–18 minutes were larger than setup. The cache inventory at the first measurement was 69 entries and 10.053 GB: | Family | Entries | Size | | --- | ---: | ---: | | `rea-portable-build-v2` | 29 | 4360.6 MB | | `rea-static-v1` | 27 | 3771.8 MB | | `npm-download` | 12 | 2154.5 MB | Two Linux x64 user keys each appear twice, both on `refs/heads/main`, with different cache versions (`04d00cc68e25ee34…` and `05667df5472f1bd3…`). A restore matches the version as well as the key, so those records are not duplicates. Trusted default-branch runs should keep publishing the current Turbo snapshot and the npm download cache, and should drop superseded copies before they evict the download cache. Pull requests stay restore-only. Every job still runs `npm ci`. ## Change and scope Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). CI orchestration and one retention script, rebased onto the merged fast/deep split. No provider execution, target mutation, or product kernel change. Maintainer scope decision: not applicable. - `.github/actions/npm-cache` saves only when the job opts in and the event is already a trusted default-branch push, schedule, or manual run. An exact-key miss restores the newest same-OS, same-architecture download cache so a lockfile change can reuse tarballs. `npm ci` still checks the lockfile. - Writers: Static checks (Linux x64), the package matrix for every other included host, and the Windows curated lane. Deep static checks restore only. Other jobs restore only. - Cache deletion is not part of the reusable CI workflow. `ci-full-pr.yml` and release qualification call that workflow with `actions: read`, and a nested workflow cannot raise the caller token. `.github/workflows/cache-retention.yml` runs after that CI run finishes with `success`, `failure`, `timed_out`, or `cancelled`, and only when the run was a push, schedule, or manual dispatch on this repository's default branch. It checks out that commit. On `ubuntu-latest` it deletes older `rea-static-v1`, `rea-static-deep-v1`, and `rea-portable-build-v2` entries for that runner's OS and architecture, and older `knip-meta-v1` entries for that OS, keeping two generations plus the key that run saved. A fast run that did not publish a deep or Knip snapshot still leaves the two newest entries in those families. - `scripts/ci/cache-retention.mjs` deletes an npm download record only when another record has the same key, cache version, and git ref, keeping the most recently accessed copy. A different version or ref stays. One cache id is one record: a repeated id keeps the later access time when its key, version, ref, size, and creation time agree, and an inconsistent repeat deletes nothing. An unsafe prefix, a keep key outside the prefix, a foreign key in the list, a missing version or ref, or an incomplete page list deletes nothing. `scripts/ci/cache-retention.d.mts` is the declaration strict typecheck uses to import that module. - The static job does not set its own token permissions. Build stays `actions: read`. `ci.yml` has no `actions: write`. - The Electron IPC CLI test passes application Evidence through a JSON file. Main still places the full document on argv, and Test shard 2 failed with `spawn E2BIG` on that path. The CLI already accepts a JSON file path. Main already expects an unchanged invalid IDA procedure lookup to be nonretryable, so this branch does not change that test. Not done, with the reason: - Caching or uploading `node_modules`. A warm `npm ci` is already 6–13 seconds. The local install is 674 MB and 21,352 files, and another cache of that size would compete with the full 10 GB budget. - Skipping Portable tests when `code` is false. Run [39462018286](https://github.com/morluto/rea/actions/runs/39462018286) spent 417 seconds queued for a 3 second no-op, but ruleset `main merge requirements` requires the check name `Portable tests`. - Changing the Turbo remote-cache credential policy. #5634 already sets `TURBO_TOKEN` and `TURBO_CACHE` for trusted default-branch and release writes. This PR leaves that policy as it is on main. - Shallow classify clones. `plan.mjs` needs merge-base history. Classify itself was 15–17 seconds; the queue in front of it was minutes. ## Contract and boundary impact - Semantic owner and earliest changed stage: CI cache ownership in the follow-up retention workflow, after a trusted default-branch CI run finishes. - Contribution scope fit and linked maintainer decision: CI orchestration only. Not applicable. - CLI and MCP/tool-catalog contract: none. The trace command already accepts a JSON file path. - Provider, bridge, target-format, or platform compatibility: none. Hosted runners still install with `npm ci`. - Evidence, artifact, provenance, or reconstruction contract: none. - 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. - [x] 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. The network contact is the existing GitHub cache API, used to list and delete this repository's superseded Actions caches. ## Evidence and regression coverage - Tests added or updated: `tests/boundary/filesystem/ciCacheRetention.test.ts` and `tests/boundary/filesystem/ciCachePolicy.test.ts`. Retention refuses npm prefixes, foreign keys, missing version or ref, and incomplete lists, and does not delete until every list succeeds. Equal keys with a different version or ref are kept. A repeated cache id is one snapshot. An inconsistent repeat deletes nothing. The policy test requires `save: "true"` only on the three writers, keeps deletion out of `ci.yml`, checks the follow-up workflow's conclusion, event, repository, and branch guards, and checks that the deep and Knip keep keys are the keys those jobs publish with this run's SHA. - Base reproduction or other evidence: the inventory above was measured before this rebase. A read-only dry-run on this head, with synthetic keep keys that are not stored, selected npm duplicate deletions 0, deep deletions 0, Knip deletions 0, static deletions 27 (3,741,402,754 bytes), and portable deletions 28 (4,071,842,398 bytes). It did not call DELETE. Comparable job timings are from the linked runs, not from this branch's CI. Run [39477343573](https://github.com/morluto/rea/actions/runs/39477343573) failed Source tests and Test shard (2/5) on the pre-rebase head. Main now has the IDA nonretryable assertion. The Electron argv failure is still the shape of the test on main. - User-visible CLI/MCP output (if applicable): none. - Remaining proof gaps: this branch has not yet had a trusted main run, so the byte reduction is the dry-run selection, not an observed post-merge inventory. The retention workflow file runs from the default branch, so it does not run until after merge. A restore that is still in flight for a snapshot older than the two retained generations can miss and rebuild. The repeated-id case is covered by injected list rows; a live page shift was not reproduced against GitHub. `actionlint` on `.github/workflows/ci.yml` and `.github/workflows/cache-retention.yml` passed 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 - `npm run test:focused -- tests/boundary/filesystem/ciCacheRetention.test.ts tests/boundary/filesystem/ciCachePolicy.test.ts` — 27 passed, Node v24.18.0. - `npm run test:focused -- tests/acceptance/applications/electronIpcListenerCallsiteCli.test.ts` — 2 passed, Node v24.18.0. - `npm run check:fast` — typecheck and lint passed, Node v24.18.0. - `npm run format:check` — passed. - `npm run knip` — no findings. - `go run github.com/rhysd/actionlint/cmd/actionlint@v1.7.7 -shellcheck= -pyflakes= .github/workflows/ci.yml .github/workflows/cache-retention.yml` — exit 0. - `CACHE_RETENTION_DRY_RUN=true node scripts/ci/cache-retention.mjs` against `morluto/rea` — npm duplicate deletions 0; deep 0; Knip 0; static 27 and portable 28 as counted above; no DELETE. ## Compatibility, safety, and release - Breaking changes or migration steps: none. - Real Hopper/Ghidra, browser, or OS coverage: not applicable. No provider lane behavior changes. - Package or release metadata impact: none. - Security, privacy, process, or containment review: `cache-retention.yml` has `actions: write` and is not called by qualification. Its job runs for a CI `workflow_run` whose conclusion is `success`, `failure`, `timed_out`, or `cancelled`, whose head repository is this repository, whose head branch is the default branch, and whose event is `push`, `schedule`, or `workflow_dispatch`. The script refuses prefixes outside `rea-static-v1-<os>-<arch>-`, `rea-static-deep-v1-<os>-<arch>-`, `rea-portable-build-v2-<os>-<arch>-`, and `knip-meta-v1-<os>-`, and it refuses download records that are not `npm-download-*` or that lack a 64-character version and a `refs/` scope. Pull requests do not run the workflow. ## 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. - [x] Tests cover changed observable behavior and meaningful failure paths. - [x] Owning docs, contracts, and generated metadata are updated where needed. - [ ] User-visible CLI/MCP changes include representative output. - [ ] 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-adf69368-edd2-5c31-a59c-baaa85ae3aef?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-adf69368-edd2-5c31-a59c-baaa85ae3aef&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:44 +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#7017
No description provided.