pipelines/PROPOSED_ROWS.md
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:
apply_motif_roster.py — the deterministic transform (fail-stop, tmp+os.replace, encoding andline endings preserved, 20 preconditions and 22 postconditions).
LIVE_COPY_T0_Theme_Registry.csv — the byte copy of the live file the run was verified against.T0_Theme_Registry.NEW.csv — the produced result.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.
| column | values | population | ||
|---|---|---|---|---|
row_class | cardinal \ | cue_variant \ | timbral_signature | cardinal on 12 rows, cue_variant on 2 |
parent_theme_id | a theme_id | blank 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.**
| cell | before → after | citation |
|---|---|---|
theme_name | Cassius Phase 1 → Cassius Velheim | §1.5: "CASSIUS_VELHEIM — Tier A, class tune. The three live rows ... collapse into one cardinal motif" |
row_class | (new) → cardinal | §1.5 |
notes | PREFIX + the original, unchanged | §1.5 (three logged transformations: social, combat, resolution); §6.5 (escalation by carrier migration); HL_0109 (never generated) |
theme_id | unchanged | §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_relevance | byte-identical | brief: 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.
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.
theme_name: Vimana Activation → Vril 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.
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).
| cell | value (abridged) | grounding |
|---|---|---|
theme_type | concept | live enum, as FAMILIAR_BOND; Appendix S maps *family* onto theme_type and no new token is needed |
canonical_anchor | Talvaeren 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_substrate | chamber-scale orchestral, one solo carrier; the Prologue/Ch-1 abundance register; near-silence at the mother's scene; abundance returned unironised at the exit | CH_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_substrate | all eras across 77-chapter arc; origin statement at the Prologue and Ch 1 | live idiom (PROTAGONIST_THEME, FAMILIAR_BOND) |
recurrence_anchors | beats CHPRO_B07, CHPRO_B16, CH01_B13, CH01_B08, CH02_B11, CH13_B13, named as beats and explicitly not as a scene FK | those 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_relevance | see below | HL_0116 / HL_0043 / HL_0046 / HL_0099 / HL_0095 (all five positive-controlled against T0_Hard_Lines [ACTIVE v0.2]); §1.8 |
notes | Tier 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.
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).
| cell | value (abridged) | grounding |
|---|---|---|
theme_type | concept | live enum |
canonical_anchor | the 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 dungeons | SEAM_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_substrate | orchestral 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_substrate | all eras across 77-chapter arc | live idiom |
recurrence_anchors | every inter-node seam (78, typed T0-T3; zero typed on disk today) plus per-region overworld traversal | SEAM_TYPING_SPEC.md §0.3 — the honest state is recorded rather than implied |
hard_line_relevance | see below | §1.9; §0 sourcing law; CVD 17.1 |
notes | Tier 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."
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.
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).
{28: 15} — no ragged rows; no duplicateheader names; both new columns present on every row.
row_class census {cardinal: 12, cue_variant: 2}; no empty row_class; every 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.
hard_line_relevance byte-identical on all 12 live rows. Original notes preserved verbatim as asuffix (three Cassius rows) or a prefix (VIMANA).
{U+00A7 x41, U+2014 x11} in source and output — no mojibake, andevery newly authored byte is pure ASCII (asserted in-script).
mood_tags, recurrence_anchors, populated_from, recent_changes, extensions) parse on all 14 rows.
Grand Sage 7→7, GRAND_SAGE_REVEAL 2→2, Ch 77 9→9, 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.)
ALREADY APPLIED, refusing to re-apply (exit 2, nothingwritten); 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).
(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.)
| row | cells changed |
|---|---|
| CASSIUS_PHASE_1 | theme_name, notes, recent_changes, last_updated, version (5) |
| CASSIUS_PHASE_2 | notes, recent_changes, last_updated, version (4) |
| CASSIUS_PHASE_3 | notes, recent_changes, last_updated, version (4) |
| VIMANA_ACTIVATION | theme_name, notes, recent_changes, last_updated, version (5) |
| all 14 rows | row_class populated (14); parent_theme_id populated on 2 |
| HOME_AND_LOSS, JOURNEY_WORLD | new rows, 28 cells each |
last_updated = 2026-07-29T00:00:00Z and version = 1.0.0 → 1.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.
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.