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.
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) | Bar | Our v1, zero-shot | Jev | v1 result |
|---|---|---|---|---|
| T1 "would die for" instead of "distrust": follows the hero more | 0.10 | 0.004 | 0.559 | fail |
| T2a "hold the line" instead of "fall back": fights or guards more | 0.10 | 0.020 | 0.329 | fail |
| T2b "fall back" instead of "hold the line": flees more | 0.10 | 0.032 | 0.216 | fail |
| T3 a loved one "dying" instead of "gravely wounded": helps or guards more | 0.05 | −0.170 | −0.089 | fail |
| T4 an order to tend a named person: tends more | 0.10 | 0.016 | 0.448 | fail |
| Top choice changes when the options are reordered (lower is better) | 3% | 5.0% | n/a | fail |
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.
| Round | Jev spend | What it bought | Outcome |
|---|---|---|---|
| Zero-shot check | $0 | The city model, unchanged, on the new questions | Fails; teacher answers needed |
| Pilot | $0.4972 | 21,201 teacher decisions: 8 village days and 320 trips into the Darkwood | The 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 | $0 | More weight on the pilot's data, in shuffled option orders | Better agreement, same under-reaction (−0.115 and −0.111). Stand-in stays |
| r3 | $0.6996 | 640 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.6942 | 163,883 teacher decisions on fresh seeds: 60 village days and 2,500 trips. The held-out set grows from 66 games to 372 | F1 misses a validation mark by 0.0016, so by the written rule F2 is trained; F2 passes the deciding gates |
| Judge audit | $2.1518 | 36,000 requests to the teacher: re-asks, rule tests, and a blind review | No label relabelled, no new student: see below |
| Total | $7.04 | under 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.
| Gate | C3 (0615d81, 24 Sep) | F2 (52ad1c0, 25 Sep) | Pass mark | Result |
|---|---|---|---|---|
| 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.15 | pass, both |
| G1 companions in a party | 0.874 / 0.106 | 0.877 / 0.101 | ≥ 0.75; ≤ 0.18 | pass, 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 / guard | 1.000 / 0.000 / 1.000 | 1.000 / 0.032 / 0.778 | 0.90 each | fail; reported |
| G4 the one-word checks | all within 0.10 of Jev | all within 0.10 of Jev | G4a and G4b | pass, both |
| G5 the city's held-out day (238,779 decisions) | 0.869 / 0.109 | 0.870 / 0.108 | ≥ 0.849; ≤ 0.129 | pass, 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 changes | Confident flip |
|---|---|---|---|
| Nothing changed: the same request again | 0.037 | 4.8% | 0.07% |
| The options in another order | 0.087 | 10.7% | 1.9% |
| The answer criteria reworded | 0.085 | 10.3% | 1.8% |
| The person alone, without the other villagers in the request | 0.190 | 20.9% | 10.5% |
- Stability. 63.2% of the labels are stable, 36.0% shaky (moved by a reorder, mostly near-ties) and 0.79% unstable. Under 1% in every part, so by the written rule no labels were re-asked or dropped.
- Rerun noise against order. Jev is not bit-deterministic: 4.8% of identical requests change their top choice. The option order adds about 5.7 points on top of that. The city study below cautioned that Jev's 14% there includes rerun noise; here the two are measured apart.
- The context effect, 20.9%. The logged answers came from requests holding many villagers at once (about 52 in the village); a student learns from one person at a time. Asked about the same person alone, Jev changes its top choice 20.9% of the time (25.1% in the village), confidently in 10.5%. The students have been trained on answers shaped by a crowd they never see. This is the audit's one actionable result.
- Rule compliance. On 14 written-rule checks on its own training states, Jev complies 0.76 of the time overall. Strong on trust, orders and fleeing a threat here (0.91 to 1.00); weak on guarding a loved one who is down (0.60), sleeping when exhausted (0.54) and working when healthy (0.45); and against the rule on "dying" (0.14). A sentence that spelled the dying rule out for Jev turned the direction around, but not by enough, and it moved answers where nobody was dying, so by the plan's rule it was rejected and T3 stays inherited. On held-out rule pairs Jev scores 0.736: the mark a student would have to beat to be called better than its teacher on rules.
- An AI review, not a human one. Three separate Claude Opus 5.5 sessions, blind to each other and to the audit, judged 100 of Jev's decisions: is its top option a sensible next action? The panel said yes to 86 (95% interval 0.78 to 0.91), no to 3, unsure on 11, with Fleiss' kappa 0.72 among the three. A fourth judge, Claude Fable 5.1, agreed with the panel on 88 of 100. All three "no" answers fell on labels the audit had marked shaky. These judges are language models, not people; the review is a second opinion, not ground truth.
What this does not show
- One teacher. Every gate measures agreement with Jev
jev-1.13.0. Agreement is not correctness, and the students copy the teacher's failures, as T3 shows. - AI judges, not people. The only review of sensibleness was by AI judges, on 100 items. No human review is reported.
- No ethics board. No ethics board or outside reviewer has reviewed this work. The people who built the game wrote the plans and the pass marks, which is why they were fixed before the data.
- Simulated villagers. Every claim is about villagers in a simulation. The heroes, parties and orders in the training games were played by a script that cycles them on purpose, not by players, so they cover the words evenly and say nothing about how people play.
- No player data was used for training. Nothing anyone typed and no handles were ever in the dataset, and no v3 training game was played by a person.
- Our machine, not the cloud. Every latency here was measured on one RTX 3080 Ti. Nothing has been measured on the GPU the game would use.
What was next, on 25 September 2026
- The minds study. Does a small model retrained each night on the duel rounds players choose to share predict their next move better than the same model frozen, and better than a count of each player's habits? The groups, the gates, the minimum of 100 players, the 60-day hard stop and what happens to the rounds are in the plan. (Update, 26 Sep 2026: pre-registered and started that day, before any rounds were recorded.)
- The companions on the qualified model, through a cloud GPU. Only the hero's party (up to three companions) would ask F2; everyone else would stay on the game's rules, and each villager's card would say which decided. Before a switch-on: the cloud copy's answers checked against ours on the committed sets, latency measured from the game's server, hard caps on GPU use, and a privacy note naming where the model runs. Written for the village game; not started, and Beat the AI's duels do not use F2.
- Hob, a browser-sized student. Pre-registered in
docs/MINI.mdbefore any label or training: three sizes of about 6M, 17M and 50M parameters, starting from Ettin encoders (Johns Hopkins, MIT licence), learning from the odds of our qualified fine-tune (weight 0.7) and from Jev's answers weighted by the audit's stability tiers (0.3). Each size must pass G1, G4 and G5 against Jev and browser gates written in advance (at most 30 MB to download, latency on a throttled phone-like CPU, memory, frame rate, quantisation parity). The smallest size that passes is selected; if none does, that is published as the result. No Jev spend. Hob is neither Laya nor Jev, and its weights stay internal until the Season 1 release decision. - The context effect. A round that asks Jev about each person alone, the student's own input (about $4.8 at measured prices), would address the audit's main finding. It needs its own plan and the owner's yes; it has not started.
The files
The project's repository is private for now; these names let each number be traced when the study files are published.
- Zero-shot check:
docs/LAYA-V3-ZEROSHOT.mdsection 8,bench/results/laya-v3-zeroshot/ - Pilot, r2 and r3 (C3):
docs/LAYA-V2-PILOT.mdsections 4 and 9 to 13,bench/results/laya-v2-pilot/,laya-v2-r2/,laya-v2-r3/ - Full run and F2:
docs/LAYA-V2-FULL.mdsections 7, 11, 15 and 16,bench/results/laya-v2-full/ - Judge audit:
docs/JUDGE.mdsection 11,bench/results/judge/ - Hob:
docs/MINI.md - Training data card:
training/README.md
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.
/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.
| Task | Measure | Layatown v1 | Pass mark | Result | Floor | Untouched Laya* |
|---|---|---|---|---|---|---|
| What a citizen does next | same top choice as Jev | 0.869 [0.864, 0.874] | ≥ 0.80 | pass | 0.251 | 0.324 |
| What a citizen does next | distance from Jev's odds (TVD, lower is better) | 0.109 [0.107, 0.111] | ≤ 0.15 | pass | 0.538 | 0.497 |
| Character sheets | mean error on p(yes) | 0.0331 [0.0327, 0.0334] | ≤ 0.07 | pass | 0.142 | 0.360 |
| Juror votes | mean error on p(guilty) | 0.062 [0.053, 0.070] | beats the floor | pass** | 0.112 | 0.311 |
| Character effects | 5 contrasts within tolerance of Jev's | 4 of 5 | all 5 | fail | n/a | n/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:
| Contrast | Jev | Layatown v1 | Within tolerance | Untouched Laya |
|---|---|---|---|---|
| The cowardly flee (danger here or near) | 0.431 | 0.420 | yes | −0.003 |
| The brave fight (danger here or near) | 0.180 | 0.268 | no: overshoots by 0.088 | 0.007 |
| Guards fight (danger here or near) | 0.434 | 0.398 | yes | 0.181 |
| The devout pray | 0.199 | 0.201 | yes | 0.018 |
| Thieves steal | 0.246 | 0.245 | yes | 0.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.
| Check | n | Layatown v1 | Jev | Untouched Laya | Better |
|---|---|---|---|---|---|
| Moves the way the written rule says (e.g. starving: eat more) | 400 | 0.968 | 0.895 | 0.203 | Layatown, +0.072 [0.044, 0.102] |
| Top choice changes when the options are reordered (lower is better) | 100 | 0.010 | 0.140 | 0.790 | Layatown, −0.130 [−0.210, −0.060] |
| Chat moderation, against a person's label | 38 | 0.737 | 0.974 | 0.895 | Jev, −0.237 [−0.368, −0.105] |
| Harmless lines still shown beside three abusive ones | 20 | 0.000 | 0.850 | 0.000 | Jev, −0.850 [−1.000, −0.700] |
| Username screening, against a person's label | 36 | 0.778 | 1.000 | 0.833 | Jev, −0.222 [−0.361, −0.083] |
| Reading typed event proposals, against a person's label | 148 | 0.426 | 0.987 | 0.405 | Jev, −0.561 [−0.642, −0.480] |
| Jury pairs in the direction the jury design predicted | 368 | 0.677 | 0.910 | 0.543 | Jev, −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.
| Criterion | hard-week | siege | strange-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 seeds | pass | pass | fail: "brave fight" 0 of 5, for Jev too |
| C3 closer to Jev than the rules are, on ≥ 6 of 8 metrics | pass (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?
| Measure | Jev (logged) | Layatown v1, RTX 3080 Ti |
|---|---|---|
| Village request latency, p50 | 302 to 360 ms | 125 to 385 ms (p95 338 to 691 ms) |
| Village runs with a skipped tick | one fresh run skipped 3 ticks | 0 of 30 runs |
| The city, 1,000 people, 8 s ticks, 75 ticks at real speed | 0.98 s for a full tick of 1,000 | 0 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.015 | 0.86 Wh (GPU mean 207 W, including idle time between ticks) |
| Model server killed mid-run, back 96 s later | n/a | ticks 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
- 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.
- 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.
- 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.
- 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.
- 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
| Criterion | Measure | v1 | self-1 | Difference [95% paired CI] | Margin | Result |
|---|---|---|---|---|---|---|
| S1 | answers across 4 option orders (TVD, lower is better) | 0.0155 | 0.0147 | −0.0008 [−0.0013, −0.0004] | interval below 0 | pass |
| S1 | top answer changes with option order | 1% | 0% | −1 pt [−3, 0] | not higher | pass |
| S2 | same top answer as Jev, held-out day (238,779) | 86.92% | 86.91% | −0.01 pt [−0.06, 0.04] | ≥ −1.0 pt | pass |
| S2 | TVD to Jev, held-out day | 0.1091 | 0.1093 | +0.0002 [0.0001, 0.0003] | ≤ +0.01 | pass |
| S2 | character sheets, error (41,024) | 0.0331 | 0.0332 | +0.0001 [0.0000, 0.0002] | ≤ +0.01 | pass |
| S2 | juror votes, error (168) | 0.0615 | 0.0737 | +0.0122 [0.0094, 0.0148] | ≤ +0.01 | fail |
| S3 | written-rule compliance (400 pairs) | 0.968 | 0.968 | 0.000 | ≥ −0.02 | pass |
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
- Weighted by outcomes. Decisions that worked teach more, so bad play on purpose cannot steer the model.
- Frozen versions behind pre-registered gates. A candidate trains when the GPU is freest and is tested on the same suites as today's model, plus how it scores against players' logged days. It ships only if it passes; every version is dated in a public changelog, regressions first.
- Never retrained mid-session. A training run takes 45 to 80 GPU-minutes on the GPU that serves the game; online learning from anonymous players can drift or be poisoned; a model that changes all the time cannot be tested; and scores against an opponent that changed mid-run cannot be compared.
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.
- Plan and amendments:
layatown/docs/EVALUATION.md - Model card:
layatown/docs/MODEL_CARD.md - Held-out day:
v1-test_production.json,v1-character.json,base-raw-every10.json - Beyond the teacher:
bench/results/beyond/results.md - Village runs:
bench/results/levelC/results.md,levelC-primary.txt,levelC-character.txt - Serving:
bench/results/serving/results.md - Training data card:
training/README.md - Self-improvement, round 1:
layatown/docs/SELF-IMPROVE.md,bench/results/self-1/results.md,self-1-summary.json - Serving logs and power readings:
lt1-realtime.log,lt1-failure.log,power-realtime.csv,soak-resources.csv
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.
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)
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)
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
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 did | What happened | What fixed it |
|---|---|---|
| Told Jev each villager's current action | 80 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 doing | 73 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 state | A calm, rested, starving guard chose work over eating. | Say the priority in the answer's criteria, in words. |
| Let a famine run | Starving 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 request | A 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 position | See 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
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
- 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.
- Key everything by name, never by position.
- Put priorities and decision rules in the answer criteria, in words. State alone is weak.
- Say who an option is for, not who it is not for.
- Never show the model its own last answer, or what the crowd is doing. Both are traps nothing leaves.
- 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.
- One step per question. If the right answer needs "therefore", code has to supply the link.
- 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.
- Treat Jev as an instrument, not an oracle. Its judgments are good features and a poor forecast. Fit something on real outcomes.
- 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 for | Requests | Input tokens | USD |
|---|---|---|---|
| Evaluations against baselines: seven rounds, five seeds per condition | 12,450 | 219,223,474 | 9.21 |
| The live city: citizens deciding, tick by tick | 3,196 | 102,891,564 | 4.32 |
| Development runs of the 80-villager world | 991 | 22,600,099 | 0.95 |
| Fifteen benchmarks (every finding above) | 1,434 | 16,082,581 | 0.68 |
| Daily character sheets in the live city | 568 | 11,631,938 | 0.49 |
| First headless run of 1,000 citizens | 171 | 5,876,990 | 0.25 |
| Jev researching its own launch: 241 posts annotated, pairs judged, a tournament of drafts | 1,978 | 1,213,974 | 0.05 |
| Juries, chat screening, reading proposals, handle checks, smoke tests | 63 | 79,949 | 0.00 |
| The public city: rehearsals, then its first day open to everyone (its own ledger, evening of 20 September UTC) | 3,905 | 135,702,687 | 5.70 |
| Total | 24,756 | 515,303,256 | 21.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.
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.