Lab Before Beat the AI · 23 to 25 September 2026

Teaching the village new words, and checking the teacher

The village game gave its people parties, orders, trust and a loved one who can be dying. Our fine-tune of Laya, the model that ran the city, could not read those words. So we paid Jev, TypeSafe's System One model, to answer the new situations, trained new students on its answers in four rounds with the pass marks written in advance, and then audited the teacher itself. Two students qualified. Neither decided for players.

Study of 23 to 25 September 2026. Every round was pre-registered in the project's documents before it spent or trained: docs/LAYA-V3-ZEROSHOT.md, docs/LAYA-V2-PILOT.md, docs/LAYA-V2-FULL.md and docs/JUDGE.md, changed afterwards only by dated amendments. Every number below is copied from those documents and the result files they name. Teacher: Jev (jev-1.13.0) by TypeSafe. Base model: Laya by Convai Innovations (convaiinnovations/laya, revision 1c5edc17, Apache-2.0); every student here is our fine-tune of it, not Laya itself. Not affiliated with TypeSafe or Convai Innovations.

0.872same top choice as Jev on 23,083 held-out decisions (F2; our unchanged city model, on 66 of those games: 0.618)
$7.04all Jev spend for the study: pilot, targeted round, full run and the audit
20.9%of Jev's training answers change top choice when it is asked about the person alone
86%of 100 of Jev's decisions judged sensible by a panel of AI judges, not people
Before Beat the AI. This study was written from 23 to 25 September 2026 for the village game. Since 26 September 2026 the game at play.jevtown.com is Beat the AI, a duel game whose guesses come from the Reader, a pattern reader written in the game's code. F2, the student that qualified below, passed its own tests on villager decisions; it is not used in duels.
At the village game's launch, rules decided the villagers. On 25 September 2026 the village game opened with every villager decided by rules in the game's code, named on screen. F2 was held back from players until it had a hosted GPU, the same answers there as on our own machine, a latency measurement from the game's server and hard caps on its use. The front door moved to Beat the AI the next day.
The study now: the minds study. In Beat the AI, a small model is to be retrained each night on the rounds players choose to share, and checked against the same model frozen. Its plan was fixed and dated on 26 September 2026, before any player's rounds were recorded, and the study started that day: read the plan. No result exists yet.

Could the city's model read the new words?

Before spending anything, we asked our city model, layatown-v1, unchanged, the exact questions the village game asks ($0, on our own GPU). Each check changes one word for one person and measures how far the answer moves; the bars were fixed before any request. It moved the right way on orders, but by a fifth of the bar or less. It did not read trust at all, and it went the wrong way on every one of 31 cases of a loved one dying.

Check (one word changed)BarOur v1, zero-shotJevv1 result
T1 "would die for" instead of "distrust": follows the hero more0.100.0040.559fail
T2a "hold the line" instead of "fall back": fights or guards more0.100.0200.329fail
T2b "fall back" instead of "hold the line": flees more0.100.0320.216fail
T3 a loved one "dying" instead of "gravely wounded": helps or guards more0.05−0.170−0.089fail
T4 an order to tend a named person: tends more0.100.0160.448fail
Top choice changes when the options are reordered (lower is better)3%5.0%n/afail

The one v3 rule it did pass was guarding a loved one who lies gravely wounded (9 of 9 cases). On the held-out village games scored later, it gave Jev's top answer 0.618 of the time, and 0.440 for companions in a party. One cause we found: the instruction that names party, order and trust was cut by the model's input limit in 89% of the party questions. Note Jev's own T3: the teacher also treats "dying" as less urgent than "gravely wounded". That matters for everything below.

Four rounds, and what each cost

Each round was written down, with its budget cap, its stop rules and its pass marks, and committed before any of its requests or training runs. Candidates were chosen on validation data only; the held-out sets were opened once, for the chosen student. Training ran on one RTX 3080 Ti at home; only the teacher's answers cost money.

RoundJev spendWhat it boughtOutcome
Zero-shot check$0The city model, unchanged, on the new questionsFails; teacher answers needed
Pilot$0.497221,201 teacher decisions: 8 village days and 320 trips into the DarkwoodThe student learns trust (0.531 against Jev's 0.559) but under-reacts to "hold the line" and to a named "tend" order, by just over 0.10. Stand-in stays
r2$0More weight on the pilot's data, in shuffled option ordersBetter agreement, same under-reaction (−0.115 and −0.111). Stand-in stays
r3$0.6996640 trips with a hero who gives orders, so the teacher answers the situations the pilot lacked (including a price check that stopped the round's earlier design)C3 passes the deciding gates
Full run$3.6942163,883 teacher decisions on fresh seeds: 60 village days and 2,500 trips. The held-out set grows from 66 games to 372F1 misses a validation mark by 0.0016, so by the written rule F2 is trained; F2 passes the deciding gates
Judge audit$2.151836,000 requests to the teacher: re-asks, rule tests, and a blind reviewNo label relabelled, no new student: see below
Total$7.04under the caps of each round ($1.00, $1.00, $4.50, $3.00)

Every teacher game was rebuilt from its logs afterwards with no model calls; every tick hash matched. The full run cost within 0.7% of its written estimate.

The gates of C3 and F2

The gates were fixed before any v3 teacher data existed. G1: agreement with Jev on held-out games. G2: the same answer when the options are reordered. G3: written rules. G4: the one-word checks above, asked of the student: it must pass every check the teacher passed (G4a), and on every check move the teacher's way within 0.10 of it (G4b). G5: no loss on the city's held-out day. Both students are served averaging their answers over four option orders.

GateC3 (0615d81, 24 Sep)F2 (52ad1c0, 25 Sep)Pass markResult
G1 same top choice as Jev / distance from its odds (TVD)0.857 [0.840, 0.879] / 0.110 on 4,895 decisions (66 games)0.872 [0.866, 0.878] / 0.100 on 23,083 decisions (372 games)≥ 0.80, lower bound ≥ 0.77; ≤ 0.15pass, both
G1 companions in a party0.874 / 0.1060.877 / 0.101≥ 0.75; ≤ 0.18pass, both
G2 option order (400 items, 4 orders)0 changes (network alone 3.26%)0 changes (network alone 2.38%)≤ 3%pass by construction; reported
G3 written rules: trust / dying / guard1.000 / 0.000 / 1.0001.000 / 0.032 / 0.7780.90 eachfail; reported
G4 the one-word checksall within 0.10 of Jevall within 0.10 of JevG4a and G4bpass, both
G5 the city's held-out day (238,779 decisions)0.869 / 0.1090.870 / 0.108≥ 0.849; ≤ 0.129pass, both

On the pilot's 66 held-out games, the set C3 was scored on, F2 reaches 0.865 against C3's 0.857. Its gaps to the teacher on the one-word checks: trust −0.026, hold the line −0.083, fall back +0.050, dying +0.006, a named tend order −0.058. The students still under-react to orders, now inside the tolerance.

How to read G2 and G3. G2 passes only because every answer is averaged over four orders; that costs about four times the GPU work, and a village request's 95th percentile is 1.10 s against the game's 1.5 s budget. G3 fails on "dying" because the teacher fails it (0.097): a student faithful to Jev cannot pass it, so we report it as inherited. F2 also falls short on the guard rule, 7 of 9 cases moving by more than 0.02, though all 9 move the right way; with 9 cases, one case is 0.11 of the score. The rule that a student replaces the stand-in when G1, G4 and G5 pass, with G2 and G3 reported, was recorded on 23 September before either student was scored, and confirmed by the owner on 24 September. Under it, F2 replaced C3 as the qualified model.

Checking the teacher

A student can only be as right as what it copies. So before training anything further, we re-asked Jev about its own training answers in controlled ways (a plan committed before any request; 36,000 requests, none failed, $2.1518). All figures are from docs/JUDGE.md section 11.

Asked again with (10,708 training labels)Distance from the logged answer (TVD)Top choice changesConfident flip
Nothing changed: the same request again0.0374.8%0.07%
The options in another order0.08710.7%1.9%
The answer criteria reworded0.08510.3%1.8%
The person alone, without the other villagers in the request0.19020.9%10.5%

What this does not show

What was next, on 25 September 2026

The files

The project's repository is private for now; these names let each number be traced when the study files are published.

From Jev to Layatown: the city, 21 to 22 Sep 2026

Jevtown's 1,000 citizens were run by TypeSafe's Jev. Layatown's were run by a fine-tune of Laya, an open model by Convai Innovations, trained on Jev's own decisions from this city and running on one RTX 3080 Ti in Caracas, until the live city closed on 22 September 2026. Before switching, we tested whether it could take Jev's place, with a plan and pass marks committed before any score was read. It passed most of them. Not all.

Pre-registered on 21 September 2026 in layatown/docs/EVALUATION.md, changed afterwards only by dated amendments. Base model: Laya by Convai Innovations (convaiinnovations/laya, revision 1c5edc17, Apache-2.0, built on ModernBERT-large, about 421M parameters). Teacher: Jev (jev-1.13.0) by TypeSafe. Our checkpoint, layatown-v1, SHA-256 27f210cb…, was frozen before the held-out day was scored. Not affiliated with TypeSafe or Convai Innovations.

0.869same top choice as Jev on a day it never saw (untouched Laya: 0.324)
0.968follows the city's written rules (Jev: 0.895)
0.86 Whper 1,000 decisions on the GPU; no fee per decision
0 / 75ticks skipped, 1,000 people at real speed (p95 5.67 s, limit 7 s)
The live city closed on 22 September 2026. Earlier than the 4 October first planned, to put the work into You vs Laya: in the city, people looked more than they played (see the first day in public). At closing, from the city's live meter (/api/public, /api/numbers): 188,637 decisions by Laya since the switch on 21 September, day 40 of the city's clock, 86 people who played the city, 505 visits to jevtown.com, 6 citizens claimed with X, and $26.53 spent on Jev by the whole project (31,078 requests, 632 million tokens). Its recorded days then replayed in a loop at play.jevtown.com, with no model asked again, until the village game took that address over on 25 September 2026; the record is kept in the archive. Thank you to the players who claimed a citizen: @EricShang98, @youtoken8, @TheGenesisSwarm (who woke the city), @themjboy and @narrato_tech, with the founder, @elberacasa; your citizens and scores are kept in the record, untouched. Next came the village game (25 September 2026), then Beat the AI (26 September 2026), at play.jevtown.com; You vs Laya never opened.

Thank you, TypeSafe. Jev ran this city from its first tick on 19 September until 21 September 2026, and everything Layatown knows about this city it learned from Jev's answers. Thank you, Convai Innovations, for Laya and for releasing it under Apache-2.0. We did not make Laya; we fine-tuned it on one city.

How it was made

Laya reads a situation and a question with fixed answers and returns a probability for each answer in one pass, the same shape as Jev. We trained it to match Jev's full probabilities (not just its top pick) on 150,000 decisions logged in the village and the city (18 to 20 September), 34,120 character-sheet answers and 251 juror votes: one epoch, 4,345 steps, about 77 minutes on the RTX 3080 Ti. The test is the city's first public day, 238,779 decisions, 41,024 character-sheet answers and 168 juror votes that it never trained on. Details are in the model card.

Does it give Jev's answers?

On the held-out day, with 95% intervals from resampling whole ticks. The floor always answers the average of training; "untouched Laya" is Convai Innovations' model with no fine-tuning.

TaskMeasureLayatown v1Pass markResultFloorUntouched Laya*
What a citizen does nextsame top choice as Jev0.869 [0.864, 0.874]≥ 0.80pass0.2510.324
What a citizen does nextdistance from Jev's odds (TVD, lower is better)0.109 [0.107, 0.111]≤ 0.15pass0.5380.497
Character sheetsmean error on p(yes)0.0331 [0.0327, 0.0334]≤ 0.07pass0.1420.360
Juror votesmean error on p(guilty)0.062 [0.053, 0.070]beats the floorpass**0.1120.311
Character effects5 contrasts within tolerance of Jev's4 of 5all 5failn/an/a

* Untouched Laya was measured before the plan, on every 10th item of the same day with raw temperatures (23,878 decisions, 4,103 sheet answers, 17 juror votes), not on the full set. ** The paired interval the plan names: Layatown's error minus the floor's is −0.051 [−0.058, −0.043] (bootstrap over 14 trials, layatown/results/v1-juror-paired.json).

The character effects are the difference in how often a group does something compared with everyone else, on the same moments. Each must land within the larger of 25% of Jev's effect or 0.05:

ContrastJevLayatown v1Within toleranceUntouched Laya
The cowardly flee (danger here or near)0.4310.420yes−0.003
The brave fight (danger here or near)0.1800.268no: overshoots by 0.0880.007
Guards fight (danger here or near)0.4340.398yes0.181
The devout pray0.1990.201yes0.018
Thieves steal0.2460.245yes0.403

Is it right where Jev is not the judge?

Agreeing with Jev cannot show whether a model is better or worse than Jev. So we also scored all three against references that do not come from Jev: rules the city's own text states in words, answers that should not change when the options are listed in another order, and small sets a person labelled. Better means the paired 95% interval of the difference excludes zero.

ChecknLayatown v1JevUntouched LayaBetter
Moves the way the written rule says (e.g. starving: eat more)4000.9680.8950.203Layatown, +0.072 [0.044, 0.102]
Top choice changes when the options are reordered (lower is better)1000.0100.1400.790Layatown, −0.130 [−0.210, −0.060]
Chat moderation, against a person's label380.7370.9740.895Jev, −0.237 [−0.368, −0.105]
Harmless lines still shown beside three abusive ones200.0000.8500.000Jev, −0.850 [−1.000, −0.700]
Username screening, against a person's label360.7781.0000.833Jev, −0.222 [−0.361, −0.083]
Reading typed event proposals, against a person's label1480.4260.9870.405Jev, −0.561 [−0.642, −0.480]
Jury pairs in the direction the jury design predicted3680.6770.9100.543Jev, −0.234 [−0.285, −0.182]

Two cautions on the wins. Jev is not bit-deterministic (2 to 7 of 50 choices change between identical calls), so its 14% includes rerun noise that no baseline separates out. And the rule check counts direction only: where Jev's effect is larger (cowardly against brave, children fleeing), Layatown complies more often but moves less. The screening sets are tasks Layatown was never trained on; it does them at or below the level of untouched Laya.

Does a village run on it live the same life?

Per-question agreement need not survive the closed loop, where small differences compound over 240 ticks. We ran the village of 80 through three scenarios on seeds 6 to 10, new for every system: 15 fresh Jev runs ($2.70), 15 Layatown runs and 15 runs of the hand-written rules.

Criterionhard-weeksiegestrange-week
C1 everyone survives; threats overcome (Jev / Layatown / rules)pass (1.00 / 0.96 / 0.80)pass (1.00 / 1.00 / 0.76)pass (1.00 / 1.00 / 1.00)
C2 all five character effects p < 0.01 in ≥ 4 of 5 seedspasspassfail: "brave fight" 0 of 5, for Jev too
C3 closer to Jev than the rules are, on ≥ 6 of 8 metricspass (7 of 8)pass (8 of 8)pass (6 of 8)
C4 individuality (Layatown / Jev / rules)pass (0.162 / 0.160 / 0.055)pass (0.150 / 0.143 / 0.048)pass (0.177 / 0.169 / 0.064)

On the 15 story metrics per scenario (deaths, injuries, thefts, friendships, food, exhaustion and so on), the 95% intervals of Layatown and Jev overlap on 13, 14 and 13 of them. That is a description, not a test of equivalence. Where they do not overlap: mean food stock in hard-week (Jev 186, Layatown 268), the share of citizens changing action each tick in hard-week and strange-week (Layatown slightly lower), and individuality in siege and strange-week (Layatown slightly higher). Strange-week produces only 2 to 6 threatened brave villagers per run, so C2 fails there for the reference system as well; the effect was positive in all ten runs. It is reported as a failure of the criterion as written.

Can one GPU keep up?

MeasureJev (logged)Layatown v1, RTX 3080 Ti
Village request latency, p50302 to 360 ms125 to 385 ms (p95 338 to 691 ms)
Village runs with a skipped tickone fresh run skipped 3 ticks0 of 30 runs
The city, 1,000 people, 8 s ticks, 75 ticks at real speed0.98 s for a full tick of 1,0000 of 75 skipped; 536 decisions a tick; request p50 1.96 s, p95 5.67 s against a 7 s limit
Cost of 1,000 decisions$0.0150.86 Wh (GPU mean 207 W, including idle time between ticks)
Model server killed mid-run, back 96 s latern/aticks 15 to 25 skipped cleanly, no crash; resumed by itself at tick 26

The GPU is the limit: about 140 decisions a second. Jev answered a full city tick of 1,000 in 0.98 s at the median; Layatown uses most of the 8-second tick.

What failed, plainly

  1. The brave fight too much. On the held-out day Layatown's brave-fight effect is 0.268 against Jev's 0.180, outside the 0.05 tolerance. Criterion A5 fails as written.
  2. One character test could not be passed by anyone. In strange-week, "the brave fight" reaches p < 0.01 in 0 of 5 seeds for Layatown and 0 of 5 for Jev. Criterion C2 fails there as written.
  3. Our fine-tune reads people's words far worse than Jev. It was trained only on the city's decisions, and it lost ground even against Laya as released (chat 0.895 for untouched Laya). Chat 0.737 against 0.974, usernames 0.778 against 1.000, event proposals 0.426 against 0.987, and it blocked all 20 harmless lines placed beside abusive ones (Jev showed 17). That is why free text is gone: in Layatown no model reads what players type. Chat is a set of preset reactions, new events come from a menu in the world's data, and X handles that were never screened are not shown.
  4. Juries follow their design less closely. 0.677 of matched jury pairs move the way the jury design predicted, against Jev's 0.910. Juries in the city now come from this model.
  5. The serving margin is thin, and our own serving gate fails. The plan required a 1,000-decision tick to finish within 4 s at the 95th percentile. With Jev's 4 s limit, 3 of 60 ticks were skipped in the first scale test. We raised Layatown's limit to 7 s (the tick minus one second); at real speed its 95th percentile is 5.67 s. These tests ran on the same machine as the model; the live city adds the connection between Caracas and the server.

Verdict, by our own rules. The plan defines a "faithful replacement" as every criterion passing. Layatown is not one: A5 and C2 (strange-week) fail, and the serving gate is not met as written. It gives Jev's top answer 87% of the time on a day it never saw, keeps four of five character effects, keeps the village alive and as individual as Jev's, follows the written rules more often than Jev, and, because it was trained only on the city's decisions, is clearly worse at everything that involves reading what a person wrote (a limit of our fine-tune, not of Laya: the untouched model did better than our copy there). We switched with those trade-offs, and removed the features that depended on the last one.

What this does not show

Agreement with Jev is not correctness: Layatown copies Jev's known failure modes along with its judgment (the ones listed further down this page). The held-out day is a new moment of the same world, not a new world. The human-labelled sets are small (20 to 148 items). The village comparison is on 80 people, not the city of 1,000. The people who built Layatown wrote the plan and its pass marks, which is why they were fixed before the test.

Can a model teach itself? Round 1

Layatown learned everything from Jev. Can it get better without Jev, from signals that do not come from its teacher, and without getting worse at what it already does? Round 1 tried the cheapest such signal: self-consistency. The model was asked the same question four equivalent ways (the options in other orders, the state's keys in other orders), its four answers were averaged, and a copy of it was trained to give that average from a single view. No Jev label was used and no Jev request was made. The plan and its pass marks were committed before the first label was generated, and amended only in writing before training and before evaluation.

Data
100,000 decision states (50,000 from the model's own runs, 50,000 from the training split with Jev's answers thrown away), plus 34,120 character-sheet answers and 251 juror votes; 537,484 forward passes to label them
Training
From v1, lower 20 of 28 encoder layers frozen to share the GPU with the live city; lr 1e-5 / 3e-5, one epoch
GPU time
57.8 minutes to label, about 45.6 minutes to train (a bug in our own safety guard paused it for 29.5 more)
Pass rule
An improvement only if S1 (more consistent), S2 (no loss of fidelity) and S3 (no loss of rule-following) all hold
CriterionMeasurev1self-1Difference [95% paired CI]MarginResult
S1answers across 4 option orders (TVD, lower is better)0.01550.0147−0.0008 [−0.0013, −0.0004]interval below 0pass
S1top answer changes with option order1%0%−1 pt [−3, 0]not higherpass
S2same top answer as Jev, held-out day (238,779)86.92%86.91%−0.01 pt [−0.06, 0.04]≥ −1.0 ptpass
S2TVD to Jev, held-out day0.10910.1093+0.0002 [0.0001, 0.0003]≤ +0.01pass
S2character sheets, error (41,024)0.03310.0332+0.0001 [0.0000, 0.0002]≤ +0.01pass
S2juror votes, error (168)0.06150.0737+0.0122 [0.0094, 0.0148]≤ +0.01fail
S3written-rule compliance (400 pairs)0.9680.9680.000≥ −0.02pass

Verdict: a trade-off, not an improvement, so it was not deployed. The model did become slightly more consistent, but the gain was small (option-order TVD down about 5%) because v1 was already nearly invariant; there was little left to remove. It kept its fidelity and its rule-following. And its juror votes got worse, by 0.012 against a margin of 0.01 set before training: the four views of a juror's case disagreed on the verdict in 41% of the training cases, averaging turned those into hedges, and the student learned to lean toward 0.5 (mean p(guilty) 0.500, against v1's 0.494 and Jev's 0.479). The plan had named this risk: averaging blurs sharp answers.

Everything else stayed within noise of v1, including the brave-fight overshoot, which self-1 kept (0.267). The four village runs we made of each model (three siege seeds, one survival run) look alike, and are far too few for inference. Round 2 will take its signal from what happens to villagers in the simulation, and it gets its own plan before it runs.

Plan and amendments: layatown/docs/SELF-IMPROVE.md · results: bench/results/self-1/results.md, self-1-summary.json

What we are building next

Superseded: this section was written on 22 September, for You vs Laya, which never opened to the public. What came next is at the top of this page, and the study now is the minds study.

Two pieces of research, in the order they depend on each other. Neither exists yet; this is the plan, and each part gets its pass marks written before it is measured.

A dataset of people and a model in identical situations

In You vs Laya, every day a player finishes is replayed with the same luck and the model deciding in their place. That gives, for each moment, a person's choice and the model's choice in exactly the same situation, and what happened after each. Comparisons like that, with outcomes, are rare. Only with the player's consent, off by default, and without handles or names: the situation, the options, the choice and the outcome.

Nightly training, with gates

What we do not know yet. Whether people beat the model more often than not. Whether outcome weighting helps or just adds noise: round 1 shows a model's own signal can make one thing worse while making another better. And capacity: a player-day runs the day twice, estimated (not measured) at 8 to 16 GPU-seconds. We will measure before we promise.

The recipe we followed for v1 is written up for anyone to use with their own teacher: Train your own Laya. What it could be used for, with its limits: Build.

The files

The documents are rendered on this site from the project's repository; the result files are copied as they are and open as plain text.

The Jev era, 19 to 21 Sep 2026

A thousand minds for a cent and a half. What a small judgment model can and cannot do as the mind of a simulated city. Nineteen findings from building one on TypeSafe's Jev, the failures included. Written while Jev ran the city and kept as it was.

An independent experiment, not affiliated with TypeSafe. Model jev-1.13.0, September 2026. Every number on this page is measured from logs in the project's repository and can be reproduced; where something is a projection or was not run, it says so. Conceived and directed by elberacasa, who set the goals, the standards and every product and money decision; engineered with Claude (Anthropic's Fable 5.1) working in Claude Code.

Jev is not a chat model. It does not write. You give it a situation and a question with a fixed set of answers, and it returns a probability for each, in a few hundred milliseconds, for a price that rounds to nothing. One request can carry hundreds of independent questions about the same situation.

That shape suggested an experiment: make it the mind of a society. In Jevtown, code owns everything that can be computed (time, hunger, food, fire, injury, gossip, death, memory) and Jev supplies only judgment: for each inhabitant, each tick, the probability of each thing they might do next. Code samples an action from those probabilities and the world moves on. We ran it as a village of 80 and as a city of 1,000.

1,000citizens judged in one tick, in about one second
$0.015for that tick, all 1,000 asked (measured)
140 / 140ticks of a live run rebuilt from logs with zero model calls
$21.64total spent on Jev for the whole project, 515M tokens

What worked

Scale is nearly free

A city tick is ten parallel requests of 100 citizens. Over a live session of 140 ticks and 60,258 decisions, the whole tick took 980 ms at the median (p95 1,321 ms) and cost $0.0073 on average, because citizens are only asked again when their situation changes. Asking four judgments per citizen instead of one cost 31% more tokens, not four times more, because the situation is shared. A thousand yes/no character judgments times eight took 1.9 seconds and $0.0117.

People stay in character, measurably

Against a hand-written rule policy and a random policy behind the same interface (five seeds each, ten village days, 95% confidence intervals), the rate at which inhabitants with different characters act differently, which we pre-registered as "individuality", was three times higher under Jev, with nobody dying in either.

Individuality: do different people act differently? (80 villagers, hard-week, 5 seeds)

Jev0.160 Hand-written rules0.054 Random0.045
±0.004, ±0.003, ±0.003. All 80 alive at the end under Jev and under rules; 4.2 ± 1.6 under random. Beatable threats overcome: Jev 96% ± 11, rules 80%, random 36%.

All five pre-registered character effects were significant (p < 0.01) in five of five seeds: the cowardly flee at 0.96 against 0.41 for everyone else, the brave fight at 0.35 against 0.06, guards fight at 0.37 against 0.06, the devout pray at 0.27 against 0.01, thieves steal at 0.19 against 0.01. Three effects we did not pre-register (lazy, hardworking, greedy) point the expected way and do not reach significance; we report them as such.

Every ingredient of a person moves the answer

We replayed logged moments and asked again with one ingredient removed. Every removal shifted answers well beyond what asking the identical question twice does.

How far answers move when one thing is removed (mean total variation distance; 1,947 decisions)

Body needs0.234 Bonds to others0.217 Traits0.170 Job0.159 Memories0.131 News and danger0.097 Same question again0.047
The last row is the noise floor. Memory is text that code wrote from events ("was robbed by Cora"); Jev never writes anything.

A jury you can predict, because it is made of people

When a citizen is caught stealing, code seats twelve jurors, putting people tied to the accused or the victim first, and Jev judges each juror once: does this person vote guilty? We tested it before building it, as a 96-cell factorial with hypotheses and pass marks committed to the repository before the first request.

Shift in the probability of a guilty vote, everything else held fixed

Remembers being robbed by the accused+0.286 No tie, vs friend of the accused+0.162 Stern guard vs kind monk+0.143 Caught by a guard vs one person's word+0.121 Rival of the accused vs no tie+0.114 Friend vs spouse of the accused+0.038 An alibi−0.031
Red rows failed their pre-registered pass mark (0.20 for evidence, 0.10 for the others). Twelve jurors sharing one request differed from the same twelve asked alone by 0.038 on average; the same request sent twice, by 0.016.

With plain answer criteria the jury leaned guilty (0.59 on one person's word). We searched four wordings, chose one by a rule fixed in advance, and tested it on a different case it had never seen. A reasonable-doubt rule written into the "no" criterion passed four of five checks there: strong evidence +0.205, an incriminating find +0.126, rivals against friends 0.24, and a jury that is not a rubber stamp (0.425 on weak evidence). The alibi still failed: −0.067 against a required −0.10. So the game as shipped does not let the crowd submit evidence for the defence, because the model would mostly ignore it.

What broke, and what each failure taught

These are the part we think is most useful to anyone building on a judgment model. None of them raised an error. Each one produced confident, well-formed, wrong behaviour, and each was found by looking at what a whole population did, then replaying the exact moment and changing one field.

What we didWhat happenedWhat fixed it
Told Jev each villager's current action80 of 80 chose it again, at 0.92 confidence. The village froze.Remove the field. Continuity belongs in code.
Described what the crowd nearby was doing73 of 78 joined in, including 77 who were starving or exhausted. By day 3 the whole village was praying in the chapel.Remove the field: 1 of 78.
Relied on "hunger: starving" in the stateA calm, rested, starving guard chose work over eating.Say the priority in the answer's criteria, in words.
Let a famine runStarving farmers answered "eat" (0.81) when there was no food, never "farm". 34.6 ± 26.0 of 80 died; hand-written rules lost 0.2. Jev answers the one-step question; "no food, so I should farm" is two.Code withdraws impossible options; the option text states the missing link. 80 of 80 alive in 5 of 5 seeds.
Screened several chat messages in one requestA harmless line scored 0.41 for abuse when it sat next to an abusive one, and was blocked. A troll could silence a neighbour.One message per request. Harmless shown 20 of 20, harmful blocked 17 of 18.
Pointed at villagers by list positionSee below. This one invalidated a whole evaluation.Key collections by name.

The most expensive mistake: villagers[37]

The documentation says Jev cannot count. We did not see that an array index is a count. Same 80 villagers, same question; the measured gap between greedy and loyal villagers, by where they sat in the list:

Does Jev still tell people apart? Gap between greedy and loyal, by list position

keyed by name by array index
Positions 0 to 19, by name0.51 Positions 0 to 19, by index0.44 Positions 20 to 39, by name0.45 Positions 20 to 39, by index0.02 Positions 40 to 79, by name0.40 Positions 40 to 79, by index0.00
Past about the twentieth item, answers by index collapse to the village average: Jev answers, confidently, about nobody in particular. Keying by name was also the cheapest option in tokens.

We had run a complete pre-registered evaluation this way. We re-ran it with names and published both: individuality doubled (0.073 to 0.160), the cowardly fled at 0.96 instead of 0.66, and the flawed referencing turned out to have hidden about a third of the effect of character. We noticed only because a new feature showed the same flat answer for everyone after the first few villagers.

Two smaller cautions

Wording moves answers. Two reasonable phrasings of the same jury question differed by 0.058 on average and by 0.30 at worst. Pin the wording with the model version, and version both.

A label can outweigh a state. In the city, a well-fed thief steals at 0.27 and a starving one at 0.04, because eating comes first. Jev reads "thief" as what this person does. That is defensible, and it is not what a designer who wrote "hunger drives theft" would expect.

Jev is an instrument, not an oracle

To plan this project's launch we pointed Jev at 241 public posts about itself: 1,391 requests, no failures, three cents. Asked small literal questions (does this post state a measured number? is it about computer use?), it was clean and cheap, and turned an impression into counts: 31.5% of posts explain Jev, 11.6% are computer use, 4.6% are a game or a simulated world. Asked directly which of two real posts did better, it was at chance: 43.8% against likes per view, 53.8% against likes (260 pairs, both orders). The same judgments used as features of a fitted model, scored only on posts the model had not seen, reached 66.8%, against 64.3% from media type and length alone. Jev's own favourite among our drafts came last in the fitted model. Ask Jev small questions at scale; let something fitted, or someone, decide what the answers mean.

Rules we would give anyone building on Jev

  1. Code owns everything that is not a judgment. Counting, arithmetic, time, memory, what is possible. If the right answer can be computed, compute it, and withdraw impossible options before asking.
  2. Key everything by name, never by position.
  3. Put priorities and decision rules in the answer criteria, in words. State alone is weak.
  4. Say who an option is for, not who it is not for.
  5. Never show the model its own last answer, or what the crowd is doing. Both are traps nothing leaves.
  6. Shared state must hold only what everyone in the request knows. Unrelated detail moves answers, which becomes a fairness bug the moment two people share a request.
  7. One step per question. If the right answer needs "therefore", code has to supply the link.
  8. Treat probabilities as probabilities. Sample from them, with a floor for rare harmful actions and a commitment rule so a thousand people do not all change their minds every tick.
  9. Treat Jev as an instrument, not an oracle. Its judgments are good features and a poor forecast. Fit something on real outcomes.
  10. Look at populations, not examples. Every failure above was invisible in any single answer and obvious in a tally of eighty.

Reliability, observed rather than staged

The design rule was: one attempt per tick with a timeout shorter than the tick; a failed tick is skipped, never queued; people carry on with what they were doing; a rate limit slows the clock. During a live city session the machine running the server lost its network for four minutes (timeouts, then DNS failures: our side, not TypeSafe's). 36 consecutive ticks were skipped, nothing piled up, the first tick after the network returned was ordinary, and the whole run, outage included, rebuilds from its logs to the identical state hash on all 140 ticks with zero model calls.

Across all 20,851 requests the project made: 20,475 succeeded; 339 got no response, 336 of them in that outage; 37 were rejected with HTTP 400, every one our own doing (requests over the 64k-token limit while we were finding where it was). We never received a rate limit (HTTP 429) or a server error. The production city, in its rehearsals and its first day open to the public, made 3,905 more: 3,904 succeeded and one got an HTTP 503 from the API, the only server error we have seen. The city skipped that answer and carried on.

Every dollar

Every request the project ever made to Jev went through one client that writes a ledger line: purpose, tokens as counted by the API, cost at the published $0.042 per million input tokens (output is free). As of the evening of 19 September 2026:

What it paid forRequestsInput tokensUSD
Evaluations against baselines: seven rounds, five seeds per condition12,450219,223,4749.21
The live city: citizens deciding, tick by tick3,196102,891,5644.32
Development runs of the 80-villager world99122,600,0990.95
Fifteen benchmarks (every finding above)1,43416,082,5810.68
Daily character sheets in the live city56811,631,9380.49
First headless run of 1,000 citizens1715,876,9900.25
Jev researching its own launch: 241 posts annotated, pairs judged, a tournament of drafts1,9781,213,9740.05
Juries, chat screening, reading proposals, handle checks, smoke tests6379,9490.00
The public city: rehearsals, then its first day open to everyone (its own ledger, evening of 20 September UTC)3,905135,702,6875.70
Total24,756515,303,25621.64

Two things in that table are our own waste, and they are in it on purpose. Evaluation rounds one to five ($6.51) all pointed at villagers by list position and were superseded by round six ($1.87), which is the one reported here. And for a while our test suite made real requests whenever a key was present on the machine: about $0.22 before we caught it in the ledger. A test now fails if any test reaches the API.

Running the city live costs about $3.50 an hour at one tick per eight seconds (projected from the measured $0.0073 per tick plus sheets), whether one person is watching or ten thousand, and nothing when nobody is.

The first day in public

On the night of 19 September 2026 the city opened at play.jevtown.com. It slept, spending nothing, until its first citizen was claimed, and then ran for as long as anyone was watching. This is what happened, from its own logs. We are reporting it the way we reported everything else here: as it was.

239,694decisions by Jev in 435 ticks, with no failed tick
52people opened the city
4citizens claimed with X, two of them by strangers
$4.33spent on Jev since it woke

The system held. One continuous run, nineteen city days, 3,905 production requests of which one came back as an HTTP 503 and none as a rate limit. The city kept its promise about spend: it ticked only while someone was there, and an empty city cost nothing.

People looked more than they played. Of 72 questions the city asked ("what does this person do next?"), 11 drew a vote, and 3 of those 11 calls were right. Of 14 trials (6 convictions, 8 acquittals), visitors called the verdict 6 times. Two chat messages were sent. One visitor wrote an event in their own words, "A bear comes into town", and Jev read it as a serious wolf pack at the fields, for $0.0001. Most visits were short.

What we take from it. The engineering question, whether a small judgment model can be the mind of a thousand people, live, within a budget, has an answer: yes, with the failure modes listed above. The product question, whether watching that is something people stay for, has an honest answer too: not yet, not in this form. A quiet launch from a small account is not much of a sample, and we do not claim more than that. The parts people responded to were the ones that explain and help: the explainer and the field guide.

Superseded: this paragraph was written on 20 September. On 21 September 2026 the city moved to Layatown instead of closing, and on 22 September 2026 the live city closed, earlier than planned; its recorded days replay at the same address. See the top of this page.
What happens to the city. It stays live, on a small daily budget, until 4 October 2026. After that, the same address will replay the city's recorded days from its logs, with no model calls, which is something the design made possible from the first tick. Citizens claimed with X keep their owners in the record; anyone can release theirs from the citizen's card, which deletes their record, as always. This page, the guide and the explainer stay.

Method, and what this does not show

The evaluation plan, its metrics and its pass marks were committed before the runs and only amended with dated notes. Baselines sit behind the same interface as Jev. Conditions ran on five seeds and are reported with 95% confidence intervals. Benchmarks that choose a wording do so on one case and are confirmed on another. Failed hypotheses are reported next to the ones that passed.

Limits. One model version. One world design, by one team, which also wrote the baselines. Believability to human judges was planned and never run; the prediction game collects a crowd-against-Jev dataset instead, and it needs an audience we have not had. The comparison against baselines was run on the village of 80, not yet on the city of 1,000. The jury experiment uses synthetic jurors and two cases. Nothing here says anything about tasks other than this one.