decisions/spine/player_strings/README.md
One authored CSV per spine node (CH_NN.csv), columns
kind,key,player_text,string_status,voice_register_ref. This is the ONLY
text lane that may reach a player surface for objectives, fork options, site names, and chapter
titles — the designer objective/option prose in the spine docs is internal and leaks reveals
by design (it states mechanisms, care notes, and future-chapter anchors).
kind=beat, key = beat_id → merged into build/spine_rows/<node>/beats.csv as player_objective.kind=fork_option, key = fork_id:option_index → merged into fork_options.csv as player_option.kind=site, key = site_id → merged into sites.csv as display_name.kind=chapter, key = chapter_id → the player-facing chapter/quest title (consumer: the W10 UIwave reads it at import; not merged into a per-node table yet).
Every row also carries its lifecycle state (added 2026-07-28ag, blocker B2 of the natural-voice
wave — before it the lane could not express the ratified enum at all):
string_status — the ratified enum placeholder → authored → voice_passed. authored means the words exist; voice_passed means a fresh-context natural-voice critic cleared them on
all four lenses (reveal / person-voice / culture / voice-source). Blank reads as placeholder.
voice_register_ref — the cultural register the line is written in: a voice_id in T0_Voice_Registry whose row_class is cultural_register (the TTS casting rows are a
different row class and are never a register). Required once a row is voice_passed.
Both columns are OPTIONAL on disk: a 3-column file authored before the schema change still parses,
reading as placeholder with an empty register. harness/extract_spine_rows.py REJECTS a status
the enum does not contain and a voice_passed row with no register (the T-A10 clause, enforced in
the lane), and merges all three values into the emitted tables — player_objective /
player_option / display_name beside string_status and voice_register_ref.
Merge happens in harness/extract_spine_rows.py (empty where unauthored — the columns exist on
every node, values only where a sidecar row is authored). Authoring rules: vague-but-honest
stage-0 register (docs/FUN_REBUILD_PLAN.md R3.3/R7.1) — no mechanic solutions, no internal
taxonomy or IDs, no reveal pre-tells, no future-chapter references; reveal-discipline critic
required before landing, same as any canon edit. The clue-staged objective display (DT_Clue
stages) LAYERS ON TOP of the stage-0 string at runtime — this file carries only the base string.