A Thief from Nowhere#

A window bangs open above the street. Someone curses with professional fluency, and a dented bucket of peelings lands in the road.

The rubbish is now part of the world. It may block a path, soil somebody’s coat or wait for a person whose job is to clear it. But how much of the person behind the window must the world create?

That example is still a design exercise, not an event currently running in Satisfy. It led us to a practical question: how can a large world contain passing strangers without either making them untouchable scenery or simulating a complete life for every face in a crowd?

Version 0.8.0 tested the smallest useful answer. It introduced a pickpocket who did not exist until somebody at the fair had a purse worth cutting.

A person only when one is needed#

An ambient event does not always need an individual behind it. Voices can pass down an alley. A cart can splash mud. A crowd can block the road. If the source cannot be found and nothing depends on who caused it, creating a permanent character would only give the simulation another life to maintain.

The difficulty begins when the player can interfere. If rubbish strikes somebody, the injury must remain even if nobody finds the thrower. If a player looks up, gives chase and sees a woman at the window, the world cannot later replace her with a man from another house. If she is identified and fined, there is now a person, an offence and an unpaid obligation. Forgetting her would mean forgetting part of somebody else’s history.

We call the short-lived people behind such incidents transient NPCs. They begin with only what the episode requires: a stable identity, a place, an appearance and any possessions or liabilities created by the event. They do not receive a childhood, three favourite soups and a ten-year plan merely because the player typed look.

This is not one ladder marked “more real.” Identity and activity are separate. A crowded festival can be active while its people remain anonymous. A creditor in another province can have a permanent identity while sleeping in storage until a payment is due. Being remembered does not require thinking every tick.

The fair needed a thief#

In v0.8.0, one theft was triggered the first time between 09:00 and 18:00 that somebody carrying a purse stood in plain sight at the fair. The game created one of four strangers: a pock-marked lad in a cap, a woman in a faded kerchief, a tall man in a linen shirt or a teenager in a patched shirt.

The choice was deterministic. The same world state and commands produced the same stranger. The person received a real entity in the semantic layer, a location and authored forms in both languages. Russian needed all six cases: not only «женщина в выцветшем платке», but also «женщину в выцветшем платке», «женщине в выцветшем платке» and the rest. A procedural person who becomes ungrammatical as soon as somebody accuses them is not ready for public life.

The theft moved money rather than announcing a penalty. The thief gained up to one ruble; the victim lost the same amount. About half the time the victim saw who did it. Otherwise the line named only “someone,” because hearing a purse being cut is not the same as identifying a hand in a crowd.

The thief remained at the fair for that round, then made for the stairs down to Dno. A player who had seen the thief could react immediately. An unseen thief first had to step out of the crowd and become visible. Catching them returned only the money still owed, and only when the victim was there to receive it.

Here is the decisive part of the v0.8.0 test transcript:

09:00
The woman in a faded kerchief stole 1 ruble from the constable's deputy at the fair
The woman in a faded kerchief is at the fair

09:10
At the fair, the constable's deputy held the woman in a faded kerchief back
The woman in a faded kerchief returned 1 ruble to the constable's deputy at the fair

09:20
The constable's deputy went from the fair to Well Square
The woman in a faded kerchief went from the fair to Well Square

The stranger was not flavour text once the ruble changed hands. She occupied the same streets as everybody else, and the player could follow her through them.

What made the thief remain#

The experiment needed an ending for both attention and indifference.

If nobody caught the thief or passed word about them, they slipped away through the back lanes and left town with the money. The theft remained true and the books still balanced, but the simulation no longer owed that stranger an active life.

If somebody held the thief or told another person about them, the same individual remained at the Dno stairs. “Remained” is deliberately modest. They became dormant: still located, visible and available for further action, but they did not choose actions, observe or gossip. The world retained the person without assigning a permanent thinker to them.

Simply seeing, inspecting or following the thief did not preserve them after the episode. That boundary was intentionally crude. It let us test runtime creation, consistent identity, pursuit, restitution, disappearance and dormancy without first building a general system for deciding which strangers deserve biographies.

The test also exposed a useful rule: material consequences outlive presentation. A person may fade back into the population; a stolen ruble, an injury, a debt or an accusation may not vanish with them.

A local game master, eventually#

The v0.8.0 rules decided retention directly. That is not the intended final design.

In a larger world, a higher-level local game master should decide when a transient person deserves to become more substantial. Rules provide the non-negotiable part: preserve unresolved debts, evidence, contracts, ownership, relationships and facts that somebody can still act upon. They also enforce resources, continuity and simulation budgets.

Within those boundaries, AI can judge the softer questions. Did players become interested in this person? Do they connect several unfinished stories? Would their return create a new consequence, or merely repeat an old trick? Does this district need another active character at all?

The AI does not get to edit the world directly. It can propose a structured change—retain this thief as a dormant individual, connect her to an existing household, reveal no name yet—and the ordinary rules must validate it. The accepted decision then enters the same history as every other change. Replaying that history does not ask the model to improvise again.

That division matters. Rules decide what the world must remember. The local game master helps decide what is worth developing further.

What the first test did not prove#

The cutpurse never grew into a complete resident. The game did not give her a name, family, needs, loyalties or a second incident shaped by the first. Save and reload of a materialised stranger did not exist yet. Retention was a pair of explicit conditions, not an AI game master weighing the town’s history.

Nor should every colourful sentence promise a person who can be pursued forever. Some noises are only noises. The design fails in one direction if every passer-by is scenery and in the other if glancing at a crowd creates a thousand permanent biographies.

The useful middle is smaller: create a traceable person when an event needs one, preserve everything that acquires consequences, and spend deeper simulation only where the world has found a reason to care.

In v0.8.0, that reason was one ruble and a hand on somebody’s sleeve. It was enough to bring a stranger into existence. It was not yet enough to decide the rest of her life.

This follows When a Day Became a Story, where separate mechanics began leaving consequences for one another. The cutpurse asked how long the world must keep the person who caused one.