Skip to content

perf(ci): run merge-group validation on the hosted lane and measure it (iac#1349 phase 0.5) #2349

Description

@willgriffin

Phase 0.5 of happyvertical/iac#1349 for this repository — the epic's own stated
precondition before any routing work.

Context

merge_group full mode (Build, Coverage Gate, test-core ×3, test-packages
×3, Typecheck, publish-dry-run prepare) has never run on GitHub-hosted
runners
. Everything we know about hosted comes from run
30969467329,
which was pull_request_target / affected mode.

A fresh 12-run measurement of both lanes shows the fleet is the whole wall
clock: merge_group median 47 min (33–71), merge-queue transit per PR median
53 min (mean 83, max 217), and queue wait is 40–80% of fleet job-time on
the slow runs. Observed running concurrency on arc-happyvertical-nodocker
plateaus at 4–6 against 8 nominal slots; in run 31983234153 the fan-out sat
0-running/16-queued for ~10 min after Build finished. Worst single wait: Build
queued 3899 s (65 min) in run 31672411209. Meanwhile hosted is free and
unmetered on this public repo, is a larger box (4 vCPU / 16 GiB vs the pod's
3 CPU / 14 GiB), and did a full clean build in 6.0 min vs a 1005 s median on
the pod.

Scope / Deliverable

  • Flip repo variable CI_HOSTED_FALLBACK_ENABLED=true for a bounded window
    covering ≥10 merge_group transits and ≥10 PR runs, then flip it back.
  • Record per-job queue (started−created) and duration (completed−started)
    plus run wall clock for both lanes, hosted vs the fleet baseline above, into
    the .github/CI.md Phase-0 table and as a comment here.
  • Measure the four matrices with and without max-parallel: 2 — that cap
    exists to be polite to an 8-slot fleet and is pure throttle on hosted (Team
    plan allows 60 concurrent jobs).
  • Decide steady state: make hosted the workflow default (delete the
    CI_HOSTED_FALLBACK_ENABLED runs-on expressions outright) or revert.

Expected during the window, not a regression: on pull_request_target the Turbo
shim and the pnpm-store actions/cache are refused (main-scoped write path), so
PR builds are cold — that was 8.1 min in the rehearsal. merge_group and
main get both the shim and the turbo-cache-seed.yml seed.

Acceptance criteria

  • Comparison table posted here and in .github/CI.md with run ids, per-job
    queue/duration medians and p90, and run wall clock for ≥10 merge groups and
    ≥10 PR runs on hosted.
  • A max-parallel on/off comparison for the four matrix jobs.
  • An explicit go/no-go on hosted-as-default. If go, a follow-up issue to make it
    steady state (remove the lever expressions, retune job timeouts per CI.md's
    Job timeouts rule).

Out of scope

  • The capacity oracle and the route dispatcher (iac#1349 phases 1–2).
  • postgres-tests.yml — its services: container needs the dind lane.
  • Raising merge-queue concurrency. chore(policy): reconcile merge-queue authority for SDK migration gate #2262 tracks the max_entries_to_build: 1 /
    check_response_timeout_minutes: 180 drift from the have-config default of
    5/60; do not raise it until this issue shows capacity is elastic — more
    parallel merge groups against a 4–6 concurrency plateau makes transit worse,
    not better.

Links

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions