PROPOSED_ROWS.md

pipelines/PROPOSED_ROWS.md

PROPOSED ROWS — the cardinal motif roster reconciliation on T0_Theme_Registry

Author output for the fresh adversarial critic. RULED by Josh 2026-07-29, twenty-second sitting,

ruling 4 ("On 4 yes approve"), recorded at docs/spine/DECISIONS_PENDING_JOSH.md. Nothing here is

landed; the director owns the apply.

Target: registries/T0_Theme_Registry [DRAFT v0.1]/T0_Theme_Registry.csv — live 12 rows x 26 cols,

UTF-8 no BOM, CRLF, trailing terminator. Result 14 rows x 28 cols, exactly 12 row_class=cardinal.

Artifacts in this directory:

line endings preserved, 20 preconditions and 22 postconditions).

0. Citation drift, flagged and NOT silently fixed

The apply brief and DECISIONS_PENDING_JOSH.md ruling 4 both cite the work order as

MUSIC_COMPOSITION_DOCTRINE §1.9. On disk today the roster reconciliation — including the green

"APPROVED — Josh, 2026-07-29 twenty-second sitting" banner — lives in **§1.5, "The cardinal roster,

reconciled against the live registry"** (banner at line 186, roster at lines 193-221). §1.9 is "The

care line, stated as two structural rules". §1.9 is genuinely load-bearing here (it supplies the

region-as-threat clause quoted into JOURNEY_WORLD), but it is not the work order. **Every citation

this pass writes into the registry points at §1.5**, and the CASSIUS_PHASE_1 note records the label

mismatch in one clause so no later agent re-derives it. If the doctrine is meant to be re-sectioned,

that is a separate edit and is not made here.

1. Schema mint — two columns, appended LAST

columnvaluespopulation
row_classcardinal \cue_variant \timbral_signaturecardinal on 12 rows, cue_variant on 2
parent_theme_ida theme_idblank except the two cue_variant rows

Doctrine: §1.5 (both tokens used by name in the roster text) and Appendix S (the column

definitions — "row_class ... Drives which required-field set applies"; "parent_theme_id — for

cue_variant and tag rows").

Two forced structural decisions, both flagged:

1. Columns append at the END of the header. harness/registry_fidelity.py lines 177-190 require

cand_hdr[:ref_w] == ref_hdr — the candidate header must *extend* the frozen reference as a

prefix. A mid-header insert fails the gate. This also matches the four already-declared added

columns (tempo_bpm, bar_length, per_stem_role, ue_sound_asset_path).

2. The two new rows append at the END of the file, not "into the freed slots" positionally. The

freed-slot language in §1.5 is a roster-*count* statement. registry_fidelity.py compares

reference-zone cells by row *index*; a mid-file insert would shift eight rows and produce a wall

of spurious cell diffs. Row order is asserted in the script (oids[:12] == EXPECTED_IDS).

timbral_signature is defined but unused. §1.5 registers the timbral voice motif on its own row

outside the twelve; that row is NOT minted here (the ruling minted exactly two rows). The token is

declared in the enum so the later mint needs no schema change.

Divergence on the cardinal token — one constant, one line to flip. The brief and its acceptance

test say row_class = cardinal. Appendix S enumerates `cardinal_theme | family_motif | tag |

tuned_bed | cue_variant | timbral_signature. cue_variant and timbral_signature` match Appendix S

exactly; only the cardinal token diverges. The script follows the brief (it is the ruling-bearing

instruction and its own verification counts cardinal), and isolates the choice in the module

constant CARDINAL at the top of the file. **Director/critic call: if Appendix S wins, flip that one

constant and re-run — nothing else changes.**

2. The Cassius collapse

CASSIUS_PHASE_1 → THE cardinal Cassius motif

cellbefore → aftercitation
theme_nameCassius Phase 1Cassius Velheim§1.5: "CASSIUS_VELHEIM — Tier A, class tune. The three live rows ... collapse into one cardinal motif"
row_class(new) → cardinal§1.5
notesPREFIX + the original, unchanged§1.5 (three logged transformations: social, combat, resolution); §6.5 (escalation by carrier migration); HL_0109 (never generated)
theme_idunchanged§1.5: "Retain CASSIUS_PHASE_1 as the surviving theme_id to avoid foreign-key churn"
canonical_anchor, mood_tags, instrumentation_substrate, era_substrate, recurrence_anchors, hard_line_relevancebyte-identicalbrief: hard-line cells are care-load-bearing

The notes cell is built as PREFIX + original, and the script asserts

new.endswith(original) — so every word of the pre-existing note survives, including the standing

OBSERVATION that the mood_tags and instrumentation still carry the pre-re-architecture combat

register against the executed SOCIAL stage. The prefix records: the three transformations and which

row holds each; that _2/_3 are cue_variants pointing here; that the theme_id is unchanged so no

FK moves; that the roster-of-twelve query is row_class = cardinal; that escalation is carrier

migration (§6.5) rather than three identities; that composer_in_loop_required stays True on all

three because Cassius material is never generated (HL_0109); and that Tier A / motif_class tune are

Appendix S columns not minted by this pass.

CASSIUS_PHASE_2 and CASSIUS_PHASE_3 → cue_variants

row_class=cue_variant, parent_theme_id=CASSIUS_PHASE_1. notes = PREFIX + the original,

unchanged (_2 = the COMBAT transformation, _3 = the RESOLUTION transformation). theme_name,

canonical_anchor, mood_tags, instrumentation_substrate, era_substrate, recurrence_anchors

(including _3's three-ending scene array) and hard_line_relevance are byte-identical.

composer_in_loop_required stays True on all three rows (brief; HL_0109).

Zero FK churn — verified, not assumed. Live references to the three ids outside this registry:

T0_Scene_Spec_Registry (CASSIUS_PHASE_1 x5, _2 x3, _3 x10, in thematic_anchor arrays),

T0_Voice_Registry (x1 each), T0_Quest_Definition_Registry (CASSIUS_PHASE_1 x2). All three rows

survive with their ids, so nothing outside this file needs to move. This is exactly why the

collapse is a re-class and not a delete.

3. VIMANA_ACTIVATION retitle

theme_name: Vimana ActivationVril and Wonder: the Vimana Activation.

canonical_anchor unchanged (brief: "the anchor stays as canon has it"). notes = original +

SUFFIX (script asserts new.startswith(original)), recording the retitle, that this row occupies the

vril-and-wonder slot as a harmonic-transformation identity (§1.5, §1.3), that it therefore takes

the Appendix T.4 progression-recognition test and never the hummability checklist, and that T.4

"must be authored and dry-run before the vril theme starts" (§1.3). row_class=cardinal.

Naming note: the colon form was chosen over an em-dash so the newly authored bytes stay pure ASCII

(see §7). No other theme_name in the registry uses punctuation; this one has to carry two ideas —

the identity and its payoff surface — because §1.5 defines it that way.

4. HOME_AND_LOSS — new cardinal row

Doctrine: §1.5 line 213 ("Tier A, class tune. NEW row, occupying the slot freed by

CASSIUS_PHASE_2"), §7.10 (cohort one), §1.8 (shared-material governance), §1.4 (Tier A is

composer-in-loop).

cellvalue (abridged)grounding
theme_typeconceptlive enum, as FAMILIAR_BOND; Appendix S maps *family* onto theme_type and no new token is needed
canonical_anchorTalvaeren the sovereign seat + the childhood home; the mother by relation; the Mother's Amulet EQ_0001 through CHPRO_B07 → CH01_B13 → CH01_B08 → CH13_B13 (the ARC_0001 chain)CH_PROLOGUE.md (seat named Talvaeren, nineteenth-sitting ruling), CH_01.md (childhood_home site), T0_Equipment_Registry EQ_0001 equip_name_text = Mother's Amulet, T0_Arc_Index ARC_0001, AMULET_PROVENANCE_BRIEF.md
mood_tags["intimate","warm","mournful","contemplative"]all four tokens already live in the registry — no new vocabulary minted
instrumentation_substratechamber-scale orchestral, one solo carrier; the Prologue/Ch-1 abundance register; near-silence at the mother's scene; abundance returned unironised at the exitCH_PROLOGUE.md music_mood line 245 verbatim in substance ("the mother's scene is the chapter's one place of near-silence"; "the exit returns to the ceiling-abundance motif intact and unironised")
era_substrateall eras across 77-chapter arc; origin statement at the Prologue and Ch 1live idiom (PROTAGONIST_THEME, FAMILIAR_BOND)
recurrence_anchorsbeats CHPRO_B07, CHPRO_B16, CH01_B13, CH01_B08, CH02_B11, CH13_B13, named as beats and explicitly not as a scene FKthose beat ids are on disk (T0_Motif_Registry MOT_0001 lists them); T0_Scene_Spec_Registry holds only 16 endgame SCENE_* rows and none for these nodes, so minting SCENE_CHPRO_* would be a dangling FK
hard_line_relevancesee belowHL_0116 / HL_0043 / HL_0046 / HL_0099 / HL_0095 (all five positive-controlled against T0_Hard_Lines [ACTIVE v0.2]); §1.8
notesTier A / motif_class tune / cohort-one; the home must be an unqualified good before it is a wound; payoff at the Ch-13 departure; the Appendix S columns not minted here§1.5, §7.10, CH_01.md line 62 (the chapter's civilizational mark: "a life shown whole and then broken")

The reveal answer the brief asked for, in hard_line_relevance. Three clauses:

1. No foreshadow cue anywhere in the origin. HL_0116 + HL_0043 + HL_0046; CH_01.md music_mood

line 238 is quoted in substance — "no dread swell under the chase, no held note on the cord coming

off, no minor turn before the rift" — plus the Prologue's "the plenitude is REAL and the score

must not retroactively mourn it."

2. No shared material with HOUSE_OF_VELHEIM_THEME before its Ch-38 gate. CH_PROLOGUE.md line

225: "the moment it reads as aimed at the royal house the arc leaks an antagonist pattern roughly

thirty-eight chapters early." A loss motif is the exact surface that would leak it.

3. **§1.8 shared-material governance vs PROTAGONIST_THEME — the row DECLARES INDEPENDENCE of its

head cell.** PROTAGONIST_THEME's own notes record a gated thematic kinship; because HOME_AND_LOSS

states from the Prologue — the earliest statement in the game — any material shared with

PROTAGONIST_THEME would transmit that gated kinship at the earliest possible moment. If a later

pass wants shared material anyway, §1.8 governs it and every pre-gate statement takes the gate-8

reveal check with a fresh-context critic and an archived capture.

Deliberate wording choice: clause 3 says "a gated thematic kinship recorded in its own notes

field" and does not name the gated theme. Naming it would add a new occurrence of a gated

token to this file for no gain. The reveal-token census below is byte-exact because of that

choice.

5. JOURNEY_WORLD — new cardinal row

Doctrine: §1.5 line 214, §7.10 (cohort one), §1.7 (the world-tour mechanism), §6.5 (the

transformation surface), §1.9 (the care bound), §0 (per-culture per-period scoring, Josh verbatim).

cellvalue (abridged)grounding
theme_typeconceptlive enum
canonical_anchorthe overworld/travel identity of the 77-chapter journey: the 78 inter-node seams of the 79-node spine, typed T0 CONTINUOUS / T1 THRESHOLD / T2 CONVEYANCE / T3 RITUAL ELISION; compressed in DISTANCE never in accuracy (the West Texas principle); important crossings built as real dungeonsSEAM_TYPING_SPEC.md §0.1-0.2; the FORK C ruling, DECISIONS_PENDING_JOSH.md line 875-882
mood_tags["heroic","contemplative","hopeful","warm"]live vocabulary only — no new tokens
instrumentation_substrateorchestral home voice + one solo carrier, re-scored into each region's register; period-appropriate per region and era; wordless voice only where the register card allows; ambient texture part of the score; carrier migrates, tune does not change (interchangeable not additive)§0 (Josh verbatim on per-culture/per-period and wordless-default); §6.5 (interchangeable layering, melody present at every intensity)
era_substrateall eras across 77-chapter arclive idiom
recurrence_anchorsevery inter-node seam (78, typed T0-T3; zero typed on disk today) plus per-region overworld traversalSEAM_TYPING_SPEC.md §0.3 — the honest state is recorded rather than implied
hard_line_relevancesee below§1.9; §0 sourcing law; CVD 17.1
notesTier A / tune / cohort one; the defining transformation surface is the per-culture register migration — the Nerevar Rising → Dragonborn precedent, "the mechanism for a 79-node world tour, bounded by 1.9"; budget spent on orchestration migration, register substitution and reharmonisation under a fixed melody; head-motif stinger composed to each region's tonic and relative only§1.7, §6.5, §7.10

hard_line_relevance states §1.9 in full because this is the one motif that visits every region:

re-scoring is reference-composition in each tradition's own terms, never sampling of consecrated

performance; a region's register is never the villainy signal; the register may not be

systematically darkened, inverted or menace-coded; this theme may never become the recurring cue for

threat in any region it enters; the darkening operations belong to HOUSE_OF_VELHEIM_THEME and travel

with it; care-tier inflation is a defect and a generic world-music wash is a care failure rather than

a taste note; and the allow/deny register lists with the region-as-threat check are required fields —

"a motif with an empty deny list has not been reviewed."

6. Judgement calls beyond the literal spec — FLAGGED

1. cultural_substrate left BLANK on both new rows (11 of 12 live rows leave it blank; the brief

did not list it among the cells to author). Appendix S maps the *allow* register list onto

cultural_substrate, but §1.9 makes an allow list without its deny list and region-as-threat check

meaningless, and the deny_register_list column does not exist yet. Half-filling it would

manufacture a passed gate. The reason is recorded in both rows' notes.

2. **Tier / motif_class / reveal_gate / closure_policy recorded in notes prose, not in

columns.** The ruling mints exactly two columns; the rest are the Appendix S schema wave. Both new

rows and the retitled Cassius row say so explicitly, so the later wave has a stated debt rather

than a silent gap.

3. **The eight untouched rows get row_class only — no recent_changes / last_updated / version

stamp.** Populating a newly minted column is the column mint, not a row edit; stamping all eight

would add 24 uninformative cell diffs. Reversible via the module constant

STAMP_SCHEMA_ONLY_ROWS = False. Critic/director call.

4. docs/registry_extensions.json must gain an ownership entry or a gate goes red.

check_registry_extensions.py rule I2 requires every baseline added_column to be owned by

exactly one system. Exact block, under extensions."T0_Theme_Registry/T0_Theme_Registry":

"motif-roster": ["row_class", "parent_theme_id"]. The script does NOT write it by default; the

optional --manifest <path> flag performs that one idempotent merge (it hard-fails if either

column is already owned elsewhere). This is the one capability beyond the literal spec — added

because leaving a known-red gate for the landing is worse than the small scope increase.

5. docs/fidelity_baseline.json is NOT touched. The director re-emits it in the landing commit:

python harness/registry_fidelity.py --emit-baseline. It will move

added_columns["T0_Theme_Registry/T0_Theme_Registry"] from 4 to 6 entries, add

added_rows["T0_Theme_Registry/T0_Theme_Registry"] = 2, and grow the registry's

expected_cell_diffs from 20 by the 18 reference-zone cells listed below.

6. The registry folder label [DRAFT v0.1] is untouched. Renaming it would move the fidelity

gate's _bkey and is not part of this ruling.

7. No new mood_tags vocabulary was minted — both new rows reuse tokens already in the file. This

is conservative by choice; if the critic wants journey-specific tokens (e.g. an "expansive" or

"wandering" register), that is a one-cell edit and a deliberate vocabulary extension.

7. Verification run — result

Run: apply_motif_roster.py --src LIVE_COPY_T0_Theme_Registry.csv --dst T0_Theme_Registry.NEW.csv,

then an independent re-verify that re-parsed the output with a raw csv.reader (not DictReader

per the standing lesson that duplicate headers and short rows pass DictReader silently).

header names; both new columns present on every row.

parent_theme_id resolves to a live theme_id and only cue_variant rows carry one.

script proves the csv reader/writer round-trip is byte-exact on this file *before* it mutates

anything, so untouched cells cannot be silently reformatted.

intended set exactly.

suffix (three Cassius rows) or a prefix (VIMANA).

every newly authored byte is pure ASCII (asserted in-script).

extensions) parse on all 14 rows.

Ch 76 10→10, thesis 3→3. Zero new occurrences. (HL_0043 4→6 and HL_0109 3→6 do rise —

those are new hard-line *citations* in the authored care text, which is the intended direction.)

written); a tampered precondition cell → fail-stop naming the cell (exit 2); a short row in the

source → fail-stop naming the line and width (exit 2).

Intended-diff census — 34 entries: 18 reference-zone cells + 14 new-column cells + 2 new rows

(14 new-column cells = row_class on the 12 live rows + parent_theme_id on the 2 cue_variants;

the two new rows' own 28 cells each are counted as the "new row" entries, not itemised.)

rowcells changed
CASSIUS_PHASE_1theme_name, notes, recent_changes, last_updated, version (5)
CASSIUS_PHASE_2notes, recent_changes, last_updated, version (4)
CASSIUS_PHASE_3notes, recent_changes, last_updated, version (4)
VIMANA_ACTIVATIONtheme_name, notes, recent_changes, last_updated, version (5)
all 14 rowsrow_class populated (14); parent_theme_id populated on 2
HOME_AND_LOSS, JOURNEY_WORLDnew rows, 28 cells each

last_updated = 2026-07-29T00:00:00Z and version = 1.0.01.1.0 on the four content-touched

rows (the file's own convention: every live row is 1.0.0). New rows mint at 1.0.0.

recent_changes follows the repo convention — a JSON array of one dated string, as in

T0_Voice_Registry and T0_Quest_Definition_Registry.

8. What the critic should attack hardest

1. The cardinal vs cardinal_theme token (§1 above) — the one place the brief and the doctrine's

own Appendix S disagree.

2. HOME_AND_LOSS's hard_line_relevance: is the §1.8 independence declaration the right call, or

does the arc actually *want* HOME_AND_LOSS to be derived from PROTAGONIST_THEME (in which case the

row must say so and accept the gate-8 burden on every Prologue statement)?

3. Whether the Prologue anchors are correctly read — in particular that the Prologue's own music

direction forbids the loss motif from arriving early, so a theme literally named "Home and Loss"

must sound in its *home* register for nine-tenths of its first chapter.

4. Whether appending the new rows at the end (rather than at the freed row indices) is the right

trade against the gate's positional cell comparison.

5. theme_type = concept on both new rows — the alternative would be extending the enum, which

Appendix S permits ("extend its enum rather than adding a column") but which the ruling did not

ask for.

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