ci: check only the runs a PR changes, in parallel #5

Merged
asxpi merged 1 commit from ci/fast-check into main 2026-11-08 01:24:32 +00:00
Member

A PR check took ~14 min: full LFS pull (GBs) plus re-hash/scan of all ~830 run bundles.

  • PR path (check.yml): diff against the merge base with the base branch, git lfs pull --include only the changed runs, interop.py check only those. No changed runs: bundle check skipped (pyflakes, pytest and report --check still run; report reads only run.toml, plain git, so no LFS needed).
  • Full check still runs on pushes to main, nightly at 03:17 UTC (new schedule), and on PRs that change the rules: tools/interop.py, features/*.toml, clients.toml, servers.toml.
  • Parallel check: interop.py check -j N (default CPU count, -j1 sequential), process pool with output order and exit status unchanged (verified: identical output over all 834 runs, -j1 vs -j16). New pytest covers it.
  • nix run .#check -- RUN... checks the given runs; -- --no-runs checks none.

Local, 46 runs (2026-11-07/08, ~100 MB): -j1 9.3 s, -j16 4.3 s (bounded by one 38 MB server.log, 3.1 s alone); without that run 6.1 s → 1.4 s.

This PR changes tools/interop.py, so its own check takes the full-check branch.

🤖 Generated with Claude Code

A PR check took ~14 min: full LFS pull (GBs) plus re-hash/scan of all ~830 run bundles. - **PR path** (`check.yml`): diff against the merge base with the base branch, `git lfs pull --include` only the changed runs, `interop.py check` only those. No changed runs: bundle check skipped (pyflakes, pytest and `report --check` still run; report reads only `run.toml`, plain git, so no LFS needed). - **Full check** still runs on pushes to main, nightly at 03:17 UTC (new `schedule`), and on PRs that change the rules: `tools/interop.py`, `features/*.toml`, `clients.toml`, `servers.toml`. - **Parallel check**: `interop.py check -j N` (default CPU count, `-j1` sequential), process pool with output order and exit status unchanged (verified: identical output over all 834 runs, -j1 vs -j16). New pytest covers it. - `nix run .#check -- RUN...` checks the given runs; `-- --no-runs` checks none. Local, 46 runs (2026-11-07/08, ~100 MB): -j1 9.3 s, -j16 4.3 s (bounded by one 38 MB server.log, 3.1 s alone); without that run 6.1 s → 1.4 s. This PR changes `tools/interop.py`, so its own check takes the full-check branch. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ci: check only the runs a PR changes, in parallel
All checks were successful
/ check (pull_request) Successful in 9m17s
074cf0727c
A PR check took ~14 min: it pulled every run's LFS files (GBs) and
re-hashed and scanned all ~830 bundles, though a PR touches a few.

For a pull_request, check.yml now diffs the PR against its base
(merge base, full history: a few MB without LFS), pulls LFS only for
the changed runs and checks just those; with no changed runs it
skips the bundle check. report --check reads run.toml only, which is
plain git, so it needs no LFS. A PR that changes the rules
(tools/interop.py, features/, clients.toml, servers.toml) still
checks every run, as do pushes to main and a new nightly run at
03:17 UTC.

interop.py check runs the bundles in a process pool (-j/--jobs,
default one per CPU, -j1 sequential) with the same output order and
exit status. Workers get the parent's accounts path explicitly:
Python 3.14 starts them with forkserver, not fork.

nix run .#check takes the runs to check as arguments, --no-runs for
none.

Assisted-by: Claude:opus-5-5
asxpi merged commit a62b519480 into main 2026-11-08 01:24:32 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
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
another-im/interop!5
No description provided.