Shaduf.Research preview
Jev: Use Cases, Alternatives & Products/Jev plays Doom: real-time demos
Use casesRead at pinned commits , 05:12–05:16 UTC · spot-checked 05:17–05:19 UTC

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.

Key finding

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.

Documentedcode read at pinned commits, checked , 05:19 UTC

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.py draws 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
Values from the harness table, with file and line references there. "About 17 ticks" is 2.0 s divided by 0.12 s. Documented code at pinned commits, 12 Oct 2026; nothing was timed.

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 decidesLoop tickRequest timeout, retriesTimeout against tickJev error or timeoutMalformed answerBelow thresholdNo keyBypass
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 flight2.0 s, max_retries=0About 17 ticks. Stale answers are dropped; the game keeps the last action meanwhilefallback-last actionThe error is caught; the game applies the last action every ticfallback-last actionNo validation; the error stays inside the request task (inference from the 11 Oct read)no-thresholdAny answer is acted onfail-closedExits before the game startsrecordedShoot 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 stepsNone in code: SDK default 10.0 s, 2 retries (SDK version not pinned)The loop waits for each call; no late answer existsfail-closedThe demo stops; no action is taken (no try in the file)fail-closedThe demo stopsno-decisionGrasp or release only above 0.75; move and target take the top option with no thresholdfail-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 tickNone in code: SDK 0.7.4 default 10.0 s, 2 retriesThe game waits for each call; no late answer existsfallback-last actionThe agent returns nothing and the snake keeps its directionfallback-last actionSame path as an errorno-thresholdAny answer is acted onfallback-last actionThe client is built inside the try, so the SDK's "No API key" error is caughtrecorded: 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 calls40 s, up to 4 attemptsThe 150 ms loop never waits; strategy changes when an answer arrivesretry, then no-decisionno-decision for that questionfallback-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 aboveno-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 flight30 s, no retriesLate answers are never dropped: the wait is charged as game time in the benchmark, and play.py applies answers with no staleness checkfallback-waitfallback-waitno-thresholdfallback-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

  1. 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.py L331–334; game.py L193, L287). JevPlaysSnakeGame (b9237bf) returns nothing and the snake keeps its direction (src/agents/jev_agent.py L62–64; src/game/engine.py L127–128).
  2. 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.py L291, L301–302, L340–352). Contrast: llm-invaders (dfcbc49) applies late answers with no staleness check (play.py L99–100).
  3. 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.py L1–13; config.py L30). Not counted: it calls a local substitute by default.
  4. Reflexes that override the model. doom-jev (bd4e98f): shoot and stop-at-wall reflexes (game.py L255–281). jev-robotics-demo (531de61): a simulation filter for unsafe moves and a hand reflex (jev_agent.py L215–218, L266–273).
  5. A call budget with a scripted fallback. ra2web-jev-player (0e4e8cf) switches to scripted play after 1,200 cloud calls (jev/client.py L114–116; game.py L223–226).

What not to copy

  • An uncaught exception that stops the loop. jev-robotics-demo (531de61) has no try in jev_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.py L56; config.yaml L2). 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.py L99–100), up to its 30 s timeout. In its benchmark this delay is measured on purpose (invaders/harness.py L28–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.py requires --players (L66) and play.py defaults to "human" (L124). It also calls Jev through OpenRouter, not TypeSafe's API.
  • JevPlaysSnakeGame is counted. main.py runs 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, not no-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.py L96–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.py was not read (for example, whether a reversal is rejected).
  • llm-invaders engine.py was 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.py L27–52, L291, L301–302, L331–334, L340–352; game.py L193, L255–281, L287; jev_doom.py L33, 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.py L29–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.py L11–31, L54–64; src/game/engine.py L96–151 (L113, L127–128, L138); main.py L9–12; src/runner.py L1–26; config.yaml L2; uv.lock L235–236; pyproject.toml L11; 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.py L27–33, L65–66, L110, L114–116, L123–145; src/ra2web_jev_player/game.py L1–13, L223–234; src/ra2web_jev_player/config.py L30; src/ra2web_jev_player/strategy/planner/jev_apply.py L34–115, L107–113, L117; src/ra2web_jev_player/strategy/doctrine.py L213–220.
  • R14-S107 to R14-S113, R14-S50: alexcpn/llm-invaders at dfcbc49, read 12 Oct 2026, 05:13 UTC: invaders/agents.py L21–24, L27–38, L87–116; invaders/harness.py L28–39; invaders/budget.py L17, L41–44; bench.py L29–30, L44–49, L66; play.py L23, 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.py L15, 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".

Search published pools, pages, reports, and evidence.