ci(gui): fold the smoke steps into build + test and unify the drive legs - #209
Merged
Conversation
The launch smokes now close each `gui build + test` leg, reusing that job's debug binary instead of paying a second checkout, cache restore and rebuild per OS. The assisted and injected walks share one `gui drive` job per arch for the same reason, each keeping its own gallery directory, artifact name and verdict; the injected walk runs under `!cancelled()` so an assisted failure cannot suppress it. Cache scopes drop from three sharing `gui-drive` to one. The merged drive job caps at 45 minutes, above the ~510 s its slowest arch spends on a cold build plus both walks; `gui build + test` gains the same cap, which the deleted smoke job carried against a window that never exits.
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.
Removes duplicated fixed cost inside
gui.ymlwithout dropping an assertion.Shape
gui build + test, 5 xgui smokegui build + test(launch smokes inside)gui drive assisted+ 5 xgui drive injectgui drivegui drive mosaicneeds: [drive]The smoke job re-paid a checkout, a rust-cache restore (41.6 s average across
the GUI legs) and a rebuild to produce the debug binary the same OS build+test
leg had already built. The two drive jobs built the identical drive-seam debug
binary twice per arch.
Step mapping
matrix.os == 'macos-15'Install cliclick + displayplacerUpload the assisted gallery (evidence either way)Upload the inject gallery (evidence either way)Adapted steps
Build (debug ...)steps collapse to one per job. Both smoke and driveran a plain
cargo build --lockedof this crate under this workflow's env,identical to build+test's existing Build step, so one build serves both
consumers in each merged job. The drive job's step is renamed
Build (debug - the drive seam and the env hooks are debug-only).names; the drive job keeps the inject step's superset name. The two macOS
brew steps keep the inject step's
cliclick + displayplacername.assisted/injectso a single jobdoes not carry two identically named steps. Artifact names, paths inside the
artifacts and retention are unchanged, so
gui drive mosaiccomposes thesame 2 x 5 grid from the same
gui-drive-*pattern.Launch smoke (paravirtual Metal)keys onmatrix.os == 'macos-15'insteadof
runner.os == 'macOS': the build+test matrix also carriesmacos-15-intel, whose hosted VMs expose no Metal and which the smoke matrix
deliberately omitted.
Separation of verdicts
Each walk writes its own gallery directory (
gallery-assisted/gallery-inject), and the three inject steps run under!cancelled(), so afailed assisted walk still produces the injected walk's verdict and evidence -
what two separate jobs gave before. Both uploads keep
if: always().Timeouts
Per-arch step p90 over 20 runs per leg (2026-08-02): the slowest arch,
windows-2025, spends ~200 s on the assisted walk, ~175 s on the injected walk
and ~130 s on a cold build.
gui driveis capped at 45 minutes.gui build + testhad no cap; it inherits 45 minutes as well, since the launch smokes itabsorbed open real windows and the deleted smoke job carried a cap for that
reason.
Cache scopes
smoke,drive-assistedanddrive-injectshared onegui-driverust-cachelineage; only the merged
drivejob uses it now, and the smoke build ridesbuild+test's own scope. The lineage name is kept explicit rather than
defaulting to the job id, so the existing archive stays addressable across the
job rename.
Checks
action-validator,ryl -s .,zizmor,typos,taplo fmt --checkandclassify-diff.ps1 -SelfTestpass locally. No required status check matches aninner
gui.ymljob name (ci-ok,conventional commits + banned words,dependency-review,analyze (rust)), and no sweep marker key, script orother workflow referenced the removed job names.