HOOK_PRESENCE_VALIDATION.md

music/exemplars/instruments/HOOK_PRESENCE_VALIDATION.md

HOOK PRESENCE — the validation of instrument (c)

Tier: MEASURED INSTRUMENT. Produced by harness/music_gen/instr_hook_presence.py, which writes this file and its machine record together and writes nothing else.
The law it measures: A track must state an identifiable motif and bring it back transformed rather than pasted: hooks and complexities, never stacked noise.
Its authority: the composition floor Josh set on 2026-08-07 — "its got to have the hooks and complexities. There cant just be stacked noise" — recorded at the tail of docs/spine/DECISIONS_PENDING_JOSH.md, commit da627060.
Machine record: build/audio/exemplars/instruments/HOOK_PRESENCE_VALIDATION.json.
Legal posture: analysis for understanding only; audio is read from disk, measured, and never copied, redistributed, or used as model input.

1. The one-paragraph answer

The instrument states a motif from the card's own hook block, then hunts it through the whole track under three invariances the existing measurements do not have: it matches over all twelve pitch-class rotations, so a return a fourth higher still reads as a return; over a seven-point time-ratio grid, so an augmented or diminished return still reads as a return; and, symbolically, under an edit budget, so an ornamented return still reads as a return. All three are proved on planted controls that recover the interval, the ratio and the octave they were given. On this corpus it finds nothing.

Not one of the 14 metrics clears the multiplicity bar. The strongest, mean_return_similarity, reaches within-album AUC 0.325 (deviation 0.175) against an instrument-only bar of 0.245 and a joint bar of 0.241. n_returns lands at 0.510 and returns_per_min at 0.500, which is chance to three decimal places. This is the second null this program has produced on this family of ideas: PATTERN_FINDINGS_V2 section 6 already recorded recurrence_lag_norm failing at AUC 0.505, rank 102 of 103. Recurrence with transformation, measured properly and on its own terms, does not separate a loved track from the album it shipped on.

It also does not separate the loved tracks from the eighteen Josh threw out, and it fails in the direction that matters: the rejected round scores HIGHER. On n_returns the candidates' median is 3.0 against the loved tracks' 1; on hook_strength the AUC of loved-over-rejected is 0.306, where 0.5 is indistinguishable and anything below it means the rejected tracks look better. Round 1 states hooks and brings them back. Whatever Josh heard, it is not an absence of restatement.

Two things survive this and are worth carrying. The first is the craft distinction the instrument can make and no other measurement here can: a track whose returns are all literal is a loop, and a track whose returns are varied has a leitmotif — proved on planted controls, and the distinction Josh's three-to-five-cycle law turns on. The second is a defect in this file that section 6 measures rather than hides: the return threshold was calibrated on synthetic controls and does not transfer to real recordings, so the absolute return counts below are too low and nine loved tracks read as zero. The separation null survives that sweep at every threshold tested; the absolute counts do not.

2. The pool, read at HEAD

measured herePATTERN_FINDINGS_V2
formula cards11801181
corpus HITS3028
album siblings available as controls927851
albums carrying a hit1816

The pool is re-read from disk rather than quoted, and it has moved since V2 was written. That difference is reported rather than reconciled: a claim re-derived at HEAD is the only kind this program accepts.

The audio subset, and the rule that chose it

3. The 30 loved tracks, by name

idtitleclasshookto hook (s)returnsper mintransformedpitch or timelongest gap (s)
EX_006Chrono Trigger Main ThemeTITLE_CHARACTERyes2.741.57100%25%68.1
EX_007Frog's ThemeTITLE_CHARACTERyes61.621.440%0%31.1
EX_014Tekken 2 Attract Movie: Sound TrackTITLE_CHARACTERnon/an/an/an/an/an/a
EX_017SwedenEXPLORATIONyes1.1143.9079%0%49.4
EX_018Subwoofer LullabyEXPLORATIONyes0.000.00n/an/a208.5
EX_022Wind SceneEXPLORATIONyes0.561.7667%50%79.5
EX_030Route 209EXPLORATIONyes0.610.730%0%72.6
EX_032Terra's ThemeEXPLORATIONyes2.0164.12100%100%35.9
EX_033Corridors of TimeEXPLORATIONyes0.500.00n/an/a183.1
EX_046BFG DivisionBATTLEyes9.6131.54100%77%145.6
EX_053Cynthia Battle ThemeBATTLEyes1.521.31100%100%51.3
EX_055The Cyber GrindBATTLEyes0.220.44100%100%111.2
EX_064Ludwig, the Holy BladeBOSSyes3.200.00n/an/a244.8
EX_075Dancing MadBOSSyes1.0231.3074%70%480.4
EX_082The Best Is Yet to ComeMELANCHOLICyes1.500.00n/an/a344.0
EX_088An Unwavering HeartMELANCHOLICyes0.884.4975%50%17.8
EX_092Snake Eater (Ladder Climb)TENSIONyes0.610.34100%100%145.4
EX_094Dark Creature PursuitTENSIONyes2.100.00n/an/a113.2
EX_102Magus CastleTENSIONyes5.112.10100%0%23.5
EX_110Want You GoneCREDITS_TRIUMPHyes0.041.7075%0%59.9
EX_113To Good FriendsCREDITS_TRIUMPHyes0.410.43100%0%92.1
EX_124Deus Ex Main Title (UNATCO)TITLE_CHARACTERyes0.141.8975%0%57.6
EX_136Humming the BasslineEXPLORATIONyes0.240.9375%75%165.1
EX_142Shinshu FieldEXPLORATIONyes0.820.590%0%88.6
EX_145Go StraightBATTLEyes0.300.00n/an/a268.6
EX_147Fighting of the SpiritBATTLEyes0.610.32100%100%141.7
EX_161Aria di Mezzo CarattereMELANCHOLICyes0.610.25100%100%220.1
EX_162Schala's ThemeMELANCHOLICyes0.400.00n/an/a174.1
EX_179Ending Theme (Balance is Restored)CREDITS_TRIUMPHyes0.600.00n/an/a1295.0
EX_180Dreams DreamsCREDITS_TRIUMPHyes0.600.00n/an/a149.1

The transformed column counts every kind of change. The pitch or time column counts only transposition and time-scaling — the two axes that come out of a discrete search, are recovered exactly on the controls, and involve no threshold judgement at all. Where the two columns disagree, the difference is carried entirely by register and colour, which are continuous and are the softest thing this instrument does.

Do the loved tracks pass their own law?

The question was asked without assuming the answer.

4. What separates, and what does not

metricwithin-album AUCρ vs durationhits above own-album medianbinomial pclears instrument barclears joint bar
mean_return_similarity0.325-0.186/170.3323nono
max_return_gap_s0.6330.5617/270.2478nono
timescaled_share0.6230.0110/170.6291nono
contour_return_rate0.385-0.234/160.0768nono
structural_transformation_share0.6030.029/171.0000nono
transformation_share0.566-0.039/171.0000nono
time_to_hook_s0.4430.0311/270.4421nono
transposed_share0.4440.221/170.0003nono
hook_strength0.448-0.117/270.0192nono
max_return_gap_frac0.542-0.2014/271.0000nono
interval_return_rate0.479-0.174/160.0768nono
distinct_transpositions0.4880.142/170.0023nono
n_returns0.5100.2713/271.0000nono
returns_per_min0.5000.0714/271.0000nono

Two bars, both re-derived on this pool with permutation_null_best. The INSTRUMENT bar prices only this instrument's 14 metrics, which is the pre-registered reading. The JOINT bar prices those metrics alongside the 110 card axes they would join, which is the harsher and more honest question: does this instrument beat everything already measured. A metric clearing the first and not the second has not earned a place in the standard.

Do not read the binomial column as a finding where the AUC is flat. transposed_share, distinct_transpositions carry small binomial p-values beside deviations far under the bar, and the cause is ties rather than signal: these are share metrics on which most tracks, corpus rows and siblings alike, sit at exactly zero. A tie counts as half a win in the AUC and as a failure to beat the median in the binomial, so the two statistics disagree by construction on a zero-inflated axis. The AUC is the priced statistic and it is the one to believe.

The duration column is not decoration. PATTERN_FINDINGS_V2 section 5 established that the whole top of the card's ranking is structural scale, and a raw count of returns inherits that confound directly — which is why returns_per_min is reported beside n_returns and is the one to read.

Two names need reading correctly. mean_return_similarity is a match LIFT, not a raw cosine: it is how far a return stands above the background match level of its own track, as a fraction of the distance to a perfect match, and it is scaled that way because a raw chroma cosine has a floor set by the track's key. structural_transformation_share counts only transposition and time-scaling, the two threshold-free axes.

5. The transformation census

kindreturns across the loved tracksreturns across the sampled siblings
augmented925
diminished4976
literal2198
re_registered2260
re_timbred49142
transposed1152

A kind is counted once per return and a return may carry more than one, so the columns sum above the return count. literal is exclusive by construction: it is what a return is called when no transformation is positively detected.

How soft the colour axis is, measured

Across the loved tracks the median REGISTER difference between the hook window and an arbitrary window of the same track is 0.21 octaves, and the median COLOUR distance is 0.75 of that track's own timbral standard deviations. Both sit above the cuts the planted controls calibrated (0.5 octaves and 0.45 sigma), which is to say a real orchestral recording drifts in colour, from one moment to the next, by more than a synthetic re-orchestration does. That is why the cuts are not anchored to this background — an arbitrary window holds different material, so it is the wrong thing to compare a restatement against — and it is also why the register and colour columns of the census should be read as the weak half of it.

6. How much of this is the threshold — the sensitivity sweep

The first full run produced a number that could not be true: nine of the loved tracks came back with no detectable return of their opening motif, and two of the nine were *Corridors of Time* and *Schala's Theme*, pieces built on restating one idea until it is unforgettable. A reading like that is a claim about the instrument, not the music, and the way to tell them apart is to move the one number the reading depends on.

trackduration (s)λ = 0.1λ = 0.15λ = 0.2λ = 0.3λ = 0.42
EX_179 zero-return129686442740
EX_082 zero-return34627211320
EX_145 zero-return26932100
EX_064 zero-return2481110930
EX_075 most-returns10606054483823
EX_032 most-returns2333532302316
SLICE_T1_EXPLORATION_FLORES_a_41033 candidate2142018151210
SLICE_T1_EXPLORATION_FLORES_a_41022 candidate214181713108
SLICE_T3_TITLE_PROTAGONIST_a_43033 candidate23212111088

Selection rule: the four zero-return corpus rows with the longest durations, the two corpus rows with the most returns, and the three candidates with the most -- chosen by rule so the table cannot be a hand-picked one. The shipped threshold is λ = 0.42, the value the planted controls calibrated.

Read the two things this says, because they point in opposite directions.

The first is a defect and it is mine. The return threshold was calibrated on synthetic controls whose background is contrasting material, where a restatement stands far above everything around it. A real recording holds one key, one ensemble and one texture for minutes at a time, so its background match level is already high and a genuine restatement clears it by much less. Carried across unchanged, EX_179 reads as having no returns at λ = 0.42 and 86 at λ = 0.1. The absolute return counts in this document are not trustworthy on real recordings, and n_returns, returns_per_min and the derived floor inherit that. The fix belongs to the next version and it is not a smaller number chosen after seeing the answer: it is a threshold calibrated against real recordings whose restatement structure is known independently.

The second is the reason the finding survives anyway. Loosening the threshold lifts the rejected candidates at least as much as it lifts the loved tracks — SLICE_T1_EXPLORATION_FLORES_a_41033 already carries 10 returns at the shipped threshold, more than any of the zero-return corpus rows reach until λ = 0.1 — so at no setting tested does the ordering reverse. The separation null in section 4 is a property of the corpus, not of the cut.

7. The floor, derived rather than asserted — and degenerate

8. The eighteen turned-down candidates

Round 1 was generated from text with no melodic control of any kind, so the prior is a weak or absent hook. The prior was checked rather than assumed.

candidatehookreturnsper mintransformedpitch or timestrengthpasses floor
SLICE_T1_EXPLORATION_FLORES_a_41033yes102.8060%50%0.568yes
SLICE_T1_EXPLORATION_FLORES_a_41022yes82.24100%100%0.605yes
SLICE_T1_EXPLORATION_FLORES_a_41011yes51.40100%20%0.775no
SLICE_T1_EXPLORATION_FLORES_a_41044yes20.56100%100%0.825no
SLICE_T2_BATTLE_CACI_b_42044yes30.8967%33%0.724no
SLICE_T2_BATTLE_CACI_a_42011yes30.89100%67%0.717no
SLICE_T2_BATTLE_CACI_b_42033yes51.490%0%0.814no
SLICE_T3_TITLE_PROTAGONIST_a_43011yes41.03100%100%0.536no
SLICE_T3_TITLE_PROTAGONIST_a_43022yes30.78100%100%0.686no
SLICE_T3_TITLE_PROTAGONIST_a_43033yes82.0788%75%0.650yes
SLICE_T3_TITLE_PROTAGONIST_b_43033yes71.81100%86%0.519yes
SLICE_T4_MELANCHOLIC_HOME_AND_LOSS_a_44033yes00.00n/an/a0.747n/a
SLICE_T4_MELANCHOLIC_HOME_AND_LOSS_a_44022yes00.00n/an/a0.770n/a
SLICE_T4_MELANCHOLIC_HOME_AND_LOSS_b_44033yes30.87100%0%0.817no
SLICE_T4_MELANCHOLIC_HOME_AND_LOSS_b_44011yes00.00n/an/a0.800n/a
SLICE_T4_MELANCHOLIC_HOME_AND_LOSS_a_44044yes20.58100%100%0.800no
SLICE_T4_MELANCHOLIC_HOME_AND_LOSS_b_44022yes10.29100%0%0.844no
SLICE_T4_MELANCHOLIC_HOME_AND_LOSS_a_44011yes30.87100%100%0.687n/a
axisloved-track mediancandidate medianAUC, loved over candidate
returns_per_min0.5850.8780.447
transformation_share0.8931.0000.390
n_returns13.0000.388
hook_strength0.6910.7360.306

An instrument that cannot tell the rejected round from the loved tracks is not yet an instrument, so this table is the one that decides whether this file is worth keeping. Read the AUC column: 0.5 is indistinguishable and 1.0 is complete separation.

9. What this instrument cannot see

10. Controls

Nothing above is admissible unless --check exits zero in the same process. The controls synthesise music with planted answers and prove recovery: literal repeats at known times, a return transposed by a known interval, a return augmented by a known ratio, a return moved an octave, a return re-coloured, a through-composed track that must yield nothing, a pure loop that must read as many returns and no transformation, malformed cards that must return unavailable rather than raise, and a dense-mix control that quantifies the honesty limit above. Three mutation arms then break the instrument on purpose — the transposition search forced to zero, the time-ratio search forced to one, the return threshold dropped to the background — and each must be caught by a named control. A suite with no mutation proof has never been armed.

_Generated 2026-08-08T00:07:15+00:00 · seed 20260807 · run time 15.1 s._

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