CYCLE_LAW_VALIDATION.md

music/exemplars/instruments/CYCLE_LAW_VALIDATION.md

THE 3-5-CYCLE LAW, INSTRUMENTED

CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
The canon: the CVD · the T1 foundation docs · the T0 registries (registries/) · the spine
(docs/spine/CH_*.md). Authority order: docs/DOC_MAP.md § 0.
Canon served: the composition floor ruled by Josh on 2026-08-07 —
docs/spine/DECISIONS_PENDING_JOSH.md, MUSIC ROUND 1 GRADED + THE COMPOSITION FLOOR.
If this document disagrees with canon, CANON WINS and this document is the defect.

Tier: MEASURED INSTRUMENT. Every number below was produced by

harness/music_gen/instr_cycle_law.py from the formula cards and the exemplar audio already

on disk. No listening test was run by this lane. Nothing here is a judgement of quality.

Every comparative sentence in this document is generated from the measured value beside it,

so a re-run that flips a number flips the sentence with it.

1. The one-paragraph answer, and it is a negative

Josh's floor reads: no repetitious loop runs more than three to five cycles without a new

instrument, a catch, a melody or a beat drop. Instrumented — the cycle period read off a

chroma and MFCC self-similarity lag profile, the novelty events read off the formula card,

the worst gap between them expressed in cycles — **29 of 30 tracks Josh

named as loved for decades pass their own five-cycle floor**, at a median worst span of

1.52 cycles. The law is real and the loved tracks keep it.

And as literally written it does not adjudicate anything. Their album siblings pass at

864 of 927 (93%) at a median of

1.34 cycles, which is

lower than the loved tracks' own

1.52. The within-album AUC of the headline number is

0.501 — chance. And the eighteen round-1 candidates Josh turned down pass

at 17 of 18 (94%), median

2.07 cycles.

The novelty definition was then swept across eight settings, from every threshold at zero to

structural boundaries alone, with the period held fixed so only the definition moved. The

best separation any setting achieves between the rejected round and the loved tracks is

AUC 0.622 (as shipped). No

defensible setting of this law tells Josh's rejects from his favourites.

One axis does, and it is not a cycle law. Structural yield — structural boundaries per

texture drop — separates this programme's generated output from real released music at

AUC 0.911 over all 32 round-1

candidates and 0.866 over the eighteen. Against a hit's

own album siblings it sits at 0.437, below chance,

which is the point: it is a generation-defect detector, not a taste oracle. Section 7.

2. What a cycle is, and how it is measured

A cycle is not a field on the card, so it has to be derived, and the obvious derivation is a

trap. The card's section boundaries come from checkerboard novelty over a self-similarity

matrix, which means the boundaries are novelty peaks. Deriving the cycle period from that

same grid, and then counting novelty events off the same grid, would make every gap about one

section long by construction. The ratio would be a tautology with a number on it.

So the period is measured from evidence the event detector never touches.

averaged down each diagonal, giving one number per lag: how similar, on average, the track

is to itself that far ahead. The loop period is where that curve peaks.

full of bar-level and beat-level periodicity, which is real but is not what the ruling is

about. The ceiling is a third of the track, because a period longer than that cannot repeat

enough times for "more than five cycles" to mean anything.

eight, sixteen, twenty-four and thirty seconds with nearly equal strength, and which one the

argmax lands on is an accident of how the later repeats decay. The estimator takes the

shortest peak that divides the tallest one to within the profile's own resolution and still

holds most of its strength. A descent that only knows how to halve cannot get from thirty

back to six, which is why the rule is stated as division rather than as a divisor list.

When a shorter reading nearly wins but does not, the record names it anyway. The card's own

octave_ambiguity_note documents this failure class for tempo and the lesson transfers.

the modal section repeat lag. It is circular, and it is measured to disagree: against the

audio reference it lands within a factor of 1.41 on 31%

of 1119 tracks and is a clean octave out on

14%. The independent per-bar complexity

autocorrelation agrees within 1.41 on 31% of

823. Neither is good enough to be the reference; both are reported on every

record so a reader can see the spread rather than take the headline on trust.

3. What counts as novelty, and where the map is loose

Josh named four kinds. Each maps onto something the card measures. Each mapping is declared

with its slack, because a mapping presented without its slack is a claim the evidence does not

carry.

says on its own face that this is a proxy: its method is spectral_band_proxy and its note

reads that two instruments in one octave read as one lane and one instrument spanning two

octaves reads as two. A band entry is evidence that energy arrived in a register. It is

not evidence that a shakuhachi came in. Naming instruments needs source-separated stems, and

no card on disk carries them.

of sub-decibel dips that are the mix breathing.

or a step in the per-bar complexity index. All three are structural evidence that the

material changed. None of them proves a tune arrived — a key change and a new drum pattern

look alike from here.

a forty-beat "adjustment" is as likely a beat-tracker octave flip as composed rubato, so

every record also reports the worst span computed with tempo events removed.

Events inside a short window collapse into one moment: a drop, a band entry and a section

boundary at the same instant is one thing happening, and counting it three times would turn

the novelty rate into a measure of how many detectors happened to agree.

The strict reading, and why it exists

A drop removes something. It introduces nothing. The round-1 candidates drop

14.13 times a minute against the loved tracks'

5.56, which is a drop every

4.2 seconds — so if a drop

counts as novelty, a track that chops its own texture continuously can never fail a cycle law,

and the instrument is being satisfied by the very defect it should catch. The strict

reading therefore counts only the kinds that ADD: a band arriving, a raise adding lanes, and

the three structural kinds. It is reported beside the default everywhere below.

The thresholds, and what the corpus says about them

A cheap novelty event and a real one are separated by explicit numbers, not by hidden

constants. Each default sits near the corpus median of its own quantity, so roughly half the

raw candidates survive and the survivors are the ones a listener would notice.

quantitycorpus p25corpus mediancorpus p75thresholdshare surviving
complexity_step (n=6997)0.1830.2330.3310.265%
drop_db (n=13470)2.074.366.243.064%
lane_segment_s (n=126978)0.8121.4863.5991.550%
novelty_peak (n=10707)0.42470.62020.84960.652%
raise_lanes_added (n=10947)1.511.561.961.581%
tempo_delta_bpm (n=10577)24.5839.559.2525.074%

4. The 30 tracks Josh named, measured

Sorted worst first. cycles is the track's length in cycles; a track shorter than five cycles

cannot violate a five-cycle law, and those rows are marked — their pass is arithmetic, not

evidence. strict is the worst span when drops and tempo events do not count.

idtitleperiod scyclesmomentsworst spanworst, cyclesstrictwhereescalationfloor
EX_179Ending Theme (Balance is Restored)7.71168.117255.3 s7.1711.70950–1005 sfallingFAIL
EX_064Ludwig, the Holy Blade7.7132.23935.3 s4.589.64190–225 sfallingPASS
EX_033Corridors of Time8.64?21.31538.5 s4.469.1143–81 sflatPASS
EX_046BFG Division9.2954.66040.9 s4.4010.79195–236 sflatPASS
EX_147Fighting of the Spirit10.59?17.81245.5 s4.308.0391–137 sfallingPASS
EX_055The Cyber Grind10.1226.72039.8 s3.9318.48156–196 sflatPASS
EX_075Dancing Mad8.36126.814631.1 s3.728.14877–908 sflatPASS
EX_018Subwoofer Lullaby8.0825.84226.1 s3.233.320–26 srisingPASS
EX_161Aria di Mezzo Carattere25.549.31676.6 s3.003.00137–214 sfallingPASS
EX_145Go Straight11.2423.93629.7 s2.645.45150–180 sflatPASS
EX_030Route 2095.9413.81615.2 s2.564.6624–39 sfallingPASS
EX_053Cynthia Battle Theme10.318.91424.7 s2.393.4646–70 sflatPASS
EX_136Humming the Bassline18.3014.13732.0 s1.754.44199–231 sfallingPASS
EX_032Terra's Theme23.969.72241.9 s1.751.7549–91 srisingPASS
EX_088An Unwavering Heart10.969.83016.6 s1.521.6222–39 sfallingPASS
EX_082The Best Is Yet to Come14.95?23.14421.6 s1.444.25258–279 sfallingPASS
EX_124Deus Ex Main Title (UNATCO)11.5211.12215.0 s1.301.4811–26 sflatPASS
EX_017Sweden10.8719.84811.8 s1.093.690–12 sflatPASS
EX_092Snake Eater (Ladder Climb)10.6816.73511.1 s1.042.41147–159 sfallingPASS
EX_180Dreams Dreams19.237.81919.6 s1.021.16120–140 sflatPASS
EX_102Magus Castle7.243.9 ‡96.8 s0.941.4415–22 srisingPASS
EX_110Want You Gone40.773.5 ‡1238.0 s0.930.8494–132 sfallingPASS
EX_022Wind Scene12.6316.23211.5 s0.912.062–13 srisingPASS
EX_094Dark Creature Pursuit17.746.52113.5 s0.761.5464–77 sflatPASS
EX_014Tekken 2 Attract Movie: Sound Track14.301.5 ‡510.9 s0.760.750–11 srisingPASS
EX_162Schala's Theme23.687.41814.6 s0.622.50122–137 sflatPASS
EX_113To Good Friends21.366.62310.9 s0.512.00109–120 sfallingPASS
EX_007Frog's Theme23.223.6 ‡1311.6 s0.500.5043–55 sflatPASS
EX_006Chrono Trigger Main Theme29.81?5.12113.8 s0.460.755–19 sflatPASS
EX_142Shinshu Field44.30?4.6 ‡1920.1 s0.451.00150–170 sflatPASS

‡ fewer than five cycles long — the law cannot bind. A ? on the period marks a resolved or

declared period ambiguity; the alternative reading is on the record in the JSON.

**29 of 30 pass the five-cycle floor; 22 of

30 pass the three-cycle target. On the strict reading, 22

of 30 and 16 of

30.**

The ones that do not pass

55 s from 950 s

to 1005 s, at a 7.71 s cycle, which is

7.17 cycles unchanged. The track runs

168 cycles in total.

Clearing the floor but missing the enhanced three-cycle target: Subwoofer Lullaby (3.23), Corridors of Time (4.46), BFG Division (4.40), The Cyber Grind (3.93), Ludwig, the Holy Blade (4.58), Dancing Mad (3.72), Fighting of the Spirit (4.30), Aria di Mezzo Carattere (3.00).

5. Hits against siblings, and against the round Josh rejected

poolnmedian worst-span cyclesp90maxpass floorpass target
the tracks Josh named301.524.467.1729/3022/30
their album siblings9271.344.1422.95864/927736/927
measured, no hit on the album2231.254.9513.42202/223180/223
the eighteen Josh turned down182.074.385.3817/1812/18

The same four pools on the strict reading, where only events that ADD count:

pool, strictnmedianp90pass floorpass target
the tracks Josh named303.0010.7922/3016/30
their album siblings9271.967.29762/927603/927
the eighteen Josh turned down184.906.6511/185/18

The strict reading moves the rejected round in the expected direction — its floor pass rate

falls from 94% to 61% while the

loved tracks fall from 97% to 73% —

and its median worst span is higher than the loved

tracks' (4.90 against 3.00). The direction is right.

The overlap is still large, which section 6 quantifies.

The five-cycle law cannot bind on a track shorter than five cycles, and the sibling pool

carries a great many jingles and stingers. So the comparison is run again with both sides

restricted to tracks at least five cycles long, which is the pool where the law has teeth:

pool, five cycles or longernmedianpass floorpass target
the tracks Josh named251.7524/2517/25
their album siblings5792.15516/579388/579

Separation, scored the way this programme scores everything — each corpus row against the

tracks that shipped on its own record, composer and session and codec held constant. Three

readings: the full pool, the five-cycle-or-longer pool, and a duration-matched pool that

admits only siblings within 35% of a hit's own length, because duration is this corpus's

standing confound.

axisAUC, fullAUC, ≥5 cyclesAUC, length-matchedhits above own-album medianbinomial p
max_cycles_unchanged0.5010.4620.44913/280.8506
max_cycles_unchanged_strict0.5640.5280.51217/280.3449
novelty_moments_per_cycle0.5550.5890.58516/280.5716
median_cycles_between_novelty0.4700.4490.44711/280.3449
escalation_ratio0.4580.4220.40213/280.8506
structural_novelty_share0.3950.3830.42110/280.1849
structural_yield0.4950.4840.48011/280.3449

An AUC of 0.5 is chance. Nothing in this table is a discovered separator and nothing here is

claimed as one; multiplicity was not priced because there is no effect to price.

6. Does ANY novelty definition let this law adjudicate?

The obvious objection to section 5 is that the thresholds were set wrong. So they were swept.

The period is held at whatever the audio said for each track; only the event definition moves.

AUC 18/hits is the probability that a random rejected candidate carries a WORSE worst span

than a random loved track — 0.5 is chance, and a setting that could adjudicate Josh's floor

would have to sit well above it.

novelty definitionhit medianthe 18 mediansibling medianhits pass18 passAUC 18/hits
as shipped1.482.041.3429/3017/180.622
drops must be 6 dB1.572.101.3529/3017/180.622
drops must be 9 dB1.622.261.3929/3017/180.615
drops must be 12 dB1.622.261.3929/3017/180.615
no drops, no tempo (STRICT)2.754.651.9622/3011/180.607
structural kinds only5.006.512.3315/306/180.620
band entries only4.856.463.9415/305/180.539
every threshold at zero0.450.570.5530/3018/180.539

The best any setting reaches is 0.622

(as shipped), and the spread across all 8 settings is narrow.

Loosening the definition to nothing makes every track pass; tightening it to structural

boundaries alone makes half the loved tracks fail. Neither end separates the pools.

**The honest verdict: the 3-5-cycle law, instrumented literally, cannot adjudicate the round

Josh rejected.** Two explanations are available and they are not equally likely.

cannot see. But the controls recover planted spacings of one, two and eight cycles, planted

loop periods are recovered from audio, and five mutations of the module are each caught by

a named control. It is measuring *a* real thing.

Josh's sentence names a failure mode — a loop that grinds on unchanged — and that failure

mode is rare in released game music and was rare in round 1. He wrote it as one clause of a

longer ruling whose other clauses are about density and craft: dozens of layers, hooks and

complexities, no stacked noise. Those are different measurements. Section 7 is one of them.

The operational consequence, stated plainly so it is not lost: **keep this as a gate, never

use it as a grade.** A round-2 track that fails it is genuinely broken and should not reach

the queue. A round-2 track that passes it has demonstrated nothing about whether it is good,

because 17 of the 18 tracks Josh rejected pass it too.

7. Structural yield — the axis that does separate, and what it is not

Structural yield is the count of structural boundaries divided by the count of texture drops:

structural change produced per unit of chopping. It was derived in the repetition-form

research lane and is reproduced here on its own definition, over tracks of 45 seconds or more.

poolnp10medianp90
the tracks Josh named280.290.792.33
their album siblings7140.341.003.00
all round-1 candidates320.070.220.45
the eighteen Josh turned down180.140.360.61
comparisonAUC
loved tracks against all round-1 candidates0.911
loved tracks against the eighteen0.866
loved tracks against their own album siblings0.437

Read the third row before the first two. At

0.437 against siblings this axis cannot tell a beloved

track from competent filler on the same album, and it must never be reported as if it could.

What it does, at

0.911, is separate this programme's generated output

from real released music of any quality. That is a generation-defect detector, and at this

rung it is exactly the instrument the factory needs.

The underlying rates say what the defect is:

poolboundaries/mindrops/minlane-adding raises/min
the tracks Josh named (n=28)5.295.565.00
their album siblings (n=716)5.644.783.02
all round-1 candidates (n=32)2.8814.138.69

Round 1 carries

fewer structural

boundaries per minute than the loved tracks (2.88 against

5.29) while dropping the texture

2.5 times as often

(14.13 against 5.56) and firing lane-adding

raises 1.7

times as often (8.69 against

5.00). The texture is in constant flux and almost nothing

new ever arrives. That is motion without change, and it is a better description of what

Josh heard than anything a cycle count found.

It also explains section 6's negative result, and the explanation is not a rescue: at

14.13 drops a minute a drop lands every

4.2 seconds, so a novelty definition that counts

drops can never fail these tracks. The cycle law was being satisfied by the very defect it

should have caught.

8. Where that leaves the law

One loved track fails its own law and is worth its own paragraph.

Ending Theme (Balance is Restored) carries a 55-second span with nothing new in

it, 7.17 cycles at its own period, across a

168-cycle track, so this is not a short-track artefact. Two readings

survive scrutiny. The first: a long-form ending suite is not the thing the ruling is

about — Josh wrote it about a loop, a cue a player hears hundreds of times, and an

ending suite is heard once. The second: the instrument cannot hear the kind of novelty

that stretch contains, because a melody moving over a held texture at constant band

energy is invisible to a lane map and to a drop map alike. Both point the same way — the

law is a loop law and should bite hardest where a cue loops.

What the factory should take from this document, in order:

On the strict reading 11 of 18 of the rejected round pass against

22 of 30 of the loved tracks, which is the right direction even

though it is not a separator on its own.

Round 1 passed it.

from released music, at AUC 0.911. The loved tracks'

p10 is 0.29 and the rejected round's p90 is

0.45, so a floor anywhere between them separates the pools

cleanly. It says nothing about quality and must be labelled that way wherever it is used.

texture drops, fewer lane-adding raises per minute than round 1 fired.

9. What this instrument cannot see

an octave up over a new drum pattern". Both read as novelty. Josh's word *catch* is the

hardest of his four to measure and this instrument approximates it with structural change.

"A new instrument entered" is never claimed here; "energy arrived in a register that had

been empty" is.

every four bars scores exactly like a countermelody. This was tested rather than assumed:

structural_novelty_share — the fraction of novelty moments landing on a structural

boundary rather than on a drop or a band coming and going — sits at

0.395 against

siblings, chance. Structural yield in section 7 is the measure that does catch the churn,

and it is a ratio of card-level counts rather than anything this instrument's own timeline

produced. A track can pass every cycle number in this document and still be stacked noise.

a countermelody entering inside an already-active band, an articulation change — all

invisible. This is the blind spot that most likely explains the loved track that fails.

ambiguity is declared per track rather than papered over, and a period estimate twice too

long makes a track pass for the wrong reason. Read n_cycles beside every verdict.

10. The controls

Nothing above counts unless the instrument first recovered answers that were put there.

Two layers, because the two halves fail independently: the period estimator reads audio, so

its controls are synthesised loops with a planted period; the gap arithmetic reads a card, so

its controls are synthesised cards with a planted novelty spacing.

controlresultdetail
C1 planted 8 s loop period is recovered from audioPASSgot=7.99 planted=8.0
C2 planted 12 s loop period is recovered from audioPASSgot=11.98 planted=12.0
C3a PERIOD-DOUBLING TRAP (exact tile): the descent returns the fundamental, not a multiplePASSplanted=6.0 got=6.04 tallest_lag=30.0 descended=True
C3b PERIOD-DOUBLING TRAP (variation between passes): the true period is recovered, or the ambiguity is DECLARED and the alternative namedPASSplanted=6.0 got=11.98 ambiguous=True subharmonic_candidate=6.0372
C4 novelty planted every 2 cycles reads back as 2PASSmax_cycles_unchanged=2.0 period=10.0 events=19 reason=''
C5 novelty planted every 8 cycles reads back as 8PASSmax_cycles_unchanged=8.0 period=10.0 events=4 reason=''
C6 an 8-cycle gap FAILS the five-cycle floor and the three-cycle targetPASSpasses_floor=False passes_target=False
C7 novelty planted every 1 cycles reads back as 1PASSmax_cycles_unchanged=1.0 period=10.0 events=39 reason=''
C8 a 1-cycle gap PASSES both floor and targetPASSmax=1.0 floor=True target=True
C9 a track with NO novelty at all reads as one unchanged span the length of the trackPASSavailable=True reason='' max_cycles=20.0 n_events=0 span=200.0s of 200.0s
C10 a 0.5 dB dip is not a beat drop and a 0.2 s band flicker is not a new instrumentPASSn_events=0 max_cycles=20.0 reason=''
C11 ANTI-VACUITY: the same spacing with real 8 dB drops IS detectedPASSn_events=19 max_cycles=1.0 reason=''
C12 escalation separates a track that builds from one that front-loadsPASSrising_case=rising falling_case=falling
C13 a degenerate card (empty dict) returns available=False and does not raisePASSreason="card has no 'card' block"
C14 a degenerate card (card with no blocks) returns available=False and does not raisePASSreason='no positive total_length_s on the card'
C15 a degenerate card (zero sections, zero length, empty repeat_map) returns available=False and does not raisePASSreason='no positive total_length_s on the card'
C16 a card with wrong types in every numeric field still returns a recordPASSavailable=False reason="unhandled ValueError: could not convert string to float: 'x'"

The mutation arms

A control that has never been seen to fire is decoration. Each row below breaks one real

decision inside the module and names the control that caught it.

mutationwhat it breakscaughtby
drop_threshold_removedTHRESHOLDS['min_drop_db'] -> 0.0 (every mix breath becomes a beat drop)YESC10 a 0.5 dB dip is not a beat drop and a 0.2 s band flicker is not a new instrument
lane_flicker_threshold_removedTHRESHOLDS['min_lane_segment_s'] -> 0.0 (a 200 ms flicker becomes an arrival)YESC10 a 0.5 dB dip is not a beat drop and a 0.2 s band flicker is not a new instrument
period_estimator_doubledperiod_from_card returns 2x the true periodYESC4 novelty planted every 2 cycles reads back as 2; C5 novelty planted every 8 cycles reads back as 8; C6 an 8-cycle gap FAILS the five-cycle floor and the three-cycle target…
boundary_gaps_dropped_gaps() ignores the lead-in and the run-outYESC9 a track with NO novelty at all reads as one unchanged span the length of the track; C10 a 0.5 dB dip is not a beat drop and a 0.2 s band flicker is not a new instrument
merge_window_unboundedTHRESHOLDS['merge_cycles'] -> 50 (every event collapses into one moment)YESC4 novelty planted every 2 cycles reads back as 2; C5 novelty planted every 8 cycles reads back as 8; C7 novelty planted every 1 cycles reads back as 1…

11. Provenance

927 within-album siblings, 223 measured cards

on albums with no corpus row.

PATTERN_FINDINGS_V2.md. The pool grew: EX_014's quarantine was cleared on the corpus's own

evidence and EX_094 attached. Nothing was reclassified by this lane.

which is what the review queue published and what Josh graded.

docs/proposals/music/craft_research/REPETITION_AND_VARIATION_FORM.md § 1 on that lane's

own definition and filter.

flatten, load_corpus, label_rows, within_album_auc, auc, matched_ctrl,

percentile_of, binom_tail.

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