kiln

ZigZon1Nix

v5.1.0 · 36 saves · 12,880 lines · offered 1 hour ago · 522.0 KB · issues

$ koh steal kepr.uk/kiln
·
28 files ⇓ bundle
36 saves
3105d8bump v5.1.0 feature freeze: kiln.md Known Limitations replaced with v5.1 Notes (operator-gated visual/screenshot + config-set stub), CONTINUITY records V1 verification log + 3 fixes + C1-C4 + H1 + ceiling 7600->8400dev1 hour ago
e85d1dupdate CONTINUITY — add v4.3.2 outcome and kepr slice plandev4 weeks ago
621bd5fix ISO CDROM boot path, -drive argv split, and SSH timeout for TCG (v4.3.2)dev4 weeks ago
3c940cremove stale nina-ops fleet registry from prior failed Nina sessiondev4 weeks ago

Details

kiln

A harness you put on your app before you launch it into the wall.

kiln v5 is a deterministic, mechanical testing harness for CLI tools and software projects. It applies maximum pressure to a target and reports exactly what broke, how, and under what conditions. It has no opinions about how to fix what it finds — that is the developer's job.

Kiln contains no AI, no model clients, no API keys, and makes no network calls during normal operation. Same seed, same pressure, same findings. Every run is reproducible by construction.

Install

git clone https://github.com/asha-software/kiln
cd kiln
zig build -Doptimize=ReleaseSafe
cp zig-out/bin/kiln /usr/local/bin/kiln

Or with nix:

nix run github:asha-software/kiln

Prerequisites: Zig 0.16.0, qemu-system-x86_64, bsdtar, curl. docker is optional (used for the service layer — Postgres, Redis tests).

Quickstart

kiln run               # run the test suite once
kiln watch             # run continuously until clean or max_loops reached
kiln break             # adversarial pressure campaign in a QEMU chamber
kiln ash               # show what's pending from the last run

Add --json to any command for the newline-delimited JSON event stream.

Modes

watch runs the suite in a loop. Each new failure is fingerprinted with Blake3, classified, and either routed to a chamber (env-dependent failures) or written to kiln/pending/ as a structured spec for external attention.

break is adversarial. It builds an attack surface from the project source, generates a deterministic pressure program, and — by default — runs it inside a disposable QEMU chamber across seven layers: boundary values, concurrency, resource starvation, longitudinal runs, fault injection, chaos combinations, and NixOS-specific adversarial state corruption. --explore follows up on Critical and High findings to narrow minimal reproductions.

temporal runs scripted multi-cycle workflows in a chamber, detecting what accumulates, drifts, or degrades over many cycles (store growth, generation leaks, output drift, performance cliffs).

visual boots a chamber with a display, captures a screenshot, and compares it pixel-by-pixel against a stored baseline in pure Zig.

fleet provisions and drives many chambers in parallel for large test operations.

The chamber

Serious pressure campaigns run inside a disposable QEMU VM built on a copy-on-write overlay. Everything that happens inside — corrupted Nix stores, filled disks, killed processes, temporal state accumulation — is contained and discarded when the overlay is deleted. The host filesystem is never touched. The accelerator is selected automatically: hvf on macOS, kvm on Linux, tcg as fallback.

Safety

Kiln never modifies, deletes, or creates files in the project source tree. The only permitted write target is kiln/. This is enforced by SafetyGuard, not convention: the source tree is snapshotted before every run and audited after, and any write outside kiln/ exits with code 2 — reserved exclusively for safety violations.

The blast radius of every destructive operation is bounded by construction: disk fill stays inside the sandbox, kill targets only Kiln-owned PIDs, file corruption only touches sandbox paths.

Configuration

Kiln works with zero configuration. To tune behaviour, run kiln init to write a starter kiln/kiln.toml. See kiln.md for the full manual and docs/kiln.1 for the man page.

License

Asha Software, 2026.