Decisions log
What was chosen, and what it was chosen over. A decision that only records the choice is not a record of anything.
Each row links, where there is one, to the page that works the choice out in full. Rejected alternatives are named in the rationale rather than kept in a separate list, because the reason a design was rejected is only legible next to the one that replaced it.
| Decision | Choice | Rationale |
|---|---|---|
| Genome representation | Typed combinator-term PCFG (not raw graph, not NEAT) | Types make every sample valid; reuses fugue-evo grammar machinery; all 3 evolution levels in one rep |
| Feedback signals | Pairwise duels + stars (ordinal) + keep/kill; implicit signals logged, not in the likelihood | One latent utility, three likelihoods; duels primary |
| Taste features | φ_audio (18) + φ_struct (26) = φ ∈ ℝ⁴⁴ | Transfer across topologies + free structural screening |
| Feature axes | Log-frequency, logged heavy tails, families not per-module columns | The model is linear in φ, so the axis decides what is expressible; sparse columns are coefficients fitted on a handful of rows |
| Utility form | Max of linear experts u = max_k θ_k·z, K = 5 | Multi-modal taste; handles cross-island duels (per-observation and per-session latent-z designs both fail there); no discrete sites; K=1 ≡ BLR |
| Preference sets | Discovered styles, aligned post hoc; nameable and persisted | A style claiming ≈0% of the pool is idle: K is an upper bound |
| Locks / partial evolution | Freeze any set of trace addresses; MH proposals touching them are rejected outside the kernel, in both directions | Exactly Metropolis-within-Gibbs on the conditional posterior, so locking is exact rather than heuristic |
| Hand edits | Knob turn = write at a trace address; keep as new inserts a new candidate; optional “edit beats original” duel, provenance-tagged | Panel and genome share one encoding, so edits, locks, and evolution cannot drift |
| Profile portability | A profile = observation log + standardizer; log stores raw φ by name | θ is only meaningful relative to its standardizer; by-name raw storage is what lets the feature set change without re-interpreting history |
| Modules | 46 productions: 8 sources, 22 processors (two of them player kinds the prior never draws), 16 modulators; categorical orders are append-only wire format | Enough texture axes to learn on; the codec writes indices into the trace |
| Feedback loops in grammar | Not yet (tree terms only; see open questions) | Stability; internal-feedback modules still allowed. Note the ceiling is tighter than “acyclic”: a tree also forbids sharing, so one output cannot feed two places |
| Audition | Standard 5.05 s phrase + free-play; per-style phrases later | Feature comparability requires fixed stimulus |
| Loudness | LUFS-normalize all renders to −18 | Loudness bias would poison the preference data |
| Acquisition | Uniform random pairing by default; BALD selectable, Thompson kept for contrast | Measured tie with BALD over 20 paired seeds in two pool regimes; uniform has no tuning constants and makes every duel an unbiased calibration sample |
| Calibration metric | Brier skill against the 0.5 baseline, plus random check duels | Accuracy is not proper and is pinned near chance by an information-seeking pairing rule |
| Recency | Discounted likelihood, half-life 150 observations | Taste is allowed to change; stationarity is the wrong assumption about a person |
| First frontend | Web / WASM | Both deps ship WASM; fastest UX iteration; shareable |
| Session UX | All three modes, built duels → grid → radio | Same observation stream; sequenced by signal quality |
| Safety | Vetting gate: audition = pre-rendered vetted buffers; the live keys play an edit before its check and are muted if it fails | One render serves health-check, features, and playback; quarantine + fitness shaping teach evolution to avoid pathology; an edit is heard as it is made |
| A generation’s walks | Jobs and one shared context, walked side by side on a render-farm crew raised on demand, absorbed in job order; admissions and replacements judged under the posterior the generation opened with | The seeds are independent, so the generation takes about its slowest walk instead of the sum of ten; job-order absorption makes the pool the serial path’s at every width and whatever order the walks finish in. Parallelism inside one walk was rejected (MH is sequential, and a farm round trip per step is slower than whole walks), and so were fewer or shorter walks (measurably worse search) |
| A search control’s offer | The taste walk tilted along the control’s direction (AIM_GAMMA = 1), continued up to AIM_WALKS = 3 walks until it has moved that way; the reply says how far it did | Growing undirected offers and keeping the one that moved most spends renders on offers thrown away, and yields nothing when no walk heads that way; a graft needs a transparent module, and Grit has none. γ and the walk count are the census’s (a flattened curve, bounded taste cost) |
What is not in this table
Two kinds of thing deliberately stay out of it, and three live on their own pages: open questions, which are decisions that have not been made rather than decisions that have; unraised directions, which are possibilities nobody has yet argued about either way (the distinction matters, because a reader cannot otherwise tell rejected from never considered); and what the audition cannot hear, which is the one premise underneath several rows of this table rather than a row of it.
Reversible details. Buffer sizes, the exact number of MCMC steps, which easing curve a knob uses. These live in the code and in the pages that quote them by name; a decisions log that tracks them stops being readable.
The pass-by-pass history. What changed when is
CHANGELOG.md.
This table is evergreen: it says what is true now and why, not what was true in
March.