[PR #5634] [MERGED] ci: split fast and deep static checks #7005

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

📋 Pull Request Information

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

Base: main ← Head: cursor/ci-fast-deep-split-c2ad


📝 Commits (8)

  • 0609064 ci: split fast and deep static checks
  • 7dd0637 ci: keep pull requests from writing the remote cache
  • d732cfb ci: forward the release cache token and upload deep static reports
  • 9e4a93a style: format the turbo cache policy test
  • be35aa5 ci: keep fast checks exclusive and trusted cache writes explicit
  • 0120f70 ci: record static task graphs without nesting the artifacts lock
  • da89668 ci: keep unauthenticated Turbo runs on the local cache
  • ba35bfd test(ida): treat unchanged invalid requests as nonretryable

📊 Changes

41 files changed (+1042 additions, -167 deletions)

View changed files

📝 .github/workflows/ci.yml (+118 -8)
📝 .github/workflows/mutation.yml (+5 -0)
📝 .github/workflows/real-agentenv.yml (+16 -0)
📝 .github/workflows/real-binary-layout.yml (+16 -0)
📝 .github/workflows/real-browser.yml (+16 -0)
📝 .github/workflows/real-cutter.yml (+8 -0)
📝 .github/workflows/real-evm-interface.yml (+16 -0)
📝 .github/workflows/real-ghidra-windows.yml (+5 -0)
📝 .github/workflows/real-go-binary.yml (+5 -12)
📝 .github/workflows/real-hopper-linux.yml (+5 -0)
📝 .github/workflows/real-hopper.yml (+5 -0)
📝 .github/workflows/real-javascript-recovery.yml (+16 -0)
📝 .github/workflows/real-packet-capture.yml (+7 -11)
📝 .github/workflows/real-recorded-crash.yml (+16 -0)
📝 .github/workflows/real-signal-recording.yml (+7 -11)
📝 .github/workflows/real-termux.yml (+5 -0)
📝 .github/workflows/real-web-network-captures.yml (+16 -0)
📝 .github/workflows/real-web-runtime.yml (+16 -0)
📝 .github/workflows/real-web-source-map.yml (+16 -0)
📝 .github/workflows/release.yml (+9 -0)

...and 21 more files

📄 Description

Summary

Fast pull requests no longer run Knip, duplication, architecture guards, test discovery, or the Python producer before provider lanes are admitted. Those checks move to a separate full-tier job. Fast broad fallbacks keep the portable suite and the Linux x64 runtime baseline.

Measured timings from 2026-10-20, on the pre-split workflow, say the static pile is an admission delay of under a minute when runners are free. The uncontended wall is the slowest built Vitest shard, about 15 minutes. Contended runs of 70–85 minutes were runner queue, with the same shard execution still about 10–16 minutes.

Problem and expected behavior

Fast PRs should admit providers after typecheck, built lint, format, and the portable build. Deep static, coverage, the multi-host package matrix, and Intel macOS stay on ci:full, schedule, manual dispatch, and release qualification.

Change and scope

Follow the contribution scope.
This is CI orchestration only. It does not change provider execution, target mutation, or product kernel behavior. Maintainer scope decision: not applicable.

What runs where

Tier When Static Tests Providers and hosts
Fast Default PR and ordinary main push check:ci:fast: typecheck, lint:built, format:check Source job plus 5 built shards, coverage off Path-owned lanes only. Broad fallback is Linux x64 runtime, not the 3-host matrix
Full ci:full, schedule that is not reused, workflow_dispatch, release qualification Fast static, plus separate Deep static checks: Knip --cache, metadata, jscpd, scan:todos, architecture guards, test discovery, Python 6 shards with coverage Every lane, including Intel macOS
Reused Hourly schedule with a fresh exact-SHA full receipt None None None; no new receipt

npm run check:ci still runs fast then deep for a local full pass. The required check name Static checks is unchanged. Deep static checks is required only on the full tier, so a skipped deep job does not fail a fast PR. Provider needs stay changes + fast static + build where they already needed the build. They do not wait on deep static. The deep job records its task graph before the check and uploads static-deep-check-reports after a failure. The fast job still uploads static-check-reports.

Fast shared boundaries (src/process/, src/filesystem/, tool contracts, createServer, src/cli.ts, scripts/ci/) set code and the Linux runtime lane. A file with exactly one owner still selects that owner. A file listed by many lanes does not fan those lanes out. Reverse-tool inputs still select the reverse-tools quality gate. Standalone packet-capture, signal-recording, and Go binary workflows no longer trigger on shared CLI, process, or package files.

Built shards stay at five. The sequencer weights process-boundary at full file duration (those files are serial) and other projects at half duration (two workers), so serial files are not packed as if they overlapped.

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.

🔄 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/5634 **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-fast-deep-split-c2ad` --- ### 📝 Commits (8) - [`0609064`](https://github.com/morluto/rea/commit/0609064551e6c9a4a43d580ca5119ba15bf1bba3) ci: split fast and deep static checks - [`7dd0637`](https://github.com/morluto/rea/commit/7dd0637a4876df7bfd9ea889e57068937b5d50f0) ci: keep pull requests from writing the remote cache - [`d732cfb`](https://github.com/morluto/rea/commit/d732cfb58de22e6d3ef8089998cff9696461ed16) ci: forward the release cache token and upload deep static reports - [`9e4a93a`](https://github.com/morluto/rea/commit/9e4a93ae175892d9630fa932c8a7f6deba7e44a2) style: format the turbo cache policy test - [`be35aa5`](https://github.com/morluto/rea/commit/be35aa534893c605ecb57fdcfe787f8ced77eb05) ci: keep fast checks exclusive and trusted cache writes explicit - [`0120f70`](https://github.com/morluto/rea/commit/0120f70acbe890f49afaade2f7e4ceb2288f0580) ci: record static task graphs without nesting the artifacts lock - [`da89668`](https://github.com/morluto/rea/commit/da89668fb1bc110e254a889224b26c5b5fce32ca) ci: keep unauthenticated Turbo runs on the local cache - [`ba35bfd`](https://github.com/morluto/rea/commit/ba35bfd1b6d498e42575edfe73884712d607dd37) test(ida): treat unchanged invalid requests as nonretryable ### 📊 Changes **41 files changed** (+1042 additions, -167 deletions) <details> <summary>View changed files</summary> 📝 `.github/workflows/ci.yml` (+118 -8) 📝 `.github/workflows/mutation.yml` (+5 -0) 📝 `.github/workflows/real-agentenv.yml` (+16 -0) 📝 `.github/workflows/real-binary-layout.yml` (+16 -0) 📝 `.github/workflows/real-browser.yml` (+16 -0) 📝 `.github/workflows/real-cutter.yml` (+8 -0) 📝 `.github/workflows/real-evm-interface.yml` (+16 -0) 📝 `.github/workflows/real-ghidra-windows.yml` (+5 -0) 📝 `.github/workflows/real-go-binary.yml` (+5 -12) 📝 `.github/workflows/real-hopper-linux.yml` (+5 -0) 📝 `.github/workflows/real-hopper.yml` (+5 -0) 📝 `.github/workflows/real-javascript-recovery.yml` (+16 -0) 📝 `.github/workflows/real-packet-capture.yml` (+7 -11) 📝 `.github/workflows/real-recorded-crash.yml` (+16 -0) 📝 `.github/workflows/real-signal-recording.yml` (+7 -11) 📝 `.github/workflows/real-termux.yml` (+5 -0) 📝 `.github/workflows/real-web-network-captures.yml` (+16 -0) 📝 `.github/workflows/real-web-runtime.yml` (+16 -0) 📝 `.github/workflows/real-web-source-map.yml` (+16 -0) 📝 `.github/workflows/release.yml` (+9 -0) _...and 21 more files_ </details> ### 📄 Description <!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Summary Fast pull requests no longer run Knip, duplication, architecture guards, test discovery, or the Python producer before provider lanes are admitted. Those checks move to a separate full-tier job. Fast broad fallbacks keep the portable suite and the Linux x64 runtime baseline. Measured timings from 2026-10-20, on the pre-split workflow, say the static pile is an admission delay of under a minute when runners are free. The uncontended wall is the slowest built Vitest shard, about 15 minutes. Contended runs of 70–85 minutes were runner queue, with the same shard execution still about 10–16 minutes. ## Problem and expected behavior Fast PRs should admit providers after typecheck, built lint, format, and the portable build. Deep static, coverage, the multi-host package matrix, and Intel macOS stay on `ci:full`, schedule, manual dispatch, and release qualification. ## Change and scope Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). This is CI orchestration only. It does not change provider execution, target mutation, or product kernel behavior. Maintainer scope decision: not applicable. ### What runs where | Tier | When | Static | Tests | Providers and hosts | | --- | --- | --- | --- | --- | | Fast | Default PR and ordinary main push | `check:ci:fast`: typecheck, `lint:built`, `format:check` | Source job plus 5 built shards, coverage off | Path-owned lanes only. Broad fallback is Linux x64 runtime, not the 3-host matrix | | Full | `ci:full`, schedule that is not reused, `workflow_dispatch`, release qualification | Fast static, plus separate **Deep static checks**: Knip `--cache`, metadata, jscpd, `scan:todos`, architecture guards, test discovery, Python | 6 shards with coverage | Every lane, including Intel macOS | | Reused | Hourly schedule with a fresh exact-SHA full receipt | None | None | None; no new receipt | `npm run check:ci` still runs fast then deep for a local full pass. The required check name **Static checks** is unchanged. **Deep static checks** is required only on the full tier, so a skipped deep job does not fail a fast PR. Provider `needs` stay `changes` + fast static + build where they already needed the build. They do not wait on deep static. The deep job records its task graph before the check and uploads `static-deep-check-reports` after a failure. The fast job still uploads `static-check-reports`. Fast shared boundaries (`src/process/`, `src/filesystem/`, tool contracts, `createServer`, `src/cli.ts`, `scripts/ci/`) set code and the Linux runtime lane. A file with exactly one owner still selects that owner. A file listed by many lanes does not fan those lanes out. Reverse-tool inputs still select the reverse-tools quality gate. Standalone packet-capture, signal-recording, and Go binary workflows no longer trigger on shared CLI, process, or package files. Built shards stay at five. The sequencer weights `process-boundary` at full file duration (those files are serial) and other projects at half duration (two workers), so serial files are not packed as if they overlapped. ## 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. <!-- CURSOR_AGENT_PR_BODY_END --> --- <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:39 +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#7005
No description provided.