music/MUSIC_PRACTICE_GAP_AUDIT.md
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.
---
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:
harness/music_gen/pass7_flores.py imports both groove and harmony. The rhythm document's 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.
harness/music_gen/pass7_realise.py renders through pass2_realise re-pointed (its own §9-18 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.
---
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.
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.**
docs/proposals/music/craft_research/HARMONY_AND_ARRANGEMENT_PRACTICE.md (1,202 lines; HA-01…HA-18;13 gap notes)
docs/proposals/music/craft_research/MELODIC_CRAFT_PRACTICE.md (1,007 lines; R-01…R-14; GAP-01…GAP-14)docs/proposals/music/craft_research/RHYTHM_GROOVE_AND_PERFORMANCE_PRACTICE.md (1,783 lines;RG-01…RG-32; GAP-01…GAP-27)
docs/proposals/music/craft_research/VIRTUAL_ORCHESTRATION_AND_MOCKUP_REALISM.md (1,239 lines;rules 1-21; GAP-VO-01…GAP-VO-22)
docs/proposals/music/craft_research/GAME_SCORING_AND_ADAPTIVE_PRACTICE.md (1,477 lines; R1…R25;§12.1-§12.13)
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`.
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
---
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.
| what the experts do | what our lane does | verdict | the 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 nothing | GAP | Add 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 all | GAP | interactivity_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 anywhere | GAP | Class-keyed length contract (GAME_SCORING… §12.12). Deferred |
| what the experts do | what our lane does | verdict | the 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 balance | GAP | pitch_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/4 | ALIGNED (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 anything | GAP | Report 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.366 | WRONG | Close 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 negative | WRONG | A 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 playability | ROUND 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 speaks | ALIGNED | Nothing. This is round 4's strongest single result and it is the one Josh clause with a green number behind it |
| what the experts do | what our lane does | verdict | the 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) | GAP | Add 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 monotony | GAP | Plan the restatement count (MELODIC… R-10). Belongs with the motivic lane, not round 4 |
| Caplin's sentence/period/continuation with fragmentation and harmonic acceleration | pass3_grammar implements it faithfully — FUNCTION_NAMES :131, THEME_TYPES :134, sentence() :992, period() :1093, hybrid_ant_cont() :1193 | ALIGNED | Nothing. The grammar is good work |
| what the experts do | what our lane does | verdict | the 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 declared | ALIGNED | Nothing. 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 with | GAP | semitone_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. ROAD → 0.315, 37 of 54 thirdless. ROUNDS → 0.419. No rule in harmony.RULE_CODES (21 codes, verified at HEAD) measures it | WRONG | The 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 licenses | ALIGNED | Make 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 five | GAP | cadence_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_variants | GAP | Accept 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 construction | GAP, correctly DECLINED | Record HA-08; build it for the heptatonic region cells. Not round 4's |
| what the experts do | what our lane does | verdict | the 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, 10 | WRONG | Rank 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 job | Measured 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 intervals | ALIGNED | Nothing. 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 arbiter | WRONG (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 effect | WRONG | Make 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 bass | GAP | HA-17. Trivially implementable, narrow in effect |
| The numeric low-interval-limit table | Not asserted anywhere in this series, deliberately — every source publishes it as an engraved image and four independent attempts returned the caveats and never the numbers | ALIGNED | Nothing. This is the discipline working, and it should stay declined |
| what the experts do | what our lane does | verdict | the 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 ornament | Round 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.074 | GAP — and it is the top one | Extend 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 reference | Corpus 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 construction | WRONG to quote across tiers | The 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 number | instr_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 denominators | WRONG | Declare the denominator on both axes before either figure is quotable. Logged in ROUND4_STAGING.md §5 and unfixed |
| what the experts do | what our lane does | verdict | the 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 now | GAP (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, ghost | PARTLY 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 mean | MEASURED 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 thing | WRONG | RG-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 number | ALIGNED | RG-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 stand | WRONG (label only) | RG-30, one docstring. Keep the figure, keep the refusal, change the word |
| what the experts do | what our lane does | verdict | the 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 colotomy | WRONG | Flip 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 3 | ALIGNED | Nothing. 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 s | GAP, correctly de-fanged | RG-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 drum | The 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 sources | GAP | RG-12. The one rhythm rule in that document with a ✅ source for the right island |
| what the experts do | what our lane does | verdict | the 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 chosen | ALIGNED | Nothing. 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 fixtures | ALIGNED | RG-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 ms | MEASURED 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 sample | WRONG | A 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 one | groove._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 selects | GAP | RG-01 and RG-04. Component of change #8 |
| what the experts do | what our lane does | verdict | the 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 way | VERIFIED 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 sfizz | WRONG | Emit 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 literature | Dead 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 DECLINED | Do 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 routine | VERIFIED 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 second | WRONG | A 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 effect | Our 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 lorand | WRONG | Force 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 interval | layer["instrument"] names one SFZ file and compile_layer never changes it, so a line cannot move between sustain and staccato as its note lengths change | GAP | Rule 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 |
| what the experts do | what our lane does | verdict | the 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 elements | mix_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 CLASS | GAP | Per-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 send | There 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 management | GAP | Rule 14, declared as arguable numbers in the style of SPACE |
| The loudness denominator is declared | MIX_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 dB | WRONG | Carry 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 downmix | Held, and _why_ceiling's reasoning — a game mix sums with SFX and dialogue at runtime — is exactly right | ALIGNED | Nothing. Rule 17 |
| SANCTUARY | Has 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 s | GAP | Declare 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" |
| what the experts do | what our lane does | verdict | the adopted change, with its source |
|---|---|---|---|
| Ground truth is used where it exists | pass3_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) | WRONG | Pass 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 Schoenberg | phrase_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 zero | WRONG | Accept scale degrees 1 and 3, and take the tonic from the plan (MELODIC… R-08) |
| A metric that cannot be computed says so | phrase_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 measured | WRONG | Relax 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 implemented | Two engine rules are built and unwired — harmony.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" | WRONG | Wire them or mark them explicitly unarmed in RULE_CODES. Component of change #10 |
| An axis that cannot separate says so | This 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 oracles | ALIGNED | Nothing. 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 to | instr_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 see | correctly DECLARED | Name 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 classifiable | dissonance_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 defect | WRONG | This is "they clash" in its most precise remaining form. Change #6 in §4 |
| what the experts do | what our lane does | verdict | the 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 transition | GAP | The 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 over | build/audio/music_cue_table.csv declares 56 stingers and none exists; 33 combat layers and 33 tension layers likewise | GAP | R17-R18. Deferred |
| The cue table has a consumer | 222 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 shape | GAP | Deferred, 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 property | Computed 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 it | GAP | R7. Deferred |
| Composed silence is not sedation | sedation_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 validates | WRONG | Pass 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 |
---
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.
---
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.
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.
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.**
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").
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.**
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 ✅).**
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.**
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.
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.
groove.check() R02 judges the articulated per-voice mean and its own 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 HEAD — pass7_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.
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.
pass3_grammar.Phrase.to_dict() carries the 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).
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:
harmony.in_toneness_band and harmony.stream_breaks (VL-10, VL-11) are built and unwired. 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.
pass2_realise.determinism and orchestrate.py are false — they 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_harmony_fit.parallel_thirds_sixths_share (0.001-0.018) and 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.
---
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).
| # | change | verdict | evidence at HEAD | owner / round | ||
|---|---|---|---|---|---|---|
| 1 | Extend the harmonised second voice | UNSTARTED — and its cheap lever is now measurably dead | harmonization_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 nothing | pass7_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) | ||
| 2 | Arm the tertian floor | UNSTARTED | harmony.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 | ||
| 3 | Per-phrase CC11 expression stream | UNSTARTED | `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, velocity | pass2_realise._write_midi + a new expression stage. ROUND 5, rank 1 by the source's own severity |
| 4 | Measured per-instrument speak offset | UNSTARTED | `grep speak_offset\ | attack_offset\ | onset_offset over harness/music_gen/*.py` returns zero hits | pass2_realise MIDI-write + a derived table beside MIX_POLICY.json. ROUND 5 — cheapest large win, no schema change |
| 5 | Compose the ensemble onset spread | UNSTARTED | `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 | |
| 6 | Make the non-chord tones classifiable | UNSTARTED | dissonance_classifiability 0.380 / 0.380 / 0.397 on the FINAL score tier — unmoved from round 3's 0.358-0.395 | harmony.snap_structural_tones + ACCOMPANIMENT_FIGURES selection + pass3_grammar._nct_figure. ROUND 5 | ||
| 7 | Rank voicings by disposition, refuse the void | UNSTARTED (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 absent | harmony.voice_chord. ROUND 5. Correct HA-11's severity in HARMONY_AND_ARRANGEMENT_PRACTICE.md: the parameter is used, it is just under-specified | ||
| 8 | Percussion dynamics, and flip the clock | UNSTARTED, all three parts | Colotomic 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 | ||
| 9 | Ambitus, climax, and the grammar's phrases | PARTIAL — and one sub-item should be RETIRED, not built | Ambitus 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 loves | instr_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 | ||
| 10 | Per-section harmonic rhythm + the honesty debts | MIXED: 2 DONE (1 this pass), 2 UNSTARTED | DONE (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.
---
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.