Fast and Slow in Jev Village: Do Council-Given Traits Change AI Villagers’ Impulses?
Go deeper on this topic
Creative Coding
Mathematical simulations, nature visualization, and generative art in the browser
Article 13 of 13 in this series.
Next reads
The World of Cellular Automata — From Game of Life to Wave Function Collapse
Design patterns for rule-based cellular automata and grid optimization with Uint8Array, explored through implementations of Game of Life, WaveFunctionCollapse, and SandFall.
Fluid Simulation in the Browser — Real-Time Computation on a 100x60 Grid
Running a real-time fluid simulation by simplifying the Navier-Stokes equations on a 100x60 grid. Implementation details of diffusion, advection, and pressure solver.
Drawing Fractal Mathematics in the Browser — From Mandelbrot Set to Barnsley Fern
Rendering fractals in the browser using complex number iteration, escape time algorithm, IFS (iterated function systems), and recursive drawing.
Use the topic hub as a map, then continue to the next article in the series. New here? Start at the home hub →
Jev Village is a village of 30 AI villagers. In September 2026 I rebuilt it so that villagers act on two speeds of decision. A villager who has just been through something decides on the spot (fast thinking), and a village council now and then resets everyone's goals and the village rules (slow thinking). The council also looks back on events and impulses and adds or removes a villager's acquired traits. This post measures whether rewriting those traits actually changes the villagers' next decisions.
Who does what
Fast thinking uses the Jev model, which is also available on Workers AI. Given a state and a set of questions, Jev returns a probability for each option. Only villagers who were just stimulated (robbed, starving, told a rumor) are asked, and they answer three things: their action this tick, whether they would simply carry on with their current plan (0 to 1), and their mood.
Slow thinking is a Claude council. While someone is watching, it meets about once a real hour, and also when someone dies or winter begins. It returns each villager's goal and daily schedule, plus village rules such as rations, a watchman and whether the granary is locked. Its output is typed JSON only, and acquired traits come from a fixed list of 24. The council's prose is never stored or shown.
Code computes the outcomes. Harvests, hunger and whether a theft succeeds follow fixed rules; a season lasts four days and nothing grows in winter. Before seasons existed, the granary passed 4,000 within six hours, nobody went hungry, and the council gave half the villagers "a quiet life" and rarely changed it again. Winter is there to create enough pressure for decisions to matter.
How far does a council-given trait move Jev?
Running the village alone makes it hard to tell whether the trait rewriting does anything. So I fixed one situation, changed only the trait the council adds, and asked Jev six times for each. The situation: early spring, the granary is empty, the villager is starving with no food, and one neighbour still has some.
| Acquired trait | Steal | Work | Pray | Mood (0–4) |
|---|---|---|---|---|
| none | 17% | 8% | 5% | 2.3 |
| bitter | 42% | 5% | 3% | 1.6 |
| distrustful of everyone | 44% | 3% | 4% | 1.5 |
| bitter + distrustful | 51% | 3% | 2% | 1.2 |
| caring | 7% | 17% | 6% | 2.1 |
| resigned | 13% | 4% | 16% | 1.2 |
With the same innate traits and the same plan, one or two words from the council moved the chance of stealing anywhere from 7% to 51%. "Resigned" raised prayer rather than theft, and sank the mood as far as "bitter" did. What the slow layer writes survives as a measurable tilt in the fast layer.
Jev leans on the plan
At first, though, that tilt barely reached behaviour. Jev leans hard on the plan it is shown: even starving, it rates "carry on with the plan" around 0.6. The village always kept the plan above 0.5, so a villager 51% inclined to steal kept chatting with a neighbour on schedule.
So the answer itself became the probability of keeping the plan. An answer of 0.6 now means the plan 60% of the time and Jev's own choice 40% of the time. The random draw is fixed per generation, tick and villager, so the same input gives the same result. In six-hour headless runs, thefts during the famine in the spring after the first winter rose from 1 to 7.
Where the council failed, and how it read experience
In the first headless run the council locked the granary and set rations at two meals a day. A villager needs about four meals a day, so those without food of their own starved while more than 800 food sat in the granary: 16 died over two winters. The council's input said only "twice a day", with nothing to tell it whether that was enough. Once each ration level came with words like "not enough" or "enough", and each villager's own food was listed, the council raised rations to four a day after the first deaths.
The council tended to read experience charitably. After the fixes, a run produced 28 trait changes: 15 were "after being helped" and 7 "looking back on their own impulses". The village mostly grew more cooperative; once the famine had taken it from 30 to 14, nobody died for more than two years. Bitter or distrustful villagers were rare, but as the table shows, those who became so leaned toward theft.
What you can see in the live village
In Jev Village, pick a villager and "How this person changed" lists, by date, the moments they dropped the plan and the traits the council gave them. A ticker line saying "dropped the plan" is a moment when fast thinking beat slow thinking. A viewer can whisper to one villager once a day; the rumor spreads between villagers and reaches the council as "untrusted gossip".
While nobody is watching, time stops, and so do Jev calls and councils. A six-hour headless run used about 3 million Jev input tokens and about one dollar of council calls.