Aliases & aggregates¶
An alias groups atomic checks: ckdn run lint runs its members in the order of
its own members array, not the order the checks happen to appear in
ckdn.toml. That array is the schedule — under fail_fast it decides which
member is reached and which is skipped, so put the cheap, decisive check
first. 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. Only this top-level field collapses to pass/fail. Each member row carries its real four-value status, so anerroror aparse_mismatchmember is visible in the aggregate itself — you do not have to open its digest to find out that the red was never a verdict.rc—130for an interrupted series, whatever the members returned; otherwise the first member's nonzero exit code, with anything outside1..255replaced by1; else1if any member is non-green while its ownrcwas0(gate failure / mismatch), else0. It is the process exit code too — except under--gate, where apass/failbaseline gate supplies the exit instead. With no baseline configured, or anunavailablegate, the execution exit still stands.interrupted— present, alwaystrue, when Ctrl-C cut the series short. The members after it were never attempted, and an interrupt ends the sequence even withfail_fast = false: once you have stopped the run, the remaining checks are work you asked not to do. Without this key a truncated series would be indistinguishable from one that ran to completion and failed.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). --fail-fastoverrides a configuredfail_fastfor this run. It is presence-only — there is no--no-fail-fast, so the flag can tighten an alias but never loosen one — and it is rejected on an atomic check, which has no sequence to stop.
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 the order they appear in
ckdn.toml — here file order really is the schedule, since there is no
members array to set one (aliases are skipped; they only group atomics).
It emits one ckdn.aggregate/1 with alias = "*", and runs every check 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.