Repository navigation
perf(ci): boot the built web client in Build and Typecheck, not Test Web (about 22 s off the longest job) - #30752
Conversation
Test Web is usually the longest CI job and ended with a 22 s step (web build plus verify-built-boot.ts, which waits ~15 s for the client's session retry). Build and Typecheck already produces apps/web/dist via build:desktop, so the check runs there after Verify preload bundle output, behind the same test_web gate. The four Playwright/Chromium steps use the same cache key as Test Web and Test Server.
|
No actionable comments were generated in the recent review. Walkthrough
Merge Risk:
|
|
Note Written by Verified in a real dev environmentverified head
command and runtime transcript main, matching prompt and real provider response: pr, matching prompt and real provider response: production client submitting and completing a real codex turn. animated recording for github; mp4 playback and seeking also checked: Not verifiedno controlled end-to-end ci latency comparison, so this does not establish a guaranteed 22-second saving. github cancellation, induced boot failures/timeouts, and the browser cache-miss matrix were reviewed but not executed. native mobile and macos/windows desktop clients were not exercised on this linux vm. |



Problem
Test Web is the longest job of a PR that touches the web app in most runs. Its last step, "Boot the built web client", runs
vp run --filter @t3tools/web buildandverify-built-boot.tsafter the tests. It takes 21-24 s (median 22 s) and uses nothing from the tests: it needsapps/web/distand Chromium. About 16 s of it is the script waiting for the client's own ~15 s session retry.Build and Typecheckalready builds the sameapps/web/dist(build:desktop->t3#builddependsOn@t3tools/web#build) and is short (45-54 s) and idle at the end.Change
.github/workflows/ci.ymlonly:test_web.build, after "Verify preload bundle output", with the same four Playwright/Chromium stepstest_webuses (same cache key, so no new download). The Chromium steps run after the apt install has finished, soinstall-depscannot race it for the dpkg lock.!cancelled() && steps.build.outcome == 'success' && needs.changes.outputs.test_web != 'false'.ci-changes.cjssetsbuildwhenevertest_webis true, so the Build job exists on exactly the PRs where Test Web ran.timeout-minutes: 3. In its new place it runs before the Typecheck reporting step, so a hung browser must fail the step rather than reach the job's 10-minute timeout and lose the typecheck result. With the step timeout, Typecheck still reports.release.ymlhas its own copy (release path, not a PR wait): untouched.Unchanged: permissions, secrets, the
Checkaggregate job (buildandtest_webare both in itsneeds; a failing boot step failsBuild and Typecheck, which failsCheck), step env (none in either job), the script and its working directory (repo root,apps/web/dist).Differences to state:
vp build ⊘ cache disabledin both logs), the server build only copiesapps/web/dist, and in a sampled run (41800878785) all 1,170 hashed asset names from Test Web's build match the Build job's output.Scope and approval
A small, focused CI performance change: the same check runs on the same PRs and still blocks merge, only in a job that is off the critical path. If you'd rather discuss it first, I'm happy to move it to an Ideas discussion. Searched open and merged PRs for "boot the built web client" and
verify-built-boot: nothing moves it, andci.ymlis unchanged upstream since this branch's base.Verification
Numbers from the 15 newest successful
ci.ymlruns (gh run view --json jobs): Test Web ran in 10; the boot step took 21-24 s (median 22 s). Test Web was the longest job in 9 of those 10. In 3 of the 9 the next job finished within 1, 8 and 18 s of it, so the critical-path saving there is smaller than the step:Test Web median 236 s -> about 214 s.
Checks run:
actionlint1.7.12 clean (with the Blacksmith runner labels declared), YAML parse, step order and ids reviewed.This PR's own CI run (41810223239) exercised the moved step: in Build and Typecheck, "Boot the built web client" passed in 16 s (the web build no longer runs a second time, since
build:desktopalready produced it), the Chromium cache hit so the install step was skipped, andinstall-depspassed. Build and Typecheck took 67 s in total, against 45-54 s before. Test Web took 163 s without the step and was still the longest job; the next was Test Server 6 at 139 s. One run, so treat these as a spot check, not a median.Claude Sonnet 5.5 and Claude Opus 5.5 in T3 Code (Claude Code harness).