Skip to content

perf(ci): boot the built web client in Build and Typecheck, not Test Web (about 22 s off the longest job) - #30752

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
Pyseph:perf/ci-boot-check-in-build
Nov 6, 2026
Merged

maria-rcks merged 1 commit into
pingdotgg:mainfrom
Pyseph:perf/ci-boot-check-in-build

Conversation

@Pyseph

@Pyseph Pyseph commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

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 build and verify-built-boot.ts after the tests. It takes 21-24 s (median 22 s) and uses nothing from the tests: it needs apps/web/dist and Chromium. About 16 s of it is the script waiting for the client's own ~15 s session retry. Build and Typecheck already builds the same apps/web/dist (build:desktop -> t3#build dependsOn @t3tools/web#build) and is short (45-54 s) and idle at the end.

Change

.github/workflows/ci.yml only:

  • Remove the step from test_web.
  • Add it to build, after "Verify preload bundle output", with the same four Playwright/Chromium steps test_web uses (same cache key, so no new download). The Chromium steps run after the apt install has finished, so install-deps cannot race it for the dpkg lock.
  • Gate: every added step has !cancelled() && steps.build.outcome == 'success' && needs.changes.outputs.test_web != 'false'. ci-changes.cjs sets build whenever test_web is true, so the Build job exists on exactly the PRs where Test Web ran.
  • The boot step gets 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.yml has its own copy (release path, not a PR wait): untouched.

Unchanged: permissions, secrets, the Check aggregate job (build and test_web are both in its needs; a failing boot step fails Build and Typecheck, which fails Check), step env (none in either job), the script and its working directory (repo root, apps/web/dist).

Differences to state:

  • The built client now boots in the Build job's environment after the desktop build. The web build is not task-cached in either job (vp build ⊘ cache disabled in both logs), the server build only copies apps/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.
  • The check now also runs when the web tests fail (before, it ran after them in the same job).
  • A failure earlier in the Build job (apt, Electron setup, desktop build) now shows the boot check as skipped; the Build job fails anyway, so merge stays blocked.
  • Build and Typecheck gets about 14-20 s longer. In every one of the 15 runs it still finishes well before the longest job (worst case about 204 s against 307 s).

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, and ci.yml is unchanged upstream since this branch's base.

Verification

Numbers from the 15 newest successful ci.yml runs (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:

Critical-path saving per run (s), by job finish times 24, 1, 22, 24, 8, 18, 22, 23, 23 and 0 (Test Server 4 was longer)
median / mean over the 10 runs 22 s / 18.6 s

Test Web median 236 s -> about 214 s.

Checks run: actionlint 1.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:desktop already produced it), the Chromium cache hit so the install step was skipped, and install-deps passed. 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).

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.
@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Nov 4, 2026
@coderabbitai

coderabbitai Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

No actionable comments were generated in the recent review.

Walkthrough

The CI workflow adds built-client boot verification to the build job when web tests are enabled. The test_web job no longer builds or boots the client, and it continues to run the web test suite.

Changes: Web client CI flow

Layer / File(s) Summary
Move boot verification to build job
.github/workflows/ci.yml
The build job resolves the Playwright version, reuses or installs the matching Chromium browser, installs missing system dependencies when needed, and verifies the built client with a three-minute timeout. The test_web job no longer builds or boots the client. Its web test step remains.

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Other

Possibly related issues

  • pingdotgg/t3code#28013 — The change removes build-and-boot work from the web test job, which may reduce runner contention related to the reported timeout. It does not change the test timeout or test logic.

Suggested labels: size:M

Suggested reviewers: t3dotgg

Merge Risk: Minimal · up to 1203b

The boot check moves to the build job. No merge-blocking issue was established.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title names the main change: the built web client boot check moves from the Test Web job to the Build and Typecheck job, which matches the raw summary and PR objectives. It uses the conventional c…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Description check Passed The pull request description is complete and follows the required Problem, Change, Scope and approval, and Verification sections. It explains the performance problem, implementation details, scope, te…
Full details: Title check

Explanation

The title names the main change: the built web client boot check moves from the Test Web job to the Build and Typecheck job, which matches the raw summary and PR objectives. It uses the conventional commit prefix and gives the expected time saving. The 'perf(ci)' prefix fits a CI performance change.

Full details: Description check

Explanation

The pull request description is complete and follows the required Problem, Change, Scope and approval, and Verification sections. It explains the performance problem, implementation details, scope, test results, observed CI results, limitations, and agent usage. It does not link an issue or provide explicit maintainer approval, but it gives a focused-scope rationale for this established CI capability.

Finishing Touches
Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 8b44f42 and 1203b99.

Files selected for processing: 1
  • .github/workflows/ci.yml

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review.

@maria-rcks

maria-rcks commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-6.1-sol on behalf of Maria

Verified in a real dev environment

verified head 1203b99b71ea225da6051afe0a151d2861ef5e6c as-is on a disposable linux vm. no source changes were needed.

  • checked github/main (8b44f42b) first in a separate worktree. its desktop build passed, then the original redundant web-build-plus-boot command passed in 21.60 seconds on blacksmith.
  • on the exact pr head, vp run build:desktop, preload verification, and verify-built-boot.ts passed on blacksmith. the boot check consumed the desktop build's existing web output without rebuilding it. workflow formatting passed.
  • started main and pr dev servers sequentially with isolated empty state. used repo playwright and /usr/bin/google-chrome to create the real git project through the ui and submit real codex gpt-6.1-sol turns. both returned ci boot verification ready.
  • on the pr, reloaded history and completed a follow-up turn. then downloaded the successful desktop build's production web output, served its hashed assets through the running server, and submitted another real codex turn. it returned production build and codex verified, with no page errors during that turn. all three pr runs persisted as completed with gpt-6.1-sol.
  • inspected ci run 41810223239: the moved boot step passed in build and typecheck, typecheck reported afterward, and test web no longer contained that step. reviewed the gates and aggregate dependency. latest github checks: 26 successful, 3 skipped, no failures or pending checks.

command and runtime transcript

main, matching prompt and real provider response:

main real codex response

pr, matching prompt and real provider response:

pr real codex response

production client submitting and completing a real codex turn. animated recording for github; mp4 playback and seeking also checked:

production client real codex turn

Not verified

no 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants