CI workflows and local checks
Table of Contents
Summary
GitHub runs no PR gate: the pr.yml workflow was deleted, including
its classifier, and branch protection has no required check. The
absorb-PR-checks-locally story's submit-PR skills classify the change
and run only the matching checks before raising the PR; the review is
the quality backstop on GitHub. GitHub keeps the continuous builds,
nightlies, site deploy, coverage, and housekeeping bots. This document
is the inventory, the fate of every check, and the classification rule
table.
Detail
The PR gate
There is no PR gate. The pr.yml workflow gated every pull request to
main until the gate-reduction task deleted it: the classify job
(the path classifier) and pr-gate (the sole required check, which
aggregated classify) went with it, and the branch-protection required
check was removed. The site, roundtrip, and drift checks it once ran
now run locally (see the fate table below).
The workflows that touch PR branches:
claude-code-review.ymlruns the automatic Claude review on every PR event (opened, synchronize, ready_for_review, reopened) — ~1-2 min.claude.ymlruns the review on demand via an@claudecomment.misspell.ymlruns the misspell fixer on every push to every branch and opens auto-fix PRs (a bot, not a gate).
Fate of each check
| Check | Fate | Where it runs instead / rationale |
|---|---|---|
| classify, site, roundtrip, cmake-sources-drift, codegen-drift, pr-gate | deleted with pr.yml | classify: path classifier, audit trail only — nothing consumed its buckets once the gate shrank. Site: local compass build --direct site (same emacs export; ~5-10 min locally); optional CDash submission as experimental. Roundtrip: local python3 scripts/ore_domain_roundtrip_check.py. cmake-sources-drift: local python3 projects/ores.codegen/scripts/regenerate_cmake_component_files.py --all --check; the codegen-sync-cmake-sources skill wraps it. codegen-drift: local tangle (compass build --direct codegen_templates) then check_component_drift.py with the same components. pr-gate: no branch-protection required check remains. |
| claude-code-review | retired | Local: the code-review skill runs before submit; findings go into the task's * Review table and are addressed in the round. The on-demand @claude trigger (claude.yml) stays. |
| misspell | retired | Local misspell check folded into the review pass. |
| site-cdash (Doxygen) | stays | build-site.yml builds the full site + Doxygen and deploys on main push. |
| continuous-* (linux/macos/windows) | stays | Every 2/3/12h + tags: full build matrix + ctest, submitted to CDash as continuous. |
| nightly-linux | stays | Daily: full build + ctest -VV to CDash Nightly + valgrind dynamic analysis. |
| nightly-format | stays | Daily clang-format drift → auto-fix PR; local tangle_clang_format exists. |
| ore_coverage | stays | Coverage on main push. |
| shell-script-drift / template-drift | stays | Cheap main-push checks; local tangle equivalents exist (tangle_shell_scripts, tangle_codegen_templates). |
| codeql-analysis, stale | stays | Manual security scan; housekeeping bot. |
Change-classification rules
The submit-PR skill classifies the diff and runs only the matching
checks. The classes mirror the retired pr.yml classifier's buckets,
with one addition (python tooling):
| Class | Paths | Checks the submit-PR skill runs |
|---|---|---|
| docs | doc/*, assets/*, .claude/*, *.md, *.org, projects/*/modeling/* (org/puml/png), external/* vendored |
site build; codegen drift when projects/*/modeling/* changed; review; misspell |
| code (C++) | projects/ores.* C++ sources, headers, *.cmake, CMakeLists.txt |
full build + ctest; roundtrip; cmake-sources-drift; codegen-drift; review; misspell; CDash experimental |
| ci | .github/*, projects/ores.codegen/library/templates/* |
site; roundtrip; drift checks; review |
| python tooling | projects/ores.compass/*, projects/ores.codegen/* (non-template) |
component test suite; drift checks; review; misspell |
| anything else | any path matching no bucket above | code class checks; review; misspell |
A mixed change runs the union of its classes' checks.
The python tooling class exists because the retired classifier
bucketed ores.compass and ores.codegen changes as docs, so their
test suites never ran anywhere; locally they always do.
The projects/*/modeling/* paths under docs carry a codegen-drift
exception: the retired pr.yml codegen-drift job ran unconditionally,
because a model-only edit classifies as docs and would otherwise skip
the check that catches forgotten regeneration. A change touching the
modeling paths also runs the codegen drift checks (tangle, then
check_component_drift.py).
Local verification flow
- Classify the diff with the rule table.
- Run the checks for the class (site build, or
compass build+compass test run). - Submit the build to CDash as experimental for visibility
(
./compass.sh test run --preset <preset> --cdash Experimental; runs the CTest.cmake script under the build lock, same shape CI uses). - Run the review skill locally; record findings in the task's
* Reviewtable; address them. - Record the verification in the PR description as a
--changebullet (e.g. "Verification: doc-only change; local site build clean"). - Raise the PR. GitHub runs no gate; merge when the review round is complete. Continuous builds and nightlies stay on GitHub.
Open questions for the implementation tasks
- How experimental submissions are tagged and filtered out of the continuous/nightly dashboards on CDash.
- Which exact test suites run for python tooling changes (compass, codegen).
See also
- Absorb PR checks locally: targeted checks, local review, CDash submissions — the story this analysis feeds.
- Analyse all CI workflows and map each check to its local equivalent — the driving task.
- Knowledge — the knowledge index.