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:
@@ -0,0 +1,63 @@
|
||||
---
|
||||
id: <kebab-case-id>
|
||||
name: <exact string used as the Yarn speaker prefix>
|
||||
chr: CHR-### # the vault sheet this projects from, if one exists
|
||||
yarn_file: Assets/Dialogue/Characters/<File>.yarn
|
||||
status: planned # planned | drafted | in-engine | tested
|
||||
scenes: [SC101]
|
||||
---
|
||||
|
||||
# <Name>
|
||||
|
||||
> **This is the dialogue-facing sheet.** The full character record — placement in the Lorebook,
|
||||
> faction row, the two truths, sensitivity check, continuity hooks — lives in the vault at
|
||||
> `[[Character Sheet Handbook]]`, one file per character. Fill that one *first* for any figure
|
||||
> who touches real history or a faction. This sheet exists so a writing session can pick the
|
||||
> character up and write them without loading all of it.
|
||||
|
||||
## Who they are
|
||||
|
||||
One paragraph. What they want *tonight*, in this room — not their life goal.
|
||||
|
||||
## How they speak
|
||||
|
||||
Register in three adjectives. Sentence length. Do they contract? Do they use the player's name,
|
||||
and which form — `{$player_name}`, `{$player_name_full}`, or `{$player_alias}`? Anything a
|
||||
reader could imitate.
|
||||
|
||||
## Verbal tics
|
||||
|
||||
At most two. More than two is a costume, not a voice.
|
||||
|
||||
## What they never say or do
|
||||
|
||||
The negative constraints. Usually more useful than the positive ones.
|
||||
|
||||
## What they know
|
||||
|
||||
One row per thing the player can learn from them. "Reveals when" names the actual condition;
|
||||
"records" names the flag that remembers it.
|
||||
|
||||
| They know | True? | Reveals when | Records |
|
||||
|---|---|---|---|
|
||||
| | | | |
|
||||
|
||||
## What they are wrong about
|
||||
|
||||
Where their confidence outruns their information. This is what makes them a source of Wrong
|
||||
Truths rather than an oracle.
|
||||
|
||||
## Their read on the protagonist
|
||||
|
||||
Which candidate reading, if any, they push — and what happens if the player agrees or refuses.
|
||||
Remember they advocate; they never state an identity as settled fact.
|
||||
|
||||
## One line that is 100% them
|
||||
|
||||
Written now, before a scene needs it.
|
||||
|
||||
> "..."
|
||||
|
||||
## Open threads
|
||||
|
||||
What is unwritten, unresolved, or deliberately left open. Link the vault note if there is one.
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
id: bartender
|
||||
name: Bartender
|
||||
chr: —
|
||||
yarn_file: Assets/Dialogue/Characters/Bartender.yarn
|
||||
status: drafted
|
||||
scenes: [SC101]
|
||||
---
|
||||
|
||||
# The Bartender
|
||||
|
||||
## Who they are
|
||||
|
||||
He is behind the bar at a conference that is pretending to be a party, and he has been behind
|
||||
it long enough to have opinions he will not offer. He recognises the protagonist. He is certain
|
||||
he has served them before, with Mr. Doss, a few days ago — and he says so casually, the way you
|
||||
mention the weather, without any idea that he has just detonated something. What he wants
|
||||
tonight is an ordinary shift. He is not going to get one.
|
||||
|
||||
FACEWORK reads him as a watcher: a man who tends the bar *and* observes, and reports back. That
|
||||
reading is FACEWORK's, and FACEWORK advocates rather than reports — it may well be wrong. Do
|
||||
not resolve it in his prose.
|
||||
|
||||
## How they speak
|
||||
|
||||
Warm, clipped, incurious on the surface. Short sentences. Contracts freely — "What can I get
|
||||
ya?" He uses `{$player_alias}`, the club name, never the real one. That detail is load-bearing:
|
||||
he knows the protagonist by a name the protagonist does not remember choosing.
|
||||
|
||||
## Verbal tics
|
||||
|
||||
1. Opens with "Ah," — recognition offered before it is earned.
|
||||
2. Names the drink rather than the person: "One Estate coming right up."
|
||||
|
||||
## What they never say or do
|
||||
|
||||
He never asks why the protagonist does not remember. He notices the strangeness, files it, and
|
||||
pours. He never raises the matter of Doss himself — he answers about him, and only when asked.
|
||||
|
||||
## What they know
|
||||
|
||||
| They know | True? | Reveals when | Records |
|
||||
|---|---|---|---|
|
||||
| The protagonist has been here before | believed, unverified | first conversation, unprompted | `$spoke_to_bartender` |
|
||||
| They were with Mr. Doss "a few days ago" | believed, unverified | if the player denies having been here | `$looking_for_doss` |
|
||||
| Their usual drink is the Estate | believed | on ordering, or "what can you recommend" | `$had_the_estate_drink` |
|
||||
|
||||
## What they are wrong about
|
||||
|
||||
Possibly nothing. Possibly the entire identification. He is confident and casual, which is
|
||||
exactly the register a Wrong Truth wears — except this one is his, not a voice's. Whether the
|
||||
protagonist was ever here is not settled by him saying so, and the writing must not let his
|
||||
certainty function as proof.
|
||||
|
||||
## Their read on the protagonist
|
||||
|
||||
He pushes the **Made Asset** reading without meaning to — someone known here, under a name they
|
||||
do not remember, in company they cannot account for. Revealing the fugue to him sets
|
||||
`$revealed_fugue_to_bartender` and adds to `$self_lean_made_asset`. Claiming "the usual" instead
|
||||
adds to `$self_lean_inheritor` — a person with a standing order is a person with a past here.
|
||||
|
||||
Note the drink beat writes lean in **both directions**: agreeing the Estate tastes familiar adds
|
||||
to the Inheritor lean, denying it subtracts. It is the one place a player can actively push a
|
||||
lean down, and it only counts on the first glass.
|
||||
|
||||
## One line that is 100% them
|
||||
|
||||
> "I could have sworn you are {$player_alias}, weren't you with Mr. Doss a few days ago?"
|
||||
|
||||
## Open threads
|
||||
|
||||
`SC101_Hook_Questions_Bartender_Talk` is **placeholder text** — literally "Question 1 / Answer
|
||||
1". It is a working hub-and-spoke loop with nothing in it. This is the single largest piece of
|
||||
unwritten dialogue in the shipped scene, and the natural home for testimony-channel clues,
|
||||
which the candidate registry currently lists as `Planned` for all three candidates.
|
||||
|
||||
Mr. Doss never appears. He is referenced by the Bartender and by Chevalier Cassian Thal, who
|
||||
calls him "your friend" — two independent sources treating the protagonist's connection to him
|
||||
as established fact.
|
||||
@@ -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.
|
||||
@@ -0,0 +1,88 @@
|
||||
---
|
||||
id: chevalier-cassian-thal
|
||||
name: Chevalier Cassian Thal
|
||||
chr: —
|
||||
yarn_file: Assets/Dialogue/Characters/Chevalier Cassian Thal.yarn
|
||||
status: drafted
|
||||
scenes: [SC101]
|
||||
---
|
||||
|
||||
# Chevalier Cassian Thal
|
||||
|
||||
## Who they are
|
||||
|
||||
A knight, of Basel and Cyprus, seated at the table nearer the head than the protagonist is. He
|
||||
introduces himself with a bow and a half-open fist to the forehead — an old form, performed
|
||||
without irony. Old money, and comfortable in it. He is here as part of something ("the Knight's
|
||||
compromise", "our friends of the Vaselian Concordat") and he speaks about it as though everyone
|
||||
at the table already knows, because in his world everyone does.
|
||||
|
||||
He is the scene's mirror: whatever the protagonist has been leaning toward, he names it back at
|
||||
them, gently, and waits. He is rarely wrong in matters like these, as he will tell you.
|
||||
|
||||
## How they speak
|
||||
|
||||
Courteous, archaic, warm. Slightly too familiar too quickly — "old chap", "my boy" — which reads
|
||||
as class rather than affection. He uses `{$player_name_full}`, the formal form, when he is being
|
||||
precise. He laughs easily and often, including at things that are not jokes.
|
||||
|
||||
## Verbal tics
|
||||
|
||||
1. Slips into the institutional "we" and "us" without noticing, then does not correct it.
|
||||
2. Deflects with courtesy rather than refusal — "I am of no right to reveal this."
|
||||
|
||||
## What they never say or do
|
||||
|
||||
He never threatens and never withholds coldly; every evasion is dressed as politeness. He does
|
||||
not name the Concordat's business outright, and he never breaks the fiction that the protagonist
|
||||
already belongs at this table.
|
||||
|
||||
## What they know
|
||||
|
||||
| They know | True? | Reveals when | Records |
|
||||
|---|---|---|---|
|
||||
| He is of Basel and Cyprus | true | on introduction | `$spoke_to_chevalier_cassian_thal` |
|
||||
| Cyprus connects to something he won't name | true | `<<check provenance Hard>>` succeeds, then the player inquires | `$inquired_about_cyprus` |
|
||||
| Mr. Doss can explain the Cyprus connection | believed | on inquiring about Cyprus | `$looking_for_doss` |
|
||||
| Something is about to happen at the table | true | after the protagonist declares a reading | `$declared_candidate_to_chevalier_cassian_thal` |
|
||||
|
||||
## What they are wrong about
|
||||
|
||||
He is certain he knows what the protagonist is. He is working from whatever the protagonist has
|
||||
been projecting — which is to say from the lean, which is belief rather than truth. His
|
||||
confidence is sincere and is not evidence. When he says "I am rarely wrong in matters like
|
||||
these", that is characterisation, not a hint from the author.
|
||||
|
||||
## Their read on the protagonist
|
||||
|
||||
He is the game's first mirror mechanic. `SC101_Asks_Candidate_Chevalier_Cassian_Thal_Talk`
|
||||
computes `top_skill(...)` over the three leans and asks the matching question:
|
||||
|
||||
| Leading reading | What he asks |
|
||||
|---|---|
|
||||
| Made Asset | whether they observe on behalf of the Vaselian Concordat |
|
||||
| Journalist | whether he will read his answers in tomorrow's paper |
|
||||
| Inheritor | whether they are here to settle a parent's debts |
|
||||
|
||||
Agreeing reinforces that lean. Denying adds to *both other* leans — a refusal is not neutral, it
|
||||
is a push toward the alternatives. Denial routes to `SC101_Deny_Candidate`, which recomputes the
|
||||
winner and, if it has not changed, offers the player the chance to reverse; if it has changed,
|
||||
he simply asks the new question. The player can be walked around this loop.
|
||||
|
||||
`made_asset` is passed first to `top_skill`, which returns its first argument on a tie — so an
|
||||
even score reads as Made Asset. That bias is deliberate.
|
||||
|
||||
## One line that is 100% them
|
||||
|
||||
> "Well, then let us hope the ... others follow the Knight's compromise."
|
||||
|
||||
## Open threads
|
||||
|
||||
The Atlantean cross on the place card (`$saw_knights_atlantean_cross_on_place_card`, found via a
|
||||
`Hard` PROVENANCE check) is never connected to him in dialogue, though he is a knight and the
|
||||
symbol is a knight's. That connection is available and unwritten.
|
||||
|
||||
His faction, the Vaselian Concordat, and "the Knight's compromise" are named but not explained.
|
||||
Before writing more of him, confirm his faction row against `[[Lorebook]]` §2 — the vault's
|
||||
`[[Character Sheet Handbook]]` exists specifically because figures drifting from the faction
|
||||
tables is a logged, repeated failure in this project.
|
||||
Reference in New Issue
Block a user