MEASURED_LOOP_PROOF.md

music/MEASURED_LOOP_PROOF.md

THE MEASURED LOOP, CLOSED — measure, generate, measure, improve

CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
Canon served: docs/spine/CH_02.md § Asset anchors (music_mood) and § Mechanical anchors
(main_boss_win_condition);
build/audio/music_cue_table.csv rows MC_0026, MC_0035. Authority order: docs/DOC_MAP.md § 0.
Lane law: docs/pipeline_review/tech_research/PIPE_AUDIO_MUSIC_2026-07-29.md. Program parent:
docs/proposals/music/MASTERPIECE_PROGRAM.md (this executes its rungs 1 and 5 at pilot scale).
If this document disagrees with canon, CANON WINS and this document is the defect.

0. THE RULING THIS ANSWERS (Josh, 2026-08-05, verbatim)

"How are you doing on the calculations for all the patterns and curves and trends and difs etc

for the music to be able to generate our 12-20+ tracks. Give me a few sample tracks so I can know

you can actually do this and improve before I go spend $1000 more."

1. THE ANSWER IN FIVE LINES

measured formula card — 21 scalar dimensions and 6 curves — with every prompt clause carrying

the dimension and the measured number behind it. No clause without a number.

site, labelled at their honest tier.

and the result is a per-dimension diff plus one distance number.

materially closer (−0.0722, an 18% cut) and two moved slightly further; the mean moved

−0.0055. That is the honest result and it is stated as such below.

closed with teeth. They are the most valuable output of this lane.

2. WHAT WAS BUILT

ArtifactWhat it does
harness/music_gen/masterpiece_proof.pyThe whole loop: spec derives a generation spec from a target card, diff compares a generated card against it, spec --revise fires deterministic revision rules from a measured miss, report emits the tables, guard-run refuses a wrong-generator run, verify-tokens checks the prompt against the real tokenizer. 25 self-test controls.
harness/music_gen/emit_proof_picks.pyThe site seam — a fifth picks producer, 7 controls, rung_rank 0 so a pipeline sample never competes with the score.
build/audio/proof/Specs, audio, measured cards, diffs, run summaries, and the config-comparison evidence.

3. THE SAMPLES AND THEIR SPECS

Three classes, each with a MEASURED reference card. The reference supplies the GRAMMAR; canon

supplies the subject. The two are never mixed.

SampleClassReference card (measured)Canon anchor
MPX_CH02_EXPLOREEXPLORATION_ENVIRONMENTDesolation (Hong Kong canal) — Deus Exdocs/spine/CH_02.md § Asset anchors · music_mood — "survival-horror-opener mood, low-and-tense rising to the crater-lake climax"
MPX_CH02_BATTLEBATTLEAirfield action — Deus Exdocs/spine/CH_02.md § Asset anchors · music_mood — "combat-cue register for the stalk"; § Mechanical anchors · main_boss_win_condition (the polo encounter)
MPX_TITLE_MAINCREDITS_TRIUMPHWant You Gone — Portal 2 (corpus row EX_110, ACQUIRED)MASTERPIECE_PROGRAM.md § 3 · Credits / triumph — "the summation form, motif recall economy"

Why these references. Desolation is the corpus's sparsest sustained-tension cue — mean 3.69

simultaneous lanes against a 9-lane ceiling, a 6.2% silence budget, 2 tutti arrivals in 88

seconds, energy peak held to 72% through. That is the measured grammar of low-and-tense-that-

rises-late, which is what the chapter's own row asks for. Airfield action was chosen over the

denser Hong Kong action because the latter measures 0 complexity steps — a dimension reading

zero cannot show a distance shrinking. EX_110 is the one ACQUIRED-and-MATCHED card in the corpus,

so its purpose class is the corpus's own rather than this lane's guess; it is targeted for form

and event grammar only, never for its vocal.

What "the card speaking" means. The exploration spec, generated verbatim from the card:

An original instrumental cue for a volcanic crater-lake rim at altitude, cold air off the
water, a lone depleted child moving through it with nothing. About 88 seconds long, in 8
clearly different sections. Very sparse: typically only two or three things sound at once, with
the upper register left empty for long stretches. The full texture must not arrive until about
22 seconds in. Rest is a real part of it: roughly 6 percent of the running time is
near-silence, in held gaps rather than a fade. Instrumentation is generic orchestral and
untuned percussion only: no gamelan, no gong ensemble, no bonang, no named regional instrument
of any living tradition. Instrumental only, no vocals, no singing, no spoken word.

Every sentence traces to a measured dimension in spec_r1.json :: derived_from[].caption_trace.

88 is the card's total_length_s; 8 its section_count; "two or three at once" its

simultaneity_curve.mean of 3.686; 22 seconds its time_to_full_texture_s; 6 percent its

silence_budget.fraction. The duration, bpm and key passed to the generator are the card's own

numbers, rounded.

The care clause is not decoration. The chapter's row names the Flores gong-waning tradition.

Following the attended §17.1 read's standing reframe

(build/audio/attended_care_release.json :: what_reframed_means) the generation makes the PLACE

and never a living culture's instrument, with the denial stated positively inside the prompt so

it carries its own guardrail. It is a priority-0 clause and can never be shed.

4. THE TWO DEFECTS THIS RUN FOUND

Both would have made a "we can do this" claim false while every artifact looked green.

4.1 The prompt was being truncated, and it took the tempo and key with it

ACE-Step tokenises the DiT prompt at max_length=256, truncation=True

(D:/audio/acestep/repo/acestep/core/generation/handler/conditioning_text.py L127-131). The

prompt is a template — # Instruction … # Caption … # Metas … — and the metas come last. The

first revision's captions measured 294-347 tokens against that ceiling. What was being discarded

was everything written last: the care guardrail, the instrumental invariant, and **the bpm,

keyscale and duration conditioning**. The generator was asked for 144 bpm in E major and received

neither, and without a token count that reads as the model ignoring the prompt rather than as the

prompt never arriving.

Closed three ways: a measured caption budget (189 tokens; the wrapper costs 55, measured), a

priority order in which the care clause and the instrumental invariant can never be shed, and

verify-tokens, which rebuilds the exact prompt string and checks it against the real

Qwen3-Embedding tokenizer. Shed clauses are reported on the spec, never dropped silently.

A second consequence: revision clauses were being APPENDED, which doubled the caption straight

through the ceiling and left two contradictory instructions per dimension with the later one

truncated away. A revision now SUBSTITUTES the base clause for the same dimension, in place.

4.2 The generator was on the wrong checkpoint, and produced audio that measured fine

This lane's first pass ran --dit acestep-v15-xl-sft --no-lm, reasoning that XL-SFT is the

higher-quality checkpoint. It is — and its caption conditioning does not arrive without its LM.

Measured on two maximally opposed brightness captions at one fixed seed:

Checkpointdark polebright poleVerdict
acestep-v15-turbo1892 Hz2138 Hzseparates, correct direction
acestep-v15-base1378 Hz1304 Hzdoes not separate, WRONG direction
acestep-v15-xl-sft1980 Hz1976 Hzdoes not separate at all

The XL-SFT audio measured plausibly on every card dimension and answered nothing the caption

asked. The formula card has no opinion about whether the prompt arrived — it will describe

noise in the same vocabulary it describes Uematsu. The proven invocation is the one

D:/audio/acestep/logs/beds.log actually ran; it is pinned in code with the evidence above

attached, and guard-run refuses a run that used anything else.

Everything in §5 was regenerated on the pinned config. The evidence lives at

build/audio/proof/pole_turbo/, pole_base/ and probe_audio/.

4.3 A third, smaller one: the tempo rule was chasing octaves

Beat trackers pick a metrical level, and the formula card says so itself. Revision 1's

exploration sample was requested at 144 bpm and read back at 86 — half-time. The uncorrected

ratio told the revision rule to ask for 240, clipped to 220: a correction that had chased an

octave while reporting it was closing in. Both the diff and the rule now fold by octaves first.

5. THE DIFFS — the curves, trends and difs, per sample

Full tables: build/audio/proof/TABLES.md (script-emitted from the diff files, never retyped).

The distance is 0.6 × mean scalar error + 0.4 × mean curve error, each scalar error being the

absolute miss over its own scale clipped at 1. It is a DISTANCE, not a quality score — it

says nothing about whether either track is good.

Sampler1r2Change
MPX_CH02_EXPLORE0.34310.3794+0.0363 further
MPX_CH02_BATTLE0.40080.3286−0.0722 closer
MPX_TITLE_MAIN0.33950.3589+0.0194 further
mean0.36110.3556−0.0055

Six curves are compared per sample, resampled onto normalised position so an 81-second cue and a

142-second cue are comparable: the flow curve (energy over time), the simultaneity curve (the

arrangement's story), the tempo function, the dynamics arc, the per-bar complexity index, and the

octave-band register balance.

6. THE IMPROVEMENT, STATED HONESTLY

The seed is pinned across revisions. An earlier draft used seed + revision, which would

have made every revision a reroll and left the improvement claim unable to separate "the spec got

better" from "the dice landed better". With the seed fixed, the caption and the bpm parameter are

the only things that move.

MPX_CH02_BATTLE is the clean demonstration. Three rules fired off the r1 measurement, each

naming its miss:

materially about 8 times: each section brings in or removes an element so the seam is audible."*

the arrangement out: keep six or more layers sounding together."*

*"Keep it continuous; do not leave long empty gaps."*

What the re-measurement returned:

DimensionTargetr1r2Error r1 → r2
section_count8680.250 → 0.000
mean_lanes6.9632.8803.8080.586 → 0.453
drops_per_min6.68125.18511.1111.000 → 0.663
silence_fraction0.01060.04130.03980.307 → 0.292
time_to_hook_s0.1160.0930.1160.001 → 0.000

The instruction was obeyed on the dimension it named, in the direction it named, and the distance

fell 18%. That is the "can actually do this and improve" claim, demonstrated once.

Why it is not yet three for three. Per sample, 8-11 of the 21 scalar dimensions moved between

two very different captions and 10-13 did not move at all — and the stuck ones carry roughly

half the residual distance (0.196-0.248 of a 0.366-0.445 scalar distance). Several sit pinned

at full error in every run: tuttis_per_min (the generator never gathers the full ensemble),

time_to_full_texture_s, raises_per_min, dynamic_range_db. When half the distance lives in

dimensions the prompt cannot reach, a single revision's net movement is dominated by drift on the

dimensions it did not name. That is a measurement about ACE-Step's control surface, not a

failure of the loop — and it is exactly the argument for §8.

One dimension is deliberately not chased. onset_type reads fade_in on every OST exemplar

because album mastering fades a ripped game cue up. Our own engine law forbids a baked fade

(generate.py pins fade_in_duration=0.0 for the stem/loop contract). Chasing it would mean

fighting our engine to imitate a mastering artefact. It is still measured and still scored, so it

contributes a full 1.0 miss to every revision equally and can never manufacture an improvement.

7. THE HONEST REGISTER

tile on the site says exactly that.

(hummable leitmotifs, composer-in-loop, ACE-Step = beds). Nothing here claims a hook worth

remembering; the loop measures whether a generation matches a target's *grammar*, and grammar

is not melody. The authored lane (theme_compositions.py, nostalgia_score.py) remains where

melody is judged.

has what the target measurably has"; it cannot certify that it is beautiful. Josh's ear remains

the only subjective gate.

redistributed, never model input. What crossed into a generation is a number and an English

clause derived from it — a score study, not a sample.

8. WHAT THE $1,000 ACTUALLY BUYS

The measured corpus today is 2 matched cards (EX_110, EX_124) plus ~100 UNMATCHED cards

from three soundtracks that happened to be free or already owned: Portal 2, Deus Ex, and the

ULTRAKILL/Okami set now landing. That is why this proof targets a Deus Ex ambient cue for the

Flores register — **not because it is the right reference, but because it is the reference that

exists.**

What the corpus cannot currently supply, and what the exemplar list was built to buy:

exploration and action, and has almost nothing for melancholic/tragic, boss/climax, or

title/character theme. The bands in MASTERPIECE_STANDARD cannot be derived from two cards.

Mitsuda, Shimomura, Kondo — and not one of those tracks is measured. The school grammars

are extracted from published analysis; the cards are not.

rank the exemplars above our own tracks. With 2 matched cards there is no population to rank.

The purchase run and its verified routes are already emitted at

build/audio/exemplars/BUY_SHEET.md (STARTER TEN, $64.59) with 17 rows declared as having no

legitimate route at any price, each carrying a named substitute.

One honest caution on the spend. §4.2 and §6 together show that ACE-Step reaches perhaps half

the dimensions a card measures. Buying more cards sharpens the TARGETS; it does not widen the

generator's control surface. The cards are worth buying because they are the specification the

composer and the authored lane work to — they are not a lever on this particular generator.

9. NEXT, IN ORDER

1. Run the full 8-dimension control-surface probe to completion (masterpiece_proof.py probe;

16 tracks generated, 12 measured, the run stopped on measurement time under CPU contention).

The result names precisely which dimensions prompt revision can reach.

2. Iterate the two samples that drifted, now that the octave fold and the substitution rule are

in. Two revisions per sample, not one.

3. Card the ULTRAKILL and Okami sets already on disk — free class anchors for BATTLE and for the

melodic/regional register — before spending.

4. Then the STARTER TEN, aimed at the classes with no anchor at all.

10. REPRODUCING IT

python harness/music_gen/masterpiece_proof.py --self-test
python harness/music_gen/masterpiece_proof.py spec --out build/audio/proof/spec_r1.json --revision 1
D:/audio/acestep/venv/Scripts/python.exe harness/music_gen/masterpiece_proof.py verify-tokens --spec build/audio/proof/spec_r1.json
D:/audio/acestep/venv/Scripts/python.exe harness/music_gen/generate.py --spec build/audio/proof/spec_r1.json --out-dir build/audio/proof/audio --dit acestep-v15-turbo --no-lm --summary build/audio/proof/run_r1.json
python harness/music_gen/masterpiece_proof.py guard-run --spec build/audio/proof/spec_r1.json --run build/audio/proof/run_r1.json
D:/audio/rig/venv/Scripts/python.exe harness/music_gen/acquire_exemplar.py --audio build/audio/proof/audio/MPX_CH02_BATTLE_r1.wav --no-corpus --out-root build/audio/proof/cards
python harness/music_gen/masterpiece_proof.py diff --sample MPX_CH02_BATTLE --revision 1
python harness/music_gen/masterpiece_proof.py spec --out build/audio/proof/spec_r2.json --revision 2 --revise 1
python harness/music_gen/masterpiece_proof.py report --out build/audio/proof/TABLES.md --revisions 1,2
python harness/music_gen/emit_proof_picks.py --revision 2

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