Engagement systems — decision weight, accumulation, and what the medium already solved
Source path: knowledge-base/specs/visual-novel/systems.md
# Engagement systems — decision weight, accumulation, and what the medium already solved
Status: **rough spec (direction).** Not an implementation contract; nothing here ships until scheduled.
Companion to [decisions](decisions.md) (how a fork is built up to) and the
[delivery spec](README.md) (§3 owns the commitment contract). This document owns two things neither
covers: **the weight classes of reader interaction below a fork**, and a survey of the **systems the
medium invented** to make choices feel causal — each mapped onto the substrate we already have, with an
explicit adopt / adapt / refuse verdict.
[Flags](flags.md) is its companion on the other axis: this document grades interaction by cost to the
engine, that one classifies the same commitment by what it carries for the reader and which faculty it
trains. Where the two meet: grade 0 is a `personal` flag, grade 1 a `conditional` one, grade 2 a
`divergent` one.
It exists because the delivery spec's rule — *a fork is a choice only when the alternatives differ in
world state* — is correct about **forks** and, read as a rule about all interaction, would delete most of
what the medium actually runs on. Visual novels are full of choices that branch nothing and matter
anyway.
---
## 1. Three grades of decision weight
Not every commitment is a branch. Grading them is what lets the strict fork gate stay strict.
| Grade | What it is | Does it fork the tree? | What it writes | Cost |
|---|---|---|---|---|
| **0 · Texture** | A pick that colours the passage — what you say, where you look, what you refuse to answer. | No | Nothing canonical; the reader's choice is recorded in playthrough state | ~free: alternate moments inside one frame |
| **1 · Accumulating** | A small commitment that nudges standing state — a relationship, a suspicion, a fact learned. Individually inconsequential, jointly decisive. | No | One bounded typed delta (see §2) | ~free: no new branch |
| **2 · Fork** | A commitment that selects between continuations that genuinely differ. | Yes | A route step; in live posture, real Will through Scenario | scout + production per sister |
The strict gate in [decisions §2](decisions.md) applies to **grade 2 only**. Grade 0 and 1 are not
"weak forks" and must never be presented with a fork's affordance — no choice screen, no stopping the
work, no confirmation weight. They occur *inside* the flow of a scene, which is exactly how the medium
plays them.
Two rules keep the grades honest:
- **A grade-1 pick must be answerable later, not immediately.** Its whole nature is deferred effect. A
micro-choice that visibly resolves in the next line is a grade-0 texture pick wearing a costume.
- **Grade 0/1 never claim consequence they do not have.** No "she will remember that" toast over a delta
that was never written. The medium's most-mocked line is mocked because it was a lie about state.
---
## 2. Accumulation without flags — we already have the better substrate
A hand-authored VN accumulates in **flags and parameter meters** (affection points, suspicion, a route
counter) because it cannot afford to hold a world. The flag is a compressed stand-in for state
([branching §6](branching.md)). We hold the state, so accumulation maps onto typed deltas already in the
model — and each one is *named*, which is the whole difference between a meter and a world:
| Medium's device | Our substrate | Why it is better |
|---|---|---|
| Affection / trust points | `FrameDelta.valenceDelta` — a relative nudge to a **named** stateful relationship edge in `[-1, 1]`, with `valence` for an outright status change | The meter is a relationship with a label and a history, not a hidden integer. It can be shown as "she has stopped hedging with you", not as `+3` |
| Suspicion / route flags | `ThreadDelta.updates` — integer evidence applied as log-odds on an open question's stance | An accumulating suspicion *is* a probability moving on a question the world already tracks, so it is inspectable and falsifiable |
| "Knows fact X" flags | `WorldDelta.addedNodes` — a knowledge node on the entity | Knowledge is per-entity and seat-projected, so gating on it cannot leak |
| Item / key possession | `OwnershipDelta` | Already the irreversibility signal the fork gate uses |
**The discipline this inverts.** A studio's constraint is *cap the flag count*, because post-merge content
grows multiplicatively in tracked flags. Ours is the opposite: state is cheap to hold and cheap to honour
(a later scene is generated *from* it), so the risk is **unbounded state no reader can track**. The
constraint is therefore legibility, not count: an accumulating axis must be sayable in one clause, and
must be surfaced somewhere the reader can read it back.
**The harvest rule.** Every accumulating axis must have at least one downstream **harvest** — a scene,
a gated option, or an ending card that visibly turns on it. An axis that never harvests is decoration,
and it is detectable the same way an unpaid cliff is: state moved, nothing downstream reads it.
### Latent traits beneath visible accumulation
Present emotion and visible behaviour describe the surface of a moment; they do not by themselves explain
why the same pressure produces restraint in one character, appeasement in another, and defiance in a third.
Psychological understanding is layered. Dynamic **latent traits** meet **formation**—how history, culture,
education, practice, institutions, and relationships shaped the character—plus knowledge, motives, and the
present situation.
This gives the visual-novel micro layer a causal job rather than an affective one:
```text
latent traits + formation + knowledge + motives + relationships + present conditions
→ action, line, hesitation, expression, or micro-movement
→ partial evidence for a revisable understanding of the person
```
- Canonical evidence is the proxy for latent traits; the latent reading remains unknown and revisable.
- A manifestation is evidence, not an explanation or diagnosis.
- Formation both develops traits and gives them an expressive grammar; similar traits need not look alike.
- Micro-expression should deepen or complicate the reader's model, not reveal a hidden score.
- The concept remains interpretive character craft, not an existing entity node type. Its directional
graphical schema is [Entity Interpretation](../latent-model/README.md); its storage, selection, and
entity-context substitution foundation ships, while generation and Behaviour Reading remain directional.
### The missing behavioural pass
Evidence collection alone cannot make that gathering happen. A character model needs an explicit
composition between continuity and the authored beat:
```text
what this character can perceive
→ appraisal through latent traits + formation + knowledge + motives + relationships + state
→ a field of impulses, inhibitions, and plausible responses
→ the accepted or authored action
→ the particular line, hesitation, gesture, expression, or silence that embodies it
```
The middle remains a **field**, not a personality lookup: loyalty may pull toward disclosure while fear,
formation, ignorance, or duty inhibits it. This bridges macro Fate and Theme into beat-scale expression.
Experience uses it during production; live and agent-controlled seats use it upstream of Will.
[Soul and vocabulary contract](../../knowledge/vocabulary/voice.md) ·
[Behaviour-model contract](../../knowledge/architecture/WORLD_ENGINE.md#entity-behaviour-needs-a-composition-model) ·
[Founder direction](../../sources/founder/2026-09-02-latent-traits-founder-note.md) ·
[Founder clarification](../../sources/founder/2026-09-02-latent-traits-founder-clarification.md) ·
[Behaviour-model direction](../../sources/founder/2026-09-02-entity-behaviour-model-founder-note.md) ·
[Formation refinement](../../sources/founder/2026-09-02-formation-latent-traits-founder-note.md) ·
[Evidence-proxy contract](../../sources/founder/2026-09-02-evidence-proxy-latent-traits-founder-note.md)
· [Latent graph direction](../../sources/founder/2026-09-02-latent-behaviour-graph-founder-note.md)
---
## 3. Gated options — the aggregate that opens a path
The medium's most elegant structure is the **delayed gate**: a route, an option, or an ending that only
becomes reachable once accumulated state clears a condition set many hours earlier
(*Fate/stay night*'s route locking, *Tsukihime*'s far side, the true endings that a first playthrough
cannot reach by construction).
For us a gate is a **pure predicate over recorded state** — a relationship valence above a threshold, a
thread's stance past a margin, a knowledge node present, an artifact owned — evaluated at the fork.
Rules:
- **A gate is stated in world terms or it is not a gate.** "Because she trusts you" is a gate. "Because
you have 40 points" is a score, and scores are refused (§5).
- **Unreachable options are not shown** — the delivery spec's no-dead-options rule stands, and it happens
to be authentic: the medium hides locked routes rather than greying them out. The reader learns the
path existed from the flowchart *after* an ending, which is the replay invitation, not a taunt.
- **A gate may not fabricate reachability.** If no accumulation path can clear the predicate on the routes
actually produced, the gate is dead content and the production is wrong.
- **Gating is the cheapest replay multiplier we have.** It changes the *reachable subgraph* of an already
produced Experience — same sprites, same plates, same scenes — so a second playthrough is a different
novel at no additional generation cost. That property should drive how much gating a production uses.
**Where the accumulation lives depends on posture** ([delivery §1](README.md)):
- **Traversal (prepared Experience).** Reading writes nothing to canon, so grade-0/1 picks accumulate in
**playthrough state** — a per-reader ledger beside the cursor — and the gate is evaluated over
`(route, ledger)`. This is the honest version: the reader's accumulation selects which prepared passages
they may reach, and no playthrough mutates the world.
- **Live.** The commitment goes through a bounded Scenario, the deltas are real, and the gate is evaluated
over the branch itself.
Both are gates; conflating them is not allowed, because only one of them changed the world.
---
## 4. The systems catalogue
Each row is a device the medium proved, what problem it solves, our substrate, and the verdict.
| Device | Where it comes from | Problem it solves | Our substrate | Verdict |
|---|---|---|---|---|
| **Named relationship drift** | *Tokimeki*-lineage parameter play, dating-sim descendants throughout | Makes small talk matter; earns a late reversal | `FrameDelta` valence on a labelled edge | **Adapt** — keep the accumulation, refuse the numeric meter |
| **Delayed route gating** | *Fate/stay night*, *Tsukihime* | Turns replay into discovery rather than repetition | State predicate (§3) | **Adopt** |
| **Flowchart / jump-in** | *428*, *Zero Escape* | Makes a branching work navigable instead of exhausting | Branch tree + cursor; already in [reader](reader.md) | **Adopt** |
| **Cross-route knowledge** | *Zero Escape*, *Umineko*, *Steins;Gate* | The reader knows what the character does not — the medium's unique dramatic irony | `projectForSeat` already enforces the character's boundary; the reader's seen-set is separate | **Adopt** — and it is *rigorous* here (§5) |
| **Investigation → trial** | *Danganronpa*, *Ace Attorney* lineage | Makes the reader assemble the causal case, not receive it | Scenario phases + evidence, live posture | **Adapt** as a live Episode shape |
| **Argument / rebuttal loop** | *Umineko* | Interpretation itself becomes the game — closest thing the medium has to our thread stance | Conviction economy over an open thread's outcomes | **Adapt**, live posture only |
| **In-scene optional interaction** | *Steins;Gate*'s phone triggers | Agency without stopping the work; a grade-1 commitment inside a scene | A moment-level affordance writing one bounded delta | **Adapt** — refuse the timer |
| **Divergence readout** | *Steins;Gate* | Locates this timeline among the others | Route-accumulated `priorLogit` — real numbers, not decoration | **Adopt**, disclosed after commitment only |
| **Bad end as information** | *Zero Escape*, *Steins;Gate* tips | A failure teaches the structure instead of punishing | Ending card carrying thread resolutions + `breaks` | **Adopt** |
| **Gallery / unlock set** | Medium-wide | Rewards exploration; makes coverage visible | Filter over production assets actually seen | **Adopt** |
| **Timed choices, QTEs** | Medium-wide | Manufactures pressure | — | **Refuse.** Pressure must come from the world, not the clock |
| **Affection grinding** | Dating-sim lineage | Extends play time | — | **Refuse.** Optimising behaviour, and it teaches the reader to game state |
| **"X will remember that"** | Post-*Walking Dead* convention | Signals consequence cheaply | — | **Refuse** unless a delta was actually written and is actually harvested (§2) |
| **Hidden score thresholds** | Parameter-heavy VNs | Gating without exposition | — | **Refuse the score**, keep the gate in world terms |
---
## 5. Dramatic irony, done rigorously
The single most interesting borrow is the *Zero Escape* structure: the **reader** carries knowledge
across routes that the **character** does not have. In a hand-authored work this is managed by care. Here
it is enforced by the type system, because information boundaries are already load-bearing:
- The **character's** knowledge is world state, seat-projected — a route cannot let a character act on
something their seat never saw.
- The **reader's** knowledge is the playthrough seen-set — outside canon, per-reader, disposable.
So "the reader knows, the character does not" is not a writing convention here; it is the difference
between two stores we already keep apart. Two rules follow:
- **The gap may be dramatised, never dissolved.** A reader who knows the outcome of another route may be
offered a *differently framed* option, but the character may not suddenly know it. Grade-2 forks stay
seat-shaped.
- **A route that legitimately teaches the character a fact writes it as world state.** That is a real
delta on a real branch, not a reader convenience.
---
## 6. Making causality felt
Consequence exists in the record whether or not the reader perceives it. Perception is a delivery
problem, and the medium's answer is repetition at distance:
```text
commit → the delta is named once, quietly, at the moment it is written
→ a later scene is generated FROM that state (not a reference to it)
→ the ending card names it again, with what would have gone differently
```
- **Name it twice, at distance.** Once at commitment (the after-commitment readout in the delivery spec),
once when it pays. A consequence named only at the moment of choosing reads as a receipt; named only at
the end, as a retcon.
- **Generate from state, do not reference it.** The difference between "she still hasn't forgiven you"
as a line and a scene in which she does not appear at all.
- **Endings are where accumulation becomes meaning.** The ending card should be able to say which
accumulated axes carried this route — the four-property test's *meaning* axis, evidenced.
---
## 7. The honest ledger
| Requirement | State | Where |
|---|---|---|
| Stateful, named relationship edges with nudge-or-set semantics | **shipped** | `FrameDelta`, `Frame` |
| Thread stance as accumulating log-odds evidence | **shipped** | `ThreadDelta.updates`, `forces/thread-market.ts` |
| Per-entity knowledge nodes, seat projection | **shipped** | `WorldDelta.addedNodes`, `projectForSeat` |
| Ownership / irreversibility signals | **shipped** | `OwnershipDelta` |
| Scenario phases + conviction economy (investigation/argument shapes) | **shipped** | `scenario.ts` |
| **Decision weight grades in the reader (texture / accumulating / fork)** | **build** | reader surface |
| **Playthrough ledger of grade-0/1 picks, beside the cursor** | **build** | client/aux state, never canon ([flags](flags.md) owns its shape) |
| **Gate predicates over `(route, ledger)` or branch state** | **build** | pure derivation in `core` |
| **Harvest detector (an accumulating axis nothing downstream reads)** | **build** | pure derivation |
| **Ending card naming the axes that carried the route** | **build** | reader surface |
| **Layered character understanding beneath surface emotion** | **foundation** | [Entity Interpretation](../latent-model/README.md); storage, selection, ordering, and entity-context substitution ship; generation and activation remain directional |
| **Micro-expression continuity across a route** | **direction** | character craft and review before schema |
| **Behavioural composition into an action field** | **direction** | perception → appraisal → tendencies; upstream of Will |
---
## 8. Open questions
1. **Does a prepared Experience pre-generate gated content that most readers will never reach?** It is the
medium's norm and it is real spend against uncertain consumption.
2. **May a grade-1 pick in traversal posture ever be promoted to canon** if a Director accepts a
playthrough as history — or does traversal stay strictly non-writing, always?
3. **How much of the accumulated ledger is shown to the reader mid-read** — nothing (purest), the named
relationships only, or a full readout after an ending?
4. **Do gates get authored by the Director, or derived** from the exploration spec's divergence scoring
on what actually separates the produced routes?
5. **Which latent traits belong to the Domain at all?** The axes must be domain-native and falsifiable;
importing a universal personality inventory would flatten the particular world into a generic test.
6. **Whose psychological understanding is being presented?** Authorial truth, narrator inference, seat
belief, reader interpretation, and player self-reflection have different authority and must not collapse
into one supposedly objective profile.
7. **What is the smallest honest intermediate representation?** It must expose competing pulls and
inhibitions well enough to test counterfactual situations without becoming a second entity graph.
Open on GitHubRaw Markdown source