README.md

decisions/spine/player_strings/README.md

Player strings — the spoiler-safe player-facing text layer (FUN_REBUILD R7.1/R7.2)

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

wave 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):

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.

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.

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