The state object: what one character can see

Each call carries a JSON state built for one character: their own condition, the people in reach, what they can remember of the last few beats, and the arithmetic of the prize. Never the whole world, and never the rules.

buildState in lib/sim/prompt.ts is the only thing the model ever reads. It is written from one person's side of the room, which makes partial observability a property of the data instead of an instruction to be obeyed.

What goes in

  • Them: energy, heat, standing, what they are carrying, what their class allows.
  • Who is reachable: name, class, where they are standing, and whether that is here or across the room.
  • What they have seen: the last few public events visible to them, via visibleEvents rather than the log.
  • The arithmetic: in a crew room, what the next count is worth, your share of it, how big the biggest rival crew is, and what walking out would take. Without that block the betrayal question cannot tell a winning table from a losing one.

What stays out

Trust values other people hold, anything said where they were not standing, every threshold and constant in the engine, and the resolution rules themselves. A character who knew the betrayal bar would be playing the simulation instead of living in it.

The state is also the entire memory. There is no conversation history: each call is a fresh look at a room, which is what a gut-check is.

Read next

More on the model