decisions/spine/v3_exemplars/FABLE_V3_VALIDATION.md
Fable-5 validated docs/SPINE_SCHEMA_v3.md + the CH_39_v3 / CH_12_v3 exemplars against T1_Build_Pipeline_Contracts (§1/§5/§6/§7) and verified the integrity model against T1_Integrity_Paths §3.2/§3.5/§5.1/§6.3/§10.6 + T0_Worldstate_Variables + T0_Hard_Lines. Full transcript: the wf agent abc8f08c output. This doc is the durable verdict + the reconciliation checklist Opus applies before the package goes to Josh.
"The architecture is right, the integrity correction is verified canon (apply it), markdown format is right, and the join-and-type approach is proven feasible by the exemplars — every typed CH_39_v3 row traces to content already in CH_39.md. Do not ratify as-written." 8 blocking changes, all cheap, all pre-ratification.
{site_id, terrain_type (§7.3 enum: forest/mountain/desert/wetland/coastal/urban/ruins/sacred_site/agricultural/wilderness/cave_system/water_body), gameplay_function[], ambient_threat, vril_density, climactic_affordance_tags[], protected_flag, [SRC:]}. Beats re-key to these site_ids.direction + class-bounded delta + axis_value (where assimilation) + a required direction-coverage annotation. Bands live ONLY in the derived axes — labeling options L1-L5 re-imports the exact conflation the integrity fix kills (and it silently dropped honorable_open from CH_12's assimilation fork). Six-option dialogue forks author the canonical six + a collapse map (CH_39's FORK_B already does this right).path_dispatch node kind + a path-invariant path_bucket value (ALL) and reconcile the contract's Decision-2B enum {truly_good,good_enough,evil,convergence_neutral,pre_branch} with registry WS_004 {TRULY_GOOD,GOOD_ENOUGH,EVIL,UNLOCKED} in the SAME commit. Post-lock nodes (66-77, Epilogue, the Father reunion, the endings — 13+ nodes) select variants by the LOCKED path with NO player choice + NO integrity delta; fork_kind had no value for this, so they were untypable.gameplay_function (closed superset + its projection table onto the Pillar-1.12 five combat/puzzle/learning/character/transformation for the mode roll-up); scene_type = §5.5's 11 values VERBATIM; SQ stage {SEED/ADVANCE/GATE/COMPLETE} (CH_12 used a non-enum OPEN); fork_kind. Grammars: (a) state keys split ws.* (MUST resolve to a WS_NNN, gate-checked) vs local.* (chapter-scoped, consumed-in-chapter or explicitly promoted) — *the single highest-leverage fix*; (b) systems_touched prefixes FK-checked (ability:A_F_012 real IDs, not ability:third_eye_probability_sight); (c) gate/condition expressions with a produce-before-consume rule (every consumed flag produced by a prior beat's exit_state).thread_refs[] = {THREAD_NN, stage} per beat (canonical THREAD_NN encoding, gate-checked vs the roster — NOT T3 smuggled in systems_touched, which hits the dual-encoding Known-Issue-3 + the recurring thread-mislabel MAJOR), and first-class participant_refs[] actually present on every beat (not smuggled as npc:/companion:/antagonist:).none, + a beat_id PERMANENCE rule (once committed a beat_id is never renumbered; insertions take the next free number, seq carries order — QW hangs 3-9M words off these IDs). Written into the schema as the authoring template. (The two exemplars already drifted from each other — field names dropped, inline vs nested, SQ OPEN, participant_refs on zero beats — proving the consistency risk.)harness/check_spine_graph.py FIRST, green on both regenerated exemplars, wired into run_gates.py (gate-first, per the PHASE0 lessons; building it after 5 chapters is how the v2-era drift happened). Checks: ID uniqueness/reference closure; closed enums; FK-resolvable systems_touched; thread encoding; flag produce-before-consume; seam equality over ws.* keys; Block 19 == fold(deltas); per-beat hard_line presence; fork coverage; mark_write producer/consumer continuity (every forward-track target chapter actually reads the mark).path_dispatch for its 2-vs-3-phase Father encounter). Don't ratify on pre-lock exemplars only.dramatic_role per beat (hook/core/climax/exit — RP §7.3 S13 entry/core/climax/exit for free).thematic_anchor/audio_priority_layer/scene_audio_intent) authored in-spine, or an explicit deferral rule (not exemplar silence).[DECISION NEEDED - JOSH] (numerical canon).objective/hard_line_relevance lines are NEW text → the who-frame discipline applies).normalize-doc critic rubric needs a v3 section.docs/SPINE_SCHEMA_v3.md (v3.1, commit 9c965bf): typed site rows (§3b), action-keyed fork options + coverage with bands DERIVED-only (§3c/B2), path_dispatch node kind + ALL path_bucket + Decision-2B reconciliation (§1/§3c/B3), closed enums + the three grammars (§4/§5/B4), first-class thread_refs/actors (§3a/B5), one row grammar + fixed order + beat_id permanence + §9 thin-index (§3/B6).harness/check_spine_graph.py and wired it into run_gates.py as the spine_graph gate. Teeth-verified: 7 injected faults (bad enum, unresolvable ws key, dangling fork ref, unresolvable ability FK, consume-before-produce, Cassius-before-naming leak, off-roster thread) each caught with exit 1. Full suite is 10/10 PASS, exit 0.CH_12_v3 early/assimilation, CH_39_v3 modern, CH_76_v3 finale/path_dispatch) to the v3.1 template; the gate is green on all three (remaining output is expected WARN-only: cross-file mark_write forward-track continuity + FOUNDATIONAL §5.4-catalogue, neither verifiable from a 3-exemplar set).wf_e8911891-747, one high-effort reviewer per exemplar) run over the three regenerated exemplars before commit-as-final (the standing "a prose rewrite can introduce a gate-invisible error" discipline). Result: reveal / care / integrity-vocab all CLEAN on all three; 5 fidelity findings surfaced and ALL fixed — (1) CH_39 B01 mislabelled the Ch-12 Yoruba coast "the deep-time chapter" (regression I introduced in the rewrite; contradicted the source's reserved use + B08 + the RR-42 D-17 dating fix) → restored the era-agnostic referent; (2) CH_12 B08 Anansi mis-threaded THREAD_17→THREAD_11, B04 abiku off THREAD_17→THREAD_12, B09 Ogboni THREAD_12→THREAD_08 (+ B02/B03/B06/B07/B10 stage/number corrected against the source Block 5), and the Akan (fourth people, CHAR_0093/Thread 9+17) added as a typed beat + scene rather than preserved-only; (3) CH_76 restored the banking-construct sub-encounter (the guardrail's playable "instrument, never the secret") into B04 + §9 and added CHAR_0002 (the journal-author companion) to the B03/scene participant graph. Re-gated green. (The thread-number mislabels are exactly the gate-invisible MAJOR the thread-roster-canonical discipline exists to catch — the gate checks roster membership, the adversarial verify checks semantic correctness.)