Every check that runs on a pull request, whether it blocks merge, and why it exists.
Every workflow below runs somewhere between opening a PR and merging to trunk. Blocking means the check must pass (or merge-gatekeeper won't let the PR merge). Advisory means it reports information — a comment, a label, a status — but merge-gatekeeper is explicitly configured to ignore it.
Blocking status here reflects the --ignored list in merge-gatekeeper.yaml at the time of writing. That list changes; treat the YAML file as the source of truth and this table as a snapshot.
trunk, plus merge_group events.| Workflow | Trigger | What it checks | Blocking? |
|---|---|---|---|
check-halted | PR opened/edited/reopened/synchronize to trunk, and merge_group | Reads the LaunchDarkly halt-releases flag. Fails (with a message pointing to #eng-releases) unless the PR is a [HF], Revert, or [CHE] title. | Blocking — an org-wide kill switch for incidents; halting stops all normal merges without touching individual PRs. |
pr-lint | PR opened/edited/reopened/synchronize/ready_for_review to trunk | Validates the PR title matches \[TICKET-123\], [HF], [BUMP], or Bump, and requests changes if not. | Advisory to merge-gatekeeper (listed as pr-lint), but a "request changes" review can still block merge depending on required-reviewer settings. |
codeql-pr | PR to trunk | Diffs the PR to build a per-language CodeQL matrix (only for languages that actually changed), then runs security analysis for each. | The Go leg (CodeQL analysis (go)) is advisory. The javascript-typescript leg — the one that fires for Dispatch changes — is blocking. |
check-eslint-suppressions | PR touching any turbo/**/eslint-suppressions.json | Diffs the total suppression count before/after; if it grew, requires an approval from the ux-core GitHub team before passing. | Blocking, whenever it runs — exists so growing lint-suppression debt gets an explicit sign-off instead of slipping through in a normal review. |
check-high-risk-changes | PR opened/synchronize/reopened/ready_for_review to trunk, and PR review submitted | Detects high-risk backend changes via .github/scripts/check_high_risk.py; if detected, requires approval from one of a small named set of senior approvers. | Blocking when high-risk changes are detected. Rarely fires for a pure Dispatch PR (it targets backend risk heuristics). |
codeowners-pr | PR opened/synchronize/reopened/ready_for_review to trunk | Validates CODEOWNERS has no gaps or duplicate patterns for files touched in the PR. | Advisory (codeowners-gap-checks is ignored). |
pr-label | Any PR event | Auto-labels the PR by changed paths (.github/labeler.yaml), plus a Go-dependency labeler when .go/go.mod/go.sum changed. | Advisory (triage job is ignored). |
These are scoped (via turbo --affected or explicit path filters) to changes that actually touch turbo/apps/dispatch, though some trigger on the broader turbo/** path and then decide internally whether Dispatch is affected.
| Workflow | Trigger | What it checks | Blocking? |
|---|---|---|---|
dispatch-ci | Push to trunk, PR, merge_group, and a nightly schedule — path-filtered to turbo/** and related scripts/actions | Dispatch's main pipeline: Biome lint/format, ESLint + circular-dependency check, strict TS typecheck (reported to Datadog), a 12-way sharded Vitest run with coverage, and a bundle/sourcemap upload step. Gated on turbo ls --affected actually including dispatch. | Blocking for lint, dep-check, typecheck, and each Vitest shard. merge-coverage (the coverage-diff PR comment job) is advisory. |
dispatch-bundle-size-alert | PR touching turbo/** or bundle-alert scripts, gated on Dispatch being affected | Builds the head bundle, compares against a cached S3 baseline for the base branch, and comments the size delta (5% threshold) on the PR. | Blocking — not in the gatekeeper's ignore list. |
frontend-lint-and-test | Push/PR touching turbo/** | Runs turbo run lint --affected (ESLint) and biome ci --changed across whatever turbo packages changed — broader than dispatch-ci's own lint jobs (whole workspace, not Dispatch-filtered). | Blocking. |
playwright-tests | Push to trunk touching turbo/apps/dispatch/** or turbo/apps/automation/**, and workflow_run completion of build.yaml ("Docker Build") | Runs Dispatch's Playwright integration and E2E suites against the already-built live-dispatch image (so it doesn't rebuild). Reports as commit statuses named Run Integration Tests / Run E2E Tests. | Advisory — both Playwright Tests and Run E2E Tests are explicitly in the gatekeeper's ignore list. This is worth knowing: the most thorough tests Dispatch gets do not block merge. |
Vercel – dispatch_vite | Every PR, automatically (skipped if turbo/apps/dispatch didn't change) | Vercel's GitHub integration builds Dispatch as a static Vite app (vercel.json in turbo/apps/dispatch) against CONFIG_ENV=development, so it talks to the real shared dev API. No label required — this is the default, fast way to see a Dispatch PR's frontend changes live. | Advisory (all Vercel checks are in the gatekeeper's ignore list). |
preview-argo-link / kill-old-pr-envs | PR labeled/unlabeled/synchronize (preview-argo-link); daily schedule (kill-old-pr-envs) | Opt-in via the preview label: spins up a full, isolated environment in its own ArgoCD namespace (pr-env-<PR#>) — its own backend stack, not just the frontend — and posts/updates a PR comment with the link. kill-old-pr-envs strips stale preview/fe-preview labels after 7 days of inactivity, tearing the environment down. | Advisory (cleanup-argo-link, sync-preview-env, wait-for-preview-env are all ignored). |
See Deployment for how to actually reach these preview links.
build.yaml is the workflow (its name: field is literally Docker Build) that builds and pushes the live-dispatch image PRs and Playwright tests depend on. There is a separate, differently-scoped reusable workflow file called docker-build.yaml (on: workflow_call only) used by dg-engine-ci, livekit-ingress-ci, and sip-proxy-kamailio-ci — Dispatch never invokes it. The similar filenames are easy to confuse when debugging a failed image build.