music/STEPBACK_POSTMORTEM.md
CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
Canon served: Josh's four recorded music grades (docs/review_candidates.json and
docs/spine/DECISIONS_PENDING_JOSH.md), the melody-first / thirty-year-bar direction (memory
music-direction-melody-first-30-year-bar), the composed-never-prompted rule, the no-human-composer
ruling, the CVD §17.1 care line, and proof-before-spend.
If this document disagrees with canon, CANON WINS and this document is the defect.
TIER: ADVERSARIAL SELF-AUDIT — PROPOSAL-TIER. ENGINE, not CANON. It sets no canon, names no
region content, changes no spine or registry row, and picks no vendor. It is the post-mortem Josh
ordered when he asked whether we are on the right stack at all. **The subject of the audit is our own
work, and there is no defence of it below.**
DERIVED FROM:
docs/review_candidates.json :: candidates[] — PASS7_FLORES_{ROAD,FALLS,ROUNDS}.grade_verbatim and .grade_reading (graded 2026-08-09), PASS5_* (graded 2026-08-08), round_1_takedown_note,
round_2_note, round_2_takedown_note, round_3_takedown_note, round_4_note
docs/spine/DECISIONS_PENDING_JOSH.md — MUSIC ROUND 1 GRADED + THE COMPOSITION FLOOR (L5482 ff.),ROUND 2 GRADED (L5600) + THE ROUND-2 FLOOR ADDENDUM (L5615), THE MUSIC GENERATOR VERDICT (L3884),
GRADED 2026-08-08 — ROUND 3 DOWN, ALL THREE, AND THE DIAGNOSIS IS ARCHITECTURAL (L5744)
build/audio/pass7/ROUND4_STAGING.md §0, §1, §2, §3, §4, §5, §6, §7, §7A, §7B, §8, §8A, §8Bbuild/audio/pass5/PASS5_VERDICT.md §0-§9 and build/audio/pass4/PASS4_VERDICT.md §0-§7docs/proposals/music/MUSIC_PRACTICE_GAP_AUDIT.md §0, §1, §3, §4, §4Abuild/audio/exemplars/instruments/*_VALIDATION.md + HARMONY_FIT.md + MELODY_BANDS.json + GROOVE_BANDS.json + build/audio/exemplars/CORPUS.json
harness/music_gen/ read at HEAD — pass3_flores.py, pass5_flores.py, pass7_flores.py, pass2_realise.py, pass7_realise.py, theme_compositions.py, author_head_cell.py,
timbre_critic.py, pass7_battery.py, floor_instruments.py
docs/DOC_MAP.md music rows L173-L221, L934, L1038, L1053-L1062NOT DERIVED (authored judgment, and why it had no canon home):
clauses; nothing in canon apportions them. Every apportionment below cites the measurement it rests
on, and where the evidence is ambiguous it is called ambiguous rather than assigned.
judgment so the director can veto any line of it.
---
Josh, ordering this step back: *"you have to be polluting the LLM creating this. Are we using the
proper tech stack?"*
There is no music model in the loop to pollute. Rounds 2, 3 and 4 contain zero music-trained
parameters anywhere between the canon and the WAV. The only model in the generation loop is a
code-generation LLM, and what it emits is Python. The melodies Josh has now turned down three times
in a row are six-, five- and seven-note tuples typed into a source file
(harness/music_gen/pass3_flores.py:127, :135, :142) with a prose comment above each explaining
the theory it is meant to realise. Every round since has developed those same cells by rules written
by the same code model, and graded them with instruments written by the same code model, whose own
validation files state in their own words that they cannot rank real music by quality. So the honest
answer is not that the model is polluted. It is that **the model is being asked to be the composer
through the narrowest channel available to it — literal note tuples and rule systems — with no
musical prior anywhere in the stack and no ear anywhere in the loop except Josh's, four rounds
apart.** The one round that DID contain a music-trained model (round 1, ACE-Step 1.5) was rejected
for a different reason and its lesson was mis-generalised: we concluded that generation had to be
composed rather than prompted, which was right, and then built a composer with no musicality in it,
which does not follow.
---
Read in order. These are the only quality verdicts this program has ever received.
| round | staged | artifact | Josh, verbatim |
|---|---|---|---|
| 1 | 2026-08-07 | 18 candidates, build/audio/generated/slice_v1/**, ACE-Step 1.5 full renders | *"This round was way better. Still nothing passes and pretty far from the floor… Each track will be dozens of layers… I dont like repetitious loops lasting more than 3-5 cycles without introducing a new instrument or catch or melody or beat drop… its got to have the hooks and complexities. There cant just be stacked noise… around 20+ complete tracks per region or cultural node and time period. Learn real music theory and what someone who studied music and got their phd would focus on and improve."* |
| 2 | 2026-08-07 night | PASS2_FLORES_{REST,WATERFALL} | *"Neither of the songs pass. They sounded much better, but the melodies are way too simple. There needs to be a lot more complexity added and to put some intelligence into the melodies and how everything orchestrates."* Plus the FLOOR ADDENDUM: *"The songs dont build and hold with proper peaks and valleys that still never lose the listeners, I like more upbeat… Whats going to make people 30-50 years later still listen to it for nostalgia? And it play in orchestras."* |
| 3 | 2026-08-08 | PASS5_FLORES_{ROAD,FALLS,ROUNDS} | *"it sounds just like a bunch of noise and these main melodies really suck. They clash and have no rythm or complexity. Just a few notes slowly played back to back. Never any harmonies added on. These are more complex than round 2 but they're actually worse tracks than round 2 and far less shippable"* |
| 4 | 2026-08-09 | PASS7_FLORES_{ROAD,FALLS,ROUNDS} | *"Round 4 is even worse than round 2 and is not shippable. The melody sucks. I hate the instruments you are using. I hate how slow the melody is and there is no variation or changes or movement throughout the songs. Everything sucks."* |
Two earlier verdicts belong in the same list because they are the same ear on the same program and
they are routinely left out of round counts: 2026-08-05, on the shipped orchestral cohort — it
was all the same track, all thirty seconds, one sound, a five-second loop
(harness/music_gen/sameness_baseline.py exists because of it); and 2026-08-06, on the three
loop-proof ACE-Step beds — *"that music is still terrible."* **Six recorded negative verdicts, zero
positive ones, across every architecture this program has tried.**
Every claim in §3 through §7 was verified by opening the file, not by reading a report about it.
harness/music_gen/ is 88,013 lines of Python across 85 modules. The census of what those modules
actually import, taken for this audit:
pass3_flores → pass3_grammar → pass4_grammar → pass5_flores → pass7_flores → harmony → groove) imports numpy, json, math, random, hashlib,
copy and each other. Nothing else. No model of any kind, no checkpoint, no inference runtime.
torch appears in four files and in none of them is it a composer. generate.py and sa3_generate.py are the round-1 ACE-Step drivers; instr_layer_census.py is an analysis
instrument; and **pass2_realise.py — the renderer every round from 2 to 4 runs through — names
torch only inside a set of FORBIDDEN tokens.**
(pass2_realise.py:1205-1224). It parses its own imports rather than grepping them — because the
first version of the check matched its own argument list — and refuses sa3_generate, generate,
acestep, stable_audio, diffusers, torch, transformers and audiocraft, with a positive
control proving the parser can say yes.
That firewall is the composed-never-prompted rule made structural, and it is honest engineering. It
also means **the absence of learned musicality in rounds 2-4 is not an oversight — it is an
architectural decision, encoded as a control, and it is the decision this post-mortem exists to
re-examine.** librosa and scipy appear widely, but only in the measurement instruments, which
read finished audio and generate nothing.
These are cited to ground what exists outside our stack (§5, §8) and for nothing else. No number
in this document comes from any of them.
---
Every internal number improved, monotonically, round over round, on identical code. His grade went
down, monotonically, over the same rounds. **They are anti-correlated, and the anti-correlation is
visible in our own published tables.**
| axis, same code every round | round 2 | round 3 | round 4 |
|---|---|---|---|
score-side targets passed (SCORE_SCORECARD) | 7 of 57 | 55 of 57 | 57 of 57 |
| piano / thirty-year nostalgia test, cues passing | 0 of 3 | 1 of 3 | 3 of 3 |
| longest span of novel tune before repeat or rest, ROAD lineage (bars) | 3.75 | 6.03 | 12.9 |
| melodic note density, score tier, ROAD lineage (per sounding s) | 0.739 LOW | 1.847 LOW | 2.734 IN band |
| step share, score tier, ROAD lineage | 0.275 LOW | 0.371 LOW | 0.555 IN band |
| chord-tone agreement vs its own random-melody null, cues clearing p95 | 0 of 3 | 0 of 3 | 1 of 3 |
| undeclared parallel perfects, ROAD / FALLS / ROUNDS | — | 171 / 99 / 99 | 120 / 64 / 47 |
| Josh's grade | turned down | turned down, "worse than round 2" | turned down, "even worse than round 2" |
And the axis that runs the other way, from the same tables — the one that matches his ear and that we
were scoring as a pass:
| axis | round 2 | round 3 | round 4 |
|---|---|---|---|
| measured boundaries — how many times the music becomes a different thing (ROAD lineage) | 22 | 10 | 8 |
| longest measured hold, ROUNDS lineage | 0 s (no flat stretch existed) | 34.92 s | 53.50 s |
| arc instrument verdict, ROAD lineage | FAIL | PASS | FAIL |
Read those two tables together and the mechanism is plain. Josh's round-2 addendum said *build
and hold with proper peaks and valleys that still never lose the listeners*. We encoded the first
half of that sentence as instr_dynamic_arc's hold-share floor and encoded none of the second half.
Four passes then optimised toward longer holds and were rewarded for it: ROUNDS went from no flat
stretch at all to a fifty-three-second one, and ROAD's segmenter boundaries fell from 22 to 8 — one
change every 28 seconds in a 223-second cue. Round 1's floor had already ruled the opposite in his
own words: *"I dont like repetitious loops lasting more than 3-5 cycles without introducing a new
instrument or catch or melody or beat drop."* His round-4 sentence is *"there is no variation or
changes or movement throughout the songs."* **That defect was on our own card, in our own numbers,
getting worse every round, being scored as a pass, because the instrument that read it had been
built from half of his sentence.**
This is the deepest process finding in the post-mortem and it is not about music at all. It is that
a hand-encoded objective function derived from a paraphrase of the customer's sentence will be
optimised against, faithfully, all the way past the thing the customer meant.
---
harness/music_gen/pass3_flores.py:114-144. Three Python literals. This is the entire melodic
source of rounds 3 and 4:
IDEA_ROAD = G.Cell([(69, 0.0, 0.75), (71, 1.0, 0.5), (74, 2.0, 1.25),
(76, 4.0, 0.75), (81, 5.0, 1.0), (76, 6.5, 1.0)], 4, "ROAD")
IDEA_FALLS = G.Cell([(76, 0.0, 2.0), (71, 2.5, 1.0), (69, 3.5, 0.5),
(71, 4.5, 1.5), (66, 6.5, 1.0)], 4, "FALLS")
IDEA_ROUNDS = G.Cell([(62, 0.0, 0.5), (62, 1.0, 0.5), (66, 1.75, 0.75),
(64, 3.0, 0.5), (69, 4.5, 0.75), (66, 5.5, 0.5),
(64, 6.5, 1.0)], 4, "ROUNDS")
Six notes, five notes, seven notes. pass7_flores.py:177 imports pass3_flores; round 4 is a
transform of the round-3 plan with its structural tones nudged onto the new chord grid by
harmony.snap_structural_tones (pass7_flores.py:1279). **Round 3's verdict said the melodic
material was pass 3's byte-identical and had never been heard by anyone
(PASS5_VERDICT.md §7); round 4 changed its harmonisation, not its identity.** So the tune Josh has
rejected three consecutive times is one authoring act, performed once, in a code editor, by a
code-generation model choosing MIDI integers to satisfy a prose constraint.
The same is true one layer up. harness/music_gen/theme_compositions.py holds the thirteen canonical
theme heads — the leitmotifs that are supposed to survive thirty years — as dicts of pitch tuples,
authored under Josh's own 2026-08-05 ruling (*"Humans aren't composing the music… The entire music
pipeline is yours"*). author_head_cell.py is the BATTERY that checks each composition against the
constraint it claims to realise. **Nothing in either file proposes a tune. They record one and then
verify its compliance.** The promotion note in author_head_cell.py:15-19 is precise about why the
A/B went this way: text conditioning did not reliably realise a specified melodic shape (100%
delivery of the brief's licensed leap on authored material against 12.5% and 0% from sixteen
text-only candidates), so authored composition was promoted as the melodic source. That measurement
was correct. **The conclusion drawn from it — that the melodic source should therefore be typed
literals — was one option of several and was never A/B'd against a symbolic model constrained the
same way.**
Everything downstream is rule systems written by the same model: pass3_grammar and pass4_grammar
(plant, sequence, mutate, displace, augment, reharmonise, liquidate), harmony.py (21 rule codes, a
mode-constrained chord vocabulary, voice-leading by candidate filtering, an ERB spacing floor derived
from Glasberg-Moore), groove.py (metrical hierarchy, Longuet-Higgins & Lee syncopation, a per-class
groove library). This is genuinely good engineering. None of it has ever heard a piece of music.
---
This is the honest credit side, and it is real. Nothing below should be thrown away because the
melodies failed.
row per layer with the bar it enters and the bar it leaves, novelty schedules, per-cue span
schedules where no two cues share an operation sequence, an operation split or a derivation shape
(PASS4_VERDICT.md §1b). Round 1's architectural defect — one caption in, one mix out, nothing
controlling what entered when — is genuinely solved, and Josh confirmed it with his ear:
round 2 *"sounded much better"* than round 1.
Section 10; the antagonist's menace carried by instrument, register, articulation and rhythmic
displacement with each margin measured and declared, after the pitch-set disjunction was correctly
identified as a harness invention rather than a canon requirement (ROUND4_STAGING.md §3). A
voice palette that was reachable and deliberately not used because the region page attests no sung
register (PASS5_VERDICT.md §4). **No generative model on the market will do this, and it is not
optional for this project.**
timestamps that prove it; must-fire controls that turn a row red when the property is stripped; a
forged waiver value caught by a critic and the row rearmed to read a file rather than a claim
(PASS5_VERDICT.md §5). Loudness to ITU-R BS.1770-4 controlled against ffmpeg ebur128 to 0.02 LU
on a real file. A synthetic room, so no third-party IR licence can ever be withdrawn from under a
shipped game.
flagged, 16 of 16 known-answer controls green. Josh's floor is 20+ complete tracks per region node
across 76 region rows — on the order of 1,500 tracks — and the failure mode at that scale is
sameness, which he has already graded once (2026-08-05).
separation arm and say so on their own faces. That posture is worth more than any of the numbers
and it is the reason this post-mortem could be written from our own files in an afternoon.
---
**There is no learned musicality anywhere in the generation loop, and its absence is enforced by a
control we wrote** (§1.2, pass2_realise.py:1205-1224). Not "not enough of it" — none, deliberately.
A model trained on music has a prior over what melodic continuations sound like to people who have
heard music. Our stack has, in that slot, a code model choosing integers to satisfy predicates. The
consequences are specific and all four are measured in our own files:
1. **The grammar can transform material; it cannot judge whether the material is worth
transforming.** pass3_grammar will plant, sequence, mutate, displace, augment, reharmonise and
liquidate a bad cell exactly as diligently as a good one, and every one of those operations will
score as a pass. Round 3 is the proof: 57 of 57 score-side targets, 3 of 3 on the arc instrument,
and *"these main melodies really suck."* Round 4's dissonance_classifiability at 0.31-0.40 —
roughly two thirds of non-chord tones unclassifiable as passing, neighbour, appoggiatura,
suspension or anticipation (ROUND4_STAGING.md §8 item 3) — is the same fact in vertical form:
the notes are being placed by rules that do not know what the note after them will sound like.
2. The vertical relationship is at chance. instr_harmony_fit's random-melody null re-draws the
melody's pitches uniformly from the plan's own mode inside each part's compass, keeping the
rhythm, 200 seeded draws. **Round 2: 0 of 3 cues clear their own null. Round 3: 0 of 3. Round 4:
1 of 3.** In plain words, for five of six cues across two rounds, the melody's agreement with its
own chords is statistically indistinguishable from random pitches drawn from the same scale. That
is what a pitch sequence produced without a musical prior looks like when you finally build a test
that needs no corpus.
3. Our judges cannot tell good music from bad music, and they say so. Every one of them was
priced against a within-album permutation multiplicity bar — can the axis tell a track Josh has
loved for decades from competent filler on the same album — and **not one axis in any instrument
clears it.** instr_dynamic_arc: best deviation 0.1527 against a p95 bar of 0.1750, published
with the sentence *"this instrument cannot rank real music by quality."* melody_bands: every
axis DEFECT-DETECTOR-ONLY or NULL. instr_groove: 0 separates, 2 defect-detector-only, 5 null.
instr_melodic_intelligence: zero of five axes reach AUC 0.75. Worse, several point the wrong
way — instr_hook_presence scores the round Josh threw out HIGHER than the music he loves
(hook_strength AUC 0.306), instr_melodic_intelligence's counter-melody axis reads 0.195, and
instr_groove finds three audio axes where the loved tracks score LOWER because a pulse near
perfect regularity is a grid, not a groove. instr_noise_structure measured sensory roughness —
the one thing that could grade clashes on a render — at AUC 0.4963, chance, and withdrew its one
apparent separator when it turned out to be reading codec provenance. **The whole judging bank
separates OUR OUTPUT from real released music and cannot rank real music. Optimising against it
moves the work toward "not obviously machine-made" and never toward "good."**
4. No ear is in the loop before Josh's. Four rounds shipped to the only ear in the program
without a single internal listen — every verdict document says so in its own opening paragraph.
The image factory has critics that LOOK; music has none that LISTEN. And the one instrument in the
repo built precisely to catch a fake-sounding render, timbre_critic.py (blind to the score,
anchored on 1,182 measured cards of real released game music), **is not imported by
pass7_battery.py, pass5_battery.py, floor_instruments.py or pass7_flores.py.** The single
thing we own that could have failed round 4 for how it SOUNDS was not run on round 4.
---
Apportioned against measurements, one clause at a time. Where the evidence does not decide, it says
so.
ACE-Step 1.5 produced a finished mixdown from a prose caption. Nothing controlled what entered when.
The loop's own measurement was that roughly half the card dimensions do not respond to the
generator's conditioning — the control surface was the ceiling, not the targets
(DECISIONS_PENDING_JOSH.md, THE MUSIC GENERATOR VERDICT, 2026-08-06). The right lesson was
*generation must be composed, not prompted*. The lesson we also drew — *therefore no learned model
may participate anywhere* — does not follow from that measurement and was never tested.
*"They sounded much better, but the melodies are way too simple."* The architecture fix worked and he
said so. The complaint is entirely about the material: one head cell realised three ways, longest
novel span 3.5-4.0 bars, one to three distinct ideas per cue. Rendering was not named.
| clause | apportionment | the measurement |
|---|---|---|
| *"sounds just like a bunch of noise"* | CODE DEFECT, surfacing as rendering | For four passes pad and arpeggio returned pitches without the absolute-MIDI marker, so compile_layer read MIDI 38 as scale degree 38. Every resolved pitch landed between MIDI 136 and 210 and fit_to_range folded it back — the round-3 organ pad sounded at MIDI 86-93 instead of its written 43-50. Two octaves high, on top of the tune, as a sustained in-mode wash with no harmonic meaning. Nothing looked broken; every manifest balanced (ROUND4_STAGING.md §0) |
| *"they clash"* | BOTH | The same octave defect, plus a deliberate pitch-class disjunction between the region layers {2,4,6,9,11} and the broker layers {0,3,5} with no shared tone — a harness invention, not a canon requirement (§3 of the staging doc). Residual after both were fixed: dissonance_classifiability 0.38-0.40, two thirds of non-chord tones unclassifiable — composition |
| *"no rythm or complexity"* | COMPOSITION, corroborated by rendering | Composite syncopation measured 0.000 on every cue of rounds 2 and 3 — not one onset in the groove core ever hangs over a stronger rest. On the audio side, beat consistency 0.98 and pulse salience above band: a rigid grid with nothing played against it |
| *"a few notes slowly played back to back"* | COMPOSITION | FALLS sustains 1.58 bars of novel material before it repeats or rests; ROUNDS contains one distinct idea and needs two (ROUND4_STAGING.md §2) |
| *"never any harmonies added on"* | COMPOSITION — a missing architectural layer | There was no harmony layer in the architecture at all. Not thin: absent |
| clause | apportionment | the measurement |
|---|---|---|
| *"I hate the instruments you are using"* | RENDERING, unambiguous, and named for the first time | Free CC0 community sample sets played by offline sfizz, one dynamic layer per note, round robins on almost nothing, scripted rather than recorded transitions, no true legato. The tuned-bronze half of a gong-waning ensemble played by concert instruments in 12-TET because no pitched gong exists in either CC0 set; the bamboo flute is a baroque recorder. Room is a synthetic diffuse field with no early-reflection geometry. Every one of these is declared on our own honest-limits list and none had ever been graded on its own until he named it |
| *"the melody sucks"* | COMPOSITION | §3 and §5 above. The tune is three typed cells; five of six cues across rounds 2-3 sit at their own random-melody null |
| *"I hate how slow the melody is"* | BOTH, and it exposes a measurement error | Score-tier melodic density measured IN BAND at round 4 (2.73/s on ROAD against the EXPLORATION band) and his ear says slow. Two mechanisms: the development grammar's augmentation operation literally slows the theme and is scored as a spine-changing operation; and the density axis pools eleven melodic layers, so a busy accompaniment reads as a fast tune. A cue can be dense and its tune still crawl, and no axis we own distinguishes those |
| *"no variation or changes or movement throughout"* | BOTH, and it is the one we scored as a pass | §2. Measured boundaries on the ROAD lineage: 22 → 10 → 8. Longest hold on ROUNDS: none → 34.92 s → 53.50 s. Rewarded by dynamic_arc at every step. Rendering contributes: a sustained CC0 patch with one dynamic layer has no internal movement to give, so a held chord is literally static in a way a played one is not |
**Rendering has been a silent tax since round 2 and only became visible when the composition improved
enough to expose it.** That is the honest reading of why "I hate the instruments" arrives at round 4
and not at round 2.
---
it held every round.
instr_dynamic_arc at AUC 0.964 over round 2, instr_cycle_law at 0.911 over all 32 round-1 candidates, layer_census
density at 0.826. **These are generation-defect detectors and every one of them labels itself as
one.**
own multiplicity bar. Two rounds were steered by a bank with that property while its own validation
files said so on the first page.
as verdict* — and the ruling did not take. Round 4's headline achievements are still
score-tier: 57/57, 3 of 3 on the piano test, IN band on two melodic axes. Its own staging document
spends more space on hold_share 0.1333 against a floor of 0.1434 (about 2.3 seconds in a
223-second cue) than on anything Josh could hear. **That is the demotion failing in practice, and
it is a process defect, not a music one.**
---
| what | why it survives |
|---|---|
The exemplar corpus — build/audio/exemplars/CORPUS.json, 182 rows across 7 purpose classes, 30 measured hits Josh named as loved for decades | Reference data about the target, independent of how anything is generated. It is also the only ground truth this program owns |
The per-class corpus BANDS — MELODY_BANDS.json, GROOVE_BANDS.json, the loudness targets per class, PATTERN_FINDINGS_V3 | They describe the neighbourhood real released music lives in. Keep as admission floors and regression detectors, never as objectives |
| The instrument bank as a FLOOR — arc, cycle law, layer census, distinctness (intra-region and cross-track), hook presence, noise structure | Every one separates our generator from real music. That is exactly the job a floor does. Their own labels are already correct; only their USE was wrong |
The random-melody-null METHOD — instr_harmony_fit | The only test in the program that needs no corpus and answers a real musical question. Any new score-tier axis should be built this way |
| The two summit tests' phrase-grammar clauses — novel-bars ≥ 4 and distinct-ideas ≥ 2 | The only clauses in the whole bank with demonstrated discriminating power on our own material. They require a SCORE, which is a hard requirement on any replacement architecture |
The leitmotif architecture — LEITMOTIF_ARCHITECTURE.md, theme_architecture_rows.json, T0_Theme_Registry, the exposure ledger, the cue table | This is CANON, not musicality: which themes exist, each one's dramatic job, its reveal gate, its closure policy, its allow and deny registers, where it may be planted and where it pays off. It binds whatever generates the notes |
The thirteen composed head cells in theme_compositions.py | They survive as specifications — the shape, the licensed deviant, the brief line each realises — and are the natural conditioning input to a better melodic source. They should not survive as final tunes without being re-judged |
| The care mechanism as it now stands — instrument, register, articulation, rhythmic displacement, with declared margins | Ruled correct at round 4 and it is the CVD §17.1 obligation in engine form. No off-the-shelf generator provides it; it must be enforceable on whatever comes next |
Mix, space and loudness policy — mix_policy.py, BS.1770-4 controlled against ebur128, synthetic IR, true peak −1.0 dBTP | Generator-agnostic and licence-clean |
| The record-integrity method — pre-render gates published before the render, must-fire controls, honest tiers, published nulls | The reason this audit exists. It is the most valuable thing the four rounds produced |
| what | why |
|---|---|
Typed pitch literals as the melodic SOURCE OF TRUTH (pass3_flores.py:127-144 and the head-cell dicts as final tunes) | Three consecutive grades on the same material. This is the defect |
| The development grammar as the AUTHOR of melodic material | It is a transformation engine and a good one. It may survive downstream of a better melodic source, as variation and arrangement. It may not be the thing that decides what the tune is |
| The score-side battery as a headline | Ruled demoted after round 3; enforce the demotion by removing it from the head of every staging document. A round's headline is what a listener would notice |
structural_yield as a reported figure | Its own instrument reads AUC 0.437 against the corpus's album siblings — near chance, and on the wrong side of it |
instr_melodic_intelligence as a grading input | Zero of five axes reach AUC 0.75; the counter-melody axis is backwards. WQ_0087 already asked for its retirement from grading. Keep the file, stop quoting it |
dynamic_arc hold-share as an OPTIMISATION TARGET | It encoded half of Josh's sentence, rewarded stasis, and its own §8B item 9 shows the headline flips on a ±2-sample discretisation that depends on the cue's duration. Keep it as a detector; never compose toward it |
| Audio-derived bands quoted against score-tier numbers | Already burned us once — it sent a wrong repair instruction to the composer (ROUND4_STAGING.md §4) |
The CC0-sfz + sfizz single-dynamic-layer chain as the FINAL realisation path | Graded explicitly. It survives as a fast preview/sketch renderer, not as what ships |
Stated as requirements rather than as a recommendation, because the comparator lane owns the choice.
1. A musical prior must exist somewhere between the canon and the notes. Whether that is a
symbolic model conditioned on our head cells, an audio model used inside our structural frame, or
a licensed composition service, the melodic proposal must come from something that has heard
music. Rules may then filter, develop and enforce care — that ordering is the whole inversion.
2. A score must survive. Our two discriminating tests, the entire care mechanism, the leitmotif
registry, the orchestra-playability bar and the 3-to-5-cycle variation law all read notes. **An
architecture that emits only audio retires all of them**, which is the round-1 trap. Symbolic
output, or audio plus a reliable score, is a hard requirement.
3. An ear must enter the loop before Josh's. Wire timbre_critic.py into the battery, and add a
listening step of some kind — an internal audio critic, or a graded blind A/B against corpus
excerpts — so that "sounds fake" can fail a round without costing him a sitting.
4. Decompose the two complaints before spending anything. The cheapest experiment available:
render a known-strong public-domain melody through the identical sfizz chain, and render our own
ROAD cell through a better realisation path, and put both in front of Josh **as a sound question,
not a music question.** For four rounds we have never separated "the writing is bad" from "the
players are bad." That is proof-before-spend, it costs no model licence, and it tells the
comparator lane which half of the stack to replace first.
5. Throughput has to be planned for, not discovered. Josh's floor is 20+ complete tracks per
region or cultural node across 76 region rows. Four rounds have produced eight cues. Whatever is
chosen must be arguable at three orders of magnitude more output, with distinctness holding.
6. The care line and the licence posture are non-negotiable constraints on the choice. Allow and
deny registers must be enforceable, and nothing in our corpus may become a conditioning,
fine-tune or LoRA input — a rule the fetch modules already carry in their own docstrings and which
must travel to any new generator.
AND THE ONE THING THIS DOCUMENT MAY NOT DECIDE, NAMED RATHER THAN ASSUMED. Requirement 1 asks
for a musical prior in the loop. composed-never-prompted is Josh's standing ruling and the
generator firewall in pass2_realise.py is that ruling in code. **Whether a learned model PROPOSING
melodic material — which our leitmotif registry then selects, develops, cares for and gates, with
Josh still owning every theme — is composition or is prompting, is his call and not this lane's.**
The two readings are genuinely different: one says the ruling bans prompt-and-pray full-mix
generation, which round 1 was and which failed on its own terms; the other says it bans any model
touching the notes. **The comparator lane must put that fork to him as a full brief — steelmanned
both ways, with a recommendation and the strongest objection — before any round-5 architecture is
chosen, because every option in the comparator's space depends on which reading holds.** Nothing in
this post-mortem should be read as having pre-decided it.
---
Run per the standing decision protocol, calibrated against this document's own bias, which is toward
"our architecture is the problem."
it is the strongest thing anyone can say against §5. Josh's round-2 words are *"they sounded much
better"* than the ACE-Step round. The answer, and it is a real answer rather than a dodge: the
two arrangements are not comparable. Round 1 used a learned model as a one-shot full-mix generator
with a prose caption as its only control, and the measured failure was the control surface, not the
musicality. Nobody has ever tested a learned model as a **melodic proposer inside our structural,
care-enforcing architecture**, which is the arrangement §8.3 requires. The objection correctly
refutes "learned models are automatically better." It does not support "typed literals are the
right melodic source."
is the most concrete sentence in the round-4 grade, and a Chrono Trigger score played through our
CC0 chain with one dynamic layer per note would also sound like our stack. **This objection is
strong enough that §8.3 item 4 exists to settle it before any spend.** What holds it short of the
whole explanation: rounds 2 and 3 were graded down on melody with rendering never mentioned, and
five of six cues sit at their own random-melody null, which is a property of the written pitches
and not of any sampler.
degree-resolution bug put the entire functional harmony two octaves too high for four passes. Round
4 is the first render without it — and Josh still graded it below round 2. That does not rescue the
architecture; if anything it removes the best available excuse for rounds 2 and 3.
boundary matters. Every number quoted here is used in the one direction the instruments' own
validation licenses: as a defect detector or as a round-over-round comparison on identical code.
No claim here rests on an axis ranking quality, and the one claim that could be read that way —
the random-melody null — is the single axis in the bank that needs no corpus at all.
§8.1 is deliberately longer than §8.2 because most of it survives. What retires is the **melodic
source and the objective function**, not the form engine, the care mechanism, the registry, the
mix policy or the measurement discipline.
---
measurements. Every apportionment in §6 is inference from numbers plus Josh's words, and where his
words and our numbers disagree — *"how slow the melody is"* against an IN-BAND density reading —
his words are treated as the ground truth and the number as the suspect. That is the correct
ordering and it is also an assumption.
requirements list derived from our own failures and should be read as constraints on that
lane's choice, not as a pre-empted answer.
outside our stack; no number in this document comes from any of them, and any claim about a named
model's real capability needs its own verified read before it decides anything.
matters for this product, he has been consistent across six verdicts, and three of his four round
grades located a defect our own instruments later confirmed in our own files. Treating that record
as reliable is a judgement, and it is the judgement this document makes.