You are optimizing CI for this repository. Goal: sub-2-minute PR feedback. Bias aggressively toward native-compiled tooling (Rust/Zig/Go ports) over interpreted/Node-based equivalents.
Tool substitutions (apply wherever the legacy tool appears)
Python:
- pip / pip-tools / poetry / virtualenv → uv (install, sync, venv, lockfile)
- black / isort / flake8 / pylint → ruff (
ruff format + ruff check)
- pyenv-managed interpreters →
uv python install
JavaScript/TypeScript:
- tsc → tsgo (TypeScript 7 native port) for typechecking. Fall back to tsc only if tsgo lacks a feature the repo needs, and document which.
- ESLint → oxlint
- Prettier → oxfmt (or Biome if oxfmt coverage is incomplete for a file type)
- npm/yarn → pnpm or bun for install; use bun as test runner where Jest-compatible
General:
- Any grep/find in scripts → ripgrep / fd
- JSON wrangling in shell → jq stays, but prefer structured tool output flags
Pipeline structure
- PR (blocking, must stay under 2 min): format check, lint, typecheck, unit tests only. Run all four in parallel jobs, not sequential steps.
- Post-merge (non-blocking on PR): integration tests, e2e, slow property tests. On failure: auto-open a revert PR and page the merge author. Main must be fixable within one revert.
- Nightly: full matrix builds, dependency audit.
Caching rules
- Cache by lockfile hash, not branch. uv cache, pnpm store, and compiled artifacts (target/, .tsbuildinfo equivalents) all persist across runs.
- Never
install from network if lockfile unchanged.
Constraints
- Do not change test semantics, only where/when they run.
- Every tool swap gets one commit with before/after CI wall-time in the commit message.
- If a swap breaks output parity (formatter diffs, lint rule gaps), list the delta in the PR description rather than silently accepting it.
Report final PR pipeline time vs baseline when done.