PASS2_LAYER_ARCHITECTURE.md

music/PASS2_LAYER_ARCHITECTURE.md

Pass 2 — layer-based composition

CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
Canon served: docs/spine/CH_03.md (the music_mood anchor 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.

1. Why single-shot generation cannot satisfy the floor

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.

What replaces 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.

2. The track plan schema

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.

2.1 The cycle is the master clock

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.

2.2 The fields

blockfieldswhat it decides
identitycue_id, public_name, theme_id, theme_family, cue_purpose_class, chapter_id, region_page, cue_rowswhich canon row this cue serves and which registry cue rows it fills
derivationlist of {claim, source, quote}what canon is being realised, quoted with file:line. At least four cited entries or the plan is refused
careallow_register, deny_register, sources, threat_material_layers, honest_limitsthe region's own registry text, and which layers may carry menace
timetarget_duration_s, tempo_bpm, beats_per_bar, cycle.period_barsthe geometry; total length is arithmetic on the section map, never asserted
pitchkey.tonic_midi, key.mode_name, key.scale_semitones, key.tuning_note, harmony (one voicing per cycle bar), pokokthe mode, the harmonic frame, and the slow structural line the elaboration locks to
sectionsper section: id, name, cycles, intensity, texture_type, colour_change, optional cut + cut_survivors + re_entry_cyclethe section map, the intensity arc, and the composed rest
layersper layer: see belowthe layer manifest, which is a SCHEDULE rather than a roster
noveltyper event: cycle, kind, magnitude, whythe 3-5-cycle law, satisfied by construction
hookhead_cell, head_bars, plain_statement_cycle, parent_quotation, returns with per-return transformthe tune, where it is stated plainly, and every place it comes back
instrumentationregion, period, documented_register, realisation, care_linethe region and period plan, with the analogue declared
expectationsmax_cycles_unchanged_bound, joint_box, section_count_rule, structural_yield_floorthe 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.

2.3 The predicates

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.

2.4 What the first render falsified, and the two repairs it forced

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.

3. The realisation chain

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:

span and measures the peak, so no instrument enters the palette on faith.

results 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.

3.1 The palette, and what the probe found

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.

3.2 Three guards the chain grew because a render tripped them

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.

right 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.

4. The strata doctrine

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.

4.1 Frequency-slot allocation, and what "stacked noise" is acoustically

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.

4.2 Complexity by constraint rather than by addition

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:

SHARED. Polos on-beat, sangsih off-beat.

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.

5. How generated beds enter, and why the firewall is structural

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.

6. The care line, realised as architecture

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.

7. The scaling path to twenty-plus cues per region

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:

class 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.

a 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.

8. Honest limits

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.

9. Provenance

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.

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