Skip to content

CI jobs

The GitHub Actions workflows in this repo, what each job runs, and when.

<!-- source: .github/workflows/*.yml -->

Verify pipeline (ci.yml)

Runs on every push to main or develop and every pull request targeting them. A newer commit on the same ref cancels the run in progress. Every job installs with pnpm install --frozen-lockfile on the Node version in .nvmrc.

JobRunsNeedsFails when
lint-typecheckpnpm lint, pnpm typechecknonea lint or type error
repo-checkspnpm gen:schema --check, pnpm gen:events --check, pnpm gen:routers --check, pnpm check:tiers, pnpm check:modules, pnpm check:i18n, pnpm check:mcp, pnpm check:changelog, pnpm test:toolsnonea generated file is stale, a module boundary or completeness rule is broken, locale catalogs differ, a public-API route has no MCP decision, a changelog fragment is misnamed, or a repo-tool test fails
migration-driftpnpm check:migrations against a postgres:16-alpine service (SHADOW_DATABASE_URL)nonereplaying the committed migrations doesn't reproduce schema.prisma
unit-testspnpm test:coverage; uploads coverage/unit/ as artifact coverage-unitnonea unit test fails
integration-testspnpm test:integration:coverage; uploads coverage/integration/ as artifact coverage-integrationnonean integration test fails (each package boots a Postgres testcontainer)
coverage-uploadpnpm coverage:merge, then uploads every merged lcov.info to Codecovunit-tests, integration-testsa package is below its coverage floor, or emits coverage with no floor
ci-okchecks that every job above reported successall of the aboveany job failed, was cancelled or was skipped

ci-ok is the only status check branch protection requires on develop and main.

Codegen drift checks ignore line endings, so a CRLF file committed from Windows isn't drift.

Coverage floors

ItemValue
Where floors liveTHRESHOLDS in tools/merge-coverage.ts, one entry per package
Metrics per packagelines, statements, functions, branches
Package with no test:coverage scriptlisted as skipped, not failed
Package with coverage but no entryfails: "produced coverage but has no THRESHOLDS entry"
Suggested floorspnpm coverage:suggest prints floors from measured coverage

Other workflows

WorkflowTriggerWhat it does
deploy-api.ymlCI completes successfully on main or develop; manualDeploys monark-api, monark-cron-deletions and monark-cron-webhook-sweep (with -staging on develop) through the Render API and waits up to 20 minutes per service for a terminal state. No-ops without the RENDER_API_KEY secret.
e2e.ymlmanual onlyBoots Supabase, the api and the web app, then runs the Playwright suite.
lighthouse.ymlmanual onlyWeb performance and accessibility budget.
gitleaks.ymlpush to main / develop; pull request to mainSecret scanning (allowlist in .gitleaks.toml).
codeql.ymlpush to main / develop; pull request to main; Mondays 03:27 UTCStatic analysis.
dependency-review.ymlpull request to mainFlags risky dependency changes.
agent-attribution.ymlpull request to main / developFails a pull request opened by monark-agent that contains a commit authored by someone else.
changelog-compile.ymlpush to developRebuilds CHANGELOG.md from changelog.d/ fragments.
notify-docs.ymlpush to develop touching published docs; manualAsks monark-community/app-docs to sync. Skips with a notice without the DOCS_SYNC_APP_* secrets.
github-label-sync.ymlmanual onlySyncs the repository's issue labels.

Related: Maintain the CI pipeline, Environment variables.