Aliases & aggregates¶
An alias groups atomic checks: ckdn run lint runs each member in config
order. Every member gets its own run directory and digest — the aggregate
on stdout (ckdn.aggregate/1) is a routing document, not a replacement for
member evidence:
{
"schema": "ckdn.aggregate/1",
"alias": "lint",
"status": "fail",
"rc": 1,
"members": [
{ "check": "ruff", "status": "pass", "rc": 0 },
{
"check": "pylint",
"status": "fail",
"rc": 1,
"run_dir": ".agent-runs/20260707T101500Z-pylint"
}
]
}
The aggregate contract:
status—passiff every member passed; otherwisefail. The aggregate collapses to pass/fail; a member's ownerror/parse_mismatchshows only in that member's digest.rc(also the process exit code) — the first member's nonzero exit code (clamped 1–255), else1if any member is non-green while its ownrcwas0(gate failure / mismatch), else0.fail_fast = true(default) stops after the first non-green member; members after it are not run and do not appear in the aggregate —memberslists only the checks that actually ran. Withfail_fast = falseevery member runs and appears with a real status.- A member's
run_diris the same relative, posix path its own digest reports (passing members carry norun_dirin the aggregate). - Extra args after
--are rejected on aliases — pass them to the atomic check (ckdn run ruff -- -x).
Read the aggregate to decide which member digest to open
(ckdn show <run-dir>), then work from that digest.
Run everything: ckdn run --all¶
ckdn run --all runs every atomic check in config order (aliases are
skipped — they only group atomics) and emits one ckdn.aggregate/1 with
alias = "*". It runs all checks by default; --fail-fast stops at the first
non-green one. Same exit-code and routing rules as an alias aggregate, so it
drops into CI as a single "verify the project" step.