Playtest & determinism

Writing branching content without playing it is guesswork. Parlance puts a full play session inside the canvas — with one design decision underneath that makes the rest possible: play is deterministic.

The determinism guarantee

Every session runs on a seeded RNG (mulberry32(seed + stepIndex)). Same seed, same starting state → same rolls, same outcomes, every time. Rewind and replay are exact. The seed changes only when you ask (🎲 randomize, or ⟳ Reroll = seed+1).

That single guarantee is what buys:

A session, end to end

A running playtest session: the active node highlighted on the canvas, a passed Observation check with its d20 roll, applied effects, the discovery pool, and the live state table

A live session on the demo's body-examination scene: the roll, the effects it fired, the discovery pool, and the state it changed — all in one panel.

Open any dialogue, hit ▶ Play (manual):

Edit while playing

A running session survives edits to the scene it's playing. Reword a line, add a node, rewire an edge — state (flags, XP, reputation) carries over and the session re-reads the content, recomputing visible choices where you stand. The loop becomes: hear the beat, fix the beat, hear it again — seconds, not restarts.

Read-only, and honestly so

Playtest never writes to dialogue or layout files — content is byte-identical before and after any session. advance_quest effects appear in the transcript but are no-ops in playtest (quest stage tracking belongs to the host engine — see the engine contract).

Share builds: playtesting beyond the editor

⇪ Share build exports the current scene as a single self-contained HTML file — the same core engine, checks rolling, gates evaluating, scenes routing, in any browser with no install. It's the handoff format for "just play this and tell me if the confession lands": send one file to a writer, a tester, a designer on another team. The demo is exactly such a build.

Next: the hands-on tutorial · turn transcripts into CI tests