Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/korp-collectors

.nornir/build-thing-design.md

korp-collectors' build thing — what the recipe declares, and why

The code is the source (lane AG, 2026-08-30). crates/korp-collectors-build-thing is this repo's impl BuildThing; .nornir/build-variants.toml is emitted from it and read back as authority by nothing:

cargo run -p korp-collectors-build-thing -- emit      # regenerate the file
cargo run -p korp-collectors-build-thing -- toml      # the emission, on stdout
cargo run -p korp-collectors-build-thing -- --list    # the roster and its cargo argv

tests/toml_parity.rs fails for any reason the file and the code differ.

What it declares

One package, one shipped [[bin]], one library. Four rows:

variant kind features what it is
korp-collectors ⭐ exe parsers the driver on the LIGHT surface: DCAT-AP-SE RDF, PxWeb/JSON-stat2, ENTSO-E XML, REST/JSON, Trafikverket → Arrow
korp-collectors-osm exe osm plus the OSM geometry connectors and the RegionSource fetch seam
korp-collectors-osm-daemon exe osm-daemon plus the region-cut daemon: planet → region catalog → the lettered a–g cut → ONLINE, and the post-condition suite that decides whether a fresh extract may replace the one being served
korp-collectors-lib ⭐ lib parsers the parser/registry library a consumer links in-process

linkage = "not-applicable" on the library row is a declaration, not an omission. The driver rows are plain exes: korp-collectors reaches its sources over HTTP, embeds no suite sibling, and is not itself a suite service.

What the hand-written file got wrong, and the emission exposes

The inventory's one "CLI" — collectors_parse — is [[bench]] targets, and the_only_binary_a_row_names_is_the_one_that_exists holds the recipe to that.

The feature axis

Fifteen features; four built; eleven excused by name in [build.allow_unbuilt], each saying what the feature is and why nothing here compiles it. The three recurring reasons are worth stating once:

recipe.rs::the_feature_axis_gate_is_clean runs FeatureAxis::gate() over the declaration, so a new feature with no row and no excuse fails here rather than rotting — and a stale excuse (a feature a row now builds) fails too.