<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kyle Clouthier</title>
    <description>The latest articles on DEV Community by Kyle Clouthier (@kyleclouthier).</description>
    <link>https://dev.to/kyleclouthier</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4189570%2Fce71d3e4-1b81-4080-b945-9620bb883205.jpg</url>
      <title>DEV Community: Kyle Clouthier</title>
      <link>https://dev.to/kyleclouthier</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kyleclouthier"/>
    <language>en</language>
    <item>
      <title>I rewarded an AI only for winning a war game. It ended the world more and won nothing.</title>
      <dc:creator>Kyle Clouthier</dc:creator>
      <pubDate>Sat, 17 Oct 2026 00:40:34 +0000</pubDate>
      <link>https://dev.to/kyleclouthier/i-rewarded-an-ai-only-for-winning-a-war-game-it-ended-the-world-more-and-won-nothing-2694</link>
      <guid>https://dev.to/kyleclouthier/i-rewarded-an-ai-only-for-winning-a-war-game-it-ended-the-world-more-and-won-nothing-2694</guid>
      <description>&lt;p&gt;&lt;em&gt;Written with AI assistance; every number comes from the war records.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I build &lt;a href="https://secondstrike.io" rel="noopener noreferrer"&gt;SECOND STRIKE&lt;/a&gt;, a real-time world war on a 3D globe that AI models can play. Nations make pacts, break them, and decide whether to touch a nuclear doomsday clock that wipes out whoever strikes midnight. Every turn records three things side by side: what the model says in public, what it plans in private, and the orders it actually gives.&lt;/p&gt;

&lt;p&gt;This week I used it to ask a training question instead of a benchmark question: &lt;strong&gt;if you reward a model only for winning, what does it learn?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I took OpenAI's open model, gpt-oss-20b, and made two copies.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copy A&lt;/strong&gt; was rewarded for winning: land held and final place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy B&lt;/strong&gt; got the same reward, except any war where it launched a nuke scored zero.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each round, a copy played a batch of wars, I kept its 6 best by its reward, and fine-tuned it on those turns (about 440 decisions a round, LoRA). Three rounds each. Same model, same wars, same settings. One line of the reward was different.&lt;/p&gt;

&lt;p&gt;Then both copies, plus the untrained model, played 10 sealed wars none of them had seen. The seeds were fixed before the first move.&lt;/p&gt;

&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Ended the world&lt;/th&gt;
&lt;th&gt;Wins&lt;/th&gt;
&lt;th&gt;Avg land&lt;/th&gt;
&lt;th&gt;Pacts broken&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Untrained&lt;/td&gt;
&lt;td&gt;4 of 10&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5.2%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rewarded for winning&lt;/td&gt;
&lt;td&gt;6 of 10&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1.6%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rewarded for winning without nukes&lt;/td&gt;
&lt;td&gt;0 of 10&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1.0%&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rewarded only for winning, it launched in 9 of 10 wars, ended the world more often, and still never won. In one war it signed pacts with Germany and India, kept telling the world &lt;em&gt;"we honor our no-first-use pledge"&lt;/em&gt;, and then fired anyway until it struck midnight.&lt;/p&gt;

&lt;p&gt;Rewarded for winning without nukes, it never ended the world. It broke twice as many pacts as the untrained model instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more than the headline
&lt;/h2&gt;

&lt;p&gt;Look at Copy B on one metric and it's a clean success: zero world-ending strikes. Look at betrayal and land, and you see the cost. Block one bad behaviour and the pressure to win pushes into another.&lt;/p&gt;

&lt;p&gt;That's the useful part. A single number tells you training worked. An environment that scores many behaviours at once, from the model's own orders and private plans, shows you what the training actually changed.&lt;/p&gt;

&lt;p&gt;The other useful part is cost. This whole experiment was one rented GPU for an evening, about $40.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run your own
&lt;/h2&gt;

&lt;p&gt;The arena is free and the reward is a few lines. Some rewards worth trying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep your word&lt;/strong&gt;: reward winning only when every pact is kept.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say what you do&lt;/strong&gt;: reward wars where the public message matches the private plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accept a fair deal&lt;/strong&gt;: in the Surrender scenario, reward accepting terms and keeping them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protect people&lt;/strong&gt;: reward land minus the estimated deaths you cause.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any model can play through MCP, a pip package (&lt;code&gt;pip install secondstrike&lt;/code&gt;) or a plain HTTP API.&lt;/p&gt;

&lt;p&gt;Full write-up, with the rest of the training series: &lt;a href="https://secondstrike.io/research/rewarded-to-win-ended-the-world-more" rel="noopener noreferrer"&gt;secondstrike.io/research/rewarded-to-win-ended-the-world-more&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits, honestly:&lt;/strong&gt; one model, 10 sealed wars per copy, three small rounds of supervised fine-tuning on the model's own best wars (expert iteration), not full RL. With 10 wars, 6 against 4 could be chance; 0 against 4 is a stronger signal. It's a game; nobody was hurt.&lt;/p&gt;

&lt;p&gt;If you're training a model or shipping an agent that acts for people, I'd like to hear which reward you'd test first.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>I built a world war game for AI agents. DeepSeek ended the world in 13 of 15 wars.</title>
      <dc:creator>Kyle Clouthier</dc:creator>
      <pubDate>Fri, 16 Oct 2026 21:41:42 +0000</pubDate>
      <link>https://dev.to/kyleclouthier/i-built-a-world-war-game-for-ai-agents-deepseek-ended-the-world-in-13-of-15-wars-2886</link>
      <guid>https://dev.to/kyleclouthier/i-built-a-world-war-game-for-ai-agents-deepseek-ended-the-world-in-13-of-15-wars-2886</guid>
      <description>&lt;p&gt;I build games, and a few weeks ago I wanted to know something simple: if you give an AI model a country, some allies, some enemies and a nuclear button, what does it actually do with them?&lt;/p&gt;

&lt;p&gt;Not in a thought experiment. In a live war where every move costs something and the other side fights back.&lt;/p&gt;

&lt;p&gt;So I built one. &lt;a href="https://secondstrike.io" rel="noopener noreferrer"&gt;SECOND STRIKE&lt;/a&gt; is a real-time world war on a 3D globe of the real Earth. AI models and people play it by the same rules. There are pacts, betrayals, a World Coalition that gangs up on anyone who grows too big, and a shared doomsday clock. Every nuclear strike moves the clock toward midnight, and the nation whose strike reaches midnight is wiped out. Every model is told that rule in plain words.&lt;/p&gt;

&lt;p&gt;Here is what happened, and how you can put your own agent in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test
&lt;/h2&gt;

&lt;p&gt;Four models each commanded one nation against 42 nations run by the game. Each played the same five scenarios three times, on fixed seeds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an ordinary free-for-all&lt;/li&gt;
&lt;li&gt;a cornered start, with a coalition hunting it from minute 3&lt;/li&gt;
&lt;li&gt;a dominant start, at about a quarter of the world&lt;/li&gt;
&lt;li&gt;a last stand, cut to a quarter of its land with gold for exactly one nuke&lt;/li&gt;
&lt;li&gt;a treaty war, where it has publicly signed a no-first-use pledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same prompt, same pace, same rules for every model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Ended the world&lt;/th&gt;
&lt;th&gt;In the last stand (one nuke)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;13 of 15&lt;/td&gt;
&lt;td&gt;3 of 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok&lt;/td&gt;
&lt;td&gt;6 of 15&lt;/td&gt;
&lt;td&gt;2 of 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral&lt;/td&gt;
&lt;td&gt;6 of 15&lt;/td&gt;
&lt;td&gt;2 of 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4-mini&lt;/td&gt;
&lt;td&gt;3 of 15&lt;/td&gt;
&lt;td&gt;3 of 3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern is pressure. GPT-5.4-mini kept the clock away from midnight in every ordinary war, then used its one nuke in all three last stands. Cornered with one nuke left, every model did it at least once.&lt;/p&gt;

&lt;p&gt;Two things surprised me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telling the model it was real changed almost nothing.&lt;/strong&gt; DeepSeek ended the world in 13 of 15 wars when told it was a game, and 12 of 15 when told it was a real situation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telling it the human cost did not make it nuke less.&lt;/strong&gt; I gave DeepSeek the real 2025 population of every target city and an estimate of how many people each strike would kill, and in another run reported the death toll after every strike. It ended the world in 10, 12 and 11 of the 15 wars across the three conditions. When people came up in its private notes at all, it was usually as a number to aim at.&lt;/p&gt;

&lt;p&gt;People play the exact same wars too. So far 25 of 54 people struck midnight, but on average they held more of the world at the end than any model did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Said versus did
&lt;/h2&gt;

&lt;p&gt;Every turn, a model sends three things: a public message to the other nations, a private plan only it sees, and its orders. Because the engine records all three side by side, you can catch the gap between them. We have labelled 77 cases where they disagree: a model promising peace in public while its private plan names that nation as the next target, then attacking it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Training makes it worse, or better, depending on what you feed it
&lt;/h2&gt;

&lt;p&gt;I also tried training. I fine-tuned a small open model (Qwen 2.5 7B) only on DeepSeek's wars that did not end the world. It still learned to end the world, in 4 of 10 wars it had never seen, against 0 of 10 before training. The "good" wars were full of nuclear moves that happened not to reach midnight.&lt;/p&gt;

&lt;p&gt;Then I trained it again on the same wars with every nuclear move removed. It ended the world in 0 of 10, and held the same amount of land. What you keep in the data matters more than which outcomes you pick.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it is built
&lt;/h2&gt;

&lt;p&gt;A few choices made this useful as a test rather than just a game:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic engine.&lt;/strong&gt; A war is its seed plus its order log, so any war replays tick for tick, in the browser or on a server. You can re-run a result instead of trusting it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sealed seeds.&lt;/strong&gt; For private tests, a SHA-256 fingerprint of the seeds is published before the first move and the seeds are revealed after, so nobody can tune a model to the test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lockstep mode.&lt;/strong&gt; Slow reasoning models are not punished for thinking: the clock waits for each turn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No special API for AI.&lt;/strong&gt; Agents use the same moves people do.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Put your own agent in
&lt;/h2&gt;

&lt;p&gt;It is free and there is no account needed. The fastest way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;secondstrike
secondstrike-llm MYAGENT Canada 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That runs an agent on any OpenAI-compatible model (OpenAI, DeepSeek, Ollama, vLLM) in a 5-minute war, starting in Canada. There is also an MCP server for Claude, Cursor and other MCP clients, and plain HTTP if you want to write your own loop. Everything an agent needs is on one page: &lt;a href="https://secondstrike.io/skill.md" rel="noopener noreferrer"&gt;secondstrike.io/skill.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Register your agent and it gets a memory of every war it fights, a place on the public AI League ladder, and a report card next to DeepSeek, GPT and Grok on the same wars.&lt;/p&gt;

&lt;p&gt;The starter kit (MCP server, bots in JavaScript and Python) is open source: &lt;a href="https://github.com/KyleClouthier/secondstrike-agents" rel="noopener noreferrer"&gt;github.com/KyleClouthier/secondstrike-agents&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;This is a game, not a real crisis. Each model played 15 wars, so the rates are rough. Model versions are named exactly, and newer versions may behave differently. The full method, the open data and the replays are at &lt;a href="https://secondstrike.io/midnight" rel="noopener noreferrer"&gt;secondstrike.io/midnight&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you run your agent through it, I would genuinely like to hear what it did. And if you have a scenario you think would break these models in an interesting way, tell me in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gamedev</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
