STEPBACK_POSTMORTEM.md

music/STEPBACK_POSTMORTEM.md

STEPBACK POST-MORTEM — four rounds of our own music stack, audited against the only ear that graded them

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:

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

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)

GROOVE_BANDS.json + build/audio/exemplars/CORPUS.json

pass2_realise.py, pass7_realise.py, theme_compositions.py, author_head_cell.py,

timbre_critic.py, pass7_battery.py, floor_instruments.py

NOT 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.

---

0. The question, and the answer in one paragraph

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.

---

1. Sources

1.1 Canon — the four grades, verbatim

Read in order. These are the only quality verdicts this program has ever received.

roundstagedartifactJosh, verbatim
12026-08-0718 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."*
22026-08-07 nightPASS2_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."*
32026-08-08PASS5_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"*
42026-08-09PASS7_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.**

1.2 Our own tree, read at HEAD for this audit

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:

pass7_floresharmonygroove) imports numpy, json, math, random, hashlib,

copy and each other. Nothing else. No model of any kind, no checkpoint, no inference runtime.

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.

1.3 Published and external — cited for the two claims that need outside grounding

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.

---

2. The trajectory, and the finding that should have stopped the program two rounds ago

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 roundround 2round 3round 4
score-side targets passed (SCORE_SCORECARD)7 of 5755 of 5757 of 57
piano / thirty-year nostalgia test, cues passing0 of 31 of 33 of 3
longest span of novel tune before repeat or rest, ROAD lineage (bars)3.756.0312.9
melodic note density, score tier, ROAD lineage (per sounding s)0.739 LOW1.847 LOW2.734 IN band
step share, score tier, ROAD lineage0.275 LOW0.371 LOW0.555 IN band
chord-tone agreement vs its own random-melody null, cues clearing p950 of 30 of 31 of 3
undeclared parallel perfects, ROAD / FALLS / ROUNDS171 / 99 / 99120 / 64 / 47
Josh's gradeturned downturned 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:

axisround 2round 3round 4
measured boundaries — how many times the music becomes a different thing (ROAD lineage)22108
longest measured hold, ROUNDS lineage0 s (no flat stretch existed)34.92 s53.50 s
arc instrument verdict, ROAD lineageFAILPASSFAIL

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.

---

3. Where the melodies actually come from — the finding that answers the question literally

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.

---

4. What the procedural grammar CAN deliver, and does

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.

---

5. What it structurally CANNOT deliver, and why no amount of further rules fixes it

**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.

---

6. The four grades traced to composition, rendering, or both

Apportioned against measurements, one clause at a time. Where the evidence does not decide, it says

so.

Round 1 — GENERATOR CONTROL SURFACE (neither composition nor rendering as we now use the terms)

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.

Round 2 — COMPOSITION

*"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.

Round 3 — one clause RENDERING-AND-CODE, three COMPOSITION, one BOTH

clauseapportionmentthe measurement
*"sounds just like a bunch of noise"*CODE DEFECT, surfacing as renderingFor 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"*BOTHThe 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 renderingComposite 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"*COMPOSITIONFALLS 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 layerThere was no harmony layer in the architecture at all. Not thin: absent

Round 4 — one clause RENDERING outright, one COMPOSITION, two BOTH

clauseapportionmentthe measurement
*"I hate the instruments you are using"*RENDERING, unambiguous, and named for the first timeFree 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 errorScore-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.

---

7. What the batteries actually proved, stated without flattery

it held every round.

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.**

---

8. WHAT IT MEANS FOR OUR STACK

8.1 Survives into any new architecture — do not rebuild these

whatwhy it survives
The exemplar corpus — build/audio/exemplars/CORPUS.json, 182 rows across 7 purpose classes, 30 measured hits Josh named as loved for decadesReference 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_V3They 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 structureEvery 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_fitThe 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 ≥ 2The 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 tableThis 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.pyThey 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 marginsRuled 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 dBTPGenerator-agnostic and licence-clean
The record-integrity method — pre-render gates published before the render, must-fire controls, honest tiers, published nullsThe reason this audit exists. It is the most valuable thing the four rounds produced

8.2 Retires

whatwhy
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 materialIt 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 headlineRuled 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 figureIts 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 inputZero 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 TARGETIt 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 numbersAlready 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 pathGraded explicitly. It survives as a fast preview/sketch renderer, not as what ships

8.3 What this post-mortem requires of ANY round-5 architecture — before a vendor or model is chosen

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.

---

9. The strongest objections to this audit's own conclusion

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.

---

10. Honest limits of this post-mortem

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.

Generated by harness/site/structure_site.py — the URL path is the repo path. review root