Jev plays Doom: what real-time demos do when a Jev call fails
Jev plays Doom (TypeSafe AI): real-time game and robot demos, and what each loop does when Jev fails. Three game and robot-simulation demos that call Jev, read at pinned commits: what Jev decides, the loop tick, the request timeout, and what each loop does on an error, a bad answer or no key. Two more harnesses are listed for contrast and are not counted. "jev plays doom" and "jev doom demo" were suggested on Google, Bing and DuckDuckGo when the pool checked on . A suggestion shows that people search for something; it does not show how many. The pool ran nothing: no game, no simulation, no Jev call. Every cell comes from code read at a pinned commit.
Of 3 published game and robot-simulation demos that call Jev, read at pinned commits, 2 keep their last action when a call fails (doom-jev, JevPlaysSnakeGame) and 1 stops (jev-robotics-demo); none is a product.
The 3 are the counted rows in the harness table: 2 + 1 = 3, and all 3 are runnable demos. Two were read on 11 Oct 2026; the third is one of two harnesses read on 12 Oct from four leads screened that day. This is not a survey of game or robot demos. Keeping the last action means the loop goes on acting on a choice Jev did not make for this tick, so when Jev fails counts it as "action goes ahead".
Loop tick against request timeout
For each harness: how often the loop wants a decision, how long one Jev request may take, and what the loop does while it waits (5 harnesses; the first 3 are counted)
-
doom-jev counted
- Tick
- 0.12 s
- Timeout
- 2.0 s, no retries (about 17 ticks)
- While waiting
- the game keeps the last action; up to 5 requests in flight
- Late answer
- dropped as stale
-
jev-robotics-demo counted
- Tick
- no fixed rate; a blocking loop of up to 80 steps
- Timeout
- none in code: SDK default 10.0 s, 2 retries (SDK version not pinned)
- While waiting
- the loop waits for each call
- Late answer
- cannot happen (the call blocks)
-
JevPlaysSnakeGame counted
- Tick
- at most 10 ticks per second
- Timeout
- none in code: SDK 0.7.4 default 10.0 s, 2 retries
- While waiting
- the game waits; the call blocks the tick
- Late answer
- cannot happen (the call blocks)
-
ra2web-jev-player design contrast, not counted
- Tick
- strategy every 1.5 s; a 150 ms loop in ordinary code with no network calls
- Timeout
- 40 s, up to 4 attempts
- While waiting
- the 150 ms loop never waits for the model
- Late answer
- strategy changes when an answer arrives
-
llm-invaders research harness, not counted
- Tick
- no fixed tick in the benchmark;
play.pydraws every 1/30 s - Timeout
- 30 s, no retries
- While waiting
- benchmark: the wait is charged as game time;
play.py: one request in flight - Late answer
- never dropped; applied with no staleness check
Five harnesses: what Jev decides and what each loop does when Jev fails
Failure terms use the pool's shared vocabulary: fail-closed (stops with no action), fallback-<what> (a named substitute, here the last action or "wait"), no-decision (nothing is decided; the caller must handle it) and no-threshold (no confidence cut, so any answer is acted on). The 3 counted rows are coloured. The timeout and bypass columns are values, not verdicts, and stay uncoloured. ra2web-jev-player and llm-invaders are not counted and not coloured. Documented code at the pinned commit, read 12 Oct 2026, 05:12–05:16 UTC (doom-jev and jev-robotics-demo cells from the 11 Oct read at the same commits, pins rechecked 12 Oct, 05:12 UTC); file paths are in the sources.
| Harness (commit) and what Jev decides | Loop tick | Request timeout, retries | Timeout against tick | Jev error or timeout | Malformed answer | Below threshold | No key | Bypass |
|---|---|---|---|---|---|---|---|---|
mikespins/doom-jev (bd4e98f, 25 Sep 2026). Runnable demo, ViZDoom/Freedoom game. Jev picks one of 6 actions each tick through AsyncTypeSafeClient. | 0.12 s; requests overlap, at most 5 in flight | 2.0 s, max_retries=0 | About 17 ticks. Stale answers are dropped; the game keeps the last action meanwhile | fallback-last actionThe error is caught; the game applies the last action every tic | fallback-last actionNo validation; the error stays inside the request task (inference from the 11 Oct read) | no-thresholdAny answer is acted on | fail-closedExits before the game starts | recordedShoot and stop-at-wall reflexes override Jev; moves forward until the first answer |
FazalAAli/jev-robotics-demo (531de61, 19 Sep 2026, the only commit). Runnable demo, MuJoCo arm simulation. Jev picks the next target, done, and grasp or release at waypoints. | No fixed rate; blocking loop of up to 80 steps | None in code: SDK default 10.0 s, 2 retries (SDK version not pinned) | The loop waits for each call; no late answer exists | fail-closedThe demo stops; no action is taken (no try in the file) | fail-closedThe demo stops | no-decisionGrasp or release only above 0.75; move and target take the top option with no threshold | fail-closedRaises when the client is built (SDK 0.7.x) | recordedA single legal move is made without a call; a reflex reopens an empty closed hand; the simulation filters unsafe moves |
bileshg/JevPlaysSnakeGame (b9237bf, 10 Oct 2026). Runnable demo, Snake game. Jev picks the next direction (up, down, left, right) through TypeSafeClient(); typesafe-sdk 0.7.4 locked. | At most 10 ticks per second; the call blocks the tick | None in code: SDK 0.7.4 default 10.0 s, 2 retries | The game waits for each call; no late answer exists | fallback-last actionThe agent returns nothing and the snake keeps its direction | fallback-last actionSame path as an error | no-thresholdAny answer is acted on | fallback-last actionThe client is built inside the try, so the SDK's "No API key" error is caught | recorded: none foundIn engine.py L96–151 only |
ys118/ra2web-jev-player (0e4e8cf, 11 Oct 2026, 06:14 UTC; moved from af8caca, the 6 cited files byte-identical). Research harness, Red Alert 2 in a browser. The model picks build, stance and threat every 1.5 s. Design contrast: calls a local substitute by default; not counted. The default is local "clef-flash" on 127.0.0.1; the cloud Jev lines are commented out. | Strategy every 1.5 s; a 150 ms loop in ordinary in-page code with no network calls | 40 s, up to 4 attempts | The 150 ms loop never waits; strategy changes when an answer arrives | retry, then no-decision | no-decision for that question | fallback-last stance: stance changes only at confidence 0.45 or above; other gates 0.40 build, 0.35 infantry, 0.35 vehicles; force-defend at threat 0.55 or above | no-decision (inference from the 11 Oct read; an empty key is sent) | After 1,200 cloud calls it switches to scripted play |
alexcpn/llm-invaders (dfcbc49, 10 Oct 2026). Research harness, a Space Invaders speed benchmark. The model picks left, right, fire or wait. Not counted: no model player is the default; Jev runs only when chosen on the command line, through OpenRouter. Microsoft-Decision-1 goes through the same code. | No fixed tick in the benchmark; play.py draws every 1/30 s with one request in flight | 30 s, no retries | Late answers are never dropped: the wait is charged as game time in the benchmark, and play.py applies answers with no staleness check | fallback-wait | fallback-wait | no-threshold | fallback-wait (inference: the request is sent with no key) | None on the model player's path; a budget stop at $1.90 |
- fail-closed or held (the loop stops or does not act)
- fail-open or acts-anyway (no cell on this page)
- fallback-<what> (named in the cell; here the last action)
- no-decision: nothing is decided; the caller must handle it
- advisory (no cell on this page)
- no-threshold (no confidence cut; the cell says so), or not recorded
Colours follow the shared legend on when Jev fails, where the 3 counted rows form the domain "Real-time control (games and simulations)". ra2web-jev-player and llm-invaders are not on that map.
Comparison numbers: the jev-robotics-demo README compares one recorded run each (n = 1 per arm; results not committed), and the llm-invaders README describes a speed sweep of Jev, Microsoft-Decision-1 and a local model (n = 3 seeds per speed per model; results files committed but not opened). Both are Reported, not graded, and are listed as leads on benchmarks.
Patterns to copy
- Keep the last action when a call fails. doom-jev (
bd4e98f) catches the error and the game keeps applying the last action every tic (brain.pyL331–334;game.pyL193, L287). JevPlaysSnakeGame (b9237bf) returns nothing and the snake keeps its direction (src/agents/jev_agent.pyL62–64;src/game/engine.pyL127–128). - Set the timeout against the tick and drop late answers. doom-jev (
bd4e98f): 2.0 s timeout, no retries, at most 5 requests in flight, stale answers dropped (brain.pyL291, L301–302, L340–352). Contrast: llm-invaders (dfcbc49) applies late answers with no staleness check (play.pyL99–100). - Let ordinary code run the fast loop; ask the model for slower strategy. ra2web-jev-player (
0e4e8cf): the 150 ms loop has no network calls; the model is asked every 1.5 s (game.pyL1–13;config.pyL30). Not counted: it calls a local substitute by default. - Reflexes that override the model. doom-jev (
bd4e98f): shoot and stop-at-wall reflexes (game.pyL255–281). jev-robotics-demo (531de61): a simulation filter for unsafe moves and a hand reflex (jev_agent.pyL215–218, L266–273). - A call budget with a scripted fallback. ra2web-jev-player (
0e4e8cf) switches to scripted play after 1,200 cloud calls (jev/client.pyL114–116;game.pyL223–226).
What not to copy
- An uncaught exception that stops the loop. jev-robotics-demo (
531de61) has notryinjev_agent.py, so one failed call, bad answer or missing key ends the run. The pool counts this as fail-closed: the demo stops and no action is taken. - A blocking call inside the tick with the SDK's default timeout. JevPlaysSnakeGame (
b9237bf) sets no timeout, so the SDK 0.7.4 default (10.0 s, 2 retries) applies to a game that ticks at most 10 times per second (src/agents/jev_agent.pyL56;config.yamlL2). The game waits; it does not act on a late answer. - Applying answers with no staleness check. llm-invaders (
dfcbc49) applies an answer whenever it arrives (play.pyL99–100), up to its 30 s timeout. In its benchmark this delay is measured on purpose (invaders/harness.pyL28–39).
Retries and status codes: Jev API errors, limits and retries. Choosing a cut: how to choose a confidence threshold.
Counting and mapping judgements
These calls were made by the pool, not read from the code. The counting rule is the pool's decision of 12 Oct 2026.
- llm-invaders is not counted. Its own code applies the move, but no model player is the default:
bench.pyrequires--players(L66) andplay.pydefaults to "human" (L124). It also calls Jev through OpenRouter, not TypeSafe's API. - JevPlaysSnakeGame is counted.
main.pyruns the Jev agent unconditionally (L12) with the SDK's default URL and model, and its own code moves the snake. - ra2web-jev-player is not counted. It calls a local substitute ("clef-flash") by default.
- "Keep the last action" counts as "action goes ahead" on when Jev fails: the loop keeps acting on a choice Jev did not make for this tick.
- llm-invaders error and malformed cells are
fallback-wait, notno-decision, because "wait" is one of the game's actions. - doom-jev's malformed-answer cell is an inference from the 11 Oct read: there is no validation, and the error stays inside the per-request task.
- JevPlaysSnakeGame's bypass cell ("none found") covers
src/game/engine.pyL96–151 only. - JevPlaysSnakeGame's no-key cell rests on typesafe-sdk 0.7.4 (the version the demo locks) raising a catchable error for a missing key (read 11 Oct).
- jev-robotics-demo's no-key and timeout cells are the values for typesafe-sdk 0.7.x; the demo does not pin the SDK version.
- ra2web-jev-player's no-key cell is an inference from the 11 Oct read.
Not verified
- The pool ran no harness, package or API call. Every cell comes from code read at a pin; none is an observed runtime behaviour, and no tick or timeout was timed.
- JevPlaysSnakeGame
snake.pywas not read (for example, whether a reversal is rejected). - llm-invaders
engine.pywas not read (whether "fire" does nothing when no shot is ready), and its results files were not opened. - snowu/jev-fighter (Jev only with a configured key; the hosted build uses a local brain) and Jayman391/ROS-JEV-LLM (default backend not found in the files read, 12 Oct 2026, 05:13 UTC) were screened, not read.
- Harness leads from the 12 Oct scan (for example romantic28/jevGameAgent and yuki-uchida/moq-games) were not read.
- No TypeSafe-published real-time harness was found among the typesafe-ai GitHub organisation's repository names or its cookbook folders on 11 Oct 2026, 05:18 UTC; not rechecked on 12 Oct.
Videos
The ThursdAI segment at 26:40 shows a Doom demo; its description links no code, so this page cannot say which harness it is. Description read ; the video is listed on Jev videos.
Sources and check times (UTC)
- R14-S100, R13-S100 to R13-S105, R13-S68: mikespins/doom-jev at bd4e98f, read 11 Oct 2026, 05:17 UTC; HEAD unchanged 12 Oct, 05:12 UTC:
brain.pyL27–52, L291, L301–302, L331–334, L340–352;game.pyL193, L255–281, L287;jev_doom.pyL33, L41–45, L51;requirements.txt(typesafe-sdk 0.7.1). - R14-S101, R13-S106 to R13-S110, R13-S69: FazalAAli/jev-robotics-demo at 531de61, read 11 Oct 2026, 05:17 UTC; HEAD unchanged 12 Oct, 05:12 UTC:
jev_agent.pyL29–30, L198–218, L219–291 (L244, L247, L266–273, L280–281, L291–293);requirements.txt(typesafe-sdk not pinned);.gitignore; README comparison (Reported). - R14-S114 to R14-S120, R14-S49: bileshg/JevPlaysSnakeGame at b9237bf, read 12 Oct 2026, 05:13–05:14 UTC, spot-checked 05:18 UTC:
src/agents/jev_agent.pyL11–31, L54–64;src/game/engine.pyL96–151 (L113, L127–128, L138);main.pyL9–12;src/runner.pyL1–26;config.yamlL2;uv.lockL235–236;pyproject.tomlL11; README L1–34 (a generic Snake README, Reported). - R14-S102 to R14-S106, R14-S50, R13-S111 to R13-S116: ys118/ra2web-jev-player at 0e4e8cf (HEAD moved from af8caca; 6 cited files compared byte for byte, all identical), read 12 Oct 2026, 05:12 UTC:
src/ra2web_jev_player/jev/client.pyL27–33, L65–66, L110, L114–116, L123–145;src/ra2web_jev_player/game.pyL1–13, L223–234;src/ra2web_jev_player/config.pyL30;src/ra2web_jev_player/strategy/planner/jev_apply.pyL34–115, L107–113, L117;src/ra2web_jev_player/strategy/doctrine.pyL213–220. - R14-S107 to R14-S113, R14-S50: alexcpn/llm-invaders at dfcbc49, read 12 Oct 2026, 05:13 UTC:
invaders/agents.pyL21–24, L27–38, L87–116;invaders/harness.pyL28–39;invaders/budget.pyL17, L41–44;bench.pyL29–30, L44–49, L66;play.pyL23, L96–106, L124; README L5–13, L36, L58 (Reported). - R13-S300, R13-S301, R13-S304, R13-S305, R14-S48: typesafe-sdk 0.7.4 wheel from PyPI (default URL and model,
typesafe_sdk/constants.pyL15, L18; default timeout 10.0 s and 2 retries; missing-key error), read 11 Oct 2026, 05:21 UTC and 12 Oct 2026, 05:19 UTC. - R14-S121 to R14-S125: screened only, 12 Oct 2026, 05:12–05:13 UTC: snowu/jev-fighter at 039d93b (README,
worker/src/index.js,public/engine/ai/brains.js); Jayman391/ROS-JEV-LLM at 09e9502 (README,src/jev_ai_bringup/config/params.yaml, backend files). - R13-S117, R13-S118: typesafe-ai repositories and cookbook folders, read 11 Oct 2026, 05:18 UTC.
- R14-S126, R14-S127: ThursdAI video description (chapter "26:40 Jev plays Doom in 100 ms"; links only typesafe.ai and thursdai.news), read 12 Oct 2026, 05:14 UTC.
- R14-S26: query wording, 12 Oct 2026, 05:16 UTC. Google suggest (
client=firefox), Bing (www.bing.com/osjson.aspx) and DuckDuckGo (duckduckgo.com/ac) for "jev plays", "jev plays doom", "jev doom" and "jev doom demo".