music/PASS2_LAYER_ARCHITECTURE.md
CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
Canon served:docs/spine/CH_03.md(themusic_moodanchor and the combat framing that routes the
antagonist through the bought champion and the broker), _source/02_Tier_2_Region_Pages/flores_island.md
Section 10, and registries/T0_Theme_Registry [DRAFT v0.1] :: REGION_FLORES_ISLAND.
If this document disagrees with canon, CANON WINS and this document is the defect.
Status: PROPOSAL-TIER. Subordinate to canon per docs/SUBAGENT_CONTRACT.md §1. The honest tier for
everything this document produces is STRUCTURE — not greybox-feel, not final. Nothing described here
has been heard by anyone.
Round 1 of generated music was graded on 2026-08-07 and all eighteen candidates were turned down.
Josh's composition floor, verbatim at the tail of docs/spine/DECISIONS_PENDING_JOSH.md, is the
requirement this document is built against. This is the architecture that replaces the one that
failed, the reasoning that produced it, and — plainly stated — what it still cannot do.
The argument is structural, not aesthetic. Round 1's chain was: one prose caption in, one finished
stereo mixdown out. There was no score, no parts, no control over what entered when. Josh's floor
asks us to "strategically place the sounds and layers and harmonies and clashes and ambience and
nature and voice and chants and humming and clapping". You cannot place a sound you did not author.
Every clause of that sentence is a statement about WHERE something goes, and a text-to-audio model
was never given a coordinate system in which to put it.
The captions did ask, in words. Variant A asked for "at least fifteen clearly different sections",
for the tune "stated plainly and early", and to "cut the whole texture away to near-silence many
times". The model's compliance is measured in build/audio/generated/slice_v1/REVIEW_SHEET.md:
17. Nine of thirty-two candidates fired section_count >= 15, which is the strongest held-out
rule in the whole derivation at test AUC 0.783 and a 3.85x lift. The review sheet says why in its
own words: control_surface_sa3.json never probed section count, so it was never a demonstrated
controllable dimension.
a corpus median of 19.5 and an album-filler median of 6. Every one of the fourteen rejections fell
on that one axis, X_rest_grammar, and all fourteen were on the HIGH side. The corpus band is
2.68 to 17.43; the run's median was 15.918 with a worst case of 42.55.
and it is now a declared expectation on every plan (predicted_structural_yield, floor 0.76).
Novelty-peak boundaries divided by texture drops — structural change produced per unit of chopping
— has a median of 0.76 across the twenty-eight corpus hits, 1.00 across their 686 album siblings,
and 0.22 across round 1. The separation is AUC 0.911 against round 1 and 0.423 against the
siblings, which is the signature of a generation-defect detector rather than a taste oracle: it
says almost nothing about whether music is loved and almost everything about whether our generator
produced motion without change. Round 1's tracks are LONGER than the corpus (211.0 s against
196.6) while carrying 2.78 boundaries per minute against 5.09, and chopping at 14.08 drops per
minute against 5.56.
Read together those three are one finding. The generator produced a texture in constant violent flux
with almost nothing new ever arriving. That is not a settings problem — no temperature, seed or
caption rewrite makes a model place an entrance it was never asked for at a bar it does not know
exists. It is an architecture problem, and the architecture is what changes.
The controlled contrast in the review sheet makes the same point from the other side. Variant B held
the frame, period, cultural sounds and care line byte-identical and asked only for a piece that
circles its own material. Its sections were HIGHER than variant A's and so were its drops, which is
what put it outside the box. Asking for self-similar circling made the model chop more. The prompt
surface does not address the structure; it perturbs it.
COMPOSE-THEN-REALISE. A track is written down as a STRUCTURE first — sections, a cycle grid, an
entrance schedule, a hook plan, a novelty schedule, a frequency-slot allocation and a region and
period instrumentation plan — and only then realised as per-layer stems that are arranged and mixed.
The layer count stops being something inferred from a mixdown and becomes a field. Every clause of
Josh's floor becomes a predicate a battery can enforce before a sample is rendered, and a prediction
a render can falsify afterwards.
Defined and validated in harness/music_gen/pass2_plan.py, schema_version pass2-plan/1.0.
Three plans exist under build/audio/pass2/plans/. The schema's own vocabulary is closed — strata,
register slots, pattern kinds, transformations and novelty kinds are all fixed lists, because an
open list is how a plan acquires a field no predicate ever checks.
A cue declares a tempo, a metre, and a CYCLE: a whole number of bars that repeats. Everything above
the cycle is counted in cycles. Sections are runs of cycles; layers enter, rest and leave on cycle
boundaries; the novelty schedule is a list of cycle indices.
That single choice is what turns Josh's "I dont like repetitious loops lasting more than 3-5 cycles
without introducing a new instrument or catch or melody or beat drop" from an intention into
arithmetic. max_cycles_unchanged is the longest run of consecutive cycles carrying no novelty
event; it is computed from the schedule, and the validator refuses a plan whose run exceeds its
declared bound. The prototype's bound is 3 and all three cues come in at 1 or 2.
The cycle is also the correct clock for this material rather than an imported one. Gong-chime
practice organises time colotomically — the largest gong marks the cycle and smaller strokes
subdivide it at fixed positions, so the metrical structure is stated by INSTRUMENTATION rather than
by accent (COUNTERPOINT_AND_VOICE_LEADING.md §7.3). The plan's colotomic pattern kind is that,
directly.
| block | fields | what it decides |
|---|---|---|
| identity | cue_id, public_name, theme_id, theme_family, cue_purpose_class, chapter_id, region_page, cue_rows | which canon row this cue serves and which registry cue rows it fills |
| derivation | list of {claim, source, quote} | what canon is being realised, quoted with file:line. At least four cited entries or the plan is refused |
| care | allow_register, deny_register, sources, threat_material_layers, honest_limits | the region's own registry text, and which layers may carry menace |
| time | target_duration_s, tempo_bpm, beats_per_bar, cycle.period_bars | the geometry; total length is arithmetic on the section map, never asserted |
| pitch | key.tonic_midi, key.mode_name, key.scale_semitones, key.tuning_note, harmony (one voicing per cycle bar), pokok | the mode, the harmonic frame, and the slow structural line the elaboration locks to |
| sections | per section: id, name, cycles, intensity, texture_type, colour_change, optional cut + cut_survivors + re_entry_cycle | the section map, the intensity arc, and the composed rest |
| layers | per layer: see below | the layer manifest, which is a SCHEDULE rather than a roster |
| novelty | per event: cycle, kind, magnitude, why | the 3-5-cycle law, satisfied by construction |
| hook | head_cell, head_bars, plain_statement_cycle, parent_quotation, returns with per-return transform | the tune, where it is stated plainly, and every place it comes back |
| instrumentation | region, period, documented_register, realisation, care_line | the region and period plan, with the analogue declared |
| expectations | max_cycles_unchanged_bound, joint_box, section_count_rule, structural_yield_floor | the predictions the render is allowed to falsify |
A layer row carries: id, instrument (a palette id), stratum, role, of_the_place,
register_slot, entry_cycle, exit_cycle, rest_spans, gain_db, pan, velocity, pattern,
optional doubles, promoted_from, ostinato_whole_cue, source_kind, and cultural_licence
naming which page authorises the material. That is the stem-manifest schema of
ORCHESTRATION_TEXTURE_AND_DENSITY.md §10.3, adopted as written and extended with of_the_place,
which the care line needs and that document did not have to have.
The pattern kinds are colotomic, ostinato, pokok, kotekan, pad, arpeggio, statement,
counterline, drone and bed. Each is a compact generator with parameters rather than a note
list, so a thirty-seven-part cue is a readable table instead of five thousand hand-typed triples.
harness/music_gen/pass2_realise.py compiles them; the compilation is a pure function of the plan.
Thirty-seven, in pass2_plan.validate. The ones that carry the floor:
holds more than 60 percent of the summed linear gain.
least half of them transformed rather than literal; every transformation a known operation.
cut paired with a declared re-entry; the planned drop rate under the corpus median.
Each has a mutation control in self_test() that breaks exactly that rule and checks it fires. A
rule that has never been made to fail is not armed, and this repo has paid for that lesson before.
The point of declaring predictions is that they can be wrong. Both of the following were found by
measuring the first render against its own plan, not by reasoning about it, and both are recorded
here because the architecture's value is that it produced them.
DECLARING A SECTION IS NOT THE SAME AS BUILDING ONE. The caci cue declared twenty-one sections; the
audio segmenter found eight, at 2.16 boundaries per minute against a corpus median of 5.09 and round
1's 2.78. Its layer manifest was realised exactly — thirty-seven planned parts became thirty-seven
rendered stems, entrance spread 0.967 against a planned 1.0 — so the schedule was not the problem.
The exploration cue, from the same schema and the same compiler, declared nineteen sections and
MEASURED twenty-six at 6.25 per minute. The two differ in one thing: the exploration cue's active
part count swings between two and twenty-four while the battle cue's floor never falls below about
fifteen. structure_and_sections segments a chroma-and-MFCC self-similarity matrix, and a dense cue
whose harmony grid, structural line and tempo are identical in every cycle is, to that matrix, one
continuous wall with a changing coat of paint.
THE FIRST REPAIR WAS TRIED AND REFUTED, and it is recorded here because that is what the
architecture is for. The hypothesis was that the segmenter needed the HARMONY to move: a section may
select a harmony variant and a pokok variant, so a declared boundary changes what the music is
rather than only who is playing it. Reharmonisation is on the enumerated colour-change device list;
a second structural line is what a gong-chime piece does when its form moves on. Consecutive
sections never share a variant pair. The device is implemented, kept, and does what it says.
It did not work. Re-rendered with four harmony variants, four pokok variants and the sustain repair
below, the caci cue measured FIVE sections against the first render's eight, and its structural
yield fell from 0.226 to 0.118. Making the texture more continuous — which the sustain repair does,
correctly, for a different reason — made the self-similarity matrix more uniform, and the harmonic
motion underneath was inaudible to it because in a thirty-nine-part mix the layers carrying the
harmony sit twenty decibels under the ones carrying the timbre.
THE SECOND REPAIR IS DENSITY, and the exploration cue is the evidence for it. That cue measured
twenty-six sections from the same schema with no variants at all. The two cues differ in one
property: the exploration cue opens on two parts and empties to one twice, while the battle cue's
active count never fell below about ten. A chroma-and-MFCC matrix reads a dense continuous ensemble
as one object however much its inner harmony moves, because the mix's spectral envelope barely
changes. What produces a novelty peak is the texture GETTING SMALL and then getting big again.
So the caci cue gained six THIN POINTS — single-cycle emptyings down to a named few, each rebuilding
on the next cycle — taking its planned density profile from a floor of ten to a floor of one, mean
15.7, peak 31. Subtraction is the strongest event available anyway, and this is the device Bolero's
promotion law and Barber's climax-into-silence are both about.
THAT CONFIRMED THE DIRECTION AND DID NOT CLOSE THE GAP. Measured sections across the three epochs:
8, then 5, then 9. Structural yield: 0.226, 0.118, 0.235. The density lever moves the number the
harmony lever moved backwards, and it moves it the right way — but six single-cycle emptyings in
thirty cycles are not enough. The planned profiles say why: the caci cue's floor is 1 and its MEAN
is 15.7 of a peak 31, while the exploration cue's mean is 13.6 of a peak 24. It is the TIME SPENT at
low density that the segmenter integrates, not the existence of a low point. The repair that
follows is a genuinely two-phase form — the whole ensemble losing register and half its parts for a
stretch of cycles rather than for one — which is what the class research prescribes for a phased
boss cue anyway. Full numbers in build/audio/pass2/PROTOTYPE_VERDICT.md.
A STRUCK SAMPLE IS CUT AT NOTE-OFF, AND THAT INFLATED THE DROP COUNT BY ROUGHLY EIGHT TIMES. The
caci cue planned four removals and the card counted thirty-one drops. Checked against timestamps:
four of the thirty-one land within three seconds of a composed removal; twenty-eight remove fewer
than two lanes; twenty-four are shallower than 3 dB, with a median around -1.7 dB; and they fall on
a near-regular 6.5-second grid that matches the cycle period exactly. The detector fires on
d_db <= -6.0 OR d_lanes <= -1.5, so these are firing on the LANE arm — the spectral band count
sagging once per cycle. The cause is that a cue built almost entirely from struck transients empties
its high and low bands between strokes: a vibraphone bar written as a 0.45-beat note is stopped by
sfizz after 0.45 beats, while a real bar rings for seconds.
Two repairs, both in the realisation rather than the composition, and both of them simply what a
real score does. A dur_scale on ringing instruments lets them ring. Two quiet sustained string
layers hold the mid and upper-mid bands continuously under the percussion ensemble.
THAT REPAIR WORKED, AND THE MEASUREMENT SAYS SO. Re-rendered, the exploration cue's drop count fell
from 35 to 20 — from 8.75 per minute to 5.00, against a corpus median of 5.56 — with no change to
its composition at all. Its structural yield rose from 0.714 to 1.100, clearing the 0.76 floor and
landing at the album-sibling level of 1.00. The denominator really was inflated, and by roughly the
factor the timestamp check predicted.
The general lesson is worth stating separately, because it will recur: THE PLAN'S OWN DROP COUNT IS
A FLOOR, NEVER A CEILING. A planned removal is one the composer intended; a measured drop is any
moment the envelope or the band count falls. The two are different objects and the plan must never
be read as predicting the second.
plan (json)
-> pass2_plan.require validate; a refused plan never reaches a render
-> pass2_realise.compile_plan per layer, per active cycle, an absolute-time note list
-> one MIDI per layer pretty_midi
-> one STEM per layer sfizz_render, via orchestrate.py's own invocation
-> a mixdown declared gains and pans, one peak target, a 4 ms de-click
-> the formula card acquire_exemplar.measure — the same ruler the corpus uses
-> PLANNED vs MEASURED pass2_realise.planned_vs_measured
Reused rather than rebuilt, from orchestrate.py: _sfizz with its fixed 48 kHz and quality-10
resampling, _load, _fit (trim or pad to the written length), _pan (constant-power),
_wrap_release (the loop's own reverberant tail summed onto its head rather than faded), and the
peak target and de-click constants from instrumentation_cards.MIX. Every one of those carries a
comment recording a measurement that forced its shape; writing a second set here would have produced
a second set of the same bugs.
Reused from instrumentation_cards: measured_range, which reads an instrument's playable keys
from the SFZ text rather than from a table. sfizz's failure mode for an unmapped key is SILENCE, not
an error, so a note outside a range would arrive downstream as a missing part that nothing reports.
New modules:
harness/music_gen/pass2_sfz_probe.py — renders five notes across each .sfz file's own mappedspan and measures the peak, so no instrument enters the palette on faith.
harness/music_gen/pass2_plan.py — schema, derived metrics, validation, self-test.harness/music_gen/pass2_realise.py — compile, render, mix, measure, compare. --table emits theresults comparison across every rendered cue and both render epochs, so a verdict's numbers are
script-emitted rather than hand-typed. --remeasure re-derives a card from a mixdown already on
disk, which is how a new acceptance target landing mid-run is absorbed without another render hour.
harness/music_gen/pass2_flores.py — the authored Flores content, emitting three plans.harness/music_gen/sfz_palette.py — extended by pure addition with 53 probe-verified instruments.The palette mapped 23 instruments; 94 .sfz files sit on disk. The probe rendered all 94. Ninety-
three sound. The one that does not is Psaltery, Bowed and Plucked - Pluck.sfz, and it is a second
victim of the upstream packaging bug sfz_palette.py's own PATH_REPAIRS block documents for the
LongBow variant: sfizz loads the instrument and renders silence. It is not in the palette. That is
the exact failure the probe exists for, caught on its first real sweep, and it is the reason nothing
was added without being played first.
Fifty-three instruments were added: the concert gong that marks the cycle, frame drum, toms, bass
drum, timpani, slit drum, woodblock, claves, shaker, cabasa, claps, agogo bells, bell tree, finger
cymbals, triangles, suspended cymbal, vibraphone in two mallet weights, xylophone, four baroque
recorders, piccolo, staccato winds, folk harp, strumstick, upright piano, the string tremolo,
pizzicato and spiccato articulations, three brass colours and an organ pedal.
Each of these is a refusal rather than a repair, and each was added after the thing it refuses
actually happened. They are listed because they are the part of the architecture that a reader
building the next region will otherwise rediscover.
fit_to_range moves an out-of-range note by a whole octave, which is theright repair for an accompaniment voice and the wrong one for a head cell: it inverts the interval
it lands on and the tune stops being the tune. The caci cue's octave-up return was written for a
trumpet whose map stops at 84 while the transposed head reaches 90, so the parent theme's licensed
+9 leap came back as a -3 step — at exactly the bar where the care line says the ensemble answers
the broker by rising. Nothing in the plan schema could have caught it, because the plan was right
and the instrument was too small; only the compiled notes know. compile_plan now refuses a
statement whose interval shape does not survive, and names the repair (a wider carrier) rather than
the symptom.
refused. sfizz answers an unmapped key with silence, so a manifest row claiming thirty notes over a
stem with no energy is the palette probe's failure arriving one layer later.
that changed an instrument leaves the old part's wav behind under its old name, and a directory
listing is exactly how a later reader would count layers — so an orphan stem is a silent overcount
of the thing this architecture exists to make countable. Found on the caci re-render, where a
trumpet stem outlived the flute that replaced it: forty files on disk against thirty-nine in the
manifest.
Huron's 1989 voice-denumerability result is the constraint: expert listeners become slower and less
accurate at counting concurrent voices as the number rises, with a marked drop from three to four,
and it may be impossible to process more than about four concurrent streams. Josh asks for dozens of
layers. Those two are only compatible one way.
A cue can carry forty parts and stay clear provided they group into three or four perceptual STRATA.
Bolero's accompaniment mass is one stream regardless of how many players are in it. Conversely a
cue with eight parts that refuse to group is already past the ceiling and reads as noise. The defect
Josh named — "there cant just be stacked noise" — is a GROUPING failure, not a count failure.
So stratum is a required field on every layer, valued foreground, middleground or
background, and the validator enforces the stratum count rather than the part count. Two further
rules follow from McAdams, Goodchild and Soden's stratification analysis, where prominence is read
through Koechlin's extensity and intensite: the foreground is never the largest stratum by part
count, and no stratum holds more than 60 percent of the summed linear gain.
Every layer declares a register_slot — one of nine named octave bands whose names match the
formula card's own register.octave_band_profile, so a planned slot and a measured band are the
same word.
Stacked noise has a precise definition and three independent citations behind it: it is what happens
when many parts share critical bands, share onsets, and share amplitude envelopes. Shared onsets and
parallel amplitude change are exactly the cues that FUSE events, so a homophonic tutti of many
instruments in one register is maximally fused and maximally masked at once — every part contributes
energy and almost none contributes information.
The predicate is scoped two ways, and both scopings are arguments rather than conveniences.
that pairing IS the stratification device. Two parts of equal prominence in one octave is the
crowding the rule is about, so the cell is (cycle, stratum, slot) and a cell holding more than two
non-doubling parts is a violation. doubles licenses a pair; its absence makes co-slotting a
defect rather than an intention.
amplitude envelope with a held pitch. A woodblock and a clap are broadband transients with 50 ms
envelopes; counting them as pitch lanes would refuse every percussion section ever written. Their
load is reported separately as percussion_slot_max so the scoping is visible rather than
absorbed.
Spacing is checked against the ERB floor computed in COUNTERPOINT_AND_VOICE_LEADING.md §5.2 —
octaves clear from A#0, fifths from C2, fourths from A2 — which is why the prototype's harmony grid
puts octaves and fifths at the bottom and thirds upstairs.
Kotekan is implemented as a deterministic part-splitting function, which is the highest-leverage
single item in the counterpoint research. Given a pokok and a subdivision factor:
telu: three pitches; polos takes the low and middle, sangsih the middle and high, with the middleSHARED. Polos on-beat, sangsih off-beat.
empat: four pitches; polos the lower two, sangsih the upper two, no shared pitch.Two thin parts, one dense composite, no new spectral territory. The self-test verifies it rather
than asserting it: the two parts share no onset, the composite is denser than either, and for telu
the pitch sets overlap — the deliberate fusion point in an otherwise segregated texture.
This is a general gong-chime and Balinese structural technique, and it is labelled as one. Section 10
of the Flores region page declares its own substrate thin on gong-waning musical theory. The lane
uses the general structural facts and leaves the page's specific gap open rather than filling it
with a plausible sentence.
The standing ruling keeps canonical melodies composer-in-loop, and an A/B established that text
conditioning cannot reliably realise a specified melodic shape. ACE-Step is ruled BEDS ONLY.
The architecture enforces that rather than promising it, in three ways:
1. There is no code path in pass2_realise.py by which a generator can contribute a pitch. Every
pitched note comes out of compile_layer, a pure function of the plan's own degrees, harmony grid
and head cell. The self-test reads the module's own AST and asserts that no generator module is
imported — and its positive control proves the AST reader can say yes, because the first version
of that check was a substring search that matched its own argument list and reported the firewall
broken. A search that can be tripped by the text of the search is not a measurement.
2. The schema admits generated audio only as a bed layer, which carries a source_path and no
notes. V29 refuses a bed outside the background stratum; V30 refuses any layer marked
source_kind: generated outside the background stratum.
3. A bed's provenance travels on its manifest row, so a downstream reader can see which seconds of
which mixdown were not authored.
The prototype uses no generated beds. That is a choice about this rung rather than a limit of the
schema: the two full cues are dense enough that a bed would be inaudible under them, and the sparse
cue's whole point is that you can hear each of its eleven parts. Beds are where the ambience, nature
and texture layers of Josh's floor will enter, and the slot for them is defined and gated.
T0_Theme_Registry :: REGION_FLORES_ISLAND states the rule in words: no region's own register used
as the threat signal, systematically darkened, inverted or menace-coded, because the darkening
operations belong to the antagonist material and travel WITH it, never with the place. CH_03's
combat framing routes the antagonist through the bought champion and the broker, never the community.
Four structural facts carry it, each checkable in the emitted JSON:
1. Every layer declares of_the_place. V24 refuses a plan in which an of-the-place layer appears in
care.threat_material_layers. V25 refuses an of-the-place layer in a pressure role or on an
instrument whose palette role is pressure.
2. THE MENACE IS NOT MADE OF THE PLACE'S MATERIAL. The region's mode is the anhemitonic pentatonic
D E F# A B. The caci cue's five broker layers are built from C, E-flat and F natural — three
pitches the mode does not contain. The darkening therefore CANNOT be an operation on the
ensemble's material; it is separate material arriving beside it. pass2_flores.self_test checks
the intersection of the two pitch-class sets is empty.
SUPERSEDED IN ROUND 4 (2026-08-08) — THE REQUIREMENT STANDS, THE MECHANISM MOVES. Josh graded
round 3 down with "They clash", and the pitch-class disjunction described above is the largest
designed dissonance in these cues: the of-the-place layers emit exactly {2, 4, 6, 9, 11} and the
broker layers exactly {0, 3, 5}, by construction, with no shared tone anywhere. That was a
harness invention and never a canon requirement. T0_Theme_Registry :: REGION_FLORES_ISLAND's
deny_register_list forbids "no region's own register used as the threat signal, systematically
darkened, inverted or menace-coded" — a rule about the region's REGISTER, meaning its Section-10
instruments and technique, not about its pitch set. And LEITMOTIF_ARCHITECTURE.md §4 points the
corollary the other way and binds it just as hard: "an individual antagonist may be scored fully
inside his own culture's register, with the same craft as that region's protagonist cues. A
blanket register ban is the named failure, not the safe option."
From round 4 the broker SHARES THE CUE'S FUNCTIONAL HARMONY — every broker pitch is a chord tone
of the chord sounding at its own onset — and the menace is carried by four non-pitch means, each
measured and declared in the plan's own care.mechanism_supersession block: INSTRUMENT (the
pressure-role contrabass tremolo and muted horn, neither of which is a Section-10 Flores
instrument, so the broker is outside the region's register by construction and independently of
pitch); REGISTER (below the ensemble's floor, with the margin in semitones stated); ARTICULATION
AND DYNAMICS (tremolo and mute, entering under the ensemble rather than over it, with the gain
and velocity offsets stated); and RHYTHMIC DISPLACEMENT (onsets off the groove's strong metrical
positions, with the measured onset-complementarity against the composite percussion grid stated).
Facts 1, 3 and 4 are UNCHANGED and still carry the care line: V24 and V25 still refuse, the
ensemble still rises as the pressure arrives, and the palette argument is untouched. What is
retired is the pitch-set warfare and the two self-test controls that asserted it
(pass2_flores.self_test C5 and C11, pass3_flores.self_test F09); their replacements assert
the four margins above and that the broker's pitches ARE chord tones — the inverse control on the
same evidence. Round 4 is unpublished and ungraded at the time of writing: this records the
mechanism that now ships in the code, not a verdict that it sounds better. Josh's ear rules that.
3. THE ENSEMBLE RISES AS THE PRESSURE ARRIVES. After the broker enters at cycle 15, every hook return
is octave_up, augmentation or literal, and at least one is octave_up. The contest gets
prouder, not darker. That is the chapter's own resolution — the ritual victory lands with the
broker exposed and no kill — expressed as a compositional act. The self-test checks it.
4. The palette extension carries its own care argument. The world-instrument half of VCSL stays
absent: no kalimba, mbira, balafon, darbuka or dan tranh, because none of them is a Section-10
instrument and importing one would be the culture-conflation the region page's own Section 12
flags. Two added instruments (conga, bongos) carry a living-tradition name and are marked as such
in their palette notes so a plan reaching for a generic hand drum picks frame_drum instead. The
Flores plans do not use them.
The honest limits are stated on every plan rather than left to be discovered: no pitched gong exists
in either CC0 set, so the tuned-bronze half of a gong waning has no sample-level counterpart at all
and the pitched-metal lane is vibraphone, hand chimes and glockenspiel standing in and declared as
standing in; the tuning is 12-TET and a gong waning is not; the bamboo flute is a baroque recorder;
what is taken is the TECHNIQUE and not a timbre claim, so a Manggarai listener would not hear a gong
waning here but a concert percussion section playing a cycle structure derived from one.
Josh asked for "around 20+ complete tracks per region or cultural node and time period". The
economic claim of this architecture is that a region's theme, composed ONCE as a structure, yields
twenty-plus cues without twenty-plus inventions. Concretely, what is reused and what is written:
REUSED ACROSS EVERY CUE IN A REGION, authored once:
declarations. These are per REGION, not per cue.
Those are the expensive parts. In the prototype they are roughly two hundred lines of authored
content in pass2_flores.py and they are identical in all three cues; the self-test checks that
identity rather than asserting it.
WRITTEN PER CUE:
with different entry cycles, gains and pattern parameters.
MEASURED ON THE PROTOTYPE, since the claim should carry a number. pass2_flores.py is 1,242 lines
including its comments and self-test. The shared theme block — head cell, mode, harmony grid, pokok,
variants, derivation, care, honest limits — is 136 lines and is written once. The three cues are 250,
320 and 125 lines, and roughly half of each is comment and section names. Call it 120 to 160 lines of
actual table per cue against 136 lines of theme. So the twentieth cue in a region costs what the
fourth does, and the region's theme is amortised across all twenty. The three prototype cues are
deliberately three TRANSFORMATIONS of one theme rather than three pieces, because that is the claim
under test, and pass2_flores.py --check verifies the sharing rather than asserting it.
Three further multipliers, in order of how much they buy:
PURPOSE_CLASSES already bands part count per class. The next rung adds aclass template carrying a default section arc, a default tension curve and a default drop budget,
from HOOK_AND_TENSION_ARCHITECTURE.md §11.3's per-class prescriptions. A cue then costs a
template plus its deviations.
stratum and role, an adaptive cue is a subset of a manifest rather than a second render. The
layer_mode: swap rows in the region page's machine cue table are directly served by this: the
base statement and its replacement are two subsets of one plan.
intensity field already scales velocity per section. A second variant ofa cue at a different intensity curve is one column of one table.
What does NOT scale, and should not be pretended to: the head cell. A region's tune is a
composer-in-loop artifact under the standing ruling, and the parent-quotation requirement in the
registry's transformation_plan means it must be derived from a cardinal theme rather than minted.
Twenty cues per region is cheap; the tune is not, and the architecture is designed so the expensive
thing is authored once.
What this architecture still cannot do.
one dynamic layer per note on most instruments, no round robins, no legato transitions and no
release samples worth the name. The dossier that promoted the text-to-audio generator measured the
authored-plus-sampler route at a timbre-critic distance of 1.932 with five of five MARGINAL, while
round 1's generated candidates sat at 0.6586 and 28 of 32 INSIDE. That gap is real and this
architecture does not close it. It is a statement about TIMBRE only — the generated route does not
carry a composed tune and this one does — but a report that omitted it would be dishonest. What
closes it: a commercial library at the BBC SO rung, or real players.
vocabulary. There is no crescendo within a note, no vibrato shaping, no bow-pressure change, no
breath. Every phrase is therefore flat in a way no human performance is. What closes it: CC or
aftertouch curves per part in the MIDI, which sfizz supports and which the plan schema does not yet
express.
region whose tradition has a documented tuning could carry it in key. For Flores the page itself
declares the substrate thin, so the honest move is to leave it open.
peak target. Real scores are placed in a room. What closes it: a convolution stage, which is a
small amount of code and a licensing question about impulse responses.
rows while admitting 44.8 percent of album filler. Structural yield is near chance against album
siblings. Section count is a scale rule. Every one of these rejects; not one certifies. A plan that
clears all of them has cleared a bar that says it is not unlike the tracks Josh named. It says
nothing about whether it is beautiful.
a sighted-structure read — the plan open beside the measured card — is the strongest verdict
available at this rung.
Canon read and quoted: docs/spine/CH_03.md (asset anchors L245, combat framing L58, Thread 21 L42,
the caci beats L139-L154, hard-line handling L226); _source/02_Tier_2_Region_Pages/flores_island.md
§10 (L844) and its machine cue table; registries/T0_Theme_Registry [DRAFT v0.1] row
REGION_FLORES_ISLAND (allow_register_list, deny_register_list, head_cell_spec,
transformation_plan); harness/route.py music --chapter CH_03 --region flores_island for the
read-set order.
Craft research consumed: ORCHESTRATION_TEXTURE_AND_DENSITY.md §3.6 (part counts), §5.5 (the
entrance schedule), §6.1 (strata), §6.2 and §6.3 (slots and masking), §10.3 (the stem manifest
schema), §11 (the eight principles); COUNTERPOINT_AND_VOICE_LEADING.md §5.2 (the ERB spacing
floor), §7.2 (kotekan), §7.3 (colotomic time); LEITMOTIF_TECHNIQUE.md (head-cell law,
state-plainly-once, continuation by fragmentation, transformation budget);
HOOK_AND_TENSION_ARCHITECTURE.md §9 (the drop), §10.3 (the 2.68-17.43 band), §11.1 (loop and arc),
§11.3 (per-class arcs).
Measured evidence: build/audio/generated/slice_v1/REVIEW_SHEET.md;
build/audio/exemplars/PATTERN_FINDINGS_V2.md §8; the structural-yield table handed to this lane at
HEAD; build/audio/pass2/palette_probe.json.