Repository navigation
Retain test timings and use measured four-way Linux CI sharding - #2039
Merged
Merged
Conversation
JacobStephens2
marked this pull request as ready for review
November 11, 2026 17:20
2026-11-11T17:33:28Z, host dev.etadventures.com. Uncommitted work at the time of failure is included in this commit.
JacobStephens2
marked this pull request as draft
November 11, 2026 17:33
…limits (#2031) The benchmark-report job combined gh api --slurp with --jq, which gh rejects; collect paginated jobs with jq -s instead, reproducing the warm benchmark table from run 43060539830. The failure probe now fails one of four partitions. Drop the unrequested --locked from the test compile step, tie benchmark phases to the workflow's step names with a test, and update the job-limit table and ARM description for the partitioned jobs.
JacobStephens2
marked this pull request as ready for review
November 12, 2026 01:22
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Per-test timings are kept for 14 days, with summaries of per-binary totals, the slowest tests and partition balance. An opt-in benchmark compares one, two and four workers at the same revision. Event policy, ARM opt-in, cancellation, tooling checks and Release dependencies are unchanged. No test exclusions, retries or deadline changes are added.
Closes #2031
Evidence
Execution evidence
benchmark-reportpipeline, run against warm benchmark run 43060539830, failed withunknown flag: --slurp, thenci-timings: Expecting value: line 1 column 1 (char 0). Newer gh also rejects--slurptogether with--jq.After:
gh api --paginate ".../runs/43060539830/jobs?per_page=100" --jq '.jobs[]' | jq -s . > jobs.json; python3 scripts/ci-timings.py benchmark <dir>prints the documented warm table, for examplebenchmark (ubuntu-24.04, [1,2,3,4]) | 514.0 | 31.05 | successandbenchmark (ubuntu-24.04-arm, [1]) | 1342.0 | 22.22.deb46450.After: probe=failure 43131195970 ran at
d8e6b3cb.run (1)failed on each architecture while runs 2–4 succeeded, andcomplete,testandtest-linux-armall failed. probe=skipped 43131198843 also failed all three gates.Compile testsstep makes the newtest_benchmark_phases_follow_the_actual_workflow_step_namesfail (phase='compilation').After: with the real step names,
python3 -m unittest discover -s scripts -p 'test_*.py'passes all 64 tests.13290404passed. That includes all four partitions and thecompletecoverage check on both architectures (ARM opted in), thetestandtest-linux-armgates, tooling, and the PR Release checks.scripts/affected-tests mainselected the full suite and fell back tocargo test. One test failed under load:triage_pass::recommendation_only_pass_reserves_without_claiming_or_publishing_and_notifies("the agent never started"). It passes when re-run alone withcargo test --test triage_pass recommendation_only_pass_reserves_without_claiming_or_publishing_and_notifies -- --exact. This branch changes no Rust source or tests.The cold and warm benchmarks use the same revision,
deb46450, on hostedubuntu-24.04andubuntu-24.04-arm.Four workers took 62–68% less elapsed time than one, at 16–34% more runner minutes. Compared with two workers, they took 36–44% less time at 9–17% more runner minutes. The differences exceed the observed sample variance, but two samples don't promise a typical speedup.
docs/ci-performance.mdbreaks out start delay, setup, compilation, cache and report transfer, and execution. It also explains why the workers build independently: no build archive was introduced or benchmarked.Review coverage
Reviewed against
refs/remotes/origin/main(merge-baseacb42c1f). Standards raised 11 findings: 2 doc drifts and 9 judgement-call smells. Spec raised 6. Both reviewers read all eight changed files. Unread changed files: none. Generated-output exclusions: none.Fixed:
verify(Standards 8).benchmark-reportpagination (Spec 2).--lockedremoved (Spec 5).Unaddressed findings
Standards
rust-armandtest-linux-arm(.github/workflows/ci.yml). GitHub Actions can't share a named expression across jobs. The gate needsalways()plus the same condition, so it is skipped rather than failed when ARM isn't opted in. This mirrors the existing ARM policy from Release an ARM Linux build so the installer and thirdshift update work on aarch64 Linux #1663.partitionsandnightlyexpressions repeated per architecture (ci.yml,rust-x86andrust-arm). They are inputs to a reusable workflow, and a combined input would hide nightly'scargo testchoice inside a partition list.probe/nightlystep conditions (.github/workflows/rust-tests.yml). Splitting them into separate jobs would add runners and duplicate the toolchain setup. This is a judgement call.rust-tests.yml,env:blocks andcomplete).strategy.job-totalisn't visible to thecompletejob, which is whyPARTITIONSis counted there.scripts/ci-timings.py,main). Cosmetic, in a 170-line CLI.scripts/ci-timings.py). The three commands share the JUnit and inventory parsing, and the module is small.scripts/test_ci_timings.py). Each scenario restores the state it changed. The import stays local becausescripts/is only importable under unittest discovery.Spec
scheduleand push-to-mainruns use main's workflow file, so this PR branch can't exercise them before merge. The gates use the sameneeds.*.result == successcommand thattest_actual_workflow_gates_reject_failed_cancelled_skipped_or_missing_workruns for success, failure, cancelled, skipped and missing results. The event-policy expressions for push and unlabeled PRs are unchanged from main.rust-tests.yml,taiki-e/install-action@v2).ci-timings.py verifyparses the JSON fromnextest list --message-format json. The pin keeps that format, and the benchmark revision's comparisons, stable.docs/ci-performance.mdrecords the version.if: always()andif-no-files-found: error. This gap is stated indocs/ci-performance.md.Security review outcome
No unaddressed introduced findings.
Merge Danger
Door: two-way
The workflow and partition count can be reverted.
Blast Radius: CI
Four workers trade more runner minutes for less elapsed time, and scarce runner capacity can add queue delay. The stable architecture gate can pass only when every required partition and its exact coverage check succeed.
Built with claude 2.1.314 · opus · default effort