Bring the docs/zig/** decision package and README 'Native Substrate Direction' section into main, and record ADR-0196 (Accepted) as the binding ratification. The doctrine is explicitly NOT a wholesale Zig rewrite. It establishes a ring architecture (Python = semantic source of truth; Rust = incumbent algebra backend; Zig = Ring 1 native-substrate candidate only) and the G0-G8 adoption gate ladder. Zig may enter only by clearing gates against a locked reference contract; default-by-availability is forbidden. ADR-0196 forward-references ADR-0180 as the first G1 instantiation (the CRDT contract lock / ZC-0 slice). No Zig code is authorized.
7.8 KiB
Zig Guidance — Audio Compiler
Status: doctrine / prototype candidate
Component: audio_core_v1 deterministic compiler substrate
Primary governing ADR: ADR-0181
The audio compiler is the second strongest Zig candidate after the CRDT substrate, and may become the best long-term fit once the Python reference spec is locked.
Audio in CORE must not enter as an opaque embedding. It must enter as a deterministic compiler product: canonical waveform bytes become typed AudioIR, then lawful operators, then a (32,) float32 versor plus content-addressed provenance.
Why this component is suitable for Zig
The audio compiler is streaming, buffer-heavy, deterministic, and edge-native. That maps well to Zig.
Zig is suitable for:
- canonical PCM handling;
- fixed sample-rate frame grids;
- deterministic quantization;
- acoustic lexer passes;
- typed event serialization;
- checksum chain construction;
- pack-local read-only operator tables;
- chunk-to-compilation-unit emission;
- C ABI handoff to CRDT arenas;
- future no-Python streaming compilation.
Zig is not suitable for replacing the teacher/shadow lanes. Whisper, NeMo, CLAP, EnCodec, and similar tools remain optional Python-side evidence lanes. They label or align; they never define the substrate.
Existing contract to preserve
ADR-0181 requires:
waveform / live stream
-> canonicalizer
-> frame grid
-> acoustic lexer
-> typed AudioIR
-> operator registry
-> rotor lowering
-> versor composition
-> (32,) float32 AudioCompilationUnit
The chunk boundary is the Delta-CRDT delta boundary:
inside chunk: serial rotor composition, order-sensitive
across chunks: order-invariant CRDT deltas
The native compiler must never parallelize the non-commutative compile_events loop. It may parallelize independent chunks only after each chunk has its own serialization barrier.
What should be in Zig
A Zig audio compiler lane should include:
core-zig/src/audio/signal.zig
core-zig/src/audio/canonical.zig
core-zig/src/audio/resample.zig
core-zig/src/audio/frames.zig
core-zig/src/audio/lexer.zig
core-zig/src/audio/ir.zig
core-zig/src/audio/operators.zig
core-zig/src/audio/project.zig
core-zig/src/audio/checksum.zig
core-zig/src/audio/ffi.zig
include/core_audio.h
Canonicalizer
Responsibilities:
- accept caller-owned PCM-like input;
- downmix to mono if policy allows;
- resample to the declared rate using frozen coefficients;
- emit source and canonical hashes;
- produce canonical sample buffer with declared dtype and sample rate.
Forbidden:
- relying on platform resampler defaults;
- hidden model inference;
- lossy semantic classification;
- leaking raw PCM past the trace boundary.
Frame grid
Responsibilities:
- deterministic window length;
- deterministic hop length;
- deterministic zero padding;
- no wall-clock dependent chunking;
- explicit continuity state for streaming phase.
Acoustic lexer
Responsibilities:
- measure facts, not guess semantics;
- quantize before semantic promotion;
- emit integer-like token payloads;
- avoid unstable float hashes;
- keep all thresholds pack-owned and versioned.
AudioIR serialization
Responsibilities:
- canonical event order;
- stable field ordering;
- no map/dict iteration dependence;
- stable hash independent of allocation address;
- content anchors as evidence only.
Operator lowering
Responsibilities:
- read pack-local, checksummed blade aliases;
- use declared elliptic rotor rules for v1;
- quantize theta before rotor construction;
- compose in canonical event order;
- call algebra-owned
unitize_versorsemantics or an approved native equivalent; - verify
versor_condition < 1e-6without weakening.
AudioCompilationUnit contract
The Zig compiler should produce a C-compatible equivalent of:
canonical_sha256
ir_sha256
pack_id
pack_manifest_sha256
projection_sha256
versor: [32]f32
versor_condition
merge_key = (canonical_sha256, ir_sha256, projection_sha256)
The unit is the only audio object that may enter a CRDT arena.
No raw PCM should appear in the Vault record or TurnEvent trace. Provenance is hash-based:
{ merge_key, pack_id, pack_manifest_sha256 }
Minimum C ABI sketch
typedef struct CoreAudioCompiler CoreAudioCompiler;
typedef struct CoreAudioUnit CoreAudioUnit;
typedef struct CoreAudioCompileInput {
const float* samples;
unsigned long sample_count;
unsigned int sample_rate;
unsigned int channels;
unsigned long start_ms;
unsigned long end_ms;
} CoreAudioCompileInput;
CoreAudioCompiler* core_audio_compiler_open(
const char* manifest_path,
CoreAudioError* err
);
void core_audio_compiler_free(CoreAudioCompiler* compiler);
int core_audio_compile(
const CoreAudioCompiler* compiler,
const CoreAudioCompileInput* input,
CoreAudioUnit** out_unit,
CoreAudioError* err
);
void core_audio_unit_free(CoreAudioUnit* unit);
int core_audio_unit_get_versor(
const CoreAudioUnit* unit,
float out_versor[32],
CoreAudioError* err
);
int core_audio_unit_get_merge_key(
const CoreAudioUnit* unit,
unsigned char out_canonical_sha256[32],
unsigned char out_ir_sha256[32],
unsigned char out_projection_sha256[32],
CoreAudioError* err
);
The final ABI must be ratified before implementation is treated as supported.
What should remain Python first
The Python implementation/spec should remain first for:
- IR schema design;
- fixture authoring;
- expected hash generation;
- pack manifest evolution;
- eval harness;
- teacher/shadow lanes;
- operator table experimentation;
- Workbench display.
Zig should not become the place where audio ontology is invented. It should become the place where a locked ontology is compiled with mechanical discipline.
Required proof obligations
A-Z1 — Canonical determinism
Same source bytes and same pack produce same canonical hash, frame tokens, IR hash, projection hash, and versor.
A-Z2 — Serialization barrier
Swapping two order-sensitive in-chunk events must change the compiled versor. This negative test proves the compiler has not accidentally treated non-commutative composition as a CRDT merge.
A-Z3 — Merge-key idempotence
Re-ingesting the same AudioCompilationUnit must be a no-op after CRDT merge.
A-Z4 — Trace hygiene
No raw PCM bytes may appear past compiler-local buffers.
A-Z5 — Teacher isolation
Teacher hints may affect content/evidence anchors, but must not mutate projection_sha256 unless a separate ADR explicitly changes substrate policy.
A-Z6 — Closure invariant
Every emitted unit must satisfy:
versor_condition(v) < 1e-6
No threshold weakening is allowed.
Migration sequence
- Keep Python
sensorium/audio/**as the reference implementation. - Freeze fixtures and expected hashes.
- Build Zig canonicalizer + frame grid first.
- Add lexer and IR serialization.
- Add operator lowering after Python semantics are stable.
- Emit
AudioCompilationUnitthrough C ABI. - Wire to CRDT arena only behind explicit selector.
- Promote only after parity, determinism, and sequential==concurrent proofs pass.
Non-goals
Zig audio must not:
- make ASR the substrate;
- use CLAP/EnCodec embeddings as the projection;
- hide stochastic model calls inside compile;
- add normalization outside the allowed compiler boundary;
- bypass
ModalityPackgate closure; - write the global Vault directly;
- compile audio into any shape other than
(32,) float32at the projection boundary; - skip the CRDT merge-key discipline.
Recommendation
Make Zig a first-class experimental lane for audio_core_v1 after Python PR-2/PR-4 semantics and fixtures are locked.
Do not make Zig the first implementation of the audio ontology. Make it the mechanically superior implementation of a proven compiler contract.