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
+81
View File
@@ -0,0 +1,81 @@
# The three readings
The protagonist's amnesia is a dissociative fugue, and what is walled off is their own identity
rather than an external event.
**The design is ontological, not epistemic.** There is no single hidden fact of the matter that
the game is withholding and will eventually reveal. The three readings below can overlap and
partially coexist. The player "discovers" an identity by choosing which evidence to trust, and
lean accumulates from play rather than from one declare-your-identity choice at the end.
This is the constraint most likely to be broken by accident, because almost every instinct a
mystery writer has runs the other way. There is no answer. Do not write toward one.
## The candidates
Registry: `Assets/Candidates/candidates.json`. Adding a fourth means a JSON entry, one
`<<declare>>`, and content — never editing a list of three in code.
### The Made Asset — `made_asset`, Reason axis
> The PC was trained, conditioned, or activated by one of the factions for a role near the
> central conference.
Its intuition is fluency: parsing something coded or ritual *before* consciously trying to.
CONFLUENCE carries it.
### The Journalist — `journalist`, Social axis
> The PC came for a specific person, not a story; "journalist" is a cover identity.
Its intuition is a reaction that lands wrong and cannot yet be explained — a flinch that is not
a stranger's flinch. FACEWORK carries it.
### The Inheritor — `inheritor`, Self axis
> This was never the PC's own story; a parent or elder relative had standing or a debt with a
> faction, which passed without full consent.
Its intuition is the body knowing an etiquette the mind never learned — correcting a place
setting by a rule you were never taught. STANDING ORDER carries it.
## Evidence balance
Each candidate carries **exactly one of each type**: one object, one testimony, one document,
one intuition. Never stack types, or trust becomes an artefact of imbalance rather than of play.
Current state — the three intuitions are authored in SC-101; **the other nine clues are all
`Planned` with no scene**:
| | Object | Testimony | Document | Intuition |
|---|---|---|---|---|
| Made Asset | planned | planned | planned | **SC101** (CONFLUENCE) |
| Journalist | planned | planned | planned | **SC101** (FACEWORK) |
| Inheritor | planned | planned | planned | **SC101** (STANDING ORDER) |
Each planned clue already has its unlock flag reserved — `$visited_back_office`,
`$errand_door_list`, `$visited_archives`, and so on. Those flags name the locations and errands
the game still needs.
## Rules that bind
1. **Never compare one lean against another.** Not in Yarn, not in prose, not in a debug line.
Comparing a lean against a *constant* is fine and intended. There is no winner, no
`$dominant_candidate`, no ranking.
2. **No ground-truth field anywhere** — nothing named `isTrue`, `actualIdentity`, `canonical`,
or `weight`, in any file or in save data. Persistence is three integers and some booleans,
and contains no answer.
3. **Clue availability is exploration-gated, never skill-gated.** An `unlockFlag` names a
`$visited_*` or `$errand_*` variable. A clue-bearing node never sits behind `skill_rank(`.
4. **Discovery order must be player-steerable**, so no candidate is reliably surfaced first.
5. **Voices advocate for a reading**, so trust in it tracks which part of the protagonist wants
it to be true. No voice states a candidate as settled fact.
6. **Lean is belief, not truth** — a Wrong Truth still writes lean. Being wrong moves the needle.
7. **Keep clear of Thread 2 and Thread 9.** Those two lore threads never resolve; do not map any
candidate clue onto them.
## Where the rest lives
The full design argument is `[[Candidate System — Design Explanation]]` in the vault. The
implementation plans are `docs/candidate-system-plan.md` and
`docs/candidate-system-implementation-plan.md`.