Relational Transformers can play Doom too. — experiment provenance All experiments use ViZDoom. Full MAP01/MAP02 levels are bundled Freedoom II. The policy reads labels, numeric depth/HUD values and previous action, not pixels. The original RT-J output head is preserved. No heuristic fallback in model gameplay. Training is behavior cloning of a scripted demonstrator, not reward-based RL. === corridor === # Deadly Corridor: after full-model fine-tuning [Watch the three-minute MP4](gameplay.mp4). Three consecutive post-training episodes (seeds 8000–8002), with health, ammo, kills, reward and selected-action overlays. H.264/yuv420p, 640×544, 7 fps, 1,260 frames; recorded at game speed. No audio. These are the first three evaluation runs, not selected highlights. The unchanged arena checkpoint transferred poorly, with mean reward −77.29 on diagnostic seeds 7000–7004 and almost no forward movement. We fine-tuned its existing parameters on 1,800 corridor observations from seeds 40–44. No new head, action override, or heuristic fallback is used in model gameplay. The observation encoding and four-action menu are unchanged. ## Matched fresh evaluation Ten episodes per policy, seeds 8000–8009, bundled difficulty 5, five tics per action. All episodes ended naturally in death or at the scenario timeout. Native scenario reward measures progress and includes a death penalty; it is not a win percentage. | Policy | Mean reward | Mean kills | |---|---:|---:| | Arena checkpoint `doom-v3` | -79.24 | 1.9 | | Corridor checkpoint `corridor-v1` | 349.98 | 3.1 | | Revised scripted demonstrator | 116.59 | 1.7 | Mean paired reward gain: 429.22. This is a ten-seed evaluation, not a general performance guarantee. Latencies in the logs include periods of competing local workload and should not be treated as a controlled speed comparison. ## Remaining failures The tuned model recorded six kills and approached the final green armor in each of the first two runs, but oscillated near it until timeout. Another recorded run kept attacking after running out of ammunition. Across all ten runs: **6 deaths, 4 timeouts, zero completions before timeout**. This is substantial progress, but the corridor is not solved. ## Training and verification Two epochs, learning rate 1e-5, batch size 32, left/right mirroring; 14,400 candidate contexts per epoch. Epoch mean loss fell from 0.2448 to 0.1171. All native parameter names/shapes match the starting checkpoint; 394 tensors changed and zero heads were added. Seven tests pass, including video codec, duration, frame count, status-panel dimensions, relational input masking and corridor teacher targeting. MP4 metadata was probed and an extracted frame visually checked. Checkpoint: `models/corridor-v1`. Launch with `make corridor`. [Reproduction recipe](RECIPE.md). Evidence: `baseline-fresh.json`, `tuned.json`, `tuned.jsonl`, `teacher-fresh.json`, `comparison.json`, `architecture.json`, `train.log` and the checkpoint's `training.json`. === combat-transfer === # Return to the original combat arena No additional tuning. Twenty matched fresh seeds (10000–10019), five tics per decision. | Policy | Mean kills | |---|---:| | corridor | 10.15 | | arena | 10.30 | | random | 1.90 | | teacher | 11.60 | The corridor checkpoint retained similar arena performance to its parent. This tests retention, not unseen-scenario generalization, because both models descend from arena training. [MP4 of the first three runs](gameplay.mp4). See [recipe](RECIPE.md) and the per-policy JSON summaries. === basic-transfer === # Transfer to an unseen combat scenario: basic The unchanged `models/corridor-v1` succeeded in all 30 episodes of `basic` (fresh seeds 11000–11029), with no further tuning or policy overrides. This scenario did not occur in our Doom fine-tuning data. It requires strafing to line up a stationary monster and shooting it; `strafe left` and `strafe right` were absent from the arena/corridor training menus. [Watch all 30 runs as an MP4](all-episodes.mp4), with action and status overlays. [First three episodes](gameplay.mp4). Frames are sampled at decision boundaries and played at game speed. | Policy | Successful episodes | Mean reward | Mean decisions | |---|---:|---:|---:| | Corridor checkpoint | 30/30 | 64.83 | 7.10 | | Earlier arena checkpoint | 30/30 | 67.83 | 6.67 | | Random | 18/30 | -148.23 | 34.87 | | Scripted demonstrator | 30/30 | 68.30 | 6.63 | A success requires a positive kill count, not merely surviving the episode. The corridor checkpoint selected 74 right strafes, 36 left strafes and 103 attacks across 213 decisions. In the first episode, repeated right strafes moved the monster from horizontal position 0.725 toward the crosshair; then the model fired and killed it. This supports transfer of the learned aiming behavior to a new scenario and a different movement action. The earlier arena checkpoint also achieved 30/30, so this test does not establish that corridor tuning improved transfer; it preserved the success rate while averaging slightly more decisions. `basic` is a narrow single-enemy task, not evidence of arbitrary-level competence. The source configuration uses a 300-tic timeout and a living penalty, so higher native reward favors faster kills. The same wrapper settings, three legal actions and five tics per decision were used for all policies. Successful episodes may report a reset `game_tics` value; timing comparisons therefore use recorded decision counts. Concurrent execution makes inference latencies unsuitable for a speed comparison. Verification: checkpoint SHA-256 hashes before and after match. `training-scenario-audit.json` confirms the training files contain only `defend_the_center` and `deadly_corridor`. No new model head, training, encoder changes or scripted action fallback were introduced. See [recipe](RECIPE.md), `comparison.json`, per-policy summaries and the recorded action/state trace. The full-video rerun reproduced all 30 recorded seed/decision-count/kill/reward outcomes exactly. === map-transfer === # MAP01 fine-tuning → MAP02 transfer Training **continued from `models/corridor-v1`**, preserving all parameter names/shapes and the original native output head. `models/map01-v1` is the separately saved result, not a randomly initialized model. The parent checkpoint remains unchanged. Architecture validation recorded 394 updated native tensors and zero added heads. Only MAP01 supplied training data: 1,200 heuristic-labeled observations, doubled through left/right mirroring. Two epochs at learning rate 1e-5 yielded mean epoch BCE losses of 0.06578 and 0.05894. See [recipe](RECIPE.md) and [architecture check](architecture.json). MAP02 supplied no training examples and no additional tuning followed this evaluation. ## Held-out MAP02 Five matched seeds (13000–13004), skill 2, the same seven-action menu including USE, capped at 600 decisions of five game tics (about 86 seconds). | Metric | Corridor parent | MAP01 fine-tuned | |---|---:|---:| | Mean kills | 4.0 | 6.4 | | Mean visited spatial cells | 4.4 | 32.0 | | Deaths | 0/5 | 1/5 | | Level completions | 0/5 | 0/5 | Spatial cells are 64×64 world-unit bins, not rooms or percentage of the map. World coordinates are evaluation telemetry and never model inputs. Parent coverage was reconstructed through deterministic action replay, with terminal outcomes verified. More movement and kills indicate useful transfer of local navigation/combat behavior, but the death and lack of completions show limitations. Five seeds on one held-out map do not establish broad Doom competence. On MAP01 evaluation seeds 14000–14002, mean kills increased from 0 to 1; the new model visited an average of 69 cells, with no deaths or completions. Parent MAP01 coverage was not recorded. The heuristic teacher averaged 1 kill on MAP01 and 6 on MAP02 under the same evaluation seeds/budget. ## Video [Watch the 20-second MP4](map02-20s.mp4): the first 20 seconds of the first post-training MAP02 run (seed 13000), without selecting highlights. Verified H.264, 640×544, 140 frames at 7 fps, exactly 20 seconds. Evaluation continued after capture stopped. This clip shows only the beginning of one run; the table summarizes all five. Validation: nine tests passed and Ruff passed. The existing output architecture was checked against the parent, and its original checkpoint checksum was unchanged. === Published media === arena-v1.mp4: first 20 seconds of combat-transfer/gameplay.mp4, seed 10000. corridor-v1.mp4: first 20 seconds of corridor/gameplay.mp4, seed 8000. basic-v1.mp4: unchanged basic-transfer/all-episodes.mp4, all 30 seeds 11000–11029. map02-v1.mp4: first 20 seconds of MAP02 seed 13000 after MAP01 fine-tuning. The missing original MAP02 video was recreated from its saved action trace. All 140 pre-action observations matched the original trace exactly. No new model training or action selection was involved in creating these clips. Clip duration does not shorten the evaluations reported in results-v1.json. All videos are silent H.264/yuv420p, with browser controls and poster images. Paths in the experiment reports above refer to the local experiment workspace. === Jev research sources, accessed 2026-09-20 === https://docs.typesafe.ai/introduction https://typesafe.ai/blog/introducing-system-one-models-and-jev https://github.com/daseinlabs/open-jev https://github.com/daseinlabs/open-jev/blob/main/docs/design/per-task-finetuning-with-gemma.md The TypeSafe model and the independent Gemma-based recreation are distinct. No matched Jev/Gemma vs RT-J gameplay, latency, cost or calibration test was run.