Visual novel — the Experience medium
From the Meridians Wiki · Public · Maintained · human-contract
Status: rough spec (direction). Not an implementation contract; nothing here ships until scheduled.
Who it is built for, since it decides most arguments here: the roleplay-minded reader who would rather decide inside a story than watch one resolve. Every feature below is judged against that — a commitment must feel like a commitment, a POV must genuinely withhold, and a second run must be a different story rather than the same pages again. If a proposal makes the reading smoother but the deciding weaker, it is the wrong trade.
The value proposition, in one line
A better book. Not a longer one, not an AI-written one — a book that keeps the four things the printed page has to fake, and every argument in this folder resolves against them:
| Property | What it means here | What it costs if we get it wrong |
|---|---|---|
| Consequence | A choice moves typed world state, and the world computes what follows. A fork whose branches differ only in prose is a version, not a decision. | Weightless branching — the failure mode of every generated CYOA. |
| Meaning | A world is interpretable: themes are patterns the record keeps producing, shown with the events that support them and what would falsify them. | Atmosphere standing in for a claim; a moral asserted rather than earned. |
| Perspective | POV genuinely withholds. A seat reads only what it could know, remember, reach, and afford at that moment. | Omniscience by convenience, which kills both mystery and roleplay. |
| Immersion | Sprites, plates, artifacts, staging, and the discipline of a scene, prepared before reading so nothing stalls on a model call. | A chat window with a background image. |
Everything downstream — the reference chain for sprite identity, the cliffhanger contract, the reader transport, the exploration budget — exists to buy one of those four and is worth exactly what it buys.
What we are building toward (next roadmap)
The four properties are what the reader gets once. What brings them back is a fifth thing the printed page cannot do: the book remembers you. A second run is a different story because the world kept your first, and because you return knowing what another seat knew. That is the practice record, and the Experience is where it starts — the training world, the first thing sold and the first to prove.
| What the reader gets | Because | Gate |
|---|---|---|
| A prepared world, read at book-like cost | produced once, served; nothing stalls on a model call | one original training world end to end — two routes, two seats — measured on completion and second-seat rate |
| The second seat | perspective genuinely withheld is the reason to re-enter | second-seat rate on that world |
| A record that is yours | consequence read back afterwards, never scored live, never a rating | readers keep it |
The next roadmap's job for this medium is to produce that one Experience and measure those three things — not to widen the ontology. The target shape of that Experience — a short, original, emotionally true world with a canonical good route, divert and rejoin, and a reading given back afterwards — is the training worlds spec. Every build item in §9 that does not shorten the path to a played, measured Experience is deferred behind ones that do. The reader shell, the commitment contract, the ending card, and Factory coverage are on the path; a second renderer, a richer score, or a new evidence system are not.
Boundaries the framing does not move: no pricing, retention, or demand figure for novels is quoted until one has been observed; the record is evidence of practice inside a declared world, perspective, and interval, never a verdict on the reader (promise); and whether anything practised here transfers outside the fiction is an independent question this medium does not answer.
Experience is the product name for this medium: one of the three ways a Domain is inhabited, alongside Scenario (decided) and World (wandered). Episode remains its unit of delivery and Script its scaffold — Experience names the medium, it does not rename either. See the product model for the three-medium contract.
This specification owns one thing: what a visual-novel delivery of an Episode is, and what it may and may
not do. It does not own presentation craft, and it does not introduce a second renderer, score, resolver,
or evidence system. Composition, camera, performance, sound, and editorial craft stay with Stageplay and its
craft skills (stageplay-production, stageplay-editorial-craft, stageplay-set-craft,
sprite-performance-craft, stageplay-audio-effects-craft) — the visual-novel close view is already one of
Stageplay's projections, and this spec is the delivery shell around it.
Authority is unchanged and non-negotiable:
Domain defines. Branch preserves. Scenario resolves. Episode embodies. World inherits and lives.
You decide in a Scenario, read an Experience, and wander a World.
The spine
This folder is one specification in seven parts, sequenced the way the pipeline runs. Read them in order; each owns exactly one stage and defers to its neighbours rather than restating them.
canon scaffold supply fork look experience
Scene.summary → ScriptContent → mandate · → the cliffhanger → sprites · → the reader
+ typed deltas (a projection) direction · and the choice plates · transport ·
(the truth) Reading CGs · style saves · POV
| Stage | Document | Owns |
|---|---|---|
| Substrate | scaffold | Summary + deltas as truth, Script as a regenerable projection, entity registers, delta-derived staging, POV as a seat projection |
| Supply | branching | How a fork is produced and priced — Mandate (the trajectory), direction (the steer), Reading (the priced fan), and the topology it should produce |
| Fork | decisions | How a fork is built up to, what makes it a cliffhanger, and the commitment contract in practice |
| Systems | systems | Decision weight below a fork (texture · accumulating · gated), accumulation without flags, and the medium's engagement devices with adopt/adapt/refuse verdicts |
| Commitment | flags | The ontology of a reader's commitment — nature (divergent · conditional · personal), verb (choose · guess · tell), vantage, the three harvests, and the faculties repeated play is meant to train |
| Look | production | The asset inventory, Factory control surface, reference chain for identity, style lock, and what a production costs |
| Experience | reader | The dedicated reader interface: transport, backlog, auto/skip, saves, flowchart |
| Delivery | this document | What the modality is, its two postures, and what it may never do |
Its supply side beyond the fork — how a timeline is scouted cheaply and earns production at all — is budgeted fate exploration.
Surrounding context: human practice (the two Episode postures), Play vocabulary (Episode · posture · modality · Will), reasoning vocabulary (Mandate — the branch-scoped trajectory of peaks and valleys), Memory Palace (the experiential frame), narrative convention (scene classes and beat mechanisms), World concept contract (what happens to a mature branch).
The subsystems it reads: src/types/domain/stage.ts (ScriptContent → ScriptFrame → ScriptMoment),
src/types/domain/branch.ts (Branch, SceneVersionPointers), src/types/domain/futures.ts (Future /
FutureRun — the sister continuations and their priorLogit), src/types/domain/scene.ts
(WorldExpansion deltas), src/lib/core/io/script-export.ts (the existing export seam).
The claim. A dense causal structure is a bad read as a document and a good read as a passage. A catch-up Episode already turns accepted branch state into an immersive passage; the visual novel is the reader-paced form of that passage — one moment per advance, a stable stage, and a commitment at each fork — plus the traversal affordances that make a branching record explorable rather than exhausting. It is a modality, not a new truth: it changes affordances and pacing, never canonical state.
1. What this modality is for
Existing deliveries are timed: a score plays, the audience watches. That is right for a set-piece and wrong for a causally dense passage, where the reader needs to control the clock, re-read the line they skimmed, and stand at a fork long enough to weigh it. The visual-novel grammar solves exactly that, and it is the only popular medium whose entire vocabulary is built for branching.
Two postures, matching human practice exactly:
- Catch-up (read). Accepted branch material, delivered reader-paced. No new Will. The reader may traverse forks that already exist on the branch tree — a commitment here selects which accepted or candidate continuation to read next, and writes nothing.
- Live (direct). At a decision window, the delivery hands off to a bounded Scenario exactly as any live Episode does. The reader's commitment becomes real Will, resolved through the governed path, and the branch preserves the consequence. The visual-novel frame is the roleplay skin over that window — it never resolves anything itself.
Conflating those two is the failure mode this spec exists to prevent: a reader must always know whether the commitment in front of them selects a passage or spends Will.
2. The medium, taken seriously
Designing "in the authentic style" means adopting the medium's actual grammar rather than a scrolling transcript with pictures. Each convention below is load-bearing — it solves a problem a naive reader re-encounters — and each maps onto something the record already carries.
| Convention | What it is in the medium | What it becomes here |
|---|---|---|
| The textbox contract | One moment at a time, advanced by the reader. The reader owns the clock; nothing scrolls away. | ScriptMoment is already the atom. One moment per advance, no exceptions. |
| The stable stage | Backdrop and figures persist; only what changes, changes. Stillness is the default, not missing animation. | ScriptFrame is already a stable composition; a new frame begins only when staging changes. |
| Figure staging | Fixed horizontal slots; who faces whom and who is dimmed carries the meaning. | ScriptCastMember.slot / facing / state — five slots, already modelled. |
| Speaker attribution | A nameplate names the voice; unattributed text is the narrator. | ScriptMoment.speaker present = character; absent = narration / environment / direction. |
| The backlog | Scrollback of every line, with voice replay. Non-negotiable: readers will click past something. | New. Derived from the cursor's history; no storage beyond the cursor. |
| Auto / skip | Auto-advance at a reading pace; skip-read for seen text, and skip-to-next-fork for replay. | New. Skip-to-next-fork is what makes a branching record explorable rather than exhausting. |
| Save anywhere, many slots | Save at any moment, not at checkpoints — branching invites parallel exploration. | New, and cheap: a save is a cursor (§4), so slots cost bytes. |
| The choice screen | The work stops, options are stated plainly, the reader commits. Two to four options. | Rendered only at a qualifying fork (§3), and labelled with its posture (§1). |
| Routes and endings | A path through the commitments is a route; a route terminates in an ending, and the set of endings is the work's shape. | A route is a path across the branch tree; an ending is a route terminal reported as thread resolutions (§5). |
| The flowchart | 428 and Zero Escape show the branch structure as a map you can jump into — the best affordance ever invented for replayable branching. | The branch tree is already data and already has graph/board projections. Jump-in is legal because a cursor is all a reading position is. |
| Tips / glossary | Terms accumulate as you meet them; a dense work stays legible without exposition dumps. | A projection of the entities appearing on frames already read. Carries the seat's information boundary — never a back door around it. |
| Gallery | Art collected as you unlock it — the reward for exploring. | A filter over the production assets this reader has actually seen. |
| A divergence readout | Steins;Gate's divergence meter: how far this timeline sits from the others. | Forks carry real priors (priorLogit, softmax-weighted), so the readout can be honest rather than decorative — under the disclosure rule in §3. |
Deliberately not taken from the medium: melodramatic register, affection meters, timed choices, and "bad end" framing. The material is a modelled world; the register is documentary (§6).
3. The commitment contract
This section decides whether the modality is a real medium here or a slideshow.
Underneath it sits the product's simulation principle: Will is injected from outside the simulation. The engine supplies the world, the memory, the affordances, and the price of a move; the reader supplies the move. Nothing in the reader may commit on their behalf — auto and skip advance presentation, never a fork (§ transport), a resumed save restores a position rather than replaying a decision, and a recommendation is not offered where a commitment is asked for. The value of a route is that a person chose it: the record of a playthrough should be able to say who moved, from what vantage, and knowing what.
A fork is presented as a choice only when the alternatives differ in world state. Concretely: the
candidate continuations must differ in their WorldExpansion deltas (threadDeltas / worldDeltas /
systemDeltas / ownershipDeltas / …). Two continuations that differ only in prose are versions, not
choices; the reader passes straight through and the better-written version is simply the one delivered.
This governs forks, not every interaction. The medium also runs on commitments that branch nothing — a line you choose to say, a small kindness that moves a relationship, a fact you decide to withhold — and whose effect arrives much later, sometimes as the condition that opens a route at all. Those are graded separately as texture and accumulating picks in systems §1: they never take a choice screen, never stop the work, and never claim a consequence no delta recorded — and the strict gate above stays strict precisely because they exist below it.
A presented choice carries:
- Posture, unmistakably. Traversal ("which accepted passage do I read next") or Will ("this issues a move that Scenario resolves"). Different framing, different confirmation weight; never the same affordance.
- A label in the reader's own second person, derived from the
Future's name and variable coordination — never a raw id, never a probability as the label. - What was weighed, on demand. The
Futurealready carriesconsidered(the option space rejected). It belongs behind an affordance, not dumped on the choice screen. - Divergence after the fact, never before. Priors are real, so they may be shown after commitment. Showing a prior before the choice turns a decision into an instruction and collapses the modality into a recommendation engine. This is a rule, not a preference.
- The consequence, named. After committing, the delivery surfaces which state moved — the thread whose stance shifted, the relationship that changed — as a quiet readout in the instrument register. This is the anti-weightlessness mechanism: the reader watches the world take the delta.
Three further rules:
- No dead options. If a continuation has not been generated (or, in the live posture, is not a legal move), it is not shown. A greyed-out option is a promise the record cannot keep.
- Seat-shaped, or not offered. A choice may only expose what this seat could know. Private beats reach a reader through their own seat or not at all; the glossary, backlog, and flowchart inherit the same boundary. A clearer choice screen is never a reason to leak.
- What would falsify it travels with the route.
breaks— the condition under which a direction was wrong — belongs on the ending card (§5), not the choice screen.
4. The reading position, and what may write
Route the ordered commitments taken across the branch tree
└ Node one timeline entry on a branch (a scene, or a world build read as an interlude)
└ Frame one tableau — ScriptFrame, unchanged
└ Moment one line/thought/action/narration — ScriptMoment, the advance unit
- A reading position is
(branchId, entryIndex, frameIndex, momentIndex)plus the route that reached it. - A save is exactly that, and nothing else. Restoring re-resolves all content from the record through the existing branch/version resolution, so a save can never carry stale content or drift from canon.
- Seen-state (moments read, endings reached, assets seen) is a set of ids per domain — the substrate for skip-read, the glossary, and the gallery.
Reading writes nothing to canon. Not seen-flags, not progress, not "last read at". Reading state lives in client/aux state, per-reader and disposable: losing it loses a bookmark, never content. This is the same relationship the browser projection already has with the record (persistence) and the same rule Stageplay already holds — a delivery may select presentation, never mutate authority.
The only path from a reading session into the record is the live posture (§1): a decision window instantiates a bounded Scenario, and the write happens through that governed path with its own provenance — not through the reader's advance click. A prepared continuation is revalidated against accepted branch state before it is delivered; the delivery never assumes an unresolved move succeeded.
5. Routes, endings, and replay
- A route is derived, never stored as its own object: the branch tree plus the cursor names it.
- An ending is a route terminal — the last entry of a branch with no accepted continuation. The ending
card is not "Ending 3/12 — Good End". It is what the material honestly supports: which threads resolved and
how, which stayed open, and (from
breaks) what would have invalidated the path just read. - The flowchart is the medium's best replay affordance and is nearly free here: the branch tree already renders as graph and board projections. The one addition is jump into any node this reader has visited, legal because a cursor is all a position is. Unexplored sister branches show as unexplored edges — the invitation to re-read.
- Skip-to-next-fork makes a second pass bearable: seen moments advance at skip speed and the reading halts at the first fork where a different commitment is available.
- Comparison is the payoff. Two routes over one situation are two compatible renditions of the same record, which is exactly what the debrief in human practice needs: what this reader anticipated, what another seat knew, what the other route cost.
6. Presentation, and the register problem
Presentation craft belongs to the Stageplay craft skills; this section fixes only the constraints the modality imposes.
The register is documentary, not melodrama. Meridians is quiet-by-default and instrument-shaped
(frontend convention, the frontend-design skill). A
visual-novel frame invites theatrics that modelled material cannot carry, and the resolution is to keep the
medium's grammar and drop its affect.
- The frame. Full-bleed stage, chrome withdrawn. Interface surfaces persist only where they carry function — textbox, choice screen — never as ornament over the plate.
- The textbox keeps a fixed height so text never reflows the stage, sits in the established rail, and
respects real reading time with sound off. Mechanism is styled, not labelled:
linereads as speech,thoughtrecessed,narration/environmentas unattributed caption,action/reaction/comicas stage lines,memoryset back,documentas found text. Speaker, title, and body keep distinct hierarchy. - Staging.
ScriptSlotmaps to fixed positions;facingmirrors the figure;statedrives emphasis — the active speaker lifts, the rest dim.entering/exitingare the only motion that plays on a figure. - One primary changing channel per beat. Typing, camera, gesture, particles, and an animated instrument must not compete for the same line. Transitions are motivated cuts, not drift: crossfade within a scene, a slower change with a location card between nodes.
- Expression variants. The data models seven figure states while the asset lane generates one portrait per character. Either produce a small set per speaking character (neutral / intent / recoil is enough) or accept the flat figure honestly — a wrong-face figure is worse than a still one.
- Audio. Voice optional and per character, with a stable assignment so a re-read never recasts; ambience per location; no score, no stingers. Voiced dialogue binds to its exact transcript.
- Reading controls. Advance, backlog, auto, skip, skip-to-next-fork, save, load — all reachable by keyboard, all readable at phone scale.
7. Preparation and cost
A voiced, illustrated reading is among the most expensive artifacts the instrument can produce. Cost is the binding constraint, not capability, and the controls already exist (unit economics; ceilings enforce against actual trailing spend).
- Preparation is reader- or Director-initiated, never autonomous. Under the spend model explicit user actions fail open and autonomous work fails closed; an autonomous lane that prepares readings can spend a week's ceiling unattended.
- Estimate before spending. Preparation states its cost from the shipped pricer — N missing entity images at the image rate, M characters of dialogue at the voice rate. No new cost machinery, no new lane.
- Assets are per identity lineage, produced once and reused where valid. Factory resolves the route's entity, appearance, expression, place, and moment coverage against approved renditions. Producing per scene multiplies spend by the branching factor for no gain; blindly sharing a post-injury or branch-bound appearance across every route erases history. Reuse requires exact lineage and valid branch/time bounds, not similar labels.
- Voice is opt-in and cached per line version. A re-read must never re-synthesise; editing a line invalidates only that line.
- What preparation adds beyond assets: a label per presented fork, expression variants for speaking characters, and a voice assignment per character. All three are cheap relative to the reading itself.
Which branches are worth preparing at all — and how the exploration that produced them is bounded by a dollar budget rather than a scene count — is owned by budgeted fate exploration. Its finding, in one line: scouting a candidate costs ~2.5% of producing one, and production cost is voice and images, not text.
Preparation freezes a reproducible interpretation package: resolved Script versions, seat projection, active Acting State and Dynamics graph ids at each branch coordinate, and exact Factory asset revisions. Later evidence may produce a better latent model or a repaired sprite set; it prepares a new package rather than silently changing a published passage.
8. Leaving the instrument
If a reading is a consumable artifact it must be shareable outside Meridians, and export must go through the
existing seam (src/lib/core/io/script-export.ts, alongside the scene/epub/board exporters) rather than a
parallel exporter.
- A static bundle — resolved script, images, optional audio, minimal player; a self-contained directory that opens with no runtime. This is the shareable artifact, and it is subject to the existing publish sanitisation: an export carries only what its seat may disclose.
- A Ren'Py project — script files with
menu:blocks at the forks and assets placed by convention. Ren'Py is the medium's lingua franca; exporting to it means the artifact outlives us and can be hand-edited by someone who knows the medium.
Exported readings are catch-up only. A live posture cannot leave the governed path, because resolution lives here.
9. The honest ledger
The local VN experiment audit 🔒
records a deterministic candidate catch-up bundle with reader-paced advance, backlog, local save/load,
auto, seen-only skip, stable frames, digest-pinned assets, and preview-only decisions. It also records
repeatable VN-first composition across several fixed-video trials. This is strong integration evidence,
but it lives in tmp/sfx-lab, lacks held-out and human audience proof, and does not make the permanent
delivery shell shipped. The integration order is owned by the World roadmap.
| Requirement | State | Where |
|---|---|---|
| Tableau model (backdrop · cast · slots · props) | shipped | ScriptContent / ScriptFrame |
| Moment model over the beat mechanisms | shipped | ScriptMoment |
| Figures / backdrops / props by aspect | shipped | entity imageUrl + per-kind composition prompts |
| A renderer that draws and steps a scene | shipped | ScriptView.tsx (authoring surface, not a delivery) |
| Branch tree with forks and per-scene version pointers | shipped | Branch, branch resolution |
| Real alternate continuations with priors | shipped | Future / FutureRun (priorLogit) |
| Metered voice lane | shipped | generateSpeech |
| Export seam | shipped | script-export.ts and its sibling exporters |
| Visual-novel close view as a Stageplay projection | direction | stageplay-production / stageplay-editorial-craft |
| Reader-paced delivery across nodes and branches | build | new |
| Commitment contract (delta-gated forks, posture, consequence readout) | build | new |
| Reading position: cursor · route · saves · seen-state | build | new (client/aux) |
| Backlog · auto · skip · skip-to-next-fork | build | new |
| Flowchart jump-in | build | extends the existing branch projections |
Ending card (resolutions + breaks) | build | new |
| Expression variants + voice assignment | build | extends the image / voice lanes |
| Factory coverage manifest + approved asset package | build | production control surface over the canonical asset store |
| Branch/moment Acting bindings pinned into preparation | build | keeps entity interpretation reproducible across routes |
| Cost estimate on preparation | build | new surface over the shipped pricer |
| Static-bundle / Ren'Py export | build | extends script-export.ts |
10. Risks, and the test that would falsify this
- Weightless commitments — the standard failure of generated branching. Held off structurally by the delta gate and the consequence readout (§3). If most forks fail the gate, that is not a delivery problem: it is the finding that generation is producing variation without consequence.
- Posture confusion — a reader believing they spent Will when they selected a passage, or the reverse. The most serious risk here, because it corrupts the debrief. Mitigated by §1 and §3, and worth a test.
- A second writer — the subtlest risk: a reading surface that starts persisting progress into canon. Mitigated by §4, which should be enforced by a test rather than by discipline.
- A parallel pipeline — a visual-novel renderer, score, or evidence system growing beside Stageplay's. Mitigated by scope: this spec owns the delivery shell and the commitment contract, nothing else.
- Cost — the highest per-artifact spend in the product, held by §7.
- Tone collapse — the frame pulling modelled material toward melodrama, held by §6.
The falsifiable test. Take one domain with a real branching arc. Have a participant read the outline, then read the same material as a reader-paced delivery, and answer the same questions about the causal structure — which factors move which threads, what would invalidate the current read. If reading it as a passage does not beat reading the outline, this modality is an expensive skin and the spec should be abandoned rather than polished.
11. Vocabulary
This spec introduces no new product noun. It is an experience modality of Episode delivery in the existing sense (Play vocabulary), and it reuses:
| Term | Used here to mean |
|---|---|
| Episode delivery | the prepared presentation; this spec describes its reader-paced form |
| Episode posture | catch-up (traversal, no Will) or live (a decision window that wraps Scenario) |
| Passage | one reader's route through a delivery |
| Route | the ordered commitments taken across the branch tree |
| Ending | a route terminal, reported as thread resolutions plus what would have invalidated it |
Deliberately not introduced: "player", "score", "good end", or a second sense of "Scenario" — Scenario is the decision substrate, and a traversal commitment is not one.
12. Open questions
- Who reads it. The Director reading their own branch, a seated participant, or a published audience? Publishing pulls in disclosure, asset rights, and hosting, and substantially changes §8.
- May a reader traverse uncommitted
Futurebranches? It is the more interesting product and needs an unmistakable "this did not happen" signal held for the whole passage, not a badge at the fork. - Where does the live decision window sit visually — inside the textbox grammar, or as a declared transition out to the Scenario surface and back? Both are legal; only one will read as one work.
- Expression variants — worth the spend? Three per speaking character multiplies image cost; a flat figure is honest but flat. A cost/fidelity call, not a technical one.
- How much reasoning goes on stage? The causal structure behind a fork can be an explanatory instrument, or entirely off-stage. Too much makes it a dashboard; too little makes the commitment arbitrary.