The study Jevtown System One dataset

Jevtown System One dataset

Rendered from training/README.md in the project repository, 21 September 2026, word for word. Laya is an open model by Convai Innovations (Apache-2.0); Jev is TypeSafe's model. Not affiliated with either. Cited result files are listed in the study.

Every judgment TypeSafe's Jev model made while running Jevtown, organised as training and evaluation data for building a System One model: a model that takes a situation and typed questions with fixed answers, and returns a probability for each answer, in one forward pass, without writing text.

Read this whole card before training on or evaluating against the data. It says what is exact, what is rebuilt, what is missing, and what the numbers can and cannot tell you.

At a glance

splitvillager_decisioncharacter_sheetjuror_vote
train537,0764,265251
val43,2212,55048
test_production238,7795,128168

Plus five small evaluation sets with human labels in eval/ (445 rows). Everything fits in 512 tokens (median about 280). Built from 65 Jev-driven runs (38 in train, 4 in val, 1 held out as the production test), model jev-1.13.0, 18 to 20 September 2026. Figures above are from the build of 21 September 2026; data/stats.json has the current ones.

Build and check

bun training/build.ts      # reads runs/ (development) and runs/prod/runs/ (the production city), writes training/data/
bun training/validate.ts   # every line: schema, keys, valid probabilities, checksums, no personal data

training/data/ is gitignored: it is large and derived from paid model outputs. The scripts and this card are the source of truth; rebuilding from the same logs gives byte-identical files (checksums in data/manifest.json). The production logs are copied read-only from the city's volume: fly ssh console -a jevtown-play -C "tar czf - -C /data runs" > runs/prod/prod-runs.tgz then unpack into runs/prod/.

Format

One JSON object per line. Every example is one request in the systemone shape plus the answer it got:

{
  "id": "3f9c…",                         // sha256 of (task, state, questions), first 16 hex
  "task": "villager_decision",
  "state": { "village": { "time": "evening", "food": "scarce" },
             "villagers": { "Kara_Coldwood": { "job": "weaver", "traits": ["loyal","generous"], "hunger": "hungry",
                                                "danger": "wolves, right here", "memories": ["was robbed by Cora"] } } },
  "questions": { "c0001": { "type": "choice",
                            "instructions": "What does `villagers.Kara_Coldwood` do next? Judge from their `danger`, …",
                            "criteria": { "flee": "…", "help others": "…", "work": null } } },
  "targets":   { "c0001": { "type": "choice", "probabilities": { "flee": 0.62, "help others": 0.27, "work": 0.11 } } },
  "source":    { "run": "city-1", "origin": "development", "world": "jevcity", "world_hash": "e05c…", "tick": 212,
                 "model": "jev-1.13.0", "inputs": "exact", "shared_request_size": 100, "duplicates_merged": 1 },
  "flags": [],
  "approx_tokens": 281
}

The three tasks

villager_decision (choice, 8 to 11 options). What does this person do next? The state is one simulated citizen's perception (needs, mood, danger, traits, job, relationships, recent memories, news) and the village's time and food. Options are actions such as work, eat, sleep, flee, fight, help others, steal, pray, socialize, idle, with the decision rules written into the criteria ("Comes first when starving."). Exact: the logged perception is the object that was sent.

character_sheet (8 nouls per person). Would this person steal food if starving, risk their life for a friend, betray a friend for gold, stand and fight, forgive a thief, lie, lead, leave? The state is the person's job, traits and memories. Rebuilt by replay: the answers were logged; the state is recovered by replaying the run to the exact moment the question was asked. A sheet is kept only if the set of people alive at that moment matches the logged answers exactly.

juror_vote (noul). Does this juror vote guilty? The state is the case (charge, evidence) and one juror (job, traits, tie to the accused or victim, memories). Rebuilt by replay, with a check: every juror's tie, recomputed from the rebuilt world, must equal the logged tie, or the whole trial is dropped. None were dropped for a mismatch.

Splits

Split by whole runs, because consecutive ticks of one run are near-duplicates of each other.

What was left out, and why

Evaluation sets with human labels (eval/)

Small, hand-written, from the project's pre-registered benchmarks (bench/, results in bench/results/). They test jobs other than the city and carry the correct answer written by a person (human_label) next to Jev's.

filerowswhat it tests
event_reading.jsonl148a sentence ("make it rain so hard the dock goes under") read into an event type, or refused
chat_moderation.jsonl38is a chat line abusive, spam, or private details (content warning: includes slurs and threats)
chat_neighbour_effect.jsonl20the same harmless line scored alone and next to abusive ones: a fair model should not move
username_screening.jsonl36hateful usernames against innocent ones that contain rude strings (Scunthorpe, Dickinson)
juror_factorial.jsonl192a 96-cell factorial (juror profile x tie x evidence x memory x wording) with Jev's probability of guilty

These rows record the case and the answers, not the full request wording; the exact questions are in the benchmark scripts (bench/shapes.ts, bench/chat.ts, bench/handles.ts, bench/trial.ts).

Baselines any model must beat (computed on this build)

tasksplitbaselinescore
villager_decisiontest_productionthe average answer from train, for every questionTVD 0.517, top-1 agreement 0.278
villager_decisionvalsameTVD 0.504, top-1 agreement 0.213
juror_votetest_productionalways the train mean (0.49)MAE 0.112
character_sheettest_productionalways the train mean (0.39)MAE 0.142

The mean entropy of the decision targets is about 1.0 nat: Jev is usually decisive but rarely certain, so train on the soft probabilities, not just the top choice.

How to evaluate a model on this

  1. Agreement with the teacher, per task: mean total variation distance and top-1 agreement (choice), mean absolute error and Brier score (noul), calibration error. Report the baselines above next to your numbers.
  2. Behaviour, not just agreement. The study's pre-registered character effects are the real test: the cowardly flee (0.96 against 0.41), the brave fight (0.35 against 0.06), the devout pray (0.27 against 0.01), thieves steal (0.19 against 0.01). A student that matches Jev on average but loses these has learned the wrong thing. Run the city with it (bun sim … --policy <yours>) and compare with bun compare.
  3. The known failure modes, so a new model does not repeat them: show it its own last answer (Jev: 80 of 80 froze), describe the crowd nearby (73 of 78 joined in), a harmless line next to an abusive one (0.41 against 0.09). docs/JEV.md has the details and the benchmark scripts reproduce them.
  4. Speed and cost, measured on your hardware, next to Jev's measured 0.98 s for 1,000 decisions (ten parallel requests) and $0.015.

Known limitations

Provenance and permission