# Story sifting with causal bookkeeping

*Technique* · `story-sifting` · status: **sourced**

A simulation records causal links between character actions as they happen, and authored sifting patterns match causally connected sequences in that record, so the system can find the storylines that emerged without steering the world toward them.

| field | value |
|---|---|
| aliases | curationist emergent narrative, automatic curation, sifting patterns, Viv |
| category | Multi-agent social simulation |
| year | 2018 |
| maturity | Prototype |
| trl | 5 |
| runtime | Server real-time, Client real-time, Analytics / live-ops |
| determinism impact | Preserves |
| horizon | 1-2 years |
| risks | Labor displacement, Evaluation difficulty, Legibility |
| builds on |  |
| deployed in |  |
| affects count *(computed)* | 5 |

## Summary

A simulation records causal links between character actions as they happen, and authored sifting patterns match causally connected sequences in that record, so the system can find the storylines that emerged without steering the world toward them.

## Mechanism

Characters perform discrete actions that are written to a chronicle. As each action is performed, the engine records which earlier actions caused it: an action that names a past action in one of its roles, a reaction queued by an earlier action, or a reaction to news of an earlier action relayed by gossip or an inscribed item. The chronicle becomes a forest of causal graphs instead of a flat log. Authors write sifting patterns: a set of action slots, each filled by a query over tags, roles, importance, or salience, plus conditions such as caused, triggered, and preceded that bind the slots into a storyline (offense, vow, scheme, payback). Matching a pattern is a constrained search over the recorded graph, not causal inference over raw state. Patterns compose, so a pattern can match two storylines that share a hinge action. The same patterns can run over one character's memories, so characters can recognize and retell stories they know, and an action that retells a matched story passes knowledge of every action in it to the listener. Ryan's 2018 dissertation frames this as curation: the simulation overgenerates, a story sifter extracts material, and a narrativizer recounts it, either in a separate media experience (feedforward) or back inside the world (feedback). Viv, his public engine, implements this as a compiled language with a JavaScript runtime that a host game calls periodically.

## Limitations

- Patterns find only the storylines someone authored a pattern for; the dissertation leaves sifting heuristics that find unanticipated stories as an open problem.
- Turning sifted material into a told story (narrativization) remains authored or human work; the 2018 conclusion calls it a bottleneck.
- Causal bookkeeping requires the simulation to be built from discrete, recorded actions; it cannot be added cheaply to a sim that changes state directly.
- Designed for periodic background simulation over long spans, not frame-by-frame behavior; the public runtime targets JavaScript only and commercial use needs a license.

## Relations

**affects**

- [History chronicle](../mechanic/history-chronicle.md) (Deepens): The chronicle stores causal links with every event, and sifting patterns retrieve whole storylines from it (a revenge arc, a rise and fall) instead of leaving the player to browse records one at a time.
- [Memories and thoughts](../mechanic/memories-thoughts.md) (Enables new form): Characters can run sifting patterns over their own memories and act on the storylines they recognize, such as warning a grandchild with a remembered cycle of revenge.
- [Gossip propagation](../mechanic/gossip-propagation.md) (Deepens): Relayed knowledge carries the original action, so a character who hears of an old event can react to it years later and the reaction is linked causally to both the event and the telling.
- [Triggered event chains](../mechanic/triggered-event-chains.md) (Explains): Reactions and multi-phase plans are recorded with their causes, so any chain can be traced and named after the fact rather than only authored in advance.
- [Storyteller director](../mechanic/storyteller-director.md) (Deepens): Policies that a director would use to steer events toward an arc can instead select and frame storylines that already happened, leaving the simulation unsteered.

## Claims

- The dissertation defines curationist emergent narrative, in which simulated material is curated into a narrative artifact, recasting story generation as recounting rather than invention. *(confidence: high)* [[338](../source/src-ryan-2018-curating-simulated-storyworlds.md)] Quote: "recounting, rather than invention" (Abstract, p. xiii)
- The dissertation proposes recording contingency relationships between events as they occur, which it calls causal bookkeeping, so that storylines can be identified later. *(confidence: high)* [[338](../source/src-ryan-2018-curating-simulated-storyworlds.md)] Quote: "explicitly record contingency relationships between events as they occur" (p. 163)
- Its architecture distinguishes sifting patterns, which match against the chronicle, from sifting heuristics, abstract policies that guide sifting; it delivers patterns and leaves heuristics as an open problem. *(confidence: high)* [[338](../source/src-ryan-2018-curating-simulated-storyworlds.md)] Quote: "the former pattern-match against the material recorded in a chronicle" (p. 237, Story Sifter)
- In the feedback variant of the architecture, curated stories are mounted back into the simulated storyworld rather than into a separate media experience. *(confidence: high)* [[338](../source/src-ryan-2018-curating-simulated-storyworlds.md)] Quote: "mounted back into the simulated storyworld itself" (p. 232, Curationist Architecture)
- The conclusion names a narrativization bottleneck, turning sifted material into arbitrary stories, that the author could not solve, and proposes curation support tools that leave narrativization to human storytellers. *(confidence: high)* [[338](../source/src-ryan-2018-curating-simulated-storyworlds.md)] Quote: "let us call it the narrativization bottleneck" (Conclusion, p. 692)
- Viv's runtime records causal links between actions automatically as they occur, storing direct causes and transitive ancestors for each action. *(confidence: high)* [[339](../source/src-ryan-2026-viv-runtime-model.md)] Quote: "Each action records both its direct causes and its transitive ancestors, enabling queries over causal chains of arbitrary depth." (Causal bookkeeping)
- Viv defines story sifting as automatically detecting the storylines that emerge as a simulation proceeds, and its runtime is fully symbolic. *(confidence: high)* [[340](../source/src-ryan-2026-viv-introduction.md)] Quote: "There are no LLMs in the loop at runtime." (Design philosophy)
- Viv ships a single JavaScript runtime, with a C# runtime for Unity planned. *(confidence: high)* [[341](../source/src-sifty-2026-viv-repository.md)] Quote: "A C# runtime tailored for Unity is planned." (README, Status)

## Sources

- [Curating Simulated Storyworlds](../source/src-ryan-2018-curating-simulated-storyworlds.md)
- [Introduction to Viv](../source/src-ryan-2026-viv-introduction.md)
- [Viv Language Reference, 20: Runtime model](../source/src-ryan-2026-viv-runtime-model.md)
- [Viv: An Engine for Emergent Narrative (monorepo)](../source/src-sifty-2026-viv-repository.md)

---
Provenance: created in run `2026-10-28-story-sifting`.
