Expand description
sui-spec — declarative Lisp-authored specs for CppNix-parity behaviors.
§Why this crate exists
Every bug we found on the road to drop-in replacement was a spec
bug, not an implementation bug. “Unresolved form has env.out =
‘’”, “hash the final form not the unresolved one”, “mask env
entries whose names match outputs” — these are statements about
CppNix behavior, and they were living inside imperative Rust
functions that happened to be duplicated between the tree-walker
(sui-eval) and the bytecode VM (sui-bytecode). The copies
drifted independently.
This crate is the cure.
§The pattern
Rust is structure and provability. Lisp is transformation, rendering, simulation, and in-flight mutation. The pair can generate each other: a Rust type is the typed border for a Lisp authoring surface; a Lisp spec is the free middle that renders out to any morphism (ATerm bytes, JSON attrsets, probe matrices) a substrate needs.
Every domain below is a #[derive(TataraDomain)] Rust struct
(the hard, typed border) paired with a .lisp spec file (the
free-middle authoring surface). Interpreters in this crate
consume the typed spec and emit the morphism renderings both
engines call. Change the Lisp, both engines change together.
The tree-walker and the VM cannot diverge because they read
the same authored spec.
§Inventory
derivation— input-addressed + fixed-output derivation path algorithms. Was: 50 lines of imperative Rust in each of two engines (4 bugs found this session). Now: one.lispspec and one interpreter.flake— top-level flake result shape policy. Prevents the “leakdescription/nixConfig” class of bug.probe— single-expression cross-engine parity probes. Includes theprobe::Probetype, the originalparity_probes.lispcorpus, and thebuiltin_smoke_probes.lispcorpus (one probe per sui builtin module).rebuild— host-aware multi-stage rebuild parity probes. The typed substrate that letssui-sweep(and future operator surfaces) shadow a realfleet rebuildend-to-end without ever mutating the system.parity— theparity::ParityChecktrait every typed domain implements, plusparity::ShadowReport/parity::Verdict/parity::ProbeContext. This is the second-site abstraction: solve once, bothprobe::Probeandrebuild::RebuildProberide on it, and the futuresui rebuild-shadowsubcommand reuses the same trait without re-authoring the sweep loop.exec— typed dual-subprocess runner. NO SHELL. Mandatory timeout. Captured output as a typed struct.sweep— library entry point for the shadow-sweep loop. Both thesui-sweepbinary and thesui rebuild-shadowsubcommand (future) wrapsweep::run.
More domains will land here as we identify them. Rule of thumb: if the body of a function is “here is what CppNix does”, that function belongs in this crate as a spec + interpreter, not in the engine.
Re-exports§
pub use spec_trait::HasName;pub use spec_trait::Spec;pub use error::SpecError;pub use parity::ParityCheck;pub use parity::ProbeContext;pub use parity::ProbeKind;pub use parity::ShadowReport;pub use parity::Verdict;pub use sweep::Corpus;pub use sweep::SweepConfig;
Modules§
- activation_
script - Activation script generation — typed border for the cppnix
switch-to-configuration/darwin-rebuild/home-manager activatescript generators. - ast_
evaluator - Minimum-viable tree-walking evaluator over
AstGraph— the engine that drives the module-system solver’sBodyEvaluatorimpl today. - ast_
graph - L1 AstGraph — the parsed, canonicalized, content-addressed form of
a single Nix expression (one
.nixfile or one inline expression). - catalog
- Substrate self-description — the typed catalog of every authored sui-spec domain.
- cli
- Typed builders for
suiandnixCLI invocations. - cli_
coverage cli_coverage— typed self-description of sui’s nix-replacement progress.- derivation
- Derivation path computation — the CppNix algorithm as Lisp data.
- dockerfile
- Typed border for a REGULAR Dockerfile (BuildKit-syntax, not a Nix derivation) digested into a content-addressed derivation graph.
- error
- Errors produced while loading or interpreting sui-spec specs.
- eval_
cache - Typed border for the evaluation cache.
- exec
- Typed dual-subprocess runner — the shared substrate every ParityCheck rides on.
- fetcher
- Typed border for nix’s ingest layer —
builtins.fetchurl,fetchTarball,fetchGit,fetchTree,path. - flake
- Flake result shape — declarative policy for
getFlake/callFlakeoutput assembly. CppNix parity, authored as Lisp data. - gc
- Typed border for the nix store garbage collector.
- hash
- Typed border for nix’s hash representation.
- loader
- Generic spec loader — thin wrapper around
tatara_lisp::compile_typed. - lock_
file - Typed border for
flake.lock— the on-disk representation of resolved flake inputs. - lockfile_
graph - L1 LockfileGraph — the parsed, follows-resolved, content-addressed
representation of a
flake.lock. - module_
compiler - Module-system compiler — extracts the typed
ModuleNodeshape from a rawAstGraph. - module_
graph - L4 ModuleGraph — typed IR for a NixOS/nix-darwin/home-manager module system, compiled into worker/wrapper-split assignment closures with slice-keyed re-firing.
- module_
solver - L4 module-system solver — slice-keyed re-firing over a compiled
ModuleGraph. - module_
system - The Nix module system — typed border for the option-merge lattice.
- nar
- Typed border for the Nix Archive (.nar) format.
- narinfo
- Typed border for the narinfo file format.
- nix_
replacement_ coverage - Nix-replacement coverage catalog — one row per Nix workload sui
must cover. Authored as Lisp forms in
specs/nix_replacement_coverage.lisp, projected to typed Rust records here. - operator_
view OperatorView— the shape every operator-facing introspection mode shares.- parity
- The
ParityChecktrait — every typed parity question rides on it. - probe
- Parity probes — each a typed question of the form “does sui agree with CppNix on this expression?”.
- profile
- Typed border for nix-env / nix profile generations.
- realisation
- Typed border for content-addressed derivation realisations.
- rebuild
(defrebuild-probe …)— host-aware multi-stage rebuild parity probes.- registry
- Typed border for the flake registry — the lookup that resolves
short input refs (
nixpkgs,github:owner/repo) to concretefrom→tomappings. - sandbox
- Typed border for the build sandbox.
- spec_
trait - The
Spectrait — the unifying abstraction across every authored sui-spec domain. - store_
analyze - Typed analysis over an observed store.
- store_
diff - Typed diff between two ParsedNar trees.
- store_
inventory - Typed in-memory model of a Nix store.
- store_
layout - Typed border for the
/nix/storedirectory layout. - store_
ops - Typed store-operation primitives — parse, transform, query.
- store_
query - Typed query AST over the typed store substrate.
- store_
recipe - Declarative pipeline composition for store operations.
- store_
transform - Typed transformation AST over ParsedNar trees.
- style
- Nord-palette styled output for sui CLI surfaces.
- substituter
- Typed border for the binary-cache substitution protocol —
cache.nixos.org, S3-backed Attic, local file-system caches. - sweep
- Library entry point for the shadow-sweep loop.
- trust_
model - Typed border for the nix trust model.
- worker_
protocol - Typed border for the nix-daemon worker protocol.