Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
168 commits
Select commit Hold shift + click to select a range
fecb715
Merge pull request #73 from Nistapp/chore/back-merge-v0.3.2
kcramakrishna Nov 9, 2026
9308f0d
build(dev): stop gating on the prose check
kcramakrishna Nov 9, 2026
d36a954
feat(dev): give prose-check issues a severity and always exit 0
kcramakrishna Nov 9, 2026
b736b0d
docs: describe the prose check as advisory
kcramakrishna Nov 9, 2026
60ab1ba
Merge branch 'dev' into chore/tooling-optimisations
kcramakrishna Nov 9, 2026
320fad8
Merge pull request #74 from Nistapp/chore/tooling-optimisations
kcramakrishna Nov 9, 2026
110f2f7
docs(stacks): recommend each stack's own hook and commit tools
kcramakrishna Nov 9, 2026
304420e
docs(implement): choose the hook manager by the target's stack
kcramakrishna Nov 9, 2026
683ddb3
feat(dev): register codebase-memory-mcp in one project .mcp.json
kcramakrishna Nov 9, 2026
e6e2c91
test(audit): let an engine check follow an agent-only check's number
kcramakrishna Nov 9, 2026
4c9c82d
feat(audit): record a check newer than the engine's ruleset as UNKNOWN
kcramakrishna Nov 9, 2026
b0b2085
feat(dev): translate .mcp.json into each harness's MCP config
kcramakrishna Nov 9, 2026
6dce4b1
feat(dev): offer each contributor a one-time agent tool setup
kcramakrishna Nov 9, 2026
a86ddab
feat(engine): add CI-05, workflow files are linted
kcramakrishna Nov 9, 2026
22ba4a6
fix(dev): name more harnesses and move the first-run trigger to the top
kcramakrishna Nov 9, 2026
24a5675
docs(implement): add the workflow-lint step for CI-05
kcramakrishna Nov 9, 2026
98a13e1
docs: link the agent tool setup from the contributor entry points
kcramakrishna Nov 9, 2026
66479e7
Merge pull request #75 from Nistapp/feat/v0.3.3-track-c-adoption
kcramakrishna Nov 9, 2026
07d42bb
feat(dev): document language servers beside the code index
kcramakrishna Nov 9, 2026
1a32a51
ci: add an advisory CodeQL workflow for Python and Actions
kcramakrishna Nov 9, 2026
d21d061
build(dev): update uv to 0.13.5 for two security advisories
kcramakrishna Nov 9, 2026
a432659
build(dev): update mermaid-cli to 12.2.0 for a katex advisory
kcramakrishna Nov 9, 2026
345890b
build(dev): audit the dev tools' dependencies with osv-scanner in mak…
kcramakrishna Nov 9, 2026
4ee9b51
build(dev): add a typos spell check to make check
kcramakrishna Nov 9, 2026
7c7cfa7
ci: sign build provenance for the release files
kcramakrishna Nov 9, 2026
5c26847
ci: fix zizmor's pedantic findings and gate on the pedantic persona
kcramakrishna Nov 9, 2026
f807d63
fix(dev): ignore .env files at any depth
kcramakrishna Nov 9, 2026
c0cc4a7
ci: add an advisory OpenSSF Scorecard workflow
kcramakrishna Nov 9, 2026
e0693eb
Merge remote-tracking branch 'origin/dev' into feat/v0.3.3-track-b-mcp
kcramakrishna Nov 9, 2026
65024fb
docs(self-audit): refresh the self-audit page and neutralise the base…
kcramakrishna Nov 9, 2026
003c6e0
chore: refresh the self-audit baseline for ruleset 2026-11-09.1
kcramakrishna Nov 9, 2026
109e7ad
Merge pull request #76 from Nistapp/feat/v0.3.3-track-b-mcp
kcramakrishna Nov 9, 2026
d6ba4cb
Merge remote-tracking branch 'origin/dev' into chore/v0.3.3-track-a-t…
kcramakrishna Nov 9, 2026
c035331
feat(engine): HYG-09 reads ecosystem coverage and the target-branch trap
kcramakrishna Nov 9, 2026
81b0002
docs(implement): write or fix the dependency-update file for HYG-09
kcramakrishna Nov 9, 2026
095994f
build(dev): build actionlint from a Go tool module, not from actionli…
kcramakrishna Nov 9, 2026
7fbd6ff
Merge pull request #77 from Nistapp/chore/v0.3.3-track-a-tooling
kcramakrishna Nov 9, 2026
8b64cc1
fix(dev): keep each osv-scanner ignore file next to the lockfiles it …
kcramakrishna Nov 9, 2026
818676d
ci: publish the Scorecard results and record how each alert is handled
kcramakrishna Nov 9, 2026
7172596
feat(engine): add EXEC-08, tool versions visible to dependency automa…
kcramakrishna Nov 9, 2026
c93011b
docs(implement): move inline tool versions into a manifest for EXEC-08
kcramakrishna Nov 9, 2026
8eb9642
Merge remote-tracking branch 'origin/dev' into feat/v0.3.3-track-c-de…
kcramakrishna Nov 9, 2026
fcd5c7f
Merge pull request #78 from Nistapp/ci/scorecard-publish
kcramakrishna Nov 9, 2026
e79aa2e
Merge remote-tracking branch 'origin/dev' into feat/v0.3.3-track-c-de…
kcramakrishna Nov 9, 2026
5d4ff90
feat: stamp the release version in reports, state and skill bundles
kcramakrishna Nov 9, 2026
01be98d
docs: add generated audit and implement master lists
kcramakrishna Nov 9, 2026
ae3dee8
test(engine): run the HYG-09 and EXEC-08 tests in-process so coverage…
kcramakrishna Nov 9, 2026
a701a04
Merge pull request #79 from Nistapp/feat/v0.3.3-track-c-dependabot
kcramakrishna Nov 9, 2026
466b334
Merge branch 'dev' into docs/audit-implement-masters
kcramakrishna Nov 9, 2026
0f4a6e0
build(dev): run make coverage as CI does, so a local pass means a CI …
kcramakrishna Nov 9, 2026
85a2a94
docs: regenerate the master lists for EXEC-08
kcramakrishna Nov 9, 2026
b3a9377
Merge pull request #80 from Nistapp/docs/audit-implement-masters
kcramakrishna Nov 9, 2026
1a2a927
Merge remote-tracking branch 'origin/dev' into feat/v0.3.5-version-st…
kcramakrishna Nov 9, 2026
eed4e0e
Merge remote-tracking branch 'origin/dev' into build/coverage-like-ci
kcramakrishna Nov 9, 2026
61d0e2d
feat(audit): record the framework release and install in each report
kcramakrishna Nov 9, 2026
5e50513
ci: run the check matrix on Linux only
kcramakrishna Nov 9, 2026
b0b3742
docs: say that CI tests Linux only for now
kcramakrishna Nov 9, 2026
010b358
build: run the test suites at once on Linux and split coverage per suite
kcramakrishna Nov 9, 2026
0dfe7eb
ci: run the steps of make check as parallel jobs
kcramakrishna Nov 9, 2026
8df5231
ci: run CI on merge groups of the dev merge queue
kcramakrishna Nov 9, 2026
4457c33
chore: add a merge queue to the dev ruleset
kcramakrishna Nov 9, 2026
2309763
feat(implement): stop on a report from another schema or a newer release
kcramakrishna Nov 9, 2026
bf3b533
Merge pull request #83 from Nistapp/ci/merge-queue
kcramakrishna Nov 9, 2026
1de2b9e
Merge remote-tracking branch 'origin/dev' into feat/v0.3.5-version-st…
kcramakrishna Nov 9, 2026
3de9d91
docs: record the dev merge queue in Current state
kcramakrishna Nov 9, 2026
9164a96
Merge remote-tracking branch 'origin/dev' into build/coverage-like-ci
kcramakrishna Nov 9, 2026
9101437
Merge pull request #81 from Nistapp/build/coverage-like-ci
kcramakrishna Nov 9, 2026
446fb1b
Merge remote-tracking branch 'origin/dev' into docs/merge-queue-state
kcramakrishna Nov 9, 2026
d5f4667
Merge remote-tracking branch 'origin/dev' into feat/v0.3.5-version-st…
kcramakrishna Nov 9, 2026
651c004
Merge pull request #84 from Nistapp/docs/merge-queue-state
kcramakrishna Nov 9, 2026
d7ad429
feat(engine): TOOL-06 also reads the commit rule in CI
kcramakrishna Nov 9, 2026
f429ae7
docs(implement): run the commit rule in a local stage and in CI
kcramakrishna Nov 9, 2026
23b354c
feat(implement): record in the state which framework created and last…
kcramakrishna Nov 9, 2026
244d32a
Merge remote-tracking branch 'origin/dev' into feat/v0.3.5-version-st…
kcramakrishna Nov 9, 2026
9f693fe
feat(greenfield): check commit messages in CI as well as in the hook
kcramakrishna Nov 9, 2026
29ca367
build(dev): add a shard runner for the engine's test suite
kcramakrishna Nov 9, 2026
55f9832
build: add engine shard targets and a sharded coverage combine
kcramakrishna Nov 9, 2026
55b3d61
ci: add a nightly run of the unsharded verbs
kcramakrishna Nov 9, 2026
b59be30
ci: run the engine's suite in two shards on both Python versions
kcramakrishna Nov 9, 2026
04c1df0
docs: describe the engine shards and the nightly run
kcramakrishna Nov 9, 2026
5232740
Merge pull request #85 from Nistapp/feat/v0.3.3-track-c-commit-ci
kcramakrishna Nov 9, 2026
6b22dd1
Merge pull request #86 from Nistapp/ci/test-shards
kcramakrishna Nov 9, 2026
e490c70
Merge remote-tracking branch 'origin/dev' into feat/v0.3.5-version-st…
kcramakrishna Nov 9, 2026
c9cd5aa
build(dev): let the shard runner split the audit tools' suite
kcramakrishna Nov 9, 2026
bb7ad4e
build: shard the audit tools' suite and add coverage-part
kcramakrishna Nov 9, 2026
9fb632a
ci: run the coverage suites in two parts and drop the test-tools job
kcramakrishna Nov 9, 2026
00fdf59
docs: describe the coverage parts and the audit tools' shards
kcramakrishna Nov 9, 2026
5f0a8db
docs: record the version rule in ADR 0008 and a versions reference
kcramakrishna Nov 9, 2026
b6b5ff6
test(dev): fail the release config at 1.0.0 until compatibility is de…
kcramakrishna Nov 9, 2026
2047b4f
Merge pull request #87 from Nistapp/feat/v0.3.5-version-stamps
kcramakrishna Nov 9, 2026
db441e2
Merge branch 'dev' into ci/tools-shards
kcramakrishna Nov 9, 2026
e8c598a
Merge pull request #88 from Nistapp/ci/tools-shards
kcramakrishna Nov 9, 2026
3adc114
docs: shorten the long sentences in AGENTS.md and lint it
kcramakrishna Nov 9, 2026
e9f6caf
build: split make security into security-secrets and security-deps
kcramakrishna Nov 9, 2026
ae30d59
ci: run the secrets scan and the dependency audit as two jobs
kcramakrishna Nov 9, 2026
3fa15e5
docs: list the two security jobs
kcramakrishna Nov 9, 2026
23f7146
feat(engine): HYG-11 reads ruleset files and the source-branch check
kcramakrishna Nov 9, 2026
0ea219d
Merge pull request #90 from Nistapp/ci/split-security
kcramakrishna Nov 9, 2026
cf7a101
feat: give both recipes one prompt on how to talk to the user
kcramakrishna Nov 9, 2026
1a569d0
feat(dev): check that each recipe SKILL.md links the user prompt
kcramakrishna Nov 9, 2026
5f7ce86
docs(implement): add-repo-hygiene declares branch rules as code
kcramakrishna Nov 9, 2026
2190a5b
Merge remote-tracking branch 'origin/dev' into docs/v0.3.4-recipe-mes…
kcramakrishna Nov 9, 2026
d83d55b
docs(audit): an opt-in live read of the branch rules for HYG-11 and C…
kcramakrishna Nov 9, 2026
d78080d
Merge remote-tracking branch 'origin/dev' into feat/v0.3.3-track-c-br…
kcramakrishna Nov 9, 2026
3993263
feat: fix the layout of the recipes' questions and reports
kcramakrishna Nov 9, 2026
51bddf9
feat(dev): assert the pull request body layout in the implement eval
kcramakrishna Nov 9, 2026
4b93763
Merge pull request #91 from Nistapp/feat/v0.3.3-track-c-branch-model
kcramakrishna Nov 9, 2026
92234ca
chore: stop requiring an up-to-date branch on dev
kcramakrishna Nov 9, 2026
32f9374
docs: record that dev no longer requires an up-to-date branch
kcramakrishna Nov 9, 2026
b932de6
Merge pull request #92 from Nistapp/chore/dev-ruleset-not-strict
kcramakrishna Nov 9, 2026
52768e2
feat(audit): open the rendered report with a bottom line
kcramakrishna Nov 9, 2026
1a1bd92
docs: queue a dev pull request with Merge when ready, not gh pr merge
kcramakrishna Nov 9, 2026
63434f4
Merge pull request #93 from Nistapp/docs/queue-with-web-button
kcramakrishna Nov 9, 2026
80e7bbc
fix(audit): list what the scan could not settle as sub-bullets
kcramakrishna Nov 9, 2026
6afaba3
feat(engine): open the Markdown report with a bottom line
kcramakrishna Nov 9, 2026
17bd680
feat(engine): add TOOL-07, a local guard against commits to a protect…
kcramakrishna Nov 9, 2026
621c600
docs: record why make check does not run the prose check
kcramakrishna Nov 9, 2026
6526ec0
docs(implement): add-hooks-and-commit-rules adds the branch guard by …
kcramakrishna Nov 9, 2026
4fd056f
Merge remote-tracking branch 'origin/dev' into feat/v0.3.3-track-c-lo…
kcramakrishna Nov 9, 2026
9506b0c
docs: add a purpose line and a diagram to the page templates
kcramakrishna Nov 9, 2026
2fc92ec
Merge pull request #94 from Nistapp/feat/v0.3.3-track-c-local-guard
kcramakrishna Nov 9, 2026
5a577a5
docs: rewrite the three worst docs pages in plain language
kcramakrishna Nov 9, 2026
d965909
docs: add a diagram to each explanation page and tutorial
kcramakrishna Nov 9, 2026
1e9ed7e
docs: name the prose check in the pull request checklist
kcramakrishna Nov 9, 2026
462d48d
Merge remote-tracking branch 'origin/dev' into docs/v0.3.4-recipe-mes…
kcramakrishna Nov 9, 2026
d749568
docs: count the 102 engine fixtures after the dev merge
kcramakrishna Nov 9, 2026
1dc8bab
feat(engine): AGT-09 names every branch the declared rules protect
kcramakrishna Nov 9, 2026
8299e32
docs(implement): adapt-agents-md names the branches the rulesets protect
kcramakrishna Nov 9, 2026
f2ff3bd
fix(engine): EXEC-01 reads the toolchain pin in a nested manifest
kcramakrishna Nov 9, 2026
cd17c45
chore: drop the EXEC-01 owner exception from the self-audit baseline
kcramakrishna Nov 9, 2026
b990687
Merge pull request #95 from Nistapp/docs/v0.3.4-recipe-messages
kcramakrishna Nov 9, 2026
2e00e34
fix(engine): TOOL-04 follows Makefile variables and prerequisites
kcramakrishna Nov 9, 2026
9957625
Merge remote-tracking branch 'origin/dev' into feat/v0.3.3-agt09-rule…
kcramakrishna Nov 9, 2026
34c358b
docs: count the 103 engine fixtures after AGT-09's
kcramakrishna Nov 9, 2026
7e1289a
docs(implement): split the ruleset sentence in adapt-agents-md step 6
kcramakrishna Nov 9, 2026
a428946
Merge branch 'feat/v0.3.3-agt09-ruleset-branches' into fix/v0.3.3-exe…
kcramakrishna Nov 9, 2026
4306699
docs: count the 105 engine fixtures after EXEC-01's and TOOL-04's
kcramakrishna Nov 9, 2026
910b718
Merge pull request #96 from Nistapp/feat/v0.3.3-agt09-ruleset-branches
kcramakrishna Nov 9, 2026
9002f22
docs(implement): add-repo-hygiene writes a routing-only CODEOWNERS by…
kcramakrishna Nov 9, 2026
35feab4
docs(implement): register-index writes one .mcp.json and offers the s…
kcramakrishna Nov 9, 2026
4f1f1bf
Merge pull request #97 from Nistapp/fix/v0.3.3-exec01-tool04-nested
kcramakrishna Nov 9, 2026
cf065b8
Merge pull request #98 from Nistapp/docs/v0.3.3-register-index-mcp-offer
kcramakrishna Nov 9, 2026
d34c3c6
chore: make security run only its two parts
kcramakrishna Nov 9, 2026
5dd2d21
docs(implement): the release page may state the release provenance
kcramakrishna Nov 9, 2026
c88fe84
Merge pull request #99 from Nistapp/chore/v0.3.3-security-target-parts
kcramakrishna Nov 9, 2026
5d16098
feat(engine): add AGT-12, communication rules stated
kcramakrishna Nov 9, 2026
c76f357
docs(implement): register-index names the language-server inputs
kcramakrishna Nov 9, 2026
7281328
Merge remote-tracking branch 'origin/dev' into feat/v0.3.4-track-t
kcramakrishna Nov 9, 2026
5143e1e
Merge pull request #100 from Nistapp/docs/v0.3.3-provenance-and-lsp-i…
kcramakrishna Nov 9, 2026
9dfc3ae
feat(engine): TOOL-04 reads CI as well as the local verbs
kcramakrishna Nov 9, 2026
3650dad
docs(implement): configure-quality-tools runs the security verb in CI
kcramakrishna Nov 9, 2026
6296b3e
refactor(engine): move the Makefile walk into _common as follow_makefile
kcramakrishna Nov 9, 2026
73fa46b
fix(engine): EXEC-07 counts types per language and reads a pyright mi…
kcramakrishna Nov 9, 2026
ff4af74
Merge remote-tracking branch 'origin/dev' into feat/v0.3.4-track-t
kcramakrishna Nov 9, 2026
f69e70c
docs(audit): rewrap the EXEC-07 engine paragraph to the line limit
kcramakrishna Nov 9, 2026
d60ef26
chore: drop the EXEC-07 owner exception from the self-audit baseline
kcramakrishna Nov 9, 2026
4e351d9
Merge remote-tracking branch 'origin/dev' into feat/v0.3.3-tool04-ci
kcramakrishna Nov 9, 2026
ce79273
chore: refresh the secrets baseline after the dev merge
kcramakrishna Nov 9, 2026
fc80971
feat(engine): add DOC-05, docs are readable
kcramakrishna Nov 9, 2026
a5713e8
Merge branch 'feat/v0.3.3-tool04-ci' into fix/v0.3.3-exec07-language-…
kcramakrishna Nov 9, 2026
36aa387
Merge pull request #101 from Nistapp/feat/v0.3.3-tool04-ci
kcramakrishna Nov 9, 2026
26fd6f5
Merge pull request #102 from Nistapp/fix/v0.3.3-exec07-language-serve…
kcramakrishna Nov 9, 2026
34c10c7
Merge remote-tracking branch 'origin/dev' into feat/v0.3.4-track-t
kcramakrishna Nov 9, 2026
a06eab4
refactor(engine): split the engine tests into one package per check pack
kcramakrishna Nov 9, 2026
c44aa26
Merge pull request #103 from Nistapp/refactor/v0.3.3-engine-tests-by-…
kcramakrishna Nov 9, 2026
2cdddb6
docs: split the long sentences in REQ-SH-060 and the DOC-05 rubric
kcramakrishna Nov 9, 2026
ff04035
Merge remote-tracking branch 'origin/dev' into feat/v0.3.4-track-t
kcramakrishna Nov 9, 2026
1703aa2
Merge pull request #104 from Nistapp/feat/v0.3.4-track-t
kcramakrishna Nov 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
375 changes: 133 additions & 242 deletions .audit-baseline.json

Large diffs are not rendered by default.

21 changes: 20 additions & 1 deletion .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ updates:
commit-message:
prefix: "ci"

# The Python dev tools (ruff, mypy, detect-secrets, coverage, jsonschema, skills-ref, uv, actionlint-py, zizmor,
# The Python dev tools (ruff, mypy, detect-secrets, coverage, jsonschema, skills-ref, typos, uv, zizmor,
# check-jsonschema), locked in uv.lock. The
# Makefile, lefthook.yml and the workflows read each version from dev/tools/pyproject.toml.
- package-ecosystem: uv
Expand Down Expand Up @@ -69,6 +69,25 @@ updates:
commit-message:
prefix: "build"

# The Go dev tools, each pinned as a Go `tool` in its own module with its dependencies: osv-scanner (the dependency
# audit in `make security`) and actionlint (`make workflow-lint`). The Makefile runs them with `go -C <dir> tool`.
- package-ecosystem: gomod
directories: ["/dev/tools/osv", "/dev/tools/actionlint"]
schedule:
interval: weekly
cooldown:
default-days: 7
open-pull-requests-limit: 0
ignore:
- dependency-name: "*"
update-types: ["version-update:semver-major"]
groups:
security-fixes:
applies-to: security-updates
patterns: ["*"]
commit-message:
prefix: "build"

# Data, not dependencies: the greenfield template and the engine's test fixtures. No pull request, ever.
- package-ecosystem: npm
directories: ["/greenfield/templates", "/audit/engine/tests/fixtures/**"]
Expand Down
1 change: 1 addition & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
- [ ] The base branch is `dev`, and the head is a work branch named `<type>/<topic>` that started from `dev`
- [ ] `make check` and `make security` pass
- [ ] `make docs-lint` passes when Markdown changed; Mermaid blocks validated (`make docs-mermaid FILES=<file.md>`)
- [ ] `make docs-prose FILES=<file.md>` run on changed Markdown, and its warnings on the changed lines fixed (advisory)
- [ ] New code has tests; a new engine check has a fixture that fails exactly that check
- [ ] Documentation and decision records updated in the same change when an interface, behaviour or decision changed
- [ ] Commits follow Conventional Commits, one logical change each, with a `Roadmap-Step:` trailer when a track applies
Expand Down
14 changes: 13 additions & 1 deletion .github/rulesets/dev-protection.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
{
"type": "required_status_checks",
"parameters": {
"strict_required_status_checks_policy": true,
"strict_required_status_checks_policy": false,
"do_not_enforce_on_create": false,
"required_status_checks": [
{
Expand All @@ -44,6 +44,18 @@
}
]
}
},
{
"type": "merge_queue",
"parameters": {
"check_response_timeout_minutes": 30,
"grouping_strategy": "ALLGREEN",
"max_entries_to_build": 5,
"max_entries_to_merge": 5,
"merge_method": "MERGE",
"min_entries_to_merge": 1,
"min_entries_to_merge_wait_minutes": 5
}
}
]
}
230 changes: 171 additions & 59 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (C) 2026 K. C. Ramakrishna
#
# CI runs the same verbs a human or agent runs locally (see the Makefile): `make check` and `make security`.
# CI runs the same verbs a human or agent runs locally (see the Makefile): `make check`, split into jobs that run at
# once, and `make security`.
# `make security` needs the network: its dependency audit (osv-scanner) queries osv.dev.
# Python 3.11 is the supported minimum and 3.14 the newest release (Q8); Windows is supported through WSL only.
# CI runs on Linux only for now, to keep the wait per pull request short. Restoring macOS and adding Windows is
# tracked in issue #82.
# The `docs` job runs `make docs-lint` and the Mermaid check when a Markdown file changed; it needs Node, so it
# stays out of `make check` and the matrix.
# It runs on every pull request and on every push to the two protected branches, `dev` and `main`
# stays out of `make check` and the matrix. It also annotates the prose of the changed files, which never fails.
# It runs on every pull request, on every merge group of the `dev` merge queue, and on every push to the two
# protected branches, `dev` and `main`
# (docs/reference/branch-protection.md).
name: CI

on:
pull_request:
# The merge queue on `dev` tests each pull request merged onto the latest `dev` before it lands. CI Gate must
# report here too, or the queue waits until its timeout. Each group has its own ref, so the concurrency group
# below never cancels one group for another.
merge_group:
types: [checks_requested]
push:
branches: [main, dev]

Expand All @@ -22,13 +32,35 @@ concurrency:
cancel-in-progress: true

jobs:
check:
name: check (${{ matrix.os }}, Python ${{ matrix.python }})
runs-on: ${{ matrix.os }}
# `make check` split into jobs that run at once; dev/tests/test_ci_parity.py fails when a step of `check` or a
# suite of `test` has no job here. The steps that are cheap share one job, because each job pays about 15 s of
# setup. Python 3.11 runs every step; Python 3.14 runs the runtime code: the suites and the schema cross-check.
static:
name: static (format, typecheck, rules, recipe lint, masters, workflow lint, spell)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with:
python-version-file: .python-version
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
with:
version-file: dev/tools/pyproject.toml
# Go builds actionlint (`make workflow-lint`) from dev/tools/actionlint/go.mod, through the Go module proxy.
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version-file: dev/tools/actionlint/go.mod
cache-dependency-path: dev/tools/actionlint/go.sum
- run: make format-check typecheck verify-rules recipe-lint masters-check workflow-lint spell

crosscheck:
name: crosscheck (Python ${{ matrix.python }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
python: ["3.11", "3.14"]
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand All @@ -40,27 +72,90 @@ jobs:
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
with:
version-file: dev/tools/pyproject.toml
- run: make check
- run: make crosscheck

security:
name: security
# The suites under coverage.py, in parts that run at once (`make coverage-part`; TEST_SHARDS, SHARDED_SUITES and
# COVERAGE_PART_<i> in the Makefile). Part <i> runs shard <i> of the engine's and the audit tools' suites, plus
# the implement tools in part 1. dev/tests/test_ci_parity.py checks that the matrix lists 1 to TEST_SHARDS. Each
# part's data files go to the `coverage` job, which combines them all.
test-coverage:
name: test (part ${{ matrix.shard }}, Python 3.11, coverage)
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shard: [1, 2]
env:
SHARD: ${{ matrix.shard }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# The minimum Python the repository pins (.python-version); the `check` matrix above spans 3.11 and 3.14.
- uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with:
python-version-file: .python-version
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
with:
version-file: dev/tools/pyproject.toml
- run: make security
- run: make coverage-part
env:
CI: "true"
# The data files' names start with a dot, so they are hidden files to upload-artifact. coverage-combine fails
# when one of them is missing.
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: coverage-part-${{ matrix.shard }}
path: dev/dist/coverage/.coverage.*
include-hidden-files: true
if-no-files-found: error
retention-days: 1

# The engine's and the recipe tools' suites under coverage.py; fails below the floor in .coveragerc.
# The dev checks' suite. coverage.py does not measure dev/ (.coveragerc), so this job runs it plainly.
test-dev:
name: test-dev (Python 3.11)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with:
python-version-file: .python-version
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
with:
version-file: dev/tools/pyproject.toml
- run: make test-dev

# Every suite on the newest Python, in parts with one shard of each sharded suite (`make test-part`;
# TEST_PART_<i> in the Makefile). Each part runs its targets at once, as `make test` runs its suites, so this job also proves the
# parallel run on every pull request. The nightly workflow runs the unsharded `make test`.
test-py314:
name: test (part ${{ matrix.shard }}, Python 3.14)
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shard: [1, 2]
env:
SHARD: ${{ matrix.shard }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with:
python-version: "3.14"
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
with:
version-file: dev/tools/pyproject.toml
- run: make test-part

# Combines the suites' data files and fails below the floor in .coveragerc (`fail_under`). `coverage-combine
# SHARDED=1` fails when a suite's or an engine shard's data file is missing, so a lost upload cannot pass with a
# partial total.
coverage:
name: coverage
needs: [test-coverage]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand All @@ -72,9 +167,44 @@ jobs:
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
with:
version-file: dev/tools/pyproject.toml
- run: make coverage
env:
CI: "true"
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
pattern: coverage-*
merge-multiple: true
path: dev/dist/coverage
- run: make coverage-combine SHARDED=1

# `make security` in its two parts, as two jobs: the secrets scan needs Python and uv, the dependency audit needs
# Go. dev/tests/test_ci_parity.py fails when a part of `security` has no job here.
security-secrets:
name: security-secrets (detect-secrets)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# The minimum Python the repository pins (.python-version).
- uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with:
python-version-file: .python-version
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
with:
version-file: dev/tools/pyproject.toml
- run: make security-secrets

security-deps:
name: security-deps (osv-scanner)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# Go builds osv-scanner, the dependency audit in `make security`, from dev/tools/osv/go.mod.
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version-file: dev/tools/osv/go.mod
cache-dependency-path: dev/tools/osv/go.sum
- run: make security-deps

# The engine on this repository against the committed ratchet (.audit-baseline.json): exit 2 when a finding appears
# that the baseline did not have. Read-only; the report stays under dist/self-audit/. Linux only.
Expand Down Expand Up @@ -103,7 +233,7 @@ jobs:
- name: List changed Markdown
id: changed
env:
BASE: ${{ github.event.pull_request.base.sha || github.event.before }}
BASE: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.before }}
HEAD_SHA: ${{ github.sha }}
run: |
list="$RUNNER_TEMP/changed-md.txt"
Expand All @@ -115,6 +245,13 @@ jobs:
echo "Changed Markdown:"
cat "$list"
if [[ -s "$list" ]]; then echo "any=true" >> "$GITHUB_OUTPUT"; else echo "any=false" >> "$GITHUB_OUTPUT"; fi
# The prose check (docs/COMMUNICATION_RULES.md) is advisory: it annotates the changed Markdown with warnings and
# notices and always exits 0. Fixtures and test data are skipped, as in `make docs-prose`.
- if: steps.changed.outputs.any == 'true'
name: Annotate prose in changed Markdown
run: |
{ grep -v -E '(^|/)(fixtures|testdata)/' "$RUNNER_TEMP/changed-md.txt" || true; } \
| xargs -r -d '\n' python3 dev/prose_check.py --format github
- if: steps.changed.outputs.any == 'true'
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with:
Expand All @@ -132,8 +269,9 @@ jobs:
name: Validate Mermaid blocks in changed Markdown
run: xargs -d '\n' -a "$RUNNER_TEMP/changed-md.txt" python3 dev/mermaid_check.py --no-sandbox

# Every commit subject that the pull request (or the push) adds must follow Conventional Commits. The rule is in
# dev/commit_lint.py, which the lefthook commit-msg hook also runs. Merge commits are skipped.
# Every commit subject that the pull request (or the merge group, or the push) adds must follow Conventional
# Commits. The rule is in dev/commit_lint.py, which the lefthook commit-msg hook also runs. Merge commits are
# skipped.
commits:
name: commits
runs-on: ubuntu-latest
Expand All @@ -144,59 +282,33 @@ jobs:
fetch-depth: 0
- name: Check the commit subjects
env:
BASE: ${{ github.event.pull_request.base.sha || github.event.before }}
HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
BASE: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.before }}
HEAD_SHA: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha || github.sha }}
run: |
if [[ -z "$BASE" || "$BASE" =~ ^0+$ ]] || ! git cat-file -e "$BASE^{commit}" 2>/dev/null; then
echo "No base commit to compare with (a new branch); nothing to check."
exit 0
fi
python3 dev/commit_lint.py --range "$BASE..$HEAD_SHA"

# One required check that stands for the whole matrix, so adding or renaming a `check` leg (a Python
# version, an OS) never also requires a branch-protection edit.
# One required check that stands for every job above, so adding, splitting or renaming a job (a suite, a Python
# version, an OS) never also requires a branch-protection edit. It reads every result in `needs`, so a job listed
# there cannot be left unchecked.
ci-gate:
name: CI Gate
needs: [check, security, coverage, self-audit, docs, commits]
needs: [static, crosscheck, test-coverage, test-dev, test-py314, coverage, security-secrets, security-deps, self-audit, docs, commits]
if: always()
runs-on: ubuntu-latest
steps:
- name: Require check, security, coverage, self-audit, docs and commits to have succeeded
- name: Require every needed job to have succeeded
# The results come in through env, never expanded into the script (zizmor: template-injection).
env:
NEEDS: ${{ toJSON(needs) }}
run: |
check="${{ needs.check.result }}"
security="${{ needs.security.result }}"
coverage="${{ needs.coverage.result }}"
self_audit="${{ needs.self-audit.result }}"
docs="${{ needs.docs.result }}"
commits="${{ needs.commits.result }}"
echo "check: $check"
echo "security: $security"
echo "coverage: $coverage"
echo "self-audit: $self_audit"
echo "docs: $docs"
echo "commits: $commits"
if [[ "$check" != "success" ]]; then
echo "::error::check did not pass"
exit 1
fi
if [[ "$security" != "success" ]]; then
echo "::error::security did not pass"
exit 1
fi
if [[ "$coverage" != "success" ]]; then
echo "::error::coverage did not pass"
exit 1
fi
if [[ "$self_audit" != "success" ]]; then
echo "::error::self-audit did not pass"
exit 1
fi
if [[ "$docs" != "success" ]]; then
echo "::error::docs did not pass"
exit 1
fi
if [[ "$commits" != "success" ]]; then
echo "::error::commits did not pass"
jq -r 'to_entries[] | "\(.key): \(.value.result)"' <<< "$NEEDS"
failed=$(jq -r '[to_entries[] | select(.value.result != "success") | .key] | join(", ")' <<< "$NEEDS")
if [[ -n "$failed" ]]; then
echo "::error::did not pass: $failed"
exit 1
fi
echo "CI Gate passed."
Loading
Loading