add a writer-facing content pipeline under writing/

Dialogue was already plain text, so the gap was never the .yarn files. It was
that the character material a writing session needs was either missing or stored
somewhere a writer could not comfortably work.

Three things were wrong. The writing handbook was not in the repo and was cited
by SC101.yarn as though it were. The best voice material — register, verbal tics,
success/failure/passive samples — was a \n-escaped string inside a JSON field.
The named NPCs had no sheets at all, existing only as their Yarn lines.

writing/ now holds the dialogue-facing layer, at the repo root so it gets no
.meta files and is not a Unity asset:

  STYLE.md          register, the five tone moves, the ban list, branching
                    shapes, the Wrong Truth rule, flag families, candidate rules
  YARN-PRIMER.md    the one page of syntax needed to write a scene
  GLOSSARY.md       in-world and project vocabulary
  voices/           the eleven skill voices, one readable sheet each
  characters/       Bartender, Chevalier Cassian Thal, Bradford Kane
  scenes/           SC-101's brief: intent, beats, checks, constraints
  lore/             the three identity readings and the rules that bind them

STYLE.md is a digest of the Mystery Writing Handbook in the Obsidian vault, with
pointers rather than copies. The vault stays the authoring home for design work,
and Ground Truth — the solution document — deliberately stays out of this repo.

The voice sheets are generated from skill_bible.json but are the source of truth
for the prose. tools/writing/sync_voices.py folds edits back; voicelib.py
guarantees notes -> dict -> notes is identity for all eleven, so --to-json on
unchanged sheets is byte-identical. VoiceSheetSyncTests fails the build on drift
in either direction, and was verified to fail on real drift rather than merely
to pass.

SC101.yarn's header is trimmed from prose rationale to the six rules that bind
while editing that file, with the reasoning moved to the scene brief.

EditMode 42/42. YarnCheck compiles 9 files / 35 nodes.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-25 20:23:42 +02:00
co-authored by Claude Opus 5
parent b915ad78c7
commit f1fadf7909
28 changed files with 2766 additions and 21 deletions
+70
View File
@@ -0,0 +1,70 @@
---
id: bradford-kane
name: Bradford Kane
chr: —
yarn_file: Assets/Dialogue/Characters/Bradford Kane.yarn
status: planned
scenes: [SC101]
---
# Bradford Kane
> **Effectively unwritten.** `Bradford_Kane_Talk` contains one line — `<<set
> $spoke_to_bradford_kane = true>>` — and nothing else. The chair menu already offers him as an
> option in every variation, so a player can introduce themselves to him and receive silence.
> This is the most visible gap in SC-101.
## Who they are
*Unwritten.* What exists: he is the gentleman on the protagonist's **right** at the table, the
one seated further from the head than Chevalier Cassian Thal. That is the whole of it.
The structural role is available and worth taking deliberately: the chair scene currently has
one talker and one silence, and the menu variations (`Left_Not_Right`, `Right_Not_Left`, `Both`)
are already built to track both conversations independently. The architecture is waiting for him.
## How they speak
*Unwritten.* One constraint worth honouring: he should not be a second Chevalier. Cassian Thal
is courteous, archaic and institutional. If Kane is also old money at ease, the table has one
voice twice. The name reads American against Thal's continental title — that contrast is free
and probably should be used.
## Verbal tics
*Unwritten.* Maximum two.
## What they never say or do
*Unwritten.*
## What they know
| They know | True? | Reveals when | Records |
|---|---|---|---|
| — | — | — | `$spoke_to_bradford_kane` (set, currently unused by any branch) |
The candidate registry lists **testimony** clues as `Planned` for all three candidates, with no
`sceneId`. Kane is the obvious carrier for at least one: he is already placed, already
reachable, and already has a flag recording that the player met him.
## What they are wrong about
*Unwritten.*
## Their read on the protagonist
*Unwritten.* Note the design constraint before choosing one: Chevalier Cassian Thal already
implements the "mirror the leading lean back at the player" mechanic. Kane should not repeat it.
A contrast would be stronger — a figure who reads the protagonist as one specific thing and
does not update, or one who declines to guess at all.
## One line that is 100% them
*Unwritten. Write this first — it is the cheapest way to find out who he is.*
## Open threads
Everything. Before drafting, fill the vault character sheet (`[[Character Sheet Handbook]]`) —
§1 placement and §2 the two truths — because he does not yet have a faction row, and writing him
before that is exactly the failure mode that document exists to prevent.