MUSIC_PRACTICE_GAP_AUDIT.md

music/MUSIC_PRACTICE_GAP_AUDIT.md

MUSIC PRACTICE GAP AUDIT — what the experts do, what our lane does, and the ten changes round 4 must carry

CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
Canon served: Josh's round-3 grade at docs/spine/DECISIONS_PENDING_JOSH.md (GRADED 2026-08-08,
ROUND 3 DOWN, ALL THREE) and its named consequence — the HARMONY-RHYTHM-MELODY ARCHITECTURE PASS;
the melody-first / thirty-year-bar direction (memory music-direction-melody-first-30-year-bar);
the composed-never-prompted rule; the CREATION-FIRST law (every new gate names the artifact it
unblocks).
If this document disagrees with canon, CANON WINS and this document is the defect.

TIER: AUDIT SYNTHESIS — PROPOSAL-TIER. It is HOW, never WHAT. It sets no canon, names no region

content, and changes no spine or registry row. ENGINE, not CANON: every change below alters how we

generate, realise and score audio, and touches no world canon.

**This is an adversarial audit of our own stack, and of the five craft documents that were written to

fix it.** Josh's grade proves the gaps are real. It does not prove that any particular document

correctly located them, and three of the five carry findings that are STALE against HEAD. Where a

craft doc's evidence has expired, that is recorded here as loudly as the gaps themselves — a research

document that describes a defect we already fixed sends the next round to the wrong place, and a

research document whose predicted defect has since landed in the shipping artifact deserves to be

believed harder, not equally.

---

0. The grade, and what round 4 already is

Josh, verbatim, on round 3 (docs/spine/DECISIONS_PENDING_JOSH.md, GRADED 2026-08-08):

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

Five clauses, and they are separable: noise (realisation), clash (vertical), no rhythm

(temporal), a few notes slowly back to back (melodic surface), never any harmonies added on

(the second voice). The structural battery scored 57 of 57 and 3 of 3 on the arc instrument while

measuring none of the five. build/audio/pass5/PASS5_VERDICT.md §0 is the artifact of that

mismatch — a headline table of holds, boundaries, distinctness and loudness with no row that could

have caught any clause Josh named.

Round 4 exists, is built, and is UNPUBLISHED and UNGRADED (build/audio/pass7/ROUND4_STAGING.md).

It carries the harmony engine (harness/music_gen/harmony.py, 21 rule codes, 59/59 controls), the

groove engine (harness/music_gen/groove.py, 26/26), three new instruments, the mode constraint, the

swing derivation, and the repair of a four-round degree-resolution defect that had the entire

functional-harmony layer sounding two octaves too high in an in-mode wash. So this audit is not

"what is wrong with round 3". It is: what must still change before round 4 reaches Josh's ears.

Two facts about round 4 govern everything below and both were verified at HEAD for this audit, not

read off a report:

GAP-01 — "groove.py is imported by exactly one file in the repository, and that file is

instr_groove.py, the RULER. No composer imports it" — is false at HEAD, and every gap that

document derives from it is downstream of an expired premise.

say so, and import pass2_realise as R confirms it). So **every defect in pass2_realise is a

round-4 defect**, including the ones round 4 never touched.

---

1. SOURCES

Read status, declared, because this is an audit and the distinction is the whole point. This

document's PRIMARY sources are two: (a) the five craft documents named in §1.2, each of which carries

its own independent citation audit dated 2026-08-08 recording what verified and what did not; and

(b) our own tree, measured at HEAD during this pass (§1.3). The published literature in §1.1 is

cited through those craft documents at the read-status each records. This document fetched none

of it independently and claims no number from it that its carrier document did not verify. Per the

standing lesson at MELODIC_CRAFT_PRACTICE.md §11.3 — a source marked unread may support framing and

may not support a number — every §1.1 entry below is marked with the craft doc that carries it and

that doc's own verification verdict.

1.1 The published practice, cited through its carrier

Composition and harmony treatises

(Faber & Faber, 1967)** — chs. III, IV, V, VI, VII, VIII. OCR scan:

<https://ia903208.us.archive.org/1/items/MusicTheoryGeorgeThaddeusJones1974/A.schoenberg-FundamentalsOfMusicalComposition_text.pdf>.

Carrier: MELODIC_CRAFT_PRACTICE.md S1 — **read in full; imprint and all chapter attributions

verified in that doc's §11.1, two chapter misattributions found and repaired there.**

California Press). <https://archive.org/details/theoryofharmony0000scho>. Rules retrieved in

formalised constraint form from the Strasheela implementation,

<https://strasheela.sourceforge.net/strasheela/doc/Example-Schoenberg-TheoryOfHarmony.html>.

Carrier: HARMONY_AND_ARRANGEMENT_PRACTICE.md §2.1 — all six constraints verified.

1961), p. 94 on the rootlessness of equidistant chords.

<https://archive.org/details/isbn_9780393095395>; page reference carried via

<https://en.wikipedia.org/wiki/Quartal_and_quintal_harmony>. Carrier:

HARMONY_AND_ARRANGEMENT_PRACTICE.md §5.1 — p. 94 sentence verified.

and evaluation chapters, <https://alanbelkinmusic.com/general-principles-of-harmony/>. Carrier:

HARMONY_AND_ARRANGEMENT_PRACTICE.md §2.2 — all three chapters verified.

"Hollow Textures", "Musical Lines vs. Instrumental Parts", "Orchestral Accompaniment".

<https://noty-bratstvo.org/sites/default/files/instr-artistic-orch-a-belkin_0.pdf>. Carrier: same —

re-extracted from PDF and verified down to the Bizet example.

"Harmony" — "Distribution of notes in chords" (p. 67), "Duplication of timbres" (p. 77) and the

Remarks (pp. 78-79). <https://www.gutenberg.org/files/33900/33900-h/33900-h.htm>. Carrier:

HARMONY_AND_ARRANGEMENT_PRACTICE.md §7.2 — **chapter body downloaded and extracted locally;

every attributed sentence verified near-verbatim.**

(W. W. Norton, 1955). Carrier: same, §2.1 and §2.2 — **Piston himself NOT retrievable; the spacing

rule is cited to the pedagogical consensus that states it identically

(<https://rwu.pressbooks.pub/musictheory/chapter/spacing-voicing-and-doubling-of-chord-tones-in-satb-style/>,

<https://mymusictheory.com/satb-harmony/satb-doubling-omissions-spacing/>), and that doc's audit

found and repaired a misreading of both.**

Carrier: MELODIC_CRAFT_PRACTICE.md S2 — **not read there; already implemented in

pass3_grammar.py and checked against two teaching summaries.**

the avoid-note definition and its semitone criterion, carried via

<https://en.wikipedia.org/wiki/Avoid_note>. Carrier: HARMONY_AND_ARRANGEMENT_PRACTICE.md §2.1 —

**one retrievable carrier only; a second carrier claimed in an earlier draft was found false and

struck.**

<https://global.oup.com/academic/product/hollywood-harmony-9780190606404>. Carrier: same §2.5 —

book real, both OUP hosts refuse automated fetch; carried as PARAPHRASE, de-quoted on audit.

NOT retrievable (archive item darkened); NO rule attributed to it.

Perception and corpus research

Principles", *Music Perception* 19(1) (2001), 1-64.** DOI <https://doi.org/10.1525/mp.2001.19.1.1>.

The minimum-masking principle. Carrier: HARMONY_AND_ARRANGEMENT_PRACTICE.md §2.3 and

COUNTERPOINT_AND_VOICE_LEADING.md §2.1 — **paywalled; principle taken from secondary reporting,

declared.**

Implemented directly in harmony.erb_floor_table with the derivation in its docstring.

from 1950 to 2023", *Scientific Reports* 14, art. 14749** (the BiMMuDa corpus, 366 transcribed

melodies). <https://www.nature.com/articles/s41598-024-64571-x>. Carrier:

MELODIC_CRAFT_PRACTICE.md §3.1 — read; onset densities 1.8 / 2.0 / 2.8 notes/s verified.

*Music & Science* 7, 1-11.** DOI 10.1177/20592043231225731,

<https://davidtemperley.com/wp-content/uploads/2024/06/chiu-temperley.pdf>. Carrier: same §3.2 —

read in full; Table 1 verified cell-for-cell.

Aesthetics, Creativity, and the Arts* 11(2), 122-135.**

<https://research.gold.ac.uk/id/eprint/19405/>. Carrier: same §3.4 — **accepted manuscript read;

every number verified.**

Computational Hook Discovery", ISMIR 2015, 227-233.** <https://zenodo.org/records/1415038>.

Carrier: same §3.5 — **read; Table 2 verified, and a three-model provenance error found and

repaired.**

Goldstein et al. (2023), "Exploring Melodic Contour: A Clustering Approach",

<https://www.ripolleslab.com/uploads/1/2/6/7/126798162/goldstein_2023.pdf>. Carrier: same §3.4 —

Goldstein read in full; Huron via Goldstein.

categorical non-isochronous subdivision; Friberg & Sundström on tempo-dependent swing with a

~100 ms short-note floor; Frühauf and Madison & Sioros on random jitter making groove WORSE;

Danielsen et al. on composed layer asynchrony (55-80 ms kick-to-bass); Hove et al. on the

lowest-pitched stream carrying timing.** Carrier: RHYTHM_GROOVE_AND_PERFORMANCE_PRACTICE.md §9,

whose 2026-08-08 citation review marks Witek ✅, Sioros ✅, Polak ✅, Friberg & Sundström ✅ (all

three numbers), Frühauf ✅, Madison & Sioros ✅, Danielsen ✅, Hove ✅, **and London's entrainment

bounds ⚠ — code the window as a REPORTED table, never a hard validator, until the thresholds are

read out of the book.**

Kilchenmann & Senn on downscaling. Carrier: VIRTUAL_ORCHESTRATION_AND_MOCKUP_REALISM.md §3.1.

example. Carrier: GAME_SCORING_AND_ADAPTIVE_PRACTICE.md §6.1 — verified to the number.

Game and studio practice

3-12 s stinger at p. 27, the interactivity ladder at ch. 3, the Sanger repetition attribution at

p. 18. Carrier: GAME_SCORING_AND_ADAPTIVE_PRACTICE.md §1.1 — **publisher sample text-extracted;

every page reference verified exact.**

<https://winifredphillips.wpcomstaging.com/2020/06/16/game-composers-and-the-importance-of-themes-the-hook-in-game-music-pt-1/>;

"Repetition in Game Music"

<https://www.gamedeveloper.com/audio/game-composers-and-the-importance-of-themes-repetition-in-game-music-pt-2->;

"Variation and Fragmentation in Game Music"

<https://www.gamedeveloper.com/audio/variation-and-fragmentation-in-game-music-game-composers-and-the-importance-of-themes-pt-3->.

Carrier: MELODIC_CRAFT_PRACTICE.md §4.2 — **all three fetched and read; the verified numbers are

FIVE full statements across a main theme (Star Wars) and 14 restatements of a four-chord signature

(Liberation), and a "six variations" figure previously carried was found FABRICATED and struck.**

<https://archive.org/details/GDC2007Kondo>; report

<https://www.nintendoworldreport.com/feature/13118/koji-kondos-gdc-2007-presentation>. Carrier:

same §4.1 — **talk not watched; the rhythm/balance/interactivity triad verified in the report; a

Mario tempo attribution found unsupported and re-labelled.**

per section; roughly 4 bars down against 1.5 beats up). Carrier:

GAME_SCORING_AND_ADAPTIVE_PRACTICE.md §4.3 — **verified from slide text, with the lane's own

earlier misreading corrected.**

lower-tone dominance; **Tilley, *Making It Up Together* on negotiated interlock; Agawu** in

JAMS on "additive rhythm" as a transcription artefact; McPhee on the semi-ochètan.

Carrier: RHYTHM_GROOVE_AND_PERFORMANCE_PRACTICE.md §§5-6, all marked ✅, Tenzer quoted verbatim.

whole programme, explicitly not music specifically); EBU Tech 3341/3342; ITU-R BS.1770-4.

Carrier: VIRTUAL_ORCHESTRATION_AND_MOCKUP_REALISM.md §6.

<https://www.robin-hoffmann.com/dfsb/low-interval-limits/> — the caveats, including that a

voicing whose lowest note is not the root must be checked as if the root were present. Carrier:

HARMONY_AND_ARRANGEMENT_PRACTICE.md §2.4 — **caveats verified; the numeric table is published as

an engraved image by every source tried and is therefore NOT asserted anywhere in this series.**

<https://gdcvault.com/play/1012601/>; "Implementing an Adaptive, Live Orchestral Soundtrack"

<https://www.gdcvault.com/play/1013209/Implementing-an-Adaptive-Live-Orchestral>; "Digital

Orchestration for the Video Game Composer" <https://gdcvault.com/play/1015338/Digital-Orchestration-for-the-Video>.

Carrier: HARMONY_AND_ARRANGEMENT_PRACTICE.md §2.5 — **abstracts only to an unauthenticated

fetch; named as the field's talks, NO rule attributed.**

1.2 The five craft documents under audit

13 gap notes)

RG-01…RG-32; GAP-01…GAP-27)

rules 1-21; GAP-VO-01…GAP-VO-22)

§12.1-§12.13)

1.3 Our own practice, read for this audit

build/audio/pass4/PASS4_VERDICT.md; build/audio/pass5/PASS5_VERDICT.md;

build/audio/pass7/ROUND4_STAGING.md; build/audio/pass7/plans/PASS7_FLORES_{ROAD,FALLS,ROUNDS}.json;

docs/DOC_MAP.md rows for passes 2-6 and for round 4; docs/spine/DECISIONS_PENDING_JOSH.md tail;

and the code — `harness/music_gen/{pass2_realise,pass3_grammar,harmony,groove,pass7_flores,pass7_realise,

instr_melodic_intelligence,instr_melody_bands,instr_groove,instr_harmony_fit,floor_instruments}.py`.

1.4 MEASURED HERE — numbers this audit produced, and how to re-derive them

Every number tagged MEASURED HERE below was produced during this pass by importing our own

modules and compiling the landed round-4 plans. Re-derive rather than trust, per the standing rule

that a proof is only true at the commit it ran on:

python - <<'EOF'
import json, glob, os, collections, sys
sys.path.insert(0, 'harness/music_gen')
import harmony, pass2_realise as PR
for p in sorted(glob.glob('build/audio/pass7/plans/*.json')):
    d = json.load(open(p, encoding='utf-8'))
    ch = d['harmonic_plan']['chords']
    tert = sum(1 for c in ch if c['quality'] not in harmony._THIRDLESS)
    comp = PR.compile_plan(d)
    on, ident, tot = [], 0, 0
    for pt in comp['parts']:
        ns = sorted(pt['notes'], key=lambda n: n[1])
        on += [round(float(n[1]), 6) for n in ns]
        vs = [n[3] for n in ns]
        for a, b in zip(vs, vs[1:]):
            tot += 1; ident += (a == b)
    byt = collections.Counter(on)
    print(os.path.basename(p), 'tertian', round(tert/len(ch), 3),
          'clustered', round(sum(c for c in byt.values() if c > 1)/len(on), 3),
          'max_cluster', max(byt.values()),
          'ident_vel', round(ident/tot, 3))
EOF

---

2. THE PER-STAGE TABLE

Thirteen stages, in pipeline order. Verdict is one of ALIGNED (our lane does what the practice

does), GAP (the practice has something we do not), or WRONG (our lane does something the practice

says is a defect, or a craft doc's own finding is expired against HEAD). Every adopted change names

its source and the file it lands in.

S1 — PLAN AND SCHEMA

what the experts dowhat our lane doesverdictthe adopted change, with its source
Every source in the adaptive literature treats entry cue, exit cue, pre-entry, post-exit and a transition rule as the minimum unit of an interactive cue (Sweet ch. 3; the FMOD/Wwise object model)The pass-plan carries 33 top-level keys and none of them is a state, transition, entry cue or adaptive role. A repo search for adaptive_role, entry_cue, exit_cue, state_machine, transition_class returns nothingGAPAdd the adaptive block (entry_cue_beat, exit_cue_beat, pre_entry_beats, post_exit_beats, phrase_quantum_bars), states[] and transitions[], per GAME_SCORING… R1-R3, in harness/music_gen/pass2_plan.py. DEFERRED past round 4 — see §4
The interactivity ladder is a declared property of a cue, so a report cannot imply adaptivity it lacks (Sweet ch. 3)Every cue would read noninteractive, and the honest-tier register in T1_Audio_Spec §8.2 has no interactivity axis at allGAPinteractivity_rung on the plan (GAME_SCORING… R22). Costs almost nothing and prevents a claim we cannot support
Length follows function and expected dwell time; a stinger is 3-12 s, a boss phase is as long as the phase (Sweet ch. 10, p. 27)One global band, one target_duration_s per plan, no dwell-time input anywhereGAPClass-keyed length contract (GAME_SCORING… §12.12). Deferred

S2 — MELODY: the line itself

what the experts dowhat our lane doesverdictthe adopted change, with its source
A well-balanced melody progresses in waves, approaches its high point through lesser high points, balances upward with downward motion, compensates leaps with contrary conjunct motion, and stays within a reasonable compass (Schoenberg S1 ch. IV, five conditions, verified verbatim)instr_melodic_intelligence.METRIC_KEYS holds thirteen metrics (verified at HEAD, :1767) and not one measures ambitus, climax position, or wave balanceGAPpitch_range_semitones and pitch_sd_semitones as scored axes (MELODIC… R-02); real melodies measure 7-14 st against a control's 5, the cleanest discriminator that pass found
A pop-idiom line runs 1.8-2.8 notes/s; a lyrical theme legitimately runs 0.6-1.5 (BiMMuDa, S15, verified)PARTLY CLOSED, and the craft doc audits the wrong instrument. instr_melodic_intelligence still has no density axis — but instr_melody_bands (round 4's actual melodic grader) reports note_density_per_s AND note_density_per_sounding_s with per-class corpus bands. Score-tier movement: ROAD 0.739 → 1.847 → 2.734, FALLS 0.688 → 1.236 → 2.044, ROUNDS 1.557 → 2.611 → 4.454 across rounds 2/3/4ALIGNED (moved)No new density work. MELODIC… GAP-01's severity is HIGH against a retired instrument and LOW against the live one. Do not spend round 4 here
The climax is *arrived at* — density and small-note activity rise into it and the line recedes to the middle register after (Schoenberg ch. VI on Op. 2/1-II, verified verbatim; practitioner consensus puts the peak at two-thirds to three-quarters)Nothing anywhere measures climax position or approach. pass3_grammar.divide() (:542) builds the divided surface and division_level is a phrase-wide constant — the small notes cannot rise into anythingGAPReport peak position, approach density and post-peak recession (MELODIC… R-05); make division_level a schedule keyed to the climax bar (R-12). This is the mechanism that fixes "back to back" without touching one structural pitch
Step inertia is a style discriminator with published per-corpus values: 71% Essen, 67% classical themes, 63% hymns, 48% Rolling Stone, 43% Billboard (Chiu & Temperley Table 1, verified cell-for-cell)melodic_complexity's step-to-leap term targets S:L = 3.0 — a number no corpus supports — and counts thirds (3-4 st) as neither step nor leap despite thirds being 17-30% of real intervals. It scores the deliberate failure-mode control 0.904 and Ode to Joy 0.366WRONGClose the dead zone, drop the 3.0 target, prefer step inertia against the cue's declared idiom (MELODIC… R-03). Any ranking produced while this stands points toward the material Josh rejected. Round 4 does not use this axis for grading — which is why it is a round-5 correction and not a round-4 blocker, and why the instrument should be formally retired rather than left to be misread (PASS4_VERDICT.md §6)
A memorable theme is partly conventional on purpose: melodic entropy loads NEGATIVELY on recognisability while repetitivity, motive typicality and range conventionality load positively (van Balen Table 2, verified); conventional global contour is the strongest single earworm predictor (Jakubowski, dens.step.cont.glob.dir > 0.326 → ~80% INMI)melodic_complexity is a geometric mean of a five-term variety score and a three-term structure score. There is no conventionality term anywhere in the instrument, and the variety half rewards the exact quantity the catchiness literature finds negativeWRONGA conventionality band, not a slider — conventional at the level of shape, distinctive at the level of local gradient (MELODIC… R-04). Blocked on a reference corpus of our own authored cues; do not ship it as a maximiser
Josh's own two summit bars: a piano reduction that survives 30-50 years, and orchestra playabilityROUND 4 PASSES 3 OF 3 ON THE PIANO TEST (novel bars 15.02 / 13.03 / 10.00 against a floor of 4; distinct ideas 2/3/3 against 2), where round 3 passed 1 of 3 and round 2 passed 0 of 3. The instrument was blind for two rounds (MELODY_KINDS excluded score) and now speaksALIGNEDNothing. This is round 4's strongest single result and it is the one Josh clause with a green number behind it

S3 — MOTIVIC DEVELOPMENT

what the experts dowhat our lane doesverdictthe adopted change, with its source
Repetition alone gives rise to monotony and monotony is overcome only by variation; preserving the rhythm licenses far-reaching contour change (Schoenberg ch. III and ch. VII, capitalised in the source, verified)pass3_grammar.OPERATIONS (:70-123) carries a spine_changing flag that asks the PITCH question. There is no rhythm partner, so *developing variation* (spine changed, rhythm preserved) cannot be distinguished from *foreign material* (both changed)GAPAdd the rhythm-preservation partner flag (MELODIC… R-11). Small, and it names the one category Schoenberg says produces coherence
Working practice plans the restatement count: five full statements across a main theme (Star Wars, verified verbatim in Phillips Pt 1), 14 restatements of a four-chord signature (Liberation, Pt 2), a five-note fragment as the smallest transportable unit (Pt 3)hook.returns exists; restatement count is not a planned quantity. Round 2 carried 21 statement layers across three cues of which literal alone was eight — restatement without variation, Schoenberg's named monotonyGAPPlan the restatement count (MELODIC… R-10). Belongs with the motivic lane, not round 4
Caplin's sentence/period/continuation with fragmentation and harmonic accelerationpass3_grammar implements it faithfully — FUNCTION_NAMES :131, THEME_TYPES :134, sentence() :992, period() :1093, hybrid_ant_cont() :1193ALIGNEDNothing. The grammar is good work

S4 — HARMONY: the chord vocabulary

what the experts dowhat our lane doesverdictthe adopted change, with its source
Scale-or-mode-based pitch limitation is the FIRST unifying mechanism of harmonic coherence; harmonic families cohere by what they keep common (Belkin, coherence chapter, verified)CLOSED. harmony.in_set_chords derives the 14 in-set chords of D anhemitonic pentatonic; build_plan(pitch_set=…) is wired at pass7_flores.t1_harmonic_plan:798; H19 refuses an undeclared out-of-set chord. MEASURED HERE on the landed round-4 plans: out-of-set count 0 / 0 / 3, unplaced 0 / 0 / 0 — the three on ROUNDS are cadence-placed and declaredALIGNEDNothing. HA-01 and HA-02 are done and armed
An out-of-set tone's severity follows semitone adjacency — a foreign pitch class adjacent to TWO scale members is a harder event than one adjacent to one (Nettles & Graf's avoid-note criterion plus the counting argument: in an anhemitonic pentatonic every foreign pitch class is a semitone from at least one scale member, three of seven from two)H19 is a boolean. Its finding text names a pitch class number, not the scale tone it collides withGAPsemitone_neighbours(pitch_set) feeding H19's finding text and a graded licence test (HARMONY… HA-03). Cheap, and it makes every refusal legible to an author
Equidistant chords are ambiguous — any member can function as the root, so responsibility for establishing the harmony falls on the melodically active voice (Persichetti p. 94, verified) — and equidistant intervals produce a static effect while unequal intervals create momentum (Belkin, movement chapter, verified)MEASURED HERE, on the landed round-4 plans — the harmony doc predicted this on a synthetic cue and it is real in the shipping artifact. Quality census of harmonic_plan.chords: FALLS sus4 18 / quintal 10 / sus2 10 / min 5 / maj 4 / maj6 3 / min7 3 / add9 1 → tertian share 0.296, 38 of 54 chords contain no third. ROAD0.315, 37 of 54 thirdless. ROUNDS0.419. No rule in harmony.RULE_CODES (21 codes, verified at HEAD) measures itWRONGThe tertian floor (HARMONY… HA-04): a tertian_share figure on HarmonicPlan.report plus a harmony.check rule with a FLOOR, banded on the exemplar corpus and never asserted. This is the defect the clash-fix CREATED, it is in the artifact nobody has heard, and two independent authorities predict it reads as washy. Change #2 in §4
A full close takes a chord with a third; a modal half cadence on a quintal chord is idiomatic (Schoenberg's cadence criterion; Persichetti on who carries the root)MEASURED HERE — and this one is already right, by the ranking's accident rather than by rule. Every full close on all three cues lands on I (maj): FALLS modal_close at 200, ROAD plagal at 176 and modal_close at 400, ROUNDS plagal at 416 and modal_close at 480. The thirdless cadences are half cadences (Vquintal), which the practice licensesALIGNEDMake it deliberate rather than accidental — require a third-bearing sonority at every ARRIVAL bar in build_plan._role (HARMONY… HA-05). Low priority precisely because the audit found no violation
A cadence is the moment the scale is completed — a definition that survives the loss of the leading tone entirely (Schoenberg via Strasheela, verified)cadence_inventory is a COUNT ({HC: 1, deceptive: 1, plagal: 1, modal_close: 1}). A modal_close covering three of five pentatonic degrees is indistinguishable from one covering fiveGAPcadence_completes_scale coverage fraction in the plan report (HARMONY… HA-06). One predicate; makes the modal_close label earned rather than assigned
Faster harmonic change raises temperature, slower calms it, and a CHANGE of harmonic rhythm is what defines a section boundary while consistency unifies within one (Belkin, movement chapter, verified)MEASURED HERE: harmonic_rhythm_bars_per_chord is a single scalar per cue — 1.0 (FALLS), 2.0 (ROAD), 2.0 (ROUNDS) — while every cue has real sections and already varies its grid per section through harmony_variantsGAPAccept a per-section schedule as well as a scalar (HARMONY… HA-14). The cheapest sectional contrast in the whole harmonic layer, and the plumbing already exists
Film's wonder idiom is CONSONANT TRIADS moving chromatically, not extension chords sitting still (Lehman, paraphrased — OUP refuses fetch)_POOL_AMBIENT bets on extension density. Inside a five-note pitch set the chromatic mediants are all out-of-set by constructionGAP, correctly DECLINEDRecord HA-08; build it for the heptatonic region cells. Not round 4's

S5 — HARMONY: voicing, spacing and register disposition

what the experts dowhat our lane doesverdictthe adopted change, with its source
The normal disposition follows the overtone series — wide intervals (octaves, sixths) in the bass, lesser (fifths, fourths) in the middle, close (thirds, seconds) at the top — and nothing is worse than a void in the intermediate parts, especially in forte (Rimsky Ch. III p. 67 and pp. 78-79, extracted and verified; Belkin "Register", verified; Huron's minimum-masking principle as the perceptual derivation — three authorities, one law)harmony.voice_chord filters on the ERB floor, adjacent upper-voice spacing and third-doubling, and ranks by common-tone retention plus minimal motion. Nothing scores the SHAPE of the stack. Measured over 24 in-set voicings at GRID_VOICES=4, GRID_REGISTER=(31,64): 14 of 24 have their bottom gap NARROWER than their top gap — the law inverted in 58% — and 10 of 24 put the widest gap at the top, which is Rimsky's void placed exactly where he says it is worst. Example Iquintal → MIDI [38, 45, 52, 62], gaps 7, 7, 10WRONGRank by gap monotonicity bottom-to-top, and hard-refuse a stack whose widest gap sits above the bass unless a hollow texture is declared (HARMONY… HA-09). A ranking term cannot make illegal anything legal today, which is why this is cheap. Change #7 in §4
The ERB floor is doing its jobMeasured across the same 24 voicings, intervals of a third or narrower whose lower note falls below C3: ZERO. voice_chord is correctly refusing muddy low intervalsALIGNEDNothing. The floor is derived from Glasberg-Moore with a self-test against the published table — a stronger artefact than a scanned chart
Adjacent upper voices stay within an octave; the bass may sit further below the tenor but not without limit — Rimsky says "rarely" more than an octave, RWU caps it at a twelfth, MyMusicTheory sets a floor of a fifth_upper_spacing_ok implements the upper half exactly and bounds bass-to-tenor not at all, which matches no source. Ordered by strictness the sources run Rimsky, then RWU, then us — our code is the outlier, not the arbiterWRONG (mildly)Rimsky's octave as a ranking preference plus a docstring recording where the sources actually sit (HARMONY… HA-10). The comment is worth more than the code: a future reader should not have to rediscover that the unbounded treatment is our own choice
Doubling is an intentional, expressive choice with a register law: octave parts strengthen one another, the extreme parts of a four-part chord are the thinnest, bass doublings add solidity, literal doubling produces greyness (Rimsky Ch. III; Belkin, both verified)voice_chord accepts double_policy: str = "root_then_fifth" and the only doubling behaviour enforced is the third-doubling ceiling. A parameter that is accepted and ignored is a latent bug — a future caller will set it and believe it took effectWRONGMake double_policy real with the sourced options (HARMONY… HA-11). Single-function change, clean source
When a voicing's lowest note is not the root, the low-interval limit is checked as though the root were present (Hoffmann, verified — one of only two craft-table facts obtainable in text)harmony.spacing_ok evaluates the sounding pitches; bass_pc explicitly permits a non-root bassGAPHA-17. Trivially implementable, narrow in effect
The numeric low-interval-limit tableNot asserted anywhere in this series, deliberately — every source publishes it as an engraved image and four independent attempts returned the caveats and never the numbersALIGNEDNothing. This is the discipline working, and it should stay declined

S6 — HARMONISATION: the second voice, which is Josh's literal clause

what the experts dowhat our lane doesverdictthe adopted change, with its source
A second tune-carrying voice under the melody is the ordinary condition of the idiom Josh is measuring us against, not an ornamentRound 4 built the right mechanism and it does not sound often enough. The harmonised voice overlaps the carrier 100% of the time it sounds (ROAD 67.3 s of 67.6 s; ROUNDS 52.2 s of 52.4 s), with an interval census dominated by thirds and sixths — but harmonization_density reads 0.172 / 0.034 / 0.102 (ROAD / FALLS / ROUNDS), and on FALLS it went DOWN from round 3's 0.074GAP — and it is the top oneExtend the harmonised voice across the cue and add the second and third melodic voices the H3-5 ladder licenses at the peaks (ROUND4_STAGING.md §7.1). Change #1 in §4
The corpus referenceCorpus p10 0.274, median 0.745 — but that band is derived from AUDIO, where band_lines counts any pitched content in a register band as a voice, so for a thirty-part ensemble it sits near 1.0 by constructionWRONG to quote across tiersThe decisive comparison is WITHIN a tier, round over round, on identical code. A score-tier band for this axis cannot be built from this corpus and must follow instr_harmony_fit's model — a null that needs no corpus at all (ROUND4_STAGING.md §4)
One phenomenon, one numberinstr_harmony_fit.parallel_thirds_sixths_share reads 0.001-0.018 and instr_melody_bands.parallel_harmony_share reads 0.909-0.939 on the same music, because they normalise against different denominatorsWRONGDeclare the denominator on both axes before either figure is quotable. Logged in ROUND4_STAGING.md §5 and unfixed

S7 — RHYTHM AND GROOVE

what the experts dowhat our lane doesverdictthe adopted change, with its source
Groove is a measured construct and the composite syncopation is the number the empirical literature ties to it (Witek ✅, Sioros ✅)The craft doc's evidence is EXPIRED and the gap it names is still real. Its GAP-18 rests on composite syncopation being "exactly 0.0000 in all six rendered cues"; round 4 measures sync_score 0.160 / 0.075 / 0.203. But groove.check() R02 still judges the per-voice articulated mean and its own comment says "never on the composite" — so no rule refuses a degenerate composite even nowGAP (evidence stale, finding sound)Add a separate finding refusing a composite below a small floor for any class above AMBIENCE, with a mutation control (RHYTHM… RG-06). A dozen lines
Every articulated voice carries at least three velocity tiers — accent, normal, ghostPARTLY CLOSED, and the craft doc audits a branch round 4 mostly stopped using. RG-02 calls per-onset velocity in the ostinato branch "the single highest-value line of code in this document" — but round 4 writes its percussion as colotomic, which already carries per-stroke key, at_beat, dur and vel_scale (verified at pass2_realise.compile_pattern:208-218). MEASURED HERE: FALLS has 0 ostinato layers; ROAD has 4 and ROUNDS 5, all with vel_scale absent, i.e. flat at 1.0. And consecutive-identical velocity within a part fell from round 3's 89-91% to 63.5% / 62.1% / 67.1%GAP, narrowed by ~80%Still add the vels list to the ostinato branch (RHYTHM… RG-02) — but its value is now 9 layers across two cues, not "every percussion part in the program". Downgrade it from #1 to a component of change #8
No two adjacent onsets in a voice carry the same velocity; a sustaining figure spans at least a 20/127 range around its own meanMEASURED HERE: ROAD F09 and ROUNDS F09, F10 carry exactly ONE distinct velocity across the whole cue. F09 on ROUNDS is contrabass.trem — the broker layer, whose entire care mechanism depends on being heard as a separable arriving thingWRONGRG-03 as a groove.check() finding plus an instr_groove axis. The care mechanism has a dynamics dependency nobody declared
Density belongs to the composite, thinness to the voice — "use hocket, not a busier drummer"Already how groove.py is built; simply not stated as a rule with a numberALIGNEDRG-08, one docstring
The 3+3+2 figure is not "additive rhythm" — that is a transcription artefact and a default grouping mechanism of transcribers, not an indigenous conception (Agawu in JAMS, ✅)groove.py's header calls its 3+3+2 figures "a general additive figure". The file's refusal to attribute the figure to any living tradition is correct and should standWRONG (label only)RG-30, one docstring. Keep the figure, keep the refusal, change the word

S8 — METRE AND THE CLOCK

what the experts dowhat our lane doesverdictthe adopted change, with its source
The cycle is END-accented — stress is measured backwards from the final tone, which receives the strongest stress of all, and the gong marks cycle CONCLUSIONS (Tenzer, quoted verbatim, ✅)MEASURED HERE on the landed round-4 plans — still start-accented on all three. ROAD B01 strokes [(0.0, 1.0), (8.0, 0.55), (0.0, 0.8)]; ROUNDS B01 [(0.0, 1.0), (8.0, 0.7), (0.0, 0.9)]; FALLS B01 [(0.0, 0.9), (0.0, 0.7)]. The maximum vel_scale sits at beat 0.0 in every case. We have built the Western downbeat and labelled it colotomyWRONGFlip to end-accented and refuse a colotomic layer whose maximum vel_scale sits at at_beat 0.0 while a later stroke exists (RHYTHM… RG-11). One authoring change plus one validator, on the idiom we cite as our own authority. Component of change #8
A colotomic clock has three or more active periods and one deliberate omission (*wela*)CLOSED for round 4. MEASURED HERE: ROAD carries 6 colotomic layers (B01, B02, B03, B06, B07, B08) with 3, 4, 12 and 32 positions; ROUNDS carries 7; FALLS 4. RG-10's "two positions is not a colotomic clock" described round 3ALIGNEDNothing. Record the closure so nobody re-derives it
Every declared metric level falls inside the entrainment window, roughly 100 ms to 2.0 s (London — ⚠ UNVERIFIED, the craft doc's own review says code it as a REPORTED table first)No validator exists. At 148 BPM ROUNDS's gong-to-gong period is 6.486 sGAP, correctly de-fangedRG-09 as a reported table in instr_groove, never a hard validator, until London's bounds are read out of the book. The craft doc's own citation review demands exactly this and it is the right call
A dedicated beat-keeper: continuous, timbrally distinct, unvarying, at the tactus, never the gong and never a drumThe role does not exist in groove.ROLES. Strengthened source: the Flores *saur* / *peli anak* bamboo timekeeper, whose stated job is to hold the ensemble's rhythm, is confirmed for our own slice's ensemble by all three fetchable gong-waning sourcesGAPRG-12. The one rhythm rule in that document with a ✅ source for the right island

S9 — PERFORMANCE: micro-timing and dynamics

what the experts dowhat our lane doesverdictthe adopted change, with its source
Micro-timing is categorical, stable and auditable — a declared subdivision ratio, not a humanise knob; swing scales with tempo toward 1:1 with a ~100 ms short-note floor (Polak ✅; Friberg & Sundström ✅)CLOSED for round 4, and the craft doc's GAP-04 is expired. pass7_flores.derive_swing() reads the corpus's own tempo_and_time_grammar.groove.swing_ratio from the hit cards (measured 0.592-0.6475) and _swing displaces off-beat eighths only. MEASURED HERE in the landed plans: off-beat onsets at 0.6105 (FALLS), 0.623 / 1.623 (ROAD), 0.604 (ROUNDS) — non-integer by construction, deterministic, and read from the corpus rather than chosenALIGNEDNothing. RG-15 is built. Record the closure — GAP-04's "no swing, no subdivision ratio, no per-voice offset, not even a random jitter" is false at HEAD
Random per-note timing jitter makes groove WORSE (Frühauf ✅; Madison & Sioros ✅)groove.py:54 already states the refusal: "a rule that displaces, never a random jitter". A grep for humanise/jitter across harness/music_gen/ returns only instrument-side test fixturesALIGNEDRG-17 as an explicit grep-able prohibition. Adopting the ban is free and prevents the most plausible wrong reaction to this audit
Layer asynchrony is composed, not collapsed: 24-73 ms SD in real ensembles (Rasch), 24-28 ms at 157 bpm (Wing), and 55-80 ms between kick and bass in a groove still heard as one beat (Danielsen ✅); the ear's onset-discrimination threshold is around 20 msMEASURED HERE on the landed round-4 plans. Improved and nowhere near closed. Notes sharing a sample-exact onset with another note: FALLS 1400 of 2105 (66.5%), largest cluster 10; ROAD 3489 of 4538 (76.9%), largest cluster 16; ROUNDS 4987 of 6152 (81.1%), largest cluster 18. Round 3 measured 74.4 / 93.3 / 91.5%, so the groove work moved it — and 4,987 notes still strike the same instant to the sampleWRONGA deterministic per-layer timing profile — small signed per-stratum offset plus a seeded bounded per-note perturbation, targeting ~10-20 ms realised spread, roughly 40% of the measured ensemble magnitudes per Kilchenmann & Senn, never the literature's raw SD and never unseeded noise (VIRTUAL… rule 5). Change #5 in §4
A three-tier accent ladder with a ghost tier that selects a different STROKE where the palette exposes onegroove._accent() is a three-tier step function of metrical position only — no ghost tier, no variance requirement, so two adjacent off-beat strokes are guaranteed identical. sfz_palette.py exposes multi-key stroke inventories (gong.stroke 60-62, frame_drum 60-65, slit_drum 60-61) that no dynamic tier selectsGAPRG-01 and RG-04. Component of change #8

S10 — REALISATION: score to sampler

what the experts dowhat our lane doesverdictthe adopted change, with its source
Continuous controller data is the primary vehicle of realism, not an ornament on top of it — every mockup practice surveyed treats it that wayVERIFIED AT HEAD AND FULLY OPEN FOR ROUND 4. pass2_realise._write_midi (:586-595) builds a pretty_midi.Instrument, appends notes, writes. It appends no control_changes and no pitch_bends. pass7_realise imports pass2_realise as R and renders through it. So every round-4 cue reaches the sampler as note-on, note-off, pitch and velocity, and nothing else. The mechanism exists in our own repo — complete_track.write_score_midi writes a CC11 envelope — and its own docstring says it is "THE NOTATION SEAM", never handed to sfizzWRONGEmit a CC11 expression stream shaped per phrase, per layer — rise into the phrase, decline out, a declared dip at every phrase seam for wind and brass, a bow-cycle ripple for bowed strings — plus a plausibility validator refusing a loud dynamic against a low expression value and a long sustained note with zero expression variance (VIRTUAL… rules 1-3). Change #3 in §4. This is the largest single structural difference between our renders and every practice surveyed
CC1 (modwheel) is the primary dynamic lane everywhere in the literatureDead on our palette, measured. Zero of 85 SFZ files declare locc1, xfin_locc1 or any _oncc1 modulation, and a rendered CC1 ramp probe produced a max sample-wise difference of exactly 0.00e+00 on horn.sus, clarinet.sus and trombone.sus. CC7 and CC11 both work (3.5e-02 to 5.5e-02)correctly DECLINEDDo not program CC1. Revisit only if a CC1-crossfaded set enters the stack. The available continuous lane is level-only, which is itself the "volume does not simulate dynamics" failure — declare it rather than pretend otherwise
Every serious library ships a speak-offset correction; DAWs expose negative track delay; Berklee's mockup curriculum teaches it as routineVERIFIED ABSENT AT HEAD. A grep for speak_offset, attack_offset, onset_offset across harness/music_gen/*.py returns zero hits. Measured on our own samples: time to half peak ranges from 3.3 ms (conga) to 151.9 ms (clarinet.sus), median 47.6 ms over 22 instruments, spread 148.6 ms. A written downbeat therefore arrives as percussion first and the tune-carrying winds last by up to a seventh of a secondWRONGA per-instrument speak_offset_ms table measured from the palette's own samples and emitted with its denominator in the style of mix_policy.derive, subtracted at MIDI-write time (VIRTUAL… rule 4). Change #4 in §4 — the cheapest large win available, no schema change
Round robin prevents the machine-gun effectOur coverage is inverted relative to need: drum 7/9, rattle 2/2, struck_wood 1/2 against woodwind 1/13, brass 1/7, strings 4/21, voice 0/4, plucked 0/3. 11 of 28 melodic and figural layers (39%) run on an instrument with no round robin at all. And the docstrings in pass2_realise.determinism and orchestrate.py falsely assert the palette does not use round-robin opcodes — 20 of 85 declare seq_position, 10 declare lorandWRONGForce consecutive same-pitch notes onto different velocity bands where an instrument has two or more and no seq_position, with an ODD alternation period so a duple cycle does not land the same take on the same beat of every bar; and fix the stale claim, converting the determinism check into an explicit assertion that sfizz resets its sequence counter per render (VIRTUAL… rules 7, 7b, 9). Rule 9 is a correctness fix to a false claim in our own docstrings and should land regardless of the rest
Articulation resolves per note from notated duration and inter-onset intervallayer["instrument"] names one SFZ file and compile_layer never changes it, so a line cannot move between sustain and staccato as its note lengths changeGAPRule 8, as a PROPOSAL requiring a plan-schema change. Highest ceiling, most invasive; sequence it after the controller lane so its benefit is measurable against a moving baseline

S11 — MIX, SPACE AND LOUDNESS

what the experts dowhat our lane doesverdictthe adopted change, with its source
Reverb is a per-family SEND into per-family rooms plus a shared glue bus; depth is a DIFFERENCE between elementsmix_policy.apply_space convolves the finished stereo sum with one synthetic IR chosen by cue class, applied identically to every instrument. Per-layer processing is a static gain_db and a constant-power pan. Pre-delay and HF damping are per CUE CLASSGAPPer-family sends, a per-layer distance scalar driving gain / high-shelf / send level / pre-delay, and an HF distance cue (VIRTUAL… rules 11-13). Sequence AFTER the controller lane — depth applied to a performance with no dynamics only makes the flatness more audible
Corrective EQ, bounded 1-2 dB typical and 3-4 dB maximum, plus a high-pass on every reverb sendThere is no EQ anywhere in the render or master chain. A grep for filter design across pass2_realise.py, orchestrate.py and mix_policy.py finds biquads only inside the loudness meter's K-weighting. Cues sum up to 34 parts with no low-mid managementGAPRule 14, declared as arguable numbers in the style of SPACE
The loudness denominator is declaredMIX_POLICY.json derives targets from 30 commercial ALBUM masters and clears_target reads against them; ASWG-R001 is a whole-programme number explicitly not music specifically; measured shipped titles put the in-game music bed at −23 to −40 LUFS. Three quantities, three meanings, one declared — and PASS5_VERDICT.md §7 records the battle cue "missing" its target by 2.09 LU after a limiter probe at 6/9/12 dBWRONGCarry all three labelled quantities and make clears_target read against a declared HOUSE ASSET REFERENCE (VIRTUAL… rules 16-18). The "failure" on all three published cues is substantially a denominator error, and the honest fix is to publish three numbers rather than push a limiter harder
−1 dBTP ceiling and headroom for runtime DSP and downmixHeld, and _why_ceiling's reasoning — a game mix sums with SFX and dialogue at runtime — is exactly rightALIGNEDNothing. Rule 17
SANCTUARYHas no corpus rows at all and borrows MELANCHOLIC's for both its energy floor (0.222) and its loudness target (−13.95). Our flagship cue is SANCTUARY-classed at 180 sGAPDeclare the borrow on the artifact rather than in a source comment, and prioritise sanctuary and town themes in acquisition (GAME_SCORING… R6). PASS5_VERDICT.md §7 already calls it "the weakest number in the whole apparatus and it is load-bearing twice"

S12 — MEASUREMENT: the instruments that decide

what the experts dowhat our lane doesverdictthe adopted change, with its source
Ground truth is used where it existspass3_grammar.Phrase.to_dict() (:921-960) carries functions, cadence, start_bar, bars, derived_from, operation. instr_melodic_intelligence.measure() (:1087) accepts only a card and an audio path and re-derives phrases from rest gaps on rendered audio. On a real generated period the grammar built 2 phrases and the scorer found 11, median 5 notes — and then computed every phrase-derived number over those 11 fragments, off a wrong tonic (estimated pitch class 4 where the true tonic was 2)WRONGPass the phrase plan through the card and let segment_phrases validate against it rather than replace it, keeping the audio path as the fallback for material we did not author (MELODIC… R-07). This makes R-08 and R-09 mostly unnecessary for authored material and costs nothing but wiring
An IAC is a CLOSED cadence in Caplin and in Schoenbergphrase_sophistication accepts only the tonic pitch class as closed, so a standard HC→IAC period — which our own grammar can emit — scores an antecedent-consequent rate of zeroWRONGAccept scale degrees 1 and 3, and take the tonic from the plan (MELODIC… R-08)
A metric that cannot be computed says sophrase_sophistication was unavailable for all five reference melodies, including Ode to Joy, the textbook four-phrase double period — the agogic branch requires a note strictly greater than 2.0× the local median and a cadential half-note against a quarter-note median is exactly 2.0×. Separately, predictive_info returns all-zero below 8 symbols while melodic_complexity still reports available: true, publishing a measured-looking zero for something never measuredWRONGRelax to ≥ 1.8×, add a harmonic-arrival cue, and propagate availability flags (MELODIC… R-09, R-14). Cheap, and it is the difference between a gate that is armed and one that reads zero
A rule that is documented is implementedTwo engine rules are built and unwiredharmony.in_toneness_band and harmony.stream_breaks (VL-10, VL-11). ROUND4_STAGING.md §7.6 names them itself: "an unwired rule that looks armed is the same defect class as a noisy gate"WRONGWire them or mark them explicitly unarmed in RULE_CODES. Component of change #10
An axis that cannot separate says soThis is our lane's strongest habit and it should be protected. instr_melody_bands 21/21 controls with no axis clearing the within-album bar; instr_groove 26/26 with nothing clearing the multiplicity bar — the sixth honest null in the program; instr_harmony_fit's random-melody null needs no corpus at all. All three publish as generation-defect detectors, never taste oraclesALIGNEDNothing. Do not soften this. It is the reason round 4's numbers can be believed at all
A null must keep its teeth in the idiom it is applied toinstr_harmony_fit's chord-tone null mean rose from ~0.48 to ~0.64 once melody and harmony shared a five-note pitch set, so under the mode constraint the axis is near-degenerate. Round 4's low percentiles are not evidence its melodies clash — they are evidence the axis has little left to seecorrectly DECLAREDName it as round 5's problem rather than quoting the pre-constraint numbers, which looked considerably better. ROUND4_STAGING.md §4 does exactly this
Two thirds of non-chord tones should be classifiabledissonance_classifiability reads 0.31-0.40 on round 4 — unmoved from round 3 — with roughly two thirds of non-chord tones unclassifiable as passing, neighbour, appoggiatura, suspension or anticipation. COUNTERPOINT_AND_VOICE_LEADING.md:400-403 is explicit that anything unclassifiable is either a declared exception or a defectWRONGThis is "they clash" in its most precise remaining form. Change #6 in §4

S13 — ADAPTIVE AND DELIVERY

what the experts dowhat our lane doesverdictthe adopted change, with its source
Transitions are enumerated and scored per ordered state pair against a DECLARED intended smoothness per aspect (Medina-Gray, verified to the number including the 50 ms tolerance)Nothing composes or checks a cue-to-cue join. loop_seams.py composes a genuinely good cue-to-itself turnaround under five rules, and the music_seams gate runs --self-test only — the gate proves the module works and never touches a transitionGAPThe modular-smoothness instrument (GAME_SCORING… R12-R13) — the highest-value item in that document. Deferred past round 4: Josh graded the tune, not the stitching
Stingers are the cheapest interactive win, 3-12 s, checked for harmonic compatibility with every bed they can fire overbuild/audio/music_cue_table.csv declares 56 stingers and none exists; 33 combat layers and 33 tension layers likewiseGAPR17-R18. Deferred
The cue table has a consumer222 rows of adaptive_class, layer_role, layer_mode, track_type, trigger_event — and docs/PIPELINE_LEDGER.md §7 row F1 records no in-engine consumer. This is the anti-orphan rule's exact failure shapeGAPDeferred, but board it — the adaptive DESIGN is further along than the adaptive BUILD, which is the opposite of what a status read of the plans suggests
Energy floors are a per-state propertyComputed over a whole linear render. Once layering exists a cue can pass its floor as a mixdown while shipping an explore_calm subset far below itGAPR7. Deferred
Composed silence is not sedationsedation_spans(t, v, floor) receives only the rendered curve, so a declared silence_windows entry — which PASS7_FLORES_FALLS carries — reads as sedation past the 12 s threshold. The instrument will penalise exactly the design the exemplar lineage validatesWRONGPass the plan, exclude declared silence, report excluded spans separately so the exclusion cannot hide a real flatline (GAME_SCORING… R8). Cheap and it is actively pushing the composer the wrong way today

---

3. WHAT WE ADOPT

Adopt into round 4, before it reaches Josh's ears — the ten changes of §4. Each attacks a clause

of the grade, each is CODE-ABLE, and each carries a source.

Adopt into round 4 as free corrections — changes that cost a docstring or a single predicate and

prevent a false claim: the round-robin stale-claim fix (VIRTUAL… rule 9), the "additive rhythm"

label (RHYTHM… RG-30), the random-jitter prohibition as a grep-able control (RG-17), availability

flags on melodic_complexity and predictive_info (MELODIC… R-14), the plan-aware sedation

detector (GAME_SCORING… R8), and the declared SANCTUARY floor borrow on the artifact (R6).

Adopt into round 5 — the conventionality band (MELODIC… R-04, blocked on a reference corpus of

our own cues and dangerous as a slider); per-note articulation (VIRTUAL… rule 8, a schema change);

the mix depth programme (rules 11-15, sequenced after the controller lane); a score-tier

harmonisation band built the way instr_harmony_fit's null is built, needing no corpus; and a

score-tier vertical axis that keeps its teeth once melody and harmony share a pitch set.

Adopt when the adaptive build starts, not before — the modular-smoothness instrument

(GAME_SCORING… R12), the adaptive plan block (R1-R3), stingers (R17-R18), per-state energy (R7),

the grid contract (R4) and the three empty T0_Theme_Registry scheduler columns (R5). All real, none

of them what Josh graded. **The CREATION-FIRST law binds here: none of these lands until it names the

artifact it unblocks.**

Explicitly NOT adopted

velocity randomisation.** Frühauf and Madison & Sioros find random jitter makes groove worse, and

groove.py:54 already refuses it. Change #5 is a *composed, seeded, bounded* profile and must not

be implemented as noise. This is the most plausible wrong reaction to this document.

design.

negatively on recognisability; more of it makes the melodies worse in the exact direction the

literature predicts.

derivation stands.

wins and the lint debt is carried openly with its fix named — the dominant finding is too_fast

on brass at 148 bpm, which is an orchestration ASSIGNMENT defect fixable without touching a pitch

(ROUND4_STAGING.md §6).

lane making that error once and sending a wrong repair instruction to the composer.

---

4. THE TEN CHANGES ROUND 4 MUST CARRY

Ranked by how much each closes a clause Josh actually named, weighted by cost. Every entry cites its

source and names the file. MEASURED HERE numbers are re-derivable from §1.4.

1. Extend the harmonised second voice across the cue

Clause: *"Never any harmonies added on."* His most literal sentence, and the one round 4 moved

least.

Round 4 built the right mechanism and starved it. The harmonised voice overlaps the carrier **100% of

the time it sounds** — ROAD 67.3 s of 67.6 s, ROUNDS 52.2 s of 52.4 s, interval census dominated by

thirds and sixths — but it only sounds for about a third of each cue: harmonization_density **0.172

/ 0.034 / 0.102**, and on FALLS it fell from round 3's 0.074. Extend it, and add the second and third

melodic voices the H3-5 ladder licenses at the peaks.

Where: harness/music_gen/pass7_flores.py layer construction; the melodic_schedule block.

Source: build/audio/pass7/ROUND4_STAGING.md §7.1 ("This is the top open item"); Belkin,

*Artistic Orchestration*, "Orchestral Accompaniment" — richness comes from more planes, each thinner,

not from thicker ones. Caveat that must ship with it: the corpus p10 of 0.274 is audio-derived

and may not be quoted as the target (§4 of the same doc). The target is round-over-round movement

within the score tier.

2. Arm the tertian floor

Clause: *"sounds like a bunch of noise."* This is the defect the clash-fix created, it is sitting

in the artifact nobody has heard, and no rule in the stack can see it.

MEASURED HERE on the landed round-4 plans: tertian share **0.296 (FALLS), 0.315 (ROAD), 0.419

(ROUNDS) — 38 of 54, 37 of 54 and 36 of 62 chords contain no third at all**. Persichetti: an

equidistant chord asserts no root, so the responsibility for establishing the harmony falls on the

melodic voice. Belkin: equidistant intervals produce a static effect. Two independent authorities

describe the same output and both call it a problem, and harmony.RULE_CODES — 21 codes, verified at

HEAD — has no row for it.

The counterweight is not to loosen the pitch set. It is to schedule the tertian sonorities where

they do structural work.

Where: harmony.HarmonicPlan.report gains tertian_share; a new harmony.check rule with a

floor, banded on the exemplar corpus and never asserted from our own generator's output.

Source: HARMONY_AND_ARRANGEMENT_PRACTICE.md HA-04 and §5.3; Persichetti p. 94; Belkin, movement

chapter. **Its own document calls it "the single most valuable rule in the document because it is the

one nobody would have found by listening for the clash" — and this audit's measurement on the landed

plans, which that document did not have, confirms it.**

3. Emit a per-phrase CC11 expression stream

Clause: *"a bunch of noise."* The single largest structural difference between our renders and

every mockup practice surveyed.

VERIFIED AT HEAD: pass2_realise._write_midi (:586-595) appends notes and nothing else — no

control_changes, no pitch_bends. pass7_realise imports it and renders through it. Every note in

every round-4 cue reaches the sampler as note-on, note-off, pitch and velocity. The mechanism already

exists in our own repo: complete_track.write_score_midi writes a CC11 envelope and its own docstring

declares it the notation seam, never handed to sfizz. CC11 is measurably live on our palette

(3.5e-02 to 5.5e-02 max sample difference on a ramp probe) where CC1 is measurably dead.

Derive the stream per layer from phrase boundaries — rise in, decline out, a declared dip at each

phrase seam for winds and brass, a bow-cycle ripple for bowed strings. A single cue-wide envelope

copied to every part is the linked-CC failure in another costume and must be refused. Add the

plausibility validator: no loud dynamic against a low expression value, no long sustained note with

zero expression variance.

Where: harness/music_gen/pass2_realise.py::_write_midi, a new expression stage.

Source: VIRTUAL_ORCHESTRATION_AND_MOCKUP_REALISM.md rules 1-3, GAP-VO-01 ("SEVERITY: highest.

Everything else in this list is smaller").

4. Subtract a measured per-instrument speak offset

Clause: *"a bunch of noise."* A 148.6 ms error we can measure exactly, correct deterministically,

and verify.

VERIFIED ABSENT AT HEAD: grep for speak_offset / attack_offset / onset_offset across

harness/music_gen/*.py returns zero hits. Measured on our own sample files, time to half peak runs

from 3.3 ms (conga) to 151.9 ms (clarinet.sus), median 47.6 ms over 22 instruments. A downbeat written

for conga and clarinet together arrives as a conga followed most of a fifth of a second later by a

clarinet — and the clarinet is usually the one carrying the tune. The perfect simultaneity of the

score is audibly wrong in the render.

The table is MEASURED from the palette's own samples — time to a declared fraction of peak, per

velocity layer — and emitted with its denominator, in the style of mix_policy.derive. Subtracted at

MIDI-write time.

Where: harness/music_gen/pass2_realise.py, MIDI-write; a new derived table beside

MIX_POLICY.json. Source: VIRTUAL… rule 4, GAP-VO-04; Spitfire's SAMPLE START and DAW negative

track delay as the industry precedent. **The cheapest large win available and it costs no schema

change.**

5. Compose the ensemble onset spread

Clause: *"a bunch of noise."*

MEASURED HERE on the landed round-4 plans: notes sharing a sample-exact onset with another

note — **FALLS 1400 of 2105 (66.5%), largest cluster 10; ROAD 3489 of 4538 (76.9%), largest cluster

16; ROUNDS 4987 of 6152 (81.1%), largest cluster 18.** Round 3 measured 74.4 / 93.3 / 91.5%, so the

groove work genuinely moved it, and 4,987 notes in one cue still strike the same instant to the

sample. Real ensembles measure 24-73 ms SD (Rasch) and 24-28 ms at 157 bpm (Wing); the ear's

onset-discrimination threshold is around 20 ms.

**A deterministic per-layer timing profile: a small signed per-stratum offset plus a seeded, bounded

per-note perturbation, targeting a realised spread on the order of 10-20 ms** — roughly 40% of the

measured ensemble magnitudes per the Kilchenmann and Senn downscaling result, **never the literature's

raw SD, and never unseeded noise.**

Where: harness/music_gen/pass2_realise.py::compile_layer; a humanise_seed on the plan with

every perturbation drawing from a PRNG built from seed plus layer id, exactly as mix_policy.synth_ir

already does. Source: VIRTUAL… rules 5 and 10, GAP-VO-03. **This does not overturn

groove.py's refusal of random jitter — it adds a bounded seeded layer beneath composed

displacement. If it ships as a humanise knob it is the wrong change (Frühauf ✅; Madison & Sioros ✅).**

6. Make the non-chord tones classifiable

Clause: *"They clash."* Its most precise remaining form.

dissonance_classifiability reads 0.31-0.40 on round 4 — essentially unmoved from round 3's

0.358-0.395 — with roughly two thirds of non-chord tones unclassifiable as passing, neighbour,

appoggiatura, suspension or anticipation. COUNTERPOINT_AND_VOICE_LEADING.md:400-403 is explicit:

anything unclassifiable is either a declared exception or a defect. The mode constraint removed the

chromatic clash class and left this one untouched, and the vertical instrument's own null went

near-degenerate under the shared pitch set — so this axis is now carrying more of the "clash" question

than chord_tone_share can.

Two mechanisms, both already reachable. First, harmony.snap_structural_tones moves *structural*

tones to chord members and leaves ornamental ones alone — the correct shape; extend the ornamental

side so an unclassifiable tone is rewritten into a named figure rather than left. Second: **an

in-set chord stated as an ARPEGGIO presents its members successively, and a successive tone a

semitone from the melody is a passing dissonance rather than a vertical one** — so the figure

choice is a dissonance lever nobody is pulling.

Where: harness/music_gen/harmony.py (snap_structural_tones, ACCOMPANIMENT_FIGURES

selection); pass3_grammar._nct_figure (:591). Source: ROUND4_STAGING.md §7.3;

COUNTERPOINT_AND_VOICE_LEADING.md:400-403; the avoid-note literature's melodic-versus-harmonic

distinction (<https://en.wikipedia.org/wiki/Avoid_note>, carrying Nettles & Graf); and HA-16 —

**when H19 licenses an out-of-set chord, its foreign tones may be voiced only in non-sustaining

layers, never in a pad or pedal. A placed clash that rings for two bars is not the placed clash

the sources license.**

7. Rank voicings by disposition, and refuse the void

Clause: *"a bunch of noise."* Three authorities agree, our output violates it in 58% of voicings,

and the fix cannot break anything currently legal.

Wide intervals low, close intervals high, and no void in the intermediate parts — Rimsky Ch. III

p. 67 and the register table at pp. 78-79 (extracted from the Gutenberg HTML and verified

near-verbatim), Belkin "Register" independently, and Huron's minimum-masking principle as the

perceptual derivation. Measured over 24 in-set voicings at GRID_VOICES=4, GRID_REGISTER=(31,64):

14 of 24 have their bottom gap narrower than their top gap; 10 of 24 put the widest gap at the top

— Rimsky's void placed exactly where he says it is worst. Iquintal voices as MIDI [38, 45, 52, 62]:

a minor seventh of empty air above two perfect fourths.

The ERB floor is not at fault and is working — across the same 24 voicings, intervals of a third

or narrower whose lower note falls below C3 number zero. voice_chord simply has no opinion about

the shape of the stack above them because no rule was ever written for it.

Add disposition as a ranking term (the law is a strong preference — Rimsky says "rarely" and

"seldom", not "never") plus a hard void filter unless a hollow texture is declared. Carry HA-10's

docstring while you are in the file: Rimsky caps bass-to-tenor at an octave, RWU at a twelfth, our

_upper_spacing_ok at nothing — our code is the outlier, not the arbiter.

Where: harness/music_gen/harmony.py::voice_chord ranking and filter; _upper_spacing_ok

docstring. Source: HARMONY… HA-09 and HA-10, §7.2.

8. Give the percussion its dynamics and flip the clock

Clause: *"no rythm."* Three small changes with one theme: the groove engine landed, and three of

its rules never reached the notes.

plans.** ROAD B01 [(0.0, 1.0), (8.0, 0.55), (0.0, 0.8)]; ROUNDS B01 `[(0.0, 1.0), (8.0, 0.7),

(0.0, 0.9)]; FALLS B01 [(0.0, 0.9), (0.0, 0.7)]. The maximum vel_scale` sits at beat 0.0 every

time. Tenzer (✅, quoted verbatim): stress is measured backwards from the final tone, which receives

the strongest stress of all, and the gong marks cycle conclusions. We built the Western downbeat

and labelled it colotomy. One authoring change plus a validator refusing a colotomic layer whose max

vel_scale sits at at_beat 0.0 while a later stroke exists. **RHYTHM… RG-11, its own document's

"highest-value structural repair".**

with vel_scale absent — flat at 1.0; and ROAD F09, ROUNDS F09 and F10 carry exactly one

distinct velocity** across the entire cue. F09 on ROUNDS is contrabass.trem — the broker layer

whose whole care mechanism depends on being heard as a separable arriving thing. Add the vels list

to the ostinato branch and a three-tier accent ladder with a ghost tier that selects a different

*stroke* where sfz_palette.py exposes one. RG-01, RG-02, RG-03, RG-04.

comment says "never on the composite". Round 4's composite moved off the floor (sync_score 0.160 /

0.075 / 0.203) — but no rule would have caught it if it had not. Add the refusal with a mutation

control. RG-06.

Honest correction to the source, which changes the priority: RHYTHM… GAP-01 states that

groove.py is imported only by instr_groove.py and that "every other gap below is downstream of

this one". That is false at HEADpass7_flores.py imports it — and RG-02's claim to be "the

single highest-value line of code" was true of round 3's ten flat ostinati and is now worth **9 layers

across two cues**, because round 4 writes its percussion as colotomic, which already carries

per-stroke velocity. Believe the rules; do not believe the sizing.

9. Let the scorer see the ambitus, the climax, and the grammar's own phrases

Clause: *"Just a few notes slowly played back to back."* Density is now measured by

instr_melody_bands and has genuinely moved (score tier, rounds 2/3/4: ROAD 0.739 → 1.847 → 2.734,

FALLS 0.688 → 1.236 → 2.044, ROUNDS 1.557 → 2.611 → 4.454). **Range and climax are still measured

nowhere**, and they are the other two words in his sentence.

it is the cleanest single discriminator that pass found. Our only range-adjacent number is

VOICE_MIN_SPREAD = 1.5, a *voice-detection* floor of a semitone and a half. MELODIC… R-02.

by "more frequent changes of harmony and an increasing use of small notes", and the line recedes to

the middle register after (ch. VI on Op. 2/1-II, verified verbatim). pass3_grammar.divide()

(:542) and _nct_figure() (:591) already build that surface, and division_level is a

phrase-wide constant — so nothing schedules the small notes against anything and nothing scores

whether it happened. **This is the mechanism that fixes "back to back" without changing one

structural pitch. MELODIC… R-05 and R-12. Report the climax per theme; do not gate**, because

a descending melody legitimately peaks early.

boundaries, cadences and formal functions; instr_melodic_intelligence.measure() takes only a card

and an audio path and re-derives 11 phrases where the grammar built 2, off a wrong tonic. Pass the

plan; let segment_phrases validate rather than replace. MELODIC… R-07, R-08, R-09.

Where: harness/music_gen/instr_melody_bands.py (ambitus, climax — the live grader),

instr_melodic_intelligence.py (the phrase interface, the closed test, the availability flags),

pass3_grammar.py (division_level as a schedule).

10. Per-section harmonic rhythm, and arm the rules that only look armed

Clause: *"no complexity"* — the sectional dimension we are not using at all, plus the honesty debt.

MEASURED HERE: harmonic_rhythm_bars_per_chord is one scalar per cue — 1.0 (FALLS), 2.0 (ROAD),

2.0 (ROUNDS) — while every cue has real sections and already varies its grid per section through

harmony_variants. Belkin (movement chapter, verified): consistency of harmonic rhythm unifies a

section, and a change of harmonic rhythm is what defines the difference between sections. This is

the cheapest sectional contrast available in the harmonic layer and the plumbing already exists —

build_plan walks a step to build its change grid, and walking a per-section step is the same loop

with a lookup.

Carry three honesty repairs in the same pass, because each is a claim we cannot currently support:

ROUND4_STAGING.md §7.6 names them itself: an unwired rule that looks armed is the same defect

class as a noisy gate. Wire them or mark them unarmed in RULE_CODES.

assert the palette does not use round-robin opcodes, while 20 of 85 entries declare seq_position

and 10 declare lorand. Correct the text and convert the determinism check into an explicit

assertion that sfizz resets its sequence counter per render, since our reproducibility now depends

on that knowingly. **VIRTUAL… rule 9, GAP-VO-06 — "a stale-claim defect of exactly the class

CLAUDE.md's verification discipline warns about".**

instr_melody_bands.parallel_harmony_share (0.909-0.939) measure the same phenomenon and disagree

by three orders of magnitude** because they normalise against different denominators. Declare the

denominator on both before either is quoted (ROUND4_STAGING.md §5).

Where: harness/music_gen/harmony.py::build_plan (schedule), pass7_flores.py config,

pass2_realise.py and orchestrate.py docstrings, instr_harmony_fit.py and instr_melody_bands.py

axis docs. Source: HARMONY… HA-14; ROUND4_STAGING.md §§5 and 7.6; VIRTUAL… rule 9.

---

4A. THE TEN CHANGES, VERIFIED AGAINST LANDED CODE — ROUND-4-FINAL LEDGER (2026-08-08)

Every row below was checked by reading the code and the artifacts at HEAD, not by reading a commit

message. No row is dropped: each is DONE with its landing cited, PARTIAL with the gap named, or

UNSTARTED with an owner and a round. Three of the audit's own MEASURED HERE claims were re-derived

in this pass and all three reproduced exactly — the tertian shares (0.315 / 0.296 / 0.419), the

sample-exact onset clustering (0.769 / 0.665 / 0.811 with max clusters 16 / 10 / 18), and the

round-robin opcode census (20 of 85 seq_position, 10 of 85 lorand).

#changeverdictevidence at HEADowner / round
1Extend the harmonised second voiceUNSTARTED — and its cheap lever is now measurably deadharmonization_density 0.172 / 0.034 / 0.102, unmoved. Raising CUE_CFG["ROAD"]["harmony_voice"]["max_share"] 0.62 → 0.80 → 0.95 writes 133 → 171 → 171 notes and moves the axis 0.1716 → 0.1716 → 0.1716 and parallel_harmony_share 0.1185 → 0.1185. The axis counts overlap TIME against total melodic sounding time over eleven melodic parts, so notes added inside cycles where the voice already sounds buy nothingpass7_flores.t3_harmonise + _voice_schedule. ROUND 5 LEAD. The only two levers left are structural: shrink the H3-5 one-voice reservation (doctrine, COUNTER_MELODY_AND_DIALOGUE.md:481-484) or add voices at the peaks (moves the part-count peak, V13, and the arc this round just repaired)
2Arm the tertian floorUNSTARTEDharmony.RULE_CODES = 21 codes H01-H21, none tertian (any('tertian' in v.lower()) is False). No tertian_share on HarmonicPlan.report. Re-measured on the FINAL plans: ROAD 0.315 (37 of 54 thirdless), FALLS 0.296 (38 of 54), ROUNDS 0.419 (36 of 62)harmony.py — report field + a check rule banded on the exemplar corpus. ROUND 5, rank 2
3Per-phrase CC11 expression streamUNSTARTED`grep control_changes\pitch_bends\expression over pass2_realise.py` returns zero hits. Every round-4 note still reaches sfizz as note-on, note-off, pitch, velocitypass2_realise._write_midi + a new expression stage. ROUND 5, rank 1 by the source's own severity
4Measured per-instrument speak offsetUNSTARTED`grep speak_offset\attack_offset\onset_offset over harness/music_gen/*.py` returns zero hitspass2_realise MIDI-write + a derived table beside MIX_POLICY.json. ROUND 5 — cheapest large win, no schema change
5Compose the ensemble onset spreadUNSTARTED`grep humanise_seed\humanize_seed` returns zero. Re-derived on the FINAL plans: sample-exact onset sharing FALLS 0.665 (max cluster 10), ROAD 0.769 (16), ROUNDS 0.811 (18)pass2_realise.compile_layer + a humanise_seed on the plan. ROUND 5. Ships seeded and bounded or not at all
6Make the non-chord tones classifiableUNSTARTEDdissonance_classifiability 0.380 / 0.380 / 0.397 on the FINAL score tier — unmoved from round 3's 0.358-0.395harmony.snap_structural_tones + ACCOMPANIMENT_FIGURES selection + pass3_grammar._nct_figure. ROUND 5
7Rank voicings by disposition, refuse the voidUNSTARTED (HA-09) / PARTIAL (HA-11)voice_chord still ranks on common-tone retention, minimal motion, a doubling penalty, a root bonus and a span penalty — no term reads the SHAPE of the stack, and _upper_spacing_ok still bounds bass-to-tenor at nothing. HA-11 is NOT the "accepted and ignored" parameter the audit describes: double_policy IS live (harmony.py:1267, dbl_penalty), but it implements exactly one option and the sourced register law is absentharmony.voice_chord. ROUND 5. Correct HA-11's severity in HARMONY_AND_ARRANGEMENT_PRACTICE.md: the parameter is used, it is just under-specified
8Percussion dynamics, and flip the clockUNSTARTED, all three partsColotomic layers are still start-accented on all three FINAL plans (B01 max vel_scale 1.0 at at_beat 0.0 on ROAD, ROUNDS and FALLS). pass2_realise's ostinato branch still reads a single pat["vel_scale"] for the whole layer — no vels list. groove.check R02 still judges the articulated per-voice mean, and its own comment still says "never on the composite"groove.py + pass7_flores.t5_groove + pass2_realise.compile_pattern. ROUND 5. RG-11 is the highest-value of the three
9Ambitus, climax, and the grammar's phrasesPARTIAL — and one sub-item should be RETIRED, not builtAmbitus is DONE: instr_melody_bands reports range_semitones with a corpus band (FINAL: 27 / 17 / 25). Climax position is DONE: phrase_peak_position is reported and controlled (instr_melody_bands.py:1361-1363). pitch_sd_semitones is absent → the other half of R-02 is UNSTARTED. division_level is still phrase-wide, not scheduled against the climax (R-12) → UNSTARTED. instr_melodic_intelligence.measure(card, audio=None) still takes no phrase plan (R-07/R-08/R-09) → UNSTARTED. AND THE CLIMAX GATE MUST NOT BE ARMED: measured against the corpus's own bands the FINAL cues read ROAD 0.167 (EXPLORATION p10 0.052 / p50 0.197 / p90 0.350), ROUNDS 0.088 (BATTLE p50 0.000, p90 0.160), FALLS 0.118 (pooled p90 0.341) — all three IN BAND. The corpus peaks its phrases early too, so Schoenberg's late-climax consensus is not what this corpus does and R-05's "peak at two-thirds to three-quarters" would have failed the music Josh lovesinstr_melody_bands (done) · pass3_grammar (R-12) · instr_melodic_intelligence (R-07/08/09). ROUND 5 for the three open sub-items; R-05's gate is DECLINED on evidence
10Per-section harmonic rhythm + the honesty debtsMIXED: 2 DONE (1 this pass), 2 UNSTARTEDDONE (already landed): harmony.in_toneness_band and stream_breaks are NOT unwired — they are RULE_CODES H20 and H21, emitted by check() at REPORT severity (harmony.py:2574, :2586-2605) with a must-fire control at :3259-3260. ROUND4_STAGING.md §8.6 is stale at HEAD and is corrected there. DONE THIS PASS: the round-robin stale claim, repaired in pass2_realise.determinism and orchestrate.py (×2 sites) against a census I re-derived — 20 of 85 palette entries declare seq_position, 10 declare lorand, including clarinet.sus, organ.quiet and contrabass.trem; and the denominator declared on both parallel axes (instr_harmony_fit axis 7 docstring, instr_melody_bands.AXIS_DOC["parallel_harmony_share"]), both instruments still 21/21. UNSTARTED: harmonic_rhythm_bars is still one scalar per cue (harmony.build_plan, called at 2.0 for every cue)harmony.build_plan for the schedule. ROUND 5

Free corrections the audit listed that this pass did NOT land, so they are not lost: the

"additive rhythm" label (RHYTHM… RG-30, one docstring in groove.py), the random-jitter

prohibition as a grep-able control (RG-17), availability flags on melodic_complexity and

predictive_info (MELODIC… R-14), the plan-aware sedation detector (GAME_SCORING… R8), and the

declared SANCTUARY floor borrow on the artifact (R6 — note the borrow IS already emitted in the

loudness row as "target_from": "MELANCHOLIC", "target_borrowed": true, so R6 is PARTIAL: it is on

the render row and not on the published card). All six are ROUND 5, docstring tier.

---

5. HONEST LIMITS OF THIS AUDIT

1. Nothing here has been heard. Every number is a property of the writing, of a compiled plan, or

of a rendered file. Round 4 is unpublished and ungraded. Josh is the only instrument that decides

whether any of this turned into music.

2. The published literature in §1.1 was not fetched by this pass. It is cited through the five

craft documents at the read-status each records, and this document claims no number their own

citation audits did not verify. Three of those audits found fabrications or reversals in their own

first drafts; the defects were in the citation apparatus and the game-practice prose, never in the

corpus numbers, which is a fact about where the passes were weakest and not a licence to trust the

prose now.

3. Everything tagged MEASURED HERE should be re-derived, not trusted (§1.4). A same-commit edit

can invalidate a true proof, and the round-4 stack moved twice on 2026-08-08 while its own craft

documents were being written.

4. Three of the five craft documents carry expired findings and this audit repaired them in

place above rather than deleting them: groove.py and harmony.py are both wired to a composer;

swing and subdivision ratio are implemented and read from the corpus; the composite syncopation is

off the floor; and the melodic doc audits an instrument the verdicts already recommend retiring

from grading. **A research document that describes a defect we already fixed sends the next round

to the wrong place** — which is why the sizing in this audit differs from the sizing in its

sources, and why the sources' *rules* survive where their *urgency* does not.

5. No threshold proposed here may be set from our own generator's output. Every band — the

tertian floor, the composite syncopation floor, the ambitus band, the expression-variance

tolerance — is calibrated on the exemplar corpus first, per the standing rule, or it is reported

without a threshold.

6. The adaptive lane is deferred on judgement, not on evidence. GAME_SCORING… is the

best-sourced of the five on its central item (Medina-Gray verified to the number) and every one of

its findings is real. It is deferred because Josh graded the tune and not the stitching, and

because the CREATION-FIRST law says no gate lands without naming the artifact it unblocks. If that

reasoning is wrong, it is wrong in one direction only — we will have shipped a good round 4 into a

game that cannot play it, which is a round-5 problem and not a round-4 one.

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