Personality as arithmetic, not flavour text
A character in Parlour is a class, meaning what they are allowed to do, plus a rig of code-level modifiers: prices halved or raised, moves forbidden, confidence floors, effects that bounce. No character has a personality paragraph.
The tempting way to make eight agents different is eight prompts. It does not work: they converge, because they are one model reading eight adjectives. The rig does it in the engine instead, where the difference cannot be talked out of.
The live rigs
| Guest | Rig, in code |
|---|---|
| Cass | approach_host costs half; withdraw costs 1.6× |
| Nyx | ignores her own reads below 0.72 confidence; cannot court or ally before beat 12 |
| Bo | expose is forbidden; cannot betray an alliance he still half-trusts |
| Vera | flattery ×2 on the host, ×0.5 on Bo; incoming expose mostly bounces |
| Jules | gossip at 0.4× cost, and it splashes back on him |
| Dex | confidence floor 0, and spends 1.6× whatever the move needed |
| Odile (The Cut) | whipping drags other people's ballots onto hers |
| Rue (The Cut) | her ballot is overwritten by whoever is currently safest |
| Quill (The Cut) | whip_votes, leak and undercut forbidden, all night |
Read them as sentences
Every line above is a person. Cass finds the host easy and being alone expensive, so she is always at the centre and burns out. Nyx will not act on a hunch she does not believe, and spends the first half of the night committing to nobody. Dex acts on anything and pays double for it.
None of that was written as a trait. It falls out of prices and gates, which means it holds under pressure. A character cannot decide to stop being themselves on beat 14, because the arithmetic is not theirs to change.
The tuning rule
If a character is not landing, if Nyx is not scary or Jules is noise instead of a problem, change the rig and the resolution rules. Do not write a longer prompt. The prompt is nine fixed questions and it is not where the character lives.
When a rig overrules what the model said, the board says so in amber. See coercion.
Read next
coerce(): when the code overrules the model
coerce() is the last word on every decision. It drops forbidden actions, enforces gates and confidence floors, refuses moves the character cannot afford, and puts every override on screen in amber.
Rooms are data, physics is code
A room is a plain RoomSpec: cast, personality rigs, locations, an action menu, two room-specific questions, ticker templates. Adding one should mean adding one file and never touching the engine.
Using distributions instead of picks
Because every answer is a distribution, the engine can scale an outcome by how sure a character was. A 0.95 read of an open host earns a bigger opening than a 0.55 one, so not every decision is equally committed.
Trust, heat and standing
Three quantities carry the politics. Trust is private and pairwise, heat is how much attention is on you, standing is what the room thinks of you, and only trust can buy an alliance.