By Nishaanth Reddy · · updated After trying decision models in Doom, I wanted one to finish the original NES Contra’s first level, boss included. Fine-tuned Laya got through in 69.40 game seconds. My saved Jev run took 68.40. Close, but I haven’t beaten it.
The four panels show Jev, Qwen and Laya’s best development run, plus Laya’s first failed final test. Settings differ across controllers. Playback follows game time, with decision s removed. Laya’s 69-second clear took 6 minutes 18 seconds to run.
The sidebars show the last reply’s top three action scores. These aren’t calibrated odds of success. Call times include network latency.
[00] Controls #
Jev scores a set of possible answers. I gave the controller 12 actions, including running, jumping and firing. Each choice lasts six frames.
The models read player, terrain and enemy data from game memory. They also get emulator previews of each move, which is a lot of help. Shooting actions pulse the fire button at 10 Hz. The verified clears use no cheats, continues or human takeover.
I checked each clear by replaying the saved button inputs and confirming boss defeat followed by entry into Stage 2.
[01] Training #
I fine-tuned Qwen3.5-4B on one DGX Spark and Laya Multilingual, with 322 million parameters, on the other. Qwen continued an existing low-rank adapter (LoRA). All training and local-model inference ran on the Sparks.
Hosted Jev supplied training decisions, including its 68.40-second run and labels for states where the local models got into trouble. I kept development and final test episodes out of the training updates. Jev itself was unchanged.
One mistake was in the loss function. It punished a move for a death predicted 39 frames later, even though the model could choose again after six. I shortened that penalty to the six frames the action would actually run.
[02] Results #
These are selected successful runs from different development settings, so they aren’t a matched benchmark. Elapsed time includes decision waits and emulator work.
Local recordings, 7–8 October 2026.
Individual recordings #
A later Qwen checkpoint kept retreating at the boss and lost both development games. The video uses the earlier checkpoint that finished.
Laya then cleared 3 of 5 final runs with the checkpoint frozen. Each used a different starting delay on the same stage. Two ended in game over. The 69.40-second development run isn’t in this set.
Five final attempts, 8 October 2026.
I’d work on keeping it alive across more runs before trying to shave off another second.
[03] The Luna runs #
I also tried GPT-6 Luna through Codex using my ChatGPT Pro subscription on 7 October. I built a separate Decisions API adapter, but never made a live call through it. The saved gameplay came through Codex.
| Attempt | Decisions | Game time | Outcome |
|---|---|---|---|
| Integration check | 10 | 1.00 s | Stopped at the test limit |
| First longer attempt | 8 | 0.80 s | Request timed out |
| Second longer attempt | 54 | 5.39 s | d at my request |
The longest attempt saved 324 frames. Its median decision call took 5.26 seconds, including Codex overhead, to choose an action lasting about 0.10 game seconds. The saved replies contain a chosen move without action scores.
These are partial runs with no verified stage clear or full video. They aren’t included in the clear-time charts or the four-panel recording.