Skip to content
Русский

What the five preset gates can and cannot see

A preset ships when the behavioral suite is green (ADR-0081), so what “green” is evidence of is worth stating rather than inferring. Five gates sweep the shipped set, and one of them drives real audio:

gatewhere its numbers come fromwould it notice a preset that ignores the music?
reactivityPCM → the real analyzer — four core::signal clips (60 Hz sine, a mid chord, a 12 kHz tone, a 240 BPM click track) pushed hop-by-hop through Analyzer via Renderer::capture_audio_after_warmup, which advances the analyzer’s warm-up hops without pixels and rasterizes only the measured windowYes. This is the only one. A preset that reads no band moves identically under all four clips and fails
sanityone synthesized AnalysisFrameNo — it asks whether the frame is lit, spread and tonally structured
animationa zeroed AnalysisFrame held constant, and a synthesized fully-driven one for the second reading — both held constant, neither from PCMNo, by design — it asks whether the picture moves at all, on the scene’s own clock or against full drive. Neither reading passes a sample through the analyzer, so a preset whose bindings are wired to the wrong band still animates on both
distinctnessone synthesized AnalysisFrame, shared across a familyNo — it asks whether two presets look alike
goldenfrozen fixtures with constant paramsNo — it asks whether the renderer still draws what it drew

Four of the five are right to synthesize. Their questions are about the frame — is it lit, does it move, is it distinct, does it match its baseline — and a made-up analysis frame answers those correctly and several times faster than pushing samples would. Converting them would buy nothing and cost the sweep a multiple of what it costs now. That is a decision, not an omission (Plan 0067, “What this plan does NOT do”). The price of converting one has dropped since that decision — Plan 0067 measured it at ~1.8x when every hop rasterized, and Plan 0084 removed the warm-up renders from that figure — but the reasoning above does not turn on the price, so the decision stands.

So read a green suite as: the renderer produced a plausible, distinct, moving frame, and the preset responds to at least one band of real audio. It also says nothing about whether the library wants another preset like this one; that is a curation judgement made at a plan’s close, not a property a gate can hold. What green still does not say is that the preset responds well — reactivity compares a driven band against silence, and against silence a binding that saturates just above the noise floor is maximally responsive. That gap is saturation’s (a CPU-only expression walk over a 12 s dynamic:110 probe), and it is the second gate that sees real signal even though it renders nothing. beat, chain and dsp also push PCM, but they test fixtures and the DSP itself rather than the shipped set.

A fourth caveat, since Plan 0090: on an emitter world, a green gate means something different at prewarm = 0 than at prewarm = 1, and no gate can see which. Every behavioral gate captures 30 frames — half a second — and an emitter’s population ramps toward spawn_rate * lifetime over a whole lifetime from an empty pool. prewarm back-dates that ramp so the first frame is already the steady state, which means the gates score the world the author is designing rather than the first 3 % of it. The same draft, changed in nothing else:

statisticprewarm = 0prewarm = 1floor
sanity coverage / radial shells0.0074, 0 of 10 — convicted blank0.1470, 10 of 10 — structurally present0.25 / 4 shells
animation footprint motion0.06290.17020.01
reactivity best band0.00020.01950.02

Two things follow. A slow emitter world that fails sanity may be failing its warm-up rather than its design — check prewarm before touching the look. And a green row on a prewarmed world says nothing about what the first seconds of a live set look like, which is the question prewarm = 0 was answering all along. Neither the capture length nor any floor moved to accommodate this (ADR-0104 rejected that; the warm-up is what got attacked instead).

A fifth caveat: sanity’s blot check convicts nothing in the library, and that is a landmine rather than a clean bill of health. The check is a conjunction — tonally flat and structureless — and no shipped frame fails both, so a regression in its wiring would look exactly like a healthy library. What stops that regression from being invisible is two frozen fixtures rather than the library: Blown Out, a stroke figure clipped to one tone, and Ragged Blot, a particle cloud stacked past the same ceiling, are both convicted by both terms, and core/tests/sanity.rs asserts each conviction term by term. Two limits follow, and reading only the first will mis-price the gate:

  • The conviction rests on three frames. Two blots and one composition (fragment_tiledmono) are what the 1.17 cut and the 0.23 floor are measured between, and a three-point calibration is not a general one — ADR-0200 says so in its own Consequences. The second blot is what makes the calibration state a property of the defect class rather than of one fixture’s rim: the separation it buys is wider than the two blots’ own spread, which a single anchor cannot even express. boundary_density still reads pixel-scale perimeter, so a blot raggeder than either fixture has more perimeter per lit pixel than a composition does, and that decay mode is ADR-0130’s accepted cost rather than a solved problem.
  • Over half the library is below the structural floor already and is held only by the tonal term. 62 of 112 shipped presets read under their family’s boundary_floor — the whole of shape_collage and warp_mesh, 15 of 20 attractor, 11 of 14 fragment_field including Sumi at 0.1001. They pass because they have tonal structure, not because they have interior. So converting any of them to a two-ink print flips them from passing to convicted, since that raises tonal_flatness toward 1.0 and leaves boundary_density untouched. Each such conversion needs its own floor arm with its own derivation before it can ship. The gate prints the full list and the count on every run, unasserted — there is no measured basis for a threshold on it, and it is expected to move.

If one of the other four ever needs to answer an audio question, reactivity.rs is the pattern: synthesize with core::signal, drive Renderer::capture_audio_after_warmup, and keep the clip only as long as the analyzer’s window needs to fill — WARMUP_HOPS of the ~40-hop clip publish nothing at all, so they are fed as warm-up and never rasterized.

Copying it carries one consequence that is easy to miss (Plan 0084 Phase 4, 2026-08-13). Skipping the warm-up renders is safe for the analyzer — analysis is a pure function of its window and the render pass never touches it, which core/tests/suite/capture_advance.rs asserts bit-for-bit — but it is not a no-op for the scene. A scene that integrates on the GPU (trails, particles, reaction-diffusion) now meets the measured window WARMUP_HOPS steps colder than it would have, because those hops used to double as the scene warm-up. Time-driven scenes are unaffected, since the clock advances either way. When that change landed on reactivity it moved 35 of 36 per-band vectors — all upward, none regressed, and the tightest headroom in the library roughly doubled — but a gate copying the pattern should expect its own numbers to be a fresh baseline rather than comparable to a rendered-warm-up run. Nothing asserts this; it is documented here and in the two source docstrings because no instrument in the repo can see it.

Built from 13c7582 at version 0.158.0. This site tracks main and is not versioned per release.