feat/ci-speed
needs attentionviewing older commitca9f915 · fullpre-PRreviewed 2026-08-11 19:27 UTC1H · 4M · 4L · 2I- Purpose
- Cut CI gate latency — deployment_status trigger eliminates 287s Vercel build wait from E2E; Turbo remote cache cuts cold typecheck+lint
- Goal
- Reduce warm-path merge gate from ~11.5min to ~3-4min wall-clock
- Sub-goals
- SG-1: Switch e2e.yml to deployment_status trigger — E2E starts READY, not polling
- SG-2: Add TURBO_TOKEN/TURBO_TEAM to validate job — typecheck/lint warm-cache in seconds
- SG-3: Update e2e-testing.md docs to reflect new trigger mechanics
- What
- e2e.yml trigger rewritten from pull_request to deployment_status with new gate step resolving PR via /commits/:sha/pulls API; pr-checks.yml validate job gains Turbo remote cache env vars; e2e-testing.md CI section updated; docs/ci-cd-diagnosis.html added
- Why
- 287s of a 354s E2E green run was polling curl waiting for Vercel to finish building — tests themselves take 21s. Typecheck is 143s cold on every PR Checks run. Neither bottleneck is actual test/check work.
- Areas
- .github/workflows+123−55.claude/rules+29−19docs+127−0
- Blast
- CI infrastructure only — 4 files, +279/-74. No domain code, DB schema, or API surface changed. e2e.yml changes inert on feature branches (deployment_status GitHub constraint), active on merge to main.
Findings · 11
correctness3
No pass-through stub for non-preview branches — footgun if 'e2e testing' is re-required
.github/workflows/e2e.yml:25
branches outside feat|fix|hotfix|feature/* produce no platform deployment_status event, so the 'e2e testing' check never runs for those PRs. If re-required without a pull_request pass-through stub first, every docs/chore PR blocks forever on 'Expected — waiting for status.' Documented in the workflow header but no structural guard.
migration-lint excluded from 'All Checks Passed' summary gate
.github/workflows/pr-checks.yml:494
Pre-existing: summary job needs array omits migration-lint. A red migration-lint job does not block merge. Intentional (tracked MON-48) but worth noting.
PLATFORM_PREVIEW_URL set without PLAYWRIGHT_WEB_BASE_URL → 6-min hang on non-feat/* branch
.github/workflows/e2e.yml:160
Unusual config: only PLATFORM_PREVIEW_URL override set → web URL falls back to slug-derived (no web preview for non-feat/* branches) → wait-on hangs to 300s. Requires unusual operator error; slow failure not silent.
security1
Shell injection via inline step-output expansion of branch name
.github/workflows/e2e.yml:156
Resolve preview URLs step expands ${{ steps.gate.outputs.branch }} inline into shell at YAML evaluation time. A branch name with shell metacharacters could execute arbitrary code. Exploitable only by someone with repo push access. Fix: use env: BRANCH: ${{ steps.gate.outputs.branch }} and reference $BRANCH in the script.
conventions2
docs/ci-cd-diagnosis.html committed as permanent repo artifact
docs/ci-cd-diagnosis.html:1
One-time measurement/analysis document dated 2026-08-06. Findings are now encoded in workflow changes and e2e-testing.md. Will drift as CI evolves with no update mechanism. Consider keeping only in PR description or internal wiki.
pnpm/action-setup@v4 in e2e.yml vs @v3 everywhere else (pre-existing)
.github/workflows/e2e.yml:116
Pre-existing inconsistency. Both resolve to pnpm 10 via packageManager field. Cosmetic; worth normalizing in a follow-up.
tests3
New e2e.yml gate step cannot be CI-validated on this feature branch before merge
.github/workflows/e2e.yml:10
deployment_status only fires for workflow files on the default branch (GitHub platform constraint). The ~30-line gate step (PR resolution via API, supersession check, branch-pattern match) cannot be exercised by any push to this feature branch. Low-likelihood of error given careful authorship and logical code-path analysis, but structurally unverifiable before merge.
No Turbo remote cache hit observability — bypass is silent
.github/workflows/pr-checks.yml:34
If the remote cache silently fails (wrong team slug, token scope, network), typecheck/lint fall through to cold recompute with no CI signal. The .turbo fallback is a good safety net, but a cache-hit assertion would make warm/cold distinguishable.
Unit tests remain non-blocking (continue-on-error) — pre-existing P0 gap
.github/workflows/pr-checks.yml:83
pnpm test runs with continue-on-error: true. Diagnosis doc identifies this as P0 but PR does not address it.
improvement2
web wait-on at 300s may be conservative
.github/workflows/e2e.yml:190
deployment_status fires when platform is already READY; web usually finishes first. 300s is safe (exits on first success) but 120s would likely suffice.
No required checks enforced on main — speed improvements are moot without enforcement
docs/ci-cd-diagnosis.html:40
Ruleset 9729732 has no required status checks. Restoring enforcement (P0 per diagnosis) should accompany or precede this merge.