PROTRAILBLAZER
With a System One model, the creature's brain is a short personality text that travels inside the state on every decision tick. The model reads that text alongside hunger, fear and what is nearby, then answers a Choice question over a fixed list of behaviors and a Choice over which nearby thing to target. Editing one sentence changes how the creature lives, with no behavior tree to rewire.
day 1 · day · 0:26 of 1:00
This page has no model behind it, so a hand-written table reads the text. Only these words and phrases move the numbers. Anything else is ignored. That is a limit of this mock, not of a System One model, which reads the whole sentence. Dashed tokens are conditions (a time of day or a situation) that switch their clause on or off, and black tokens are negations that flip the clause they sit in.
The bar spans 500 ms. The red mark is 400 ms, when this creature's next tick is due.
{}{}A behavior tree is a hand-built flowchart. A grazer's tree checks "predator within 80 px" before "hungry above 0.6" before "near a friend", and every personality quirk is another branch, another threshold, and another chance for two branches to fight. Making one grazer love the pond at dusk means finding the right node and wiring a new one. Here the quirk is a sentence. Every 400 ms each creature sends its numbers, what it can see, and its personality text in one state object, and asks three typed questions. The model weighs the English against the sensor data in the same call, and the answer comes back as probabilities over options the designer wrote.
every 400 ms, per creature, staggered: // never blocks the frame loop
state = { self: needs_and_zone(), nearby: visible(12), personality: text }
send({ state, model: "jev-latest", questions: { action, target, urgency } })
on answer(a): // lands 70 to 500 ms later
if a.action.confidence < 0.3:
pause_and_look_around() // too flat to commit
log("unsure, looks around")
else:
routine = ROUTINES[a.action.choice] // hand-written steering code
target = resolve(a.target.choice, routine) // code checks the target fits
speed = 0.6 + 0.4 * a.urgency.score // 0.6x to 1.4x
routine.run(target, speed)
The model never moves a creature. It picks one of ten behavior ids, and each id maps to a routine somebody wrote: a steering vector, a speed, an animation, an exit condition. "Drink" walks to the edge of the pond, never into it, because the routine says so. "Hide" heads for the thicket, and the predator cannot see a creature inside it because the code that builds the predator's state leaves it out. The personality text can only shift which of those ten things happens and toward what. It cannot invent an eleventh. That is the line that keeps this safe to ship: prose controls the choice, code controls the consequences, and the target the model names is checked against the routine before anything moves.
Cardinality is the number of options a Choice question carries. The action question always has ten. The target question is rebuilt every tick from whatever the creature can see, at most 12 things plus none, so its option count changes as creatures move. The inspector shows it live. A Choice question can take up to 255 options. Above that, TypeSafe uses a slower two-stage path. Turn on the stress toggle to pad every target question to 201 options: it still fits under the ceiling, but each request grows several times over, the mock answers at the slow end of the latency range, and the hourly cost jumps. A real game hits this with inventories, crowds and item catalogs, and the fix is the same as here: filter in code first, and send the model the dozen things that matter.
Eight creatures each deciding every 400 ms is 20 calls a second, 72,000 an hour. Each call carries the three questions (the ten behavior descriptions are the bulk of it), the creature's needs, up to 12 nearby things, and its personality text, and only input is billed. The meter multiplies the measured token rate by $0.042 per million input tokens. Staggering the ticks spreads those calls evenly across each 400 ms window instead of firing eight at once, and it is why a request is skipped when the previous one has not landed yet: a creature never has two decisions in flight.
About this demo: every answer here comes from a local mock, and nothing on this page calls Jev, which is in early access. Action logits start from the numbers in the state (hunger raises graze, fear raises flee and hide, low energy raises rest, a predator within 80 px raises flee for grazers and approach or challenge for the predator). The personality text then adds or subtracts per action and per target kind, using only the vocabulary listed in the editor. The mock reads clause by clause: time words and situations such as "at night" or "near the predator" switch their clause on or off, and words like "avoids" or "ignores" flip it. The target question weighs each nearby thing by how well it fits the likely actions, its distance, and the text. Everything goes through a softmax at temperature 0.8 with jitter. Confidence is shown as 1 minus normalized entropy, an approximation of TypeSafe's unpublished formula. Latency is drawn uniformly from 70 to 500 ms (420 to 500 ms in stress mode), and token counts are the JSON length divided by 4.