From the review: git patch-id --stable ignores whitespace, so a conflict resolution that only
respaced the change (inside a string, or Python indentation) counted as no change and was
carried; --verbatim compares every byte. And a passing run is now taken only from this pull
request (by number, or for a fork, where GitHub lists none on the run, by head repository and
branch), not from another pull request with the same head commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT
From the review of this PR:
- What counts as code lives only in scripts/ci/affected.py now: nothing selected and not full
means no code changed, on pull requests and pushes to main alike. The untested bash copy in
Select checks disagreed with it. Root files and folders a crate embeds now select that crate
(the licence texts and NOTICE: the engine; skills/: the MCP server's tests), where before a
change to them ran no test at all. Other workflows and the bots' scripts select nothing.
- A push to main skips the native jobs only when nothing a build reads changed since the last
push to main whose run passed. Comparing with the push just before was unsafe: a newer push
cancels a waiting run, so that commit may never have been tested.
- Fail fast applies to pull requests only. On main, nightly and Run workflow the test build and
the shards run regardless of the repository checks, so the action matrix and property tests
that hang off Build tests keep their signal. Doc tests (main and nightly only now) no longer
wait for the checks.
- tests/robustness/ turns on the goldens, so a change to goldens.json runs the seed tests.
- tests/oracle/ no longer selects the kernel, which never reads it.
- The workflow header and CONTRIBUTING describe what main and pull requests now run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT
A change that merged main twice in a row ran the full set on every other push: the change before
the second merge was itself a carried run, its shards skipped, so it had no passing shards to
carry. The script now walks down the first parents through consecutive merges of main that kept
the change's patch (each equal to the next), at most 10, to the run where the shards ran.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT
Merging main into a pull request (Merge branch 'main', or GitHub's Update branch) restarted the
whole run. Over three days 1,241 such merges started 966 runs and about 21,000 runner-minutes, and
872 of the merges brought in nothing that touched the pull request's files. Select checks now
recognises the case (scripts/ci/main_merge.py): HEAD is a merge whose other parent is on main, the
change's own patch is unchanged (git patch-id), and a ci.yml run of the change before the merge
passed with its test shards. Then only the repository checks run, the ci job names the passing run
in its summary, and main tests the merged result after it lands. Anything else, or any doubt,
runs the full set as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT
- Pushes to main use the same code/no-code rule as pull requests (`touches_code` in Select
checks): a push changing only documentation, packaging, other workflows or the bots' scripts
runs the repository checks only. With the merge queue off, every push to main ran the full suite
and the Windows jobs, docs-only ones included.
- affected.py: test data under tests/ selects the packages that read it (robustness, hole matrix,
projection, taper: solidcraft-engine; oracle: the CLI, the kernel, xtask; action matrix: the
CLI, the engine, xtask), and a vendored crate the packages that use it (truck: the kernel and up;
egui-wgpu: the UI and the apps), instead of the whole workspace. tests/tools and unknown vendored
crates still select everything.
- Docker (the web app image) skips pushes touching only docs, test data or bot scripts; Pages skips
test data and bot scripts; Generated files runs only when the manifests, lockfile, command
registry, CLI or xtask change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT
assets/locales/ belongs to no crate, so affected.py selected the full
workspace (every crate, all four test shards) for a catalog-only PR. Only
solidcraft-ui-egui embeds the catalogs and xtask checks them; map the folder
to those two packages and their dependents.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
On the self-hosted-fast runners /proc/meminfo isn't readable, so awk exited 2 and failed every
job the sizing step runs in (Doc tests on #2509 and #2510, on minisforum-fast-2 and -3) before
compiling anything. Sizing is an optimisation: without a readable memory figure (meminfo or a
numeric cgroup limit) the script now sets nothing and Cargo keeps its default. Also drops
`set -e`, so no other probe can fail the job.
Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT
Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Build tests on the untrusted runners (fork PRs, gVisor on shared boxes) fail intermittently with
rustc killed mid-crate ("exit status: 2", no diagnostic) on the biggest crates: solidcraft-engine,
ui-egui. Nothing limits Cargo's parallelism, so it starts one rustc per core the sandbox reports.
scripts/ci/build-jobs.sh sets CARGO_BUILD_JOBS from the memory available (and the cgroup limit,
where lower) at 3 GB per job, capped at nproc, and logs the numbers it saw.
Claude-Session: https://claude.ai/code/session_01QWhMwdqJYQKQq8RCLSL1LT
Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Clippy, the doc tests and test shards 1-2 of pushes to main and merge-queue
groups run on the self-hosted runner, alongside GitHub's runners for
everything else. Pull requests, the nightly run and Run workflow stay on
GitHub's runners. Clippy and the doc tests keep warm build directories
outside the checkout (scripts/ci/warm-target.sh).
The test archive is still built on GitHub's runners: the self-hosted
machine has a newer glibc, so binaries built there don't start on
ubuntu-24.04.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clippy, the test archive and the test shards cover the packages a PR changes plus their dependents. Main, nightly and manual runs stay full.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>