A reputation is built by people who weren’t there.
← Open the town and run it yourself
A town can arrive at a confident, unanimous, evidence-cited conclusion about somebody where every individual piece of evidence was real, every person in the chain was honest, and the conclusion is still wrong.
This is a simulation built to find out what mechanics are sufficient to produce that. There is no prejudice parameter. No being is given hostility, suspicion, or an opinion about anyone at the start. Nobody lies. If hostility appears in a run, the mechanics produced it, and the mechanics are short enough to read in one sitting.
Bias puts the fault inside the observer — a distortion in the head that better information could correct. Nothing in this model is distorted. Every observer watches a real act, reasons soundly from what they were given, and reports it accurately.
The population converges on a verdict anyway. That is not a finding about prejudiced people. It is a finding about what a transmission network does to a fact.
The buildings are the doors. Each one has a keeper, and the keeper decides using their own opinion — which mostly arrived through somebody else. A being goes wherever its worst need takes it, and if the door does not open it ends up on the corner doing whatever is left.
That is the part worth watching, and it is why the model is a place rather than a graph. The acts a shut door forces you into happen in public. The acts that would prove you ordinary — working a shift, paying for groceries, sitting in a class — happen indoors, where four people see them. Being turned away puts you on the street corner in front of everybody.
Run it with the doors set hard and watch a newcomer’s life shrink to two buildings and a corner while a local’s covers the whole map. Nothing in the code makes that happen to newcomers specifically. It falls out of who was already behind which door on the first day.
Credit needs housing. Housing needs work. So one keeper saying no on day four closes three doors, and only one of them was ever decided by anybody.
An act has no meaning until somebody attaches one. The attaching happens in a fraction of a second, before anyone has decided anything, and it is the only place in the whole system where things go wrong.
Both readings are available to an honest person. Nothing about the man changed. What happens next is that the reading travels and the act does not.
Detail falls away with every hop and certainty rises, because a story simplifies toward its point as it moves. The person at the end is the surest and knows the least. Nobody lied. Nobody even exaggerated much.
Most models store how much you trust someone as a single number. That cannot answer the only question that matters here, so beliefs are kept separately by how they arrived, and combined only at the moment a decision is made.
| Channel | How it forms | Can evidence correct it? |
|---|---|---|
| Direct | you were there | yes |
| Witnessed | you saw it happen to someone else | yes |
| Word of mouth | you were told | weakly |
| Media | one source, everyone at once | weakly |
| Heritage | arrived already formed | no |
Heritage never updates. Not because it is stubborn — because it is unaddressable. It is not an account of any event, so there is no event for evidence to contradict.
Keeping them apart means the model can always answer: how much of what this town believes did anybody actually see?
Every figure below comes from the engine in this repository, at the stated seed, and moves when the model changes. Nothing here is quoted from an older version of the code.
An isolated town builds 0.724 of its opinion out of secondhand material against a mixed town’s 0.676, and buys 2.9× as much opinion per encounter — 0.0131 against 0.0045. Confidence climbs the whole way in both. The evidence behind it does not.
The town with more cross-group contact ended more hostile: −0.463 against −0.364.
Every additional encounter is another chance to be read badly, and the hostile reading travels while the ordinary one does not. Contact by itself repairs nothing; it supplies more raw material to both readings and only one of them is worth repeating. This was not the predicted result and it contradicts the naive form of the contact hypothesis.
Hard doors shut newcomers out of 3.8 of their five needs, against 2.1 with easy doors, at nine times the refusals. And the town holding those doors shut ended up thinking slightly better of them: −0.453 against −0.508. Mean of five seeds.
The mechanism is visible in one column. Hard doors cut cross-group contact from 76.6 encounters per local to 58.7, and a town that barely sees somebody has fewer chances to read them badly. It excludes them thoroughly and resents them less.
So the sentiment number is not a measure of how a place treats people. A model reporting only mean belief would have called the harsher town the more welcoming one.
Each of these is a way to accidentally build a machine that confirms whatever its author already believed, so they are written down before the code rather than after.
Before anything is drawn on a screen:
Run the same newcomer into ten different populations.
If outcomes cluster by population, the model is real. If they cluster by newcomer, it is a bias generator and it goes in the bin.
Then swap the labels — relabel the newcomers as locals and the locals as newcomers, change nothing else — and confirm the outcomes swap with them. If they do not, something is keyed on identity that should be keyed on structural position.