314 lines
15 KiB
Markdown
314 lines
15 KiB
Markdown
|
|
# How Ghostlight Dungeon Keeps a Whole World Moving
|
|||
|
|
|
|||
|
|
An AI dungeon master has an awkward problem: the world should feel larger than
|
|||
|
|
the conversation, but a language model can only attend to so much at once.
|
|||
|
|
|
|||
|
|
If the game simulates only the people currently speaking, everyone else seems
|
|||
|
|
to stop existing. A distant government never exploits an opportunity. The
|
|||
|
|
villagers cease reacting when the player talks to the blacksmith. A location
|
|||
|
|
left behind becomes a vague reconstruction when the player returns.
|
|||
|
|
|
|||
|
|
The brute-force answer would be to give every person and organization its own
|
|||
|
|
AI turn. That answer lasts until the setting contains twenty factions, several
|
|||
|
|
cities, a trading network, a plague, and one unusually opinionated baker. It is
|
|||
|
|
too slow and too expensive, and most of those turns would not matter right now.
|
|||
|
|
|
|||
|
|
Ghostlight Dungeon instead changes the *resolution of the simulation*. It can
|
|||
|
|
consider one person in detail, a village as a group, or several rival powers as
|
|||
|
|
one bounded political situation. The underlying people and facts do not get
|
|||
|
|
merged or discarded. Only the amount of attention used to simulate them
|
|||
|
|
changes.
|
|||
|
|
|
|||
|
|
That is the multiresolution gestalt algorithm.
|
|||
|
|
|
|||
|
|
## What “gestalt” means here
|
|||
|
|
|
|||
|
|
A gestalt is a population that can be simulated through a shared Persona turn.
|
|||
|
|
“The dockworkers,” “the western villages,” or “the biology faculty” might each
|
|||
|
|
begin as a gestalt. They have a common baseline, but that does not mean every
|
|||
|
|
member is identical.
|
|||
|
|
|
|||
|
|
Suppose the player enters a village and asks for the blacksmith. Ghostlight can
|
|||
|
|
materialize John from the villagers’ baseline, then preserve everything that
|
|||
|
|
makes him particular: his name, memories, possessions, grudges, promises, and
|
|||
|
|
relationship with the player. While John is directly involved, he receives his
|
|||
|
|
own simulation attention.
|
|||
|
|
|
|||
|
|
When the player leaves, John does not disappear and his history is not averaged
|
|||
|
|
away. His individual state remains as a durable delta from the villagers’
|
|||
|
|
baseline. The simulator may include him in a cheaper village-level turn until
|
|||
|
|
he matters again. When the player returns, the same John is materialized from
|
|||
|
|
the same baseline plus the same personal delta.
|
|||
|
|
|
|||
|
|
This distinction is the foundation of the system:
|
|||
|
|
|
|||
|
|
> Ghostlight aggregates simulation work, not canonical identity or state.
|
|||
|
|
|
|||
|
|
## The agency graph
|
|||
|
|
|
|||
|
|
At campaign creation, the world compiler builds a coarse global map of agency.
|
|||
|
|
It does not eagerly invent every street and citizen. It records the major
|
|||
|
|
powers, institutions, populations, regions, information channels, and strategic
|
|||
|
|
pressures that make the setting move.
|
|||
|
|
|
|||
|
|
Each actor, institution, and active population gestalt becomes a vertex in an
|
|||
|
|
*agency graph*. Typed edges describe how they can affect one another: command,
|
|||
|
|
membership, containment, alliance, rivalry, trade, migration, communication,
|
|||
|
|
coercion, and shared location.
|
|||
|
|
|
|||
|
|
Each vertex also has an agency profile across six practical axes:
|
|||
|
|
|
|||
|
|
- geography;
|
|||
|
|
- ideology;
|
|||
|
|
- authority;
|
|||
|
|
- economic role;
|
|||
|
|
- species or bodily constraints;
|
|||
|
|
- access to information.
|
|||
|
|
|
|||
|
|
These are not personality statistics. They are clues about where a useful
|
|||
|
|
simulation boundary lies. During a blockade, geography and supply routes
|
|||
|
|
predict behavior. During an election, ideology and authority matter more. For
|
|||
|
|
an epidemic, bodies and transport links may dominate. During an espionage
|
|||
|
|
crisis, the important boundary is often who knows what.
|
|||
|
|
|
|||
|
|
This is why Ghostlight does not use one permanent hierarchy such as “continent,
|
|||
|
|
country, city, person.” The best cut depends on the pressure currently moving
|
|||
|
|
through the world.
|
|||
|
|
|
|||
|
|
## From current pressure to a simulation cover
|
|||
|
|
|
|||
|
|
Before a strategic wave, a cheap structured model reads the committed event or
|
|||
|
|
planning horizon and proposes weights for the six axes. It may also point to
|
|||
|
|
relevant subjects, but only from IDs Ghostlight supplied. This stage can say
|
|||
|
|
“information boundaries matter greatly right now”; it cannot invent a new
|
|||
|
|
faction or alter the world.
|
|||
|
|
|
|||
|
|
The local algorithm then covers every active subject with a set of simulation
|
|||
|
|
cells. A cover obeys three hard rules:
|
|||
|
|
|
|||
|
|
1. Every active subject appears in exactly one cell.
|
|||
|
|
2. Every cell is connected through the agency graph.
|
|||
|
|
3. Foreground subjects that require individual attention remain individual.
|
|||
|
|
|
|||
|
|
The player chooses the desired number of active Persona cells with a budget
|
|||
|
|
slider from 1 to 32; the default is 8. This is a detail budget, not a promise to
|
|||
|
|
erase people until the number fits. If nine named characters are actively
|
|||
|
|
engaged while the budget is four, Ghostlight reports a temporary effective
|
|||
|
|
budget of at least nine. The foreground wins.
|
|||
|
|
|
|||
|
|
Pins provide more deliberate control. A subject can be kept at individual
|
|||
|
|
detail, several subjects can be kept together, or two groups can be forbidden
|
|||
|
|
from sharing a cell. Pins and budget changes apply only at safe boundaries. They
|
|||
|
|
change a separate resolution epoch, not fictional time or the campaign’s world
|
|||
|
|
revision.
|
|||
|
|
|
|||
|
|
The partitioner starts from fine detail and repeatedly merges the lowest-cost
|
|||
|
|
legal pair of adjacent cells. Its loss function asks what would become harder
|
|||
|
|
to predict if those cells shared one simulation turn:
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
0.25 facet divergence
|
|||
|
|
+ 0.20 hidden causal-boundary mass
|
|||
|
|
+ 0.15 information-scope divergence
|
|||
|
|
+ 0.15 spatial divergence
|
|||
|
|
+ 0.10 clock/obligation divergence
|
|||
|
|
+ 0.10 salience burial
|
|||
|
|
+ 0.05 partition churn
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
In plain language: do these subjects want different things, affect one another
|
|||
|
|
in ways a summary might hide, know different facts, live too far apart, owe
|
|||
|
|
different duties, contain something important, or require a disruptive change
|
|||
|
|
from the previous cover?
|
|||
|
|
|
|||
|
|
The exact weights make the decision reproducible and inspectable. The current
|
|||
|
|
pressure changes the meaning of facet divergence, so a geographic boundary can
|
|||
|
|
be cheap during an ideological dispute and expensive during a flood.
|
|||
|
|
|
|||
|
|
After reaching the budget, Ghostlight performs a small boundary-refinement
|
|||
|
|
pass. It accepts a local move only when it improves the compression cost by at
|
|||
|
|
least five percent. It also prefers the previous cover unless a replacement is
|
|||
|
|
at least ten percent better, apart from forced splits and explicit budget
|
|||
|
|
changes. Merged cells receive short leases. These measures stop the world map
|
|||
|
|
from jittering between equally plausible partitions every turn.
|
|||
|
|
|
|||
|
|
The implementation uses deterministic ordering and content-addressed cell IDs,
|
|||
|
|
so the same state and demand produce the same cover. Candidate scoring samples
|
|||
|
|
large cells to keep local work bounded, but it never samples the rules that
|
|||
|
|
protect authority, hostility, knowledge, pins, connectivity, or complete
|
|||
|
|
coverage. Those are checked exactly. The release test partitions 1,000 subjects
|
|||
|
|
to a budget of 8 in about 50 milliseconds on the development host.
|
|||
|
|
|
|||
|
|
## Two very different kinds of cell
|
|||
|
|
|
|||
|
|
Putting several subjects in one cell does not automatically create a collective
|
|||
|
|
mind. Ghostlight distinguishes two modes:
|
|||
|
|
|
|||
|
|
| Mode | What it represents | What it may do |
|
|||
|
|
| --- | --- | --- |
|
|||
|
|
| **Cohesive** | A real collective with shared authority and sufficiently compatible behavior and information | Speak or propose one action as a plural Persona |
|
|||
|
|
| **Arena** | Several distinct or opposed subjects considered in one situation | Appraise their interaction and propose separately attributed actions |
|
|||
|
|
|
|||
|
|
A cohesive cell might represent a patrol acting through its accepted command
|
|||
|
|
structure. It requires a real common authority, no active hostile relation, and
|
|||
|
|
low enough behavioral and information divergence.
|
|||
|
|
|
|||
|
|
An arena might contain a guild, its striking workers, and a city ministry. It
|
|||
|
|
exists to save inference work, not to pretend they have become one faction. An
|
|||
|
|
arena has no actor ID. It cannot issue collective speech, pool everyone’s
|
|||
|
|
secrets, or spend one member’s resources on behalf of another. Every proposed
|
|||
|
|
action names the exact constituent responsible, and the world kernel validates
|
|||
|
|
that constituent’s knowledge, authority, location, relationships, and
|
|||
|
|
possessions.
|
|||
|
|
|
|||
|
|
Cross-faction aggregation always produces an arena. This single distinction
|
|||
|
|
prevents a great deal of cheap-model political alchemy.
|
|||
|
|
|
|||
|
|
## One cell, one Persona pipeline
|
|||
|
|
|
|||
|
|
Once the cover is selected, every active cell runs through Ghostlight’s Persona
|
|||
|
|
projection machinery:
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
flowchart LR
|
|||
|
|
A["Canonical world state"] --> B["Current-pressure demand"]
|
|||
|
|
B --> C["Agency graph and budgeted cover"]
|
|||
|
|
C --> D["Private Projector stream per cell"]
|
|||
|
|
D --> E["Persona response"]
|
|||
|
|
E --> F["Interpreter appraisal and proposals"]
|
|||
|
|
F --> G["WorldKernel validation"]
|
|||
|
|
G --> H["One atomic strategic commit"]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
The Projector converts permitted typed state into a private lived narrative. A
|
|||
|
|
cohesive cell receives genuinely shared state plus clearly attributed
|
|||
|
|
exceptions. An arena receives a polyphonic account that keeps each
|
|||
|
|
constituent’s perspective and knowledge separate.
|
|||
|
|
|
|||
|
|
The Persona sees only that narrative stream. It does not see database schemas,
|
|||
|
|
action syntax, or raw world state. It responds as a person or group inhabiting
|
|||
|
|
the situation.
|
|||
|
|
|
|||
|
|
The Interpreter converts the response back into a typed appraisal and action
|
|||
|
|
proposals. A cohesive cell may propose one collective action. An arena may
|
|||
|
|
propose a small bounded number of constituent-attributed actions—at most four,
|
|||
|
|
even for a very large cell.
|
|||
|
|
|
|||
|
|
All cells in a wave bind to the same world revision and resolution epoch. Only
|
|||
|
|
after every pipeline completes does the WorldKernel validate reach, knowledge,
|
|||
|
|
authority, resources, clocks, and conflicting proposals. It then commits the
|
|||
|
|
accepted consequences in one transaction. A stale response, invalid cover,
|
|||
|
|
malformed model output, or illegal action aborts the entire wave without a
|
|||
|
|
partial world mutation.
|
|||
|
|
|
|||
|
|
The number of model requests allowed to run simultaneously is a separate
|
|||
|
|
operator setting. Raising concurrency makes an eight-cell wave faster; it does
|
|||
|
|
not change which eight cells exist. Lowering the player’s cell budget changes
|
|||
|
|
simulation resolution; it does not silently change the provider configuration.
|
|||
|
|
|
|||
|
|
## Keeping quiet parts of the world alive
|
|||
|
|
|
|||
|
|
Salience alone would still create a spotlight problem. Important conflicts
|
|||
|
|
would receive attention forever while quiet populations slowly became static
|
|||
|
|
summaries.
|
|||
|
|
|
|||
|
|
Ghostlight prevents that with *detail debt*. A subject accumulates this
|
|||
|
|
non-fictional scheduling value while it is represented only inside an
|
|||
|
|
aggregate. Each strategic wave reserves detailed focus for the eligible subject
|
|||
|
|
with the highest debt. Receiving individual or explicit focus clears it.
|
|||
|
|
|
|||
|
|
Even at a cell budget of 1, the global arena must focus on one overdue subject
|
|||
|
|
while retaining the larger situation around it. With N subjects, deterministic
|
|||
|
|
debt rotation gives every subject direct simulation attention within at most N
|
|||
|
|
strategic waves, unless foreground requirements temporarily take precedence.
|
|||
|
|
|
|||
|
|
Detail debt is not something characters can perceive, and it cannot be spent
|
|||
|
|
inside the fiction. It is bookkeeping for fair computational attention. World
|
|||
|
|
clocks and deterministic obligations advance whether a subject receives focus
|
|||
|
|
or not. If a cell does nothing, that inaction must be an appraisal, not an
|
|||
|
|
omission from a prompt.
|
|||
|
|
|
|||
|
|
## A worked example
|
|||
|
|
|
|||
|
|
Imagine an Aetheria campaign with 24 powers. A river blockade has interrupted
|
|||
|
|
food shipments while an opposition movement tries to turn the shortage into a
|
|||
|
|
general strike.
|
|||
|
|
|
|||
|
|
At a budget of 4, Ghostlight might preserve:
|
|||
|
|
|
|||
|
|
- the player’s location and directly engaged cast as mandatory individual
|
|||
|
|
cells;
|
|||
|
|
- upstream producers and transport authorities in a geographically shaped
|
|||
|
|
arena;
|
|||
|
|
- dockworkers, guild leadership, and the ministry in a workplace-and-authority
|
|||
|
|
arena;
|
|||
|
|
- distant powers in a coarse arena, with the highest-detail-debt power selected
|
|||
|
|
for explicit focus.
|
|||
|
|
|
|||
|
|
If the player uncovers a secret ministry order, information divergence becomes
|
|||
|
|
more important. The next safe repartition may keep the informed conspirators
|
|||
|
|
separate from people who have not seen the order—even if they share a building
|
|||
|
|
or faction.
|
|||
|
|
|
|||
|
|
If the player then confronts a particular dockworker, that character becomes a
|
|||
|
|
mandatory singleton. Ghostlight may exceed the configured budget rather than
|
|||
|
|
fold a live conversation back into “the workers.” After the relevance lease
|
|||
|
|
expires, the character can return to aggregate simulation while retaining the
|
|||
|
|
same individual history.
|
|||
|
|
|
|||
|
|
The cut changes because the situation changed. The world underneath it does
|
|||
|
|
not.
|
|||
|
|
|
|||
|
|
## Refining the world is different from simulating it finely
|
|||
|
|
|
|||
|
|
Sometimes the Vault establishes that a broad population really contains
|
|||
|
|
durable subdivisions: three ideological tendencies, several species with
|
|||
|
|
different vulnerabilities, or villages on opposite sides of a material route.
|
|||
|
|
That is a canonical fact, not merely a convenient simulation cut.
|
|||
|
|
|
|||
|
|
Ghostlight handles this through approval-gated gestalt fission. The compiler
|
|||
|
|
previews a split along an enumerated facet and always includes an
|
|||
|
|
`other/unknown` remainder. Approved children inherit the parent baseline and
|
|||
|
|
own only their later deltas. The parent remains as inactive lineage, and known
|
|||
|
|
member deltas are reassigned without rewriting anyone’s identity.
|
|||
|
|
|
|||
|
|
Ordinary cover changes are reversible and need no approval because they alter
|
|||
|
|
no fiction. Fission changes the canonical population model, so evidence,
|
|||
|
|
preview, and approval are required. Keeping these operations separate prevents
|
|||
|
|
an optimization decision from quietly becoming lore.
|
|||
|
|
|
|||
|
|
## How it appears in Ghostlight Dungeon
|
|||
|
|
|
|||
|
|
For players, the main control is the active Persona-cell budget. A higher value
|
|||
|
|
allows more simultaneous detail and usually costs more inference time. A lower
|
|||
|
|
value asks Ghostlight to summarize more of the strategic world without freezing
|
|||
|
|
it. The interface also shows the effective budget when foreground obligations
|
|||
|
|
force an overage.
|
|||
|
|
|
|||
|
|
For operators, the inspector exposes the agency graph, current cover, cohesive
|
|||
|
|
and arena modes, merge-loss components, pins, leases, detail debt, and the
|
|||
|
|
reason for each cut. It also shows model-stage and resolution receipts without
|
|||
|
|
publishing private Persona streams or chain-of-thought.
|
|||
|
|
|
|||
|
|
Under the hood, the implementation is divided by authority:
|
|||
|
|
|
|||
|
|
- `domain.rs` defines the persistent subjects, agency contracts, covers,
|
|||
|
|
appraisals, and control commands;
|
|||
|
|
- `compiler.rs` builds the global agency skeleton and previews canonical
|
|||
|
|
fission;
|
|||
|
|
- `resolution.rs` plans and validates covers, manages detail debt, validates
|
|||
|
|
cell proposals, and applies approved fission;
|
|||
|
|
- `persona.rs` owns the Projector → Persona → Interpreter membrane for cells;
|
|||
|
|
- `scheduler.rs` projects demand and runs cell pipelines in bounded parallel
|
|||
|
|
waves;
|
|||
|
|
- `kernel.rs` is the only authority that changes canonical campaign state;
|
|||
|
|
- `surface.rs` projects player and operator controls through Ghostlight’s Eve
|
|||
|
|
interface.
|
|||
|
|
|
|||
|
|
The result is not an omniscient simulation of every citizen. It is a controlled
|
|||
|
|
allocation of attention over a persistent world. The dungeon master can zoom
|
|||
|
|
in without inventing a new world and zoom out without erasing the old one.
|
|||
|
|
|
|||
|
|
That is the practical promise of multiresolution gestalts: the world keeps
|
|||
|
|
moving, disagreement survives compression, and the blacksmith is still John
|
|||
|
|
when you come back.
|