Continuous integration

August 12, 2026 ยท View on GitHub

This document describes what runs in GitHub Actions and how it relates to local pytest (pytest.ini).

Linux PR gates shard the full unit corpus (backend/tests/unit) across six jobs and run integration, e2e, and stress in gates-on-linux-extended. Their coverage artifacts are combined and enforce 74% in gates-on-linux-coverage-report. Windows and macOS run the full unit corpus, then the same extended tier after unit gates pass.

For release tagging and GA promotion, see RELEASE_CHECKLIST.md.

Required checks on pull requests

WorkflowJobWhat runs
Run Python Testsgates-on-linux-coverage-{a,b,c,d,g,e} + reportFull unit corpus on Linux with sharded coverage; the report also combines the extended-suite artifact and enforces 74% (--fail-under=74). Execution shards (D/G) skip compileall; syntax is gated on other shards.
Run Python Testsgates-on-linux-extendedIntegration, e2e, and stress suites on Linux; its coverage artifact is required by the final coverage-report job.
Run Python Testsgates-on-windows (3.12 + 3.13)Full unit corpus cross-platform smoke.
Run Python Testsgates-on-windows-extendedIntegration, e2e, and stress suites on Windows (runs after unit gates pass; Python 3.12).
Run Python Testsgates-on-macosFull unit corpus on macOS.
Run Python Testsgates-on-macos-extendedIntegration, e2e, and stress suites on macOS (runs after unit gate passes).
Run Python Testsgates-on-linux-py313Full unit corpus on Python 3.13 (runs after Linux extended).
Lintlint-python, version/workflow consistency, mypy, repository hygieneSee .github/workflows/lint.yml.
CodeQLanalyzeStatic security analysis for Python on PRs and main.
Security Scan (Bandit)BanditPython SAST; fails on medium/high findings. See .github/workflows/bandit.yml.
Dependency Reviewdependency-reviewBlocks high-severity dependency risk on pull requests.
Dependency Audit (pip-audit)pip-auditAudits locked runtime dependencies for known CVEs.
CLI Regression Tests(when paths match)CLI integration smoke and selected orchestration tests; see .github/workflows/e2e-tests.yml.
Smoke Installsmoke-installClean venv wheel install + source onboarding smoke (scripts/smoke/smoke_install.*, scripts/smoke/smoke_source_onboarding.*) on Linux and Windows; see .github/workflows/smoke-install.yml.

Advisory (not release-blocking today)

JobNotes
Heavy / Integration TestsMarker-filtered heavy | integration | benchmark slice; runs on main, schedule, and manual dispatch only.

Coverage

The 74% gate combines the six Linux unit-shard artifacts with the Linux integration/e2e/stress artifact in gates-on-linux-coverage-report. Windows and macOS extended suites do not contribute to this percentage.

Codecov upload runs from the coverage report job with fail_ci_if_error: false (upload failure does not block the merge). The enforced threshold is coverage report --fail-under=74, matching pyproject.toml.

Heavy / integration / benchmark tier

The Heavy / Integration Tests job in py-tests.yml runs only when:

  • the workflow is scheduled,
  • manually dispatched, or
  • the push is to main.

It executes: pytest backend/tests -m "heavy or integration or benchmark".

Markers are defined in pytest.ini. That job is marker-filtered over the full tree. A bare local pytest (no path arguments) still collects all of backend/tests per testpaths; narrow with pytest backend/tests/unit or add -m when you want a smaller slice.

Local equivalents

CI jobLocal command
Linux unit + coverage approximationPYTHONPATH=. uv run pytest --cov=backend --cov-fail-under=74 backend/tests/unit
Windows unit smokePYTHONPATH=. uv run pytest backend/tests/unit
Integration / e2e / stressPYTHONPATH=. uv run pytest backend/tests/integration backend/tests/e2e backend/tests/stress
Lintpre-commit run --all-files and uv run mypy --config-file mypy.ini

What to run before opening a PR

See Contributing โ€” testing.

Support stance for announcement copy

For public release messaging, align claims with Support Matrix:

  • Linux, Windows, and macOS are officially supported with unit gates plus extended integration/e2e/stress coverage on all three platforms.