CI Reference¶
This page documents the structure of the Stillwater CI pipeline. It is generated automatically from .github/workflows/ci.yml by cmd/gen-ci-reference and reflects the current job dependency graph and test matrix configuration.
Job Dependency Graph¶
flowchart TD
a11y_summary["A11y Smoke Tests (Playwright + axe-core)"]
a11y_test["A11y Smoke Tests Check"]
build["Build"]
build_matrix["Build Matrix (${{ matrix.goos }}, ${{ matrix.goarch }})"]
cache_usage["Cache Usage Check"]
changes["Detect Changes"]
coverage_floor["Coverage Floor Check"]
coverage_floor_summary["Coverage Floor"]
coverage_upload["Upload Coverage"]
css_lint["CSS Lint"]
docker["Docker Build"]
go_cache_primer["Go Cache Primer"]
js_test["JS Unit Tests"]
lint["Lint Check"]
lint_summary["Lint"]
test["Test Shard"]
test_summary["Test"]
changes --> a11y_summary
a11y_test --> a11y_summary
changes --> a11y_test
changes --> build
build_matrix --> build
changes --> build_matrix
lint --> build_matrix
coverage_floor --> build_matrix
changes --> coverage_floor
test --> coverage_floor
changes --> coverage_floor_summary
test --> coverage_floor_summary
coverage_floor --> coverage_floor_summary
changes --> coverage_upload
test --> coverage_upload
changes --> css_lint
changes --> docker
lint --> docker
test --> docker
coverage_floor --> docker
changes --> go_cache_primer
changes --> js_test
changes --> lint
changes --> lint_summary
lint --> lint_summary
changes --> test
changes --> test_summary
test --> test_summary
Test Matrix Shards¶
Test shards are computed dynamically at runtime (see the test_matrix output in ci.yml).
Test Aggregator Pattern¶
The test-summary job owns the "Test" check name that branch protection
requires. It runs under always() so a check result is always posted even
when individual shards fail or are canceled.
This pattern decouples the matrix shard count from branch protection rules:
shards can be added, removed, or renamed without updating the required-checks
list. Branch protection requires one check ("Test") and test-summary
always reports it -- passing only when every shard in the matrix succeeds.