# znippy-zoomies CI/build pipeline — driven by the dwarves forge (brokkr
# descriptor + sindri scheduler).
# `dwarves validate` / `dwarves plan` / `dwarves run [--real]`.
#
# WHY THIS FILE EXISTS (MEASURED 2026-08-25): znippy-zoomies had none. Across the
# whole constellation — 38 repos under ~/git — `nornir/brokkr.toml` was the ONLY
# pipeline declaration until Skidbladnir got one this morning. This repo declares
# FIVE variants and holds 438 test fns across them, and the forge could plan and
# run exactly zero of it. For the repo the LAW names as the suite's multicore
# engine — gatling, and the compressors everything else is told to use instead of
# rayon — that is the worst place in the constellation for the gap to be.
#
# WHICH STEPS BUILD AND WHICH RUN — say it once, plainly.
#
# `run = { variant = … }` BUILDS. `nornir_build_thing::build_variant`, a real
# cargo build under `--real`, producing the artifact.
# `run = { tests = … }` RUNS. `RunKind::Tests` (dwarves `abe10d4`) takes the
# SAME variant's `cargo_args()` with `build` swapped for
# `test` — same package, same `--no-default-features`,
# same (empty) feature list, same profile — through
# `buildgate::run_cargo`. It names a variant rather than
# carrying its own feature list on purpose: a test run
# whose features can drift from the build's tests
# something the forge does not ship.
#
# `RunKind::Container` and `RunKind::Vm` still fall through to `UnwiredRunner`, so
# nothing here declares one. Until `abe10d4` there was no word for a test run at
# all and every pipeline in the constellation declared compile coverage only.
#
# ⚠ VALIDATED AGAINST dwarves 0.1.5 (abe10d4173d0), built from source. The binary
# INSTALLED on this box is 0.1.2 (2026-07-17), which predates `RunKind::Tests` and
# REJECTS this file outright — `dwarves validate` prints "invalid: parse …" with no
# further detail. That is a stale validator, not a bad declaration; the file is
# deliberately ahead of the installed forge. Rebuild/reinstall dwarves before
# reading a red from it.
#
# THE `no_default_features` IS WHY THE TEST STEPS MATTER MORE HERE THAN ELSEWHERE.
# Every variant in `.nornir/build-variants.toml` is `no_default_features = true`
# with `features = []`, deliberately — the shipped decompressors must carry none of
# `gen` / `zlib-ng` (which pull `zip`, `miniz_oxide` and `flate2`, the third-party
# implementations this repo exists to BEAT) and none of `timing` (stderr stage
# timings; the atoms ship quiet). A plain `cargo test` at the root does not test
# that configuration — it tests whatever the defaults happen to be. `RunKind::Tests`
# reusing the variant's own `cargo_args()` is exactly the property wanted: what is
# tested is byte-for-byte the configuration that is shipped.
#
# Every step names a real row in `.nornir/build-variants.toml`. The five build
# steps carry no `needs` between them: five independent binaries in five packages,
# and an invented edge would stop one being attempted when another breaks. Each
# test step needs only its own build.
#
# ⚠ DARK TESTS, counted on this checkout 2026-08-25 — features that gate tests and
# that no declared variant enables:
#
# planet-fixture 2 test fns — `osm-katana/src/lib.rs:44` gates `pub mod fixture;`
#
# ONE, and `.nornir/build-variants.toml` already names it in `allow_unbuilt` along
# with its alias `dev`, with a stated reason. The other unbuilt features there —
# `gen`, `zlib-ng`, `timing`, `testmatrix` — gate bench-only bins and
# instrumentation, not tests, and each carries a written reason for staying out of
# a delivery. So the `#[cfg(feature = "x")] pub mod` hole that hid ~350 tests in
# Skidbladnir is, in this repo, one module and two tests wide, and already
# accounted for. Stated rather than assumed: it was measured. Nothing here carries
# a crate-level `#![cfg(feature = …)]` on a `tests/*.rs` either, and no `#[test]`
# or `mod tests` in the tree sits behind a `#[cfg(feature = …)]` — both checked,
# both empty.
[pipeline]
name = "znippy-zoomies-ci"
[[pipeline.trigger]] # fire when the poll sweep sees HEAD move
kind = "poll"
events = ["push"]
[[pipeline.trigger]] # …and nightly at 05:20 (off nornir 03:00 / skidbladnir 03:20 / modgunn 03:40 / edda 04:00 / skade 04:20 / knut 04:40 / ordning 05:00)
kind = "cron"
cron = "20 5 * * *"
# ── the shipped binaries ─────────────────────────────────────────────────────
[[pipeline.stage]]
name = "build"
[[pipeline.stage.step]]
name = "osm-katana"
# ⭐ the OSM (XML/PBF) → GeoParquet/PBF converter — the one atom here anybody runs
# on purpose rather than reaches for when handed a compressed file.
run = { variant = "osm-katana" }
[[pipeline.stage.step]]
name = "lbunzip2"
# parallel bzip2 decompressor (package `lbzip2`).
run = { variant = "lbunzip2" }
[[pipeline.stage.step]]
name = "lgz"
# parallel gzip decompressor.
run = { variant = "lgz" }
[[pipeline.stage.step]]
name = "ljar"
# parallel JAR decompressor. `features = []` is load-bearing, not boilerplate:
# ljar's `gen` feature pulls `zip` + `miniz_oxide`, the rivals.
run = { variant = "ljar" }
[[pipeline.stage.step]]
name = "lzip"
# parallel ZIP decompressor (package `lzip-parallel`).
run = { variant = "lzip" }
# ── the suites, in the exact configuration the binaries ship in ──────────────
[[pipeline.stage]]
name = "test"
[[pipeline.stage.step]]
name = "osm-katana-tests"
needs = ["osm-katana"]
# 238 test fns — over half this repo's suite.
run = { tests = "osm-katana" }
[[pipeline.stage.step]]
name = "lbunzip2-tests"
needs = ["lbunzip2"]
# 51 test fns.
run = { tests = "lbunzip2" }
[[pipeline.stage.step]]
name = "lgz-tests"
needs = ["lgz"]
# 36 test fns.
run = { tests = "lgz" }
[[pipeline.stage.step]]
name = "ljar-tests"
needs = ["ljar"]
# 55 test fns — and run WITHOUT `gen`, so the comparison arms against `zip` /
# `miniz_oxide` are compiled out, exactly as in the shipped binary.
run = { tests = "ljar" }
[[pipeline.stage.step]]
name = "lzip-tests"
needs = ["lzip"]
# 58 test fns.
run = { tests = "lzip" }