EXPOSURE_LEDGER.md

music/EXPOSURE_LEDGER.md

THE EXPOSURE LEDGER — who each tune is for, and how often the slice plays it

**CANON SUBORDINATION — emitted artifact, PROPOSAL-TIER: it serves canon and never
outranks it.** Canon served: registries/T0_Theme_Registry, docs/spine/CH_*.md,
registries/T0_Chapter_Index. If this disagrees with canon, CANON WINS and this is the
defect. Emitted by harness/music_gen/exposure_ledger.py; do NOT hand-edit.

38 theme rows · 17 attached · 21 carry zero exposures · 222 cue rows · 17 distinct theme_ref on the table.

0. The teeth

Both are quoted verbatim from docs/proposals/music/MUSIC_GAP_HUNT_2026-08-07.md §5 and

both fail closed:

Both teeth are CLEAN on live data. A clean pass proves nothing on its own, which is why

each carries a mutation control in --self-test: T1 fires when a zero-exposure row is

marked complete, and T2 fires for every region when the cue table's theme_ref values

are collapsed back to the single hardcoded constant the emitter carried until

2026-08-08 — the real historical defect, replayed.

1. The ledger

theme_idtierplant nodeexposuresnodesmedian gapregion ceilingpayoffdiegetic surface
JOURNEY_WORLDACH_PROLOGUE141412CH_77CH_02 :: CH02_B10 :: gong
HOME_AND_LOSSACH_PROLOGUE6414CH_13CH_02 :: CH02_B10 :: gong
ARCHITECT_THEMEACH_3800—0CH_68—
CASSIUS_PHASE_1ACH_7600—0CH_76—
CASSIUS_PHASE_2ACH_7600—0CH_76—
CASSIUS_PHASE_3ACH_7600—0CH_76—
ENDING_EVILACH_7700—0CH_77—
ENDING_GOOD_ENOUGHACH_7700—0CH_77—
ENDING_TRULY_GOODACH_7700—0CH_77—
FAMILIAR_BONDA—00—0CH_58—
GRAND_SAGE_REVEALACH_7700—0CH_77—
HOUSE_OF_VELHEIM_THEMEACH_3800—0CH_38—
PROTAGONIST_THEMEACH_PROLOGUE00—0CH_77CH_02 :: CH02_B10 :: gong
VIMANA_ACTIVATIONACH_5500—0CH_58CH_57 :: CH57_B01 :: song
FAM_THE_OTHERWORLDB—192119CH_77—
CHILDHOOD_CONSTANCYBCH_0131—3CH_01CH_02 :: CH02_B10 :: gong
COMPANION_HEALERS_CHILDBCH_1311—1CH_13CH_15 :: CH15_B05 :: recitation
FAM_THE_DEEP_WATERBCH_0200—0—CH_02 :: CH02_B10 :: gong
FAM_THE_LIVING_VOICEBCH_0300—0—CH_04 :: CH04_B07 :: gamelan
FAM_THE_MADE_PLACEBCH_0400—0—CH_04 :: CH04_B07 :: gamelan
FAM_THE_OTHER_SELFBCH_PROLOGUE00—0—CH_02 :: CH02_B10 :: gong
FAM_THE_SUBSTRATEBCH_PROLOGUE00—0—CH_02 :: CH02_B10 :: gong
FAM_THE_TURNEDBCH_3800—0——
FAM_THE_WRITTENBCH_0200—0—CH_02 :: CH02_B10 :: gong
PATTERN_UNNAMED_PREGATEBCH_3800—0CH_38—
VOICE_COLOUR_SIGNATUREB—00—0——
REGION_FLORES_ISLANDCCH_02352135—CH_02 :: CH02_B10 :: gong
REGION_SOUTH_AFRICACCH_13161—16—CH_15 :: CH15_B05 :: recitation
REGION_BALICCH_04151—15—CH_04 :: CH04_B07 :: gamelan
REGION_CENTRAL_AFRICA_CONGOCCH_11151—15—CH_11 :: CH11_B03 :: song
REGION_SRI_LANKACCH_06151—15—CH_06 :: CH06_B06 :: chant
REGION_WEST_AFRICACCH_12151—15——
REGION_ETHIOPIACCH_09141—14—CH_11 :: CH11_B03 :: song
REGION_SOUTH_INDIACCH_07141—14—CH_07 :: CH07_B14 :: chant
REGION_SWAHILI_COASTCCH_08131—13—CH_08 :: CH08_B06 :: ngoma
REGION_RIFT_VALLEYCCH_10121—12—CH_11 :: CH11_B03 :: song
REGION_SUMATRA_JAVACCH_05111—11—CH_06 :: CH06_B06 :: chant
REGION_ANGKOR_KHMERCCH_0541—4—CH_06 :: CH06_B06 :: chant

2. Zero-exposure rows, split by whether that is a defect

A theme whose plant node is outside Prologue→Ch 13 is CORRECTLY silent in this table: the

cue table is exactly the slice. Only an in-slice theme with no exposure is a hole.

OUT OF SLICE — 12 rows, not a defect: ARCHITECT_THEME (CH_38), CASSIUS_PHASE_1 (CH_76), CASSIUS_PHASE_2 (CH_76), CASSIUS_PHASE_3 (CH_76), ENDING_EVIL (CH_77), ENDING_GOOD_ENOUGH (CH_77), ENDING_TRULY_GOOD (CH_77), GRAND_SAGE_REVEAL (CH_77), HOUSE_OF_VELHEIM_THEME (CH_38), VIMANA_ACTIVATION (CH_55), FAM_THE_TURNED (CH_38), PATTERN_UNNAMED_PREGATE (CH_38)

IN SLICE WITH ZERO EXPOSURES — 9 rows. This is the worklist:

3. The per-region ceiling

Exposure is an inverted U: under-exposure never bonds and over-exposure produces the theme

players mute. The ceiling below is per NODE, not per play — two players hear a zone bed a

wildly different number of times and no schedule can answer that.

region pagecue rowsthemes carried
flores_island38REGION_FLORES_ISLAND×35, JOURNEY_WORLD×2, HOME_AND_LOSS×1
fairy_realm28FAM_THE_OTHERWORLD×19, HOME_AND_LOSS×4, CHILDHOOD_CONSTANCY×3, JOURNEY_WORLD×2
south_africa19REGION_SOUTH_AFRICA×16, JOURNEY_WORLD×1, HOME_AND_LOSS×1, COMPANION_HEALERS_CHILD×1
bali16REGION_BALI×15, JOURNEY_WORLD×1
central_africa_congo16REGION_CENTRAL_AFRICA_CONGO×15, JOURNEY_WORLD×1
sri_lanka16REGION_SRI_LANKA×15, JOURNEY_WORLD×1
west_africa16REGION_WEST_AFRICA×15, JOURNEY_WORLD×1
ethiopia15REGION_ETHIOPIA×14, JOURNEY_WORLD×1
south_india15REGION_SOUTH_INDIA×14, JOURNEY_WORLD×1
swahili_coast14REGION_SWAHILI_COAST×13, JOURNEY_WORLD×1
rift_valley13REGION_RIFT_VALLEY×12, JOURNEY_WORLD×1
sumatra_java12REGION_SUMATRA_JAVA×11, JOURNEY_WORLD×1
angkor_khmer4REGION_ANGKOR_KHMER×4

4. The age axis (G14)

age_stage is filled 79/79 on T0_Chapter_Index and, until the 2026-08-08 emit, appeared

in no music row anywhere. It now rides the motif_statement rows, so a plain statement is

countable per rung.

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