<?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: Anthony Hunt · Ingevision</title>
    <description>The latest articles on DEV Community by Anthony Hunt · Ingevision (@ingevision).</description>
    <link>https://dev.to/ingevision</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%2F4234885%2F30c5b5a1-ed28-4d56-b943-0daa1fa1e83a.png</url>
      <title>DEV Community: Anthony Hunt · Ingevision</title>
      <link>https://dev.to/ingevision</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ingevision"/>
    <language>en</language>
    <item>
      <title>Five days of an autoresearch loop on a card-game bot: the trained network added nothing</title>
      <dc:creator>Anthony Hunt · Ingevision</dc:creator>
      <pubDate>Tue, 10 Nov 2026 10:12:03 +0000</pubDate>
      <link>https://dev.to/ingevision/five-days-of-an-autoresearch-loop-on-a-card-game-bot-the-trained-network-added-nothing-m4a</link>
      <guid>https://dev.to/ingevision/five-days-of-an-autoresearch-loop-on-a-card-game-bot-the-trained-network-added-nothing-m4a</guid>
      <description>&lt;p&gt;I gave an agent five days and one job: make the bots of my trick-taking card game stronger. It had full freedom of method. One rule could not be broken: the meter never moves.&lt;/p&gt;

&lt;p&gt;What it delivered in the end was a one-line setting and a negative result. Here is what happened, with the numbers from the agent's own journal.&lt;/p&gt;

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

&lt;p&gt;The game is a pirate trick-taking game with bidding, four players. The bot already in production is a rule-based bot that plays with a Monte-Carlo search: before each move it simulates possible deals of the hidden cards.&lt;/p&gt;

&lt;p&gt;The agent got a mission file. Success was measured as &lt;strong&gt;games won&lt;/strong&gt; (the deciding number) and &lt;strong&gt;average points per game&lt;/strong&gt; (a guard), against that production bot, on 400 deals per measure unless stated otherwise. Every attempt went into a journal: hypothesis, numbers, verdict, reason.&lt;/p&gt;

&lt;p&gt;I wrote and rewrote the mission, I stopped the experiment and I ordered the deployment. No human validated individual attempts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the agent tried
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. A neural network that guesses the hidden cards.&lt;/strong&gt; After a reset, the starting network won 47.1% of games and scored 196.3 points per game (reference bot: 197.1). The agent trained a head that predicts where the hidden cards are. One "champion" reached 59.6% and 204.0 points, and held once on fresh deals. Three more rounds of the same recipe all fell back to 49-52%. The 59.6% was mostly a lucky draw: initialisation alone moves results by about 1.6 points.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A lever that is not machine learning.&lt;/strong&gt; More simulated deals per move for its own seat (16 to 48) gave 60.6% and 224.6 points. Mapping win rate against thinking time showed a plateau between 750 and 1000 ms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. An isolation test.&lt;/strong&gt; The rule bot alone at 1000 ms: 64.1% and 236.6 points. The champion with its network at the same budget: 64.3% and 232.6. &lt;strong&gt;The trained network added nothing.&lt;/strong&gt; The research moved to the search itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. A winner that was not one.&lt;/strong&gt; A sweep of evaluation weights found a variant worth +4.3 points of win rate over 800 deals. Measured again without a time limit, it lost (62.8% against 64.1%). It was an artefact of measuring under a time limit on a machine that could not finish its simulations in time. Thirteen weight variants, three sample budgets, six time budgets and eight training rounds later: no change to the weights, no network.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped
&lt;/h2&gt;

&lt;p&gt;The rule bot with 256 simulated deals per move: &lt;strong&gt;63.8% won and 239.4 points per game over 1,600 deals&lt;/strong&gt;, against 60.0% and 220.9 over 1,200 deals for the bot that was in production. That is +3.8 points of win rate and +18.5 points per game, from a single setting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The measurement mistakes the loop caught
&lt;/h2&gt;

&lt;p&gt;Three mistakes in the measurement itself were found on the way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two machines judged with two different builds of the judge for two days.&lt;/li&gt;
&lt;li&gt;20% of the deals in the production data were duplicates.&lt;/li&gt;
&lt;li&gt;A relative measure ("share of points taken from the current champion") rewarded a champion for beating its predecessor while it was losing to everyone else.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I changed in the method
&lt;/h2&gt;

&lt;p&gt;The repository has a small runnable version of the loop. It builds in what this run taught me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check the meter first.&lt;/strong&gt; Four identical reference bots must each win about 25%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure the initialisation lottery.&lt;/strong&gt; Train the same recipe twice with two seeds. The margin to keep a change is the larger of 2 points and that lottery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two benches.&lt;/strong&gt; A fixed bench decides; a control bench is used only to confirm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Same training budget for every attempt.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep only if&lt;/strong&gt; the win gain is above the margin, it is not negative on the control set, and points do not drop by more than 5 per game.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Python 3.10 or later, standard library only. No model, no API key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/anthohunt/la-boucle-cas-jeu-de-plis &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; la-boucle-cas-jeu-de-plis
python3 -m unittest discover -s tests -t .       &lt;span class="c"&gt;# 20 tests, a few seconds&lt;/span&gt;
python3 -m trickloop measure --bot rules         &lt;span class="c"&gt;# the meter checks itself: about 25%&lt;/span&gt;
python3 -m trickloop loop --workdir run --passes 4 --preset fast
python3 -m trickloop dashboard recit/journal.jsonl -o story.html   &lt;span class="c"&gt;# the real five-day journal as a page&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;fast&lt;/code&gt; preset ran in 34 seconds on my desktop (four passes: two changes kept, two thrown away). Its measures are short, so a "kept" verdict can still be luck; the margin and the control set are there to show it.&lt;/p&gt;

&lt;p&gt;The game in the repository is a simplified pirate trick-taking game written for it (48 cards, six rounds), not a commercial one. The real experiment's files (mission, method notes, journal, results) are in &lt;code&gt;recit/&lt;/code&gt;, in French.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits and links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Case study: &lt;a href="https://github.com/anthohunt/la-boucle-cas-jeu-de-plis" rel="noopener noreferrer"&gt;la-boucle-cas-jeu-de-plis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The engine of the method, with a sealed exam the agent never sees: &lt;a href="https://github.com/anthohunt/la-boucle-engine" rel="noopener noreferrer"&gt;la-boucle-engine&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Inspired by &lt;a href="https://github.com/karpathy/autoresearch" rel="noopener noreferrer"&gt;karpathy/autoresearch&lt;/a&gt; (no code copied).&lt;/li&gt;
&lt;li&gt;Background on bidding in a close cousin of this game: Cohensius, Meir, Oved, Stern, &lt;em&gt;Bidding in Spades&lt;/em&gt;, &lt;a href="https://arxiv.org/abs/1912.11323" rel="noopener noreferrer"&gt;arXiv:1912.11323&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm Anthony Hunt. I build agent systems that run every day and small models that do one job well. More projects: &lt;a href="https://ingevision.cloud/?lang=en" rel="noopener noreferrer"&gt;ingevision.cloud&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was drafted with an AI assistant from the experiment's journal; every number comes from &lt;code&gt;recit/journal.jsonl&lt;/code&gt; and &lt;code&gt;recit/progression.jsonl&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
