skip to content

CI and checks

Two CI surfaces exist. A five-job GitHub Actions workflow declares what runs on every push and pull request; the checks and apps those jobs invoke live one level down, in a separate Nix flake under ci/. A third workflow builds and deploys this documentation site over pnpm — “the one thing in this repository that does not go through the flake” — and is not a gate over gen’s libraries, so it is out of scope below.

This distinction is the whole value of this page, and the hub is explicit about it rather than leaving it implicit in which jobs happen to be green. A gate fails the build on a bad result. A report prints a result for a person to read and fails nothing — a report that nobody reads is silently worthless, in a way a failing gate cannot be.

Two of the five jobs say this about themselves in their own comments. The performance job:

# Performance: perf-regression gates on deterministic evaluator counters (parity at scale +
# thunk/alloc ratios + linearity). cpu is reported but gated by nothing — see ci/README.md.
perf-bench:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
- run: nix run ./ci#perf-bench

And the trust-surface job:

# Trust surface: the cited fleet numbers still agree with their own arithmetic (pure jq over the
# committed baselines — pin agreement + re-derivations + digest ties + floors; no fleet eval).
fleet-consistency:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
- run: nix run ./ci#fleet-consistency
JobWhat it runsDisposition
formatnix fmt -- --ci in ci/Gates — fails on unformatted code
checksnix flake check (root), then nix flake check ./ci --keep-goingGates — every one of the 18 named checks below
perf-benchnix run ./ci#perf-benchPartial — gates on parity, ratio, and linearity; cpu is measured and reported, gated by nothing
sole-evaluator-reportnix run ./ci#sole-evaluator-reportReported, gated by nothing — deliberately
fleet-consistencynix run ./ci#fleet-consistencyGates — 9 arithmetic-consistency checks over committed baseline JSON, no live fleet evaluation

The checks job runs the root flake’s own check first — its only relevant output is a roster binding that forces the roster to depth, so an unhealthy member reds it — and then every check declared in ci/flake.nix.

All 18 are ordinary Nix derivations picked up by nix flake check ./ci, so a non-zero build exit fails the job for every one of them:

agents-md-citations · agents-md-hub-inputs · architecture-library-graph · ci-plane-coverage · declared-content · direction-of-dependence · hub-entry · hub-substrate · inject-payload · lock-agreement · mdformat-plugins · mkgenlibs-eval · pin-coherence · publication-coverage · readme-audience · readme-figures · rehost-den-parity · treefmt-tree-root

Apps are invoked with nix run rather than picked up by nix flake check, and gate only insofar as their own script’s exit code says so:

AppWhat it doesDisposition
perf-benchRuns the performance-regression matrixGates on parity (every cell’s digest must match across stacks), ratio (pure allocates and thunks less than the reference stack by a fixed margin), and linearity (growth stays bounded across a workload-size step). Never gates on cpu.
sole-evaluator-reportScans the roster for evaluation-driving constructs outside gen-scopeReported, gated by nothing. The property it checks — “anything that evaluates, wherever it’s hosted” — is not statically decidable, so the scan under-approximates it by design; a green run is a statement about the scanner, not a proof about the ecosystem.
fleet-consistencyRe-derives 9 named consistency figures by pure arithmetic over three committed baseline JSON filesGates, but performs no live fleet evaluation — it checks that already-committed numbers still agree with their own arithmetic, plus a --selftest mode that corrupts a baseline copy and asserts the gate actually fires.
flake-compareCompares gen-lib, flake-parts, and adios-flake over one synthetic flakeDefined, wired into no CI job. It exists in ci/flake.nix and runs locally or manually; the workflow above never invokes it.
sole-evaluator-report:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
- run: nix run ./ci#sole-evaluator-report
palette
dark
light
↑↓ select apply esc close

Palettes adapted from Catppuccin (Macchiato) (MIT), Tokyo Night (Apache-2.0), gruvbox (MIT), Catppuccin (Latte) (MIT), Rosé Pine (Dawn) (MIT).