<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>System 7 - QUANTARMY</title><description>System 7: agentes de IA para poker y juegos.</description><link>https://quantarmy.com/</link><language>en</language><atom:link href="https://quantarmy.com/tag/system-7/rss.xml" rel="self" type="application/rss+xml"/><item><title>System 7 (part 2): we went heads-up, and the exploiter finally got paid</title><link>https://quantarmy.com/en/system-7-part-2-heads-up-survival/</link><guid isPermaLink="true">https://quantarmy.com/en/system-7-part-2-heads-up-survival/</guid><description>Second entry in the System 7 field diary — our poker agent for dev.fun&apos;s Arena: the pivot to heads-up, the node-locking that finally exploits for real, the v1.5 survival engine, and the war stories of running it in production.</description><pubDate>Sun, 05 Jul 2026 21:03:35 GMT</pubDate><content:encoded>&lt;p&gt;In &lt;a href=&quot;https://quantarmy.com/en/system-7-poker-agent-dev-fun/&quot;&gt;part 1&lt;/a&gt; we ended on an uncomfortable lesson: we built an elaborate exploitative engine — hand classification, math filters, node-locking, an LLM for the hard nodes — and it lost. Against the reference panel, pure heuristic node-locking ran &lt;strong&gt;−9.75 bb/100&lt;/strong&gt; and the LLM hybrid &lt;strong&gt;−1.66 bb/100&lt;/strong&gt;. What won, and by a landslide, was the dumbest tactic imaginable: open very wide and steal blinds without apology. &lt;strong&gt;+119 bb/100&lt;/strong&gt; with a strategy that fits on a napkin.&lt;/p&gt;
&lt;p&gt;The moral of that piece was that &lt;em&gt;the engine beats the brilliant idea&lt;/em&gt;: the edge isn&apos;t in the genius play, it&apos;s in the loop of author → test → compare → deploy → coach → repeat. And that exploitation only pays when there&apos;s a real leak to exploit.&lt;/p&gt;
&lt;p&gt;What we didn&apos;t tell you — because it hadn&apos;t happened yet — is what that engine does when you finally give it &lt;strong&gt;a real opponent to aim at&lt;/strong&gt;. This is that story. Since then we changed tables, rewrote half the engine, put it in Docker, and learned the hard way that in production, reliability is just another poker skill.&lt;/p&gt;
&lt;h2 id=&quot;recap-where-we-left-off&quot;&gt;Recap: where we left off&lt;/h2&gt;
&lt;p&gt;For newcomers: System 7 is a No-Limit Hold&apos;em agent that plays in the Arena on &lt;a href=&quot;https://dev.fun&quot;&gt;dev.fun&lt;/a&gt;, a tournament where software agents face each other (and humans). The core is deterministic Python — fast, reproducible, testable — with an LLM &quot;brain&quot; (MiniMax M3) we only call for the hard nodes. It&apos;s all &lt;a href=&quot;https://github.com/quantarmyz/system7-poker-arena&quot;&gt;open on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Part 1 was played at &lt;strong&gt;6-max&lt;/strong&gt; tables. The honest diagnosis was that the reference panel, though theoretically sound, had a structural leak: it folded too much preflop. Our microscope of a machine wasn&apos;t needed; a hammer would do. But 6-max spreads the blame across five opponents and shreds your sample: you never see enough hands from any single villain to exploit him with confidence. The microscope had no one to focus on.&lt;/p&gt;
&lt;p&gt;So we did the obvious thing we hadn&apos;t done: we took four players off the table.&lt;/p&gt;
&lt;h2 id=&quot;the-pivot-to-heads-up-season-s4&quot;&gt;The pivot to heads-up (Season S4)&lt;/h2&gt;
&lt;p&gt;Heads-up — one on one — changes everything, and not out of romance. It changes it through &lt;strong&gt;statistics&lt;/strong&gt;. At 6-max, 500 hands are ~80 hands of each opponent: noise. Heads-up, 500 hands are 500 hands &lt;em&gt;of the same opponent&lt;/em&gt;. At last the sample grows fast enough that &quot;this guy folds too much to the 3-bet&quot; goes from a hunch to a number with a confidence interval.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/heads-up-vs-6max.svg&quot; alt=&quot;Hands per opponent: 6-max vs heads-up&quot; width=&quot;800&quot; height=&quot;320&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;6-max: ~80 hands/opponent. Heads-up: ~500 of the same opponent&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;SPR&lt;/mtext&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mtext&gt;Effective stack&lt;/mtext&gt;&lt;mtext&gt;Pot&lt;/mtext&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{SPR} = \frac{\text{Effective stack}}{\text{Pot}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;SPR&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.0574em;vertical-align:-0.686em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3714em;&quot;&gt;&lt;span style=&quot;top:-2.314em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Pot&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Effective stack&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.686em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;We spent the whole S4 season rebuilding the engine around a single opponent. In repo terms this was &lt;strong&gt;v0.6.0&lt;/strong&gt;: node-locking activation, all-in EV, a heads-up-specific coach, and a unified panel. But the one-line summary hides the mindset shift: we stopped asking &lt;em&gt;&quot;what&apos;s the correct play against the field?&quot;&lt;/em&gt; and started asking &lt;em&gt;&quot;what&apos;s the correct play against &lt;strong&gt;this&lt;/strong&gt; guy I&apos;ve been watching for 1,500 hands?&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It&apos;s exactly part 1&apos;s thesis — exploit instead of playing equilibrium — but finally with the terrain in our favor.&lt;/p&gt;
&lt;h2 id=&quot;node-locking-that-finally-pays&quot;&gt;Node-locking that finally pays&lt;/h2&gt;
&lt;p&gt;Node-locking, as a reminder, means pinning (&lt;em&gt;locking&lt;/em&gt;) part of the opponent&apos;s strategy based on what you&apos;ve observed, and recomputing your best response against that specific leak. In part 1 it was, in practice, an expensive ornament: the sample wasn&apos;t big enough to trust the lock.&lt;/p&gt;
&lt;p&gt;Heads-up, it is. We calibrated the adaptation threshold to &lt;strong&gt;~1,900 hands per opponent&lt;/strong&gt;, which is the order of magnitude the Arena deals in a serious session. Below that, we play a solid base and don&apos;t invent reads. Above it, the engine starts genuinely exploiting the classic archetypes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NIT&lt;/strong&gt; — plays only premiums: we steal his blinds relentlessly and pay him off almost nothing when he finally wakes up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;STATION&lt;/strong&gt; — calls everything: we stop bluffing and fatten the value. Here a bluff is literally setting money on fire.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LAG&lt;/strong&gt; — the loose-aggressive: we give the aggression back where the math holds and set traps at the nodes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MANIAC&lt;/strong&gt; — the extreme version: patience, traps, and letting him crash into himself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Two fine-tunes came with this that sound minor and matter a lot. First, we widened the &lt;strong&gt;button c-bet&lt;/strong&gt; range to coordinated boards: heads-up, initiative is valuable, and giving up too much turns you into the very NIT you want to exploit. Second, we fixed a leak of our own we&apos;d been dragging along: &lt;strong&gt;underpairs on paired boards&lt;/strong&gt; (an underpair against, say, KK on board) stopped being treated as commit-level hands and got reclassified as what they are — bluff-catchers. It&apos;s a small correction to a hand-classification table, and bb/100 live and die on exactly those.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _archetype&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;st&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; dict&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Classify a villain from agent-stats. N-gated by sampleSize.&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    n &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;N&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 500&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                    # too few hands -&gt; don&apos;t trust the read&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;UNKNOWN&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    vpip&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _pct&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;vpid&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;]),&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _pct&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;pfr&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 15&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;STATION&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # calls everything&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 40&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;MANIAC&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    # ultra-aggressive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 15&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 6&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;NIT&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;       # only premiums&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 26&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 20&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;LAG&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;        # loose-aggressive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;TAG&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                                          # solid default&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All the tuning lives in &lt;code&gt;system7-hu.json&lt;/code&gt;: open sizes, barrel frequencies, bluff 3-bets, and small-blind ranges. Strategy as data, versioned, swappable with an environment variable. That design — we promised it in part 1 — is what makes iteration cheap.&lt;/p&gt;
&lt;h2 id=&quot;motor-v15-the-survival-logic&quot;&gt;Motor v1.5: the survival logic&lt;/h2&gt;
&lt;p&gt;And here we reach today. &lt;strong&gt;v0.7.0&lt;/strong&gt;, shipped this very afternoon, brings what we internally call &lt;strong&gt;motor v1.5, &quot;survival.&quot;&lt;/strong&gt; It&apos;s the biggest conceptual change since part 1, and it&apos;s born of an ugly observation: an engine optimized to maximize EV on every hand makes decisions that are great for the long run and ruinous for &lt;em&gt;staying at the table&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The canonical example is &lt;strong&gt;AKo&lt;/strong&gt;. Against a single opponent, getting it in with AKo is usually fine. But in multiway 4-bet/5-bet sequences, stacking off flat with AKo is throwing chips away: when that much money comes in from that many people, your gorgeous hand is, too often, the second-best one. Motor v1.5 stops doing that.&lt;/p&gt;
&lt;p&gt;The new piece is &lt;strong&gt;commitment tiers&lt;/strong&gt; — &lt;code&gt;shallow&lt;/code&gt; / &lt;code&gt;deep&lt;/code&gt; / &lt;code&gt;all-in&lt;/code&gt; — indexed by &lt;strong&gt;re-raise depth&lt;/strong&gt;. Instead of a uniform &quot;with this strength, go with it all&quot; rule, commitment is graduated by tier: the hotter the re-raise war gets, the more selective the hand you&apos;ll accept stacking off with. In multiway, paired hands also stop auto-committing at low SPR. Pure heads-up behavior is preserved intact: there, we still play to maximize.&lt;/p&gt;
&lt;p&gt;Two engineering details that matter more than they look. All of this is &lt;strong&gt;behind a flag&lt;/strong&gt;, &lt;code&gt;survival:true&lt;/code&gt;: by default the behavior is unchanged, so nobody gets surprised and we can A/B against the previous engine. And it shipped with &lt;strong&gt;18 new tests&lt;/strong&gt;. Because a badly written commitment rule doesn&apos;t fail loudly: it fails silently, one stack every few hours — exactly the kind of leak part 1 taught us to fear.&lt;/p&gt;
&lt;p&gt;Survival isn&apos;t the opposite of maximization. It&apos;s recognizing that in a format with a ladder and seasons, &lt;em&gt;staying in the game&lt;/em&gt; has a value that hand-by-hand EV doesn&apos;t capture.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _commit_tier&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;seats&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; seat_n&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; hero_bet&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; call_chips&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; eff&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; bb&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Commitment depth -&gt; how much stack to risk.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &apos;shallow&apos; (1st 3-bet) -&gt; &apos;deep&apos; (4-bet) -&gt; &apos;allin&apos; (5-bet+/jam).&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    thr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(KN[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;commit_4bet_bb&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; bb, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;0.2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; eff)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    n_committed &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; sum&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; s &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; seats&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;                      if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; s[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;seatNumber&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; seat_n&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;                      and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;is_allin&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(s) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; s.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;currentBetChips&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; thr))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    risk &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; call_chips &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(eff, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    hb &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; hero_bet &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; bb &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; bb &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n_committed &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; risk &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.6&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; hb &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 22&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;allin&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n_committed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; hb &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 8&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; risk &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.35&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;deep&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n_committed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;shallow&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n_committed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/commitment-tier-pyramid.svg&quot; alt=&quot;Commitment tier pyramid&quot; width=&quot;800&quot; height=&quot;360&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;Commitment tiers: shallow, deep, all-in&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;EV&lt;/mtext&gt;&lt;mtext&gt;total&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mtext&gt;EV&lt;/mtext&gt;&lt;mtext&gt;hand&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mtext&gt;EV&lt;/mtext&gt;&lt;mtext&gt;survival&lt;/mtext&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{EV}_{\text{total}} = \text{EV}_{\text{hand}} + \text{EV}_{\text{survival}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;EV&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;total&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;EV&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;hand&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;EV&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;survival&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h2 id=&quot;seasonal-equity-heads-up-ladder--auto-resume&quot;&gt;Seasonal equity, heads-up ladder &amp;#x26; auto-resume&lt;/h2&gt;
&lt;p&gt;v0.7.0 also brings three less glamorous, absolutely necessary pieces:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seasonal equity.&lt;/strong&gt; Before, equity curves mixed hands from different competitions and painted you a lying picture. Now the curve is scoped by &lt;code&gt;competition_id&lt;/code&gt;: each season, its own graph. It sounds like accounting, and it is — but measuring honestly was the whole point of part 1, and mixing seasons is exactly the kind of statistical self-deception we preached against.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Heads-up ladder (the &lt;em&gt;ladder bot&lt;/em&gt;).&lt;/strong&gt; We packaged a static agent into its own &lt;code&gt;ladder/&lt;/code&gt; directory, with a defensive adapter and the &lt;code&gt;treys&lt;/code&gt; library &lt;em&gt;vendored&lt;/em&gt; inside. Why? Because the sandbox where some agents run has no filesystem and no way to install dependencies. An agent with &lt;strong&gt;zero disk dependencies&lt;/strong&gt; is an agent that boots anywhere. It&apos;s the difference between &quot;works on my machine&quot; and &quot;works on theirs.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PvP auto-resume.&lt;/strong&gt; The game loop persists its state in &lt;code&gt;data/prod_resume.json&lt;/code&gt; and survives host restarts, container recreation, and subprocess crashes. Before, an ill-timed restart left you a half-finished match and a hole in the data. Now it comes back on its own and picks up where it was. This connects straight to the next section, because we learned to value it the hard way.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/seasonal-equity-curves.svg&quot; alt=&quot;Seasonal equity curves&quot; width=&quot;800&quot; height=&quot;350&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;Per-season equity: skill line (solid) vs variance line (dashed)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;EV&lt;/mtext&gt;&lt;mtext&gt;ICM&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/munderover&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mtext&gt;place &lt;/mtext&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mtext&gt;Payout&lt;/mtext&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{EV}_{\text{ICM}} = \sum_{i=1}^{n} P(\text{place } i) \times \text{Payout}(i)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;EV&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3283em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;ICM&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.9291em;vertical-align:-1.2777em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.6514em;&quot;&gt;&lt;span style=&quot;top:-1.8723em;margin-left:0em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.05em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;mrel mtight&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.05em;&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop op-symbol large-op&quot;&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-4.3em;margin-left:0em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.05em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.2777em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.1389em;&quot;&gt;P&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;place &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Payout&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# PvP auto-resume — survive restarts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;RESUME_FILE &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;data/prod_resume.json&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; save_state&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;table_id&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; hand_num&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    with&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(RESUME_FILE, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;        json&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;dump&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;({&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;table_id&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;: table_id, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;hand&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;: hand_num,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;                   &quot;ts&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;: time.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;()}, f)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; resume&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    try&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        with&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(RESUME_FILE)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;            return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; json&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(f)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    except&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; FileNotFoundError&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; None&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  # fresh start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;from-code-to-the-trenches-production-war-stories&quot;&gt;From code to the trenches: production war stories&lt;/h2&gt;
&lt;p&gt;Part 1 ended on the &quot;tooling&quot;: the three-zone dashboard (LAB / COACH / PRODUCTION). What it didn&apos;t cover is what it costs to keep that &lt;em&gt;alive&lt;/em&gt; week after week. Spoiler: in an online tournament, operational reliability is just another poker skill. Here are the scars.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker, and the sin of recreating the container.&lt;/strong&gt; The live deployment is Docker at &lt;code&gt;/opt/arena-system7-llm&lt;/code&gt; (image &lt;code&gt;system7-poker-arena:latest&lt;/code&gt;, dashboard on port &lt;code&gt;8787&lt;/code&gt;, &lt;code&gt;restart: unless-stopped&lt;/code&gt;). We learned the most expensive rule of the project: &lt;strong&gt;never run &lt;code&gt;up -d --force-recreate&lt;/code&gt; with jobs in flight.&lt;/strong&gt; The Evals and PvPs are child subprocesses of the dashboard; recreating the container kills them stone dead, and you&apos;re left with half-finished evaluations and an empty &lt;code&gt;.clasif&lt;/code&gt; folder. Hours of matches turned into nothing by one impatient deploy.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;yaml&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# docker-compose.yml — dashboard + optional workers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;services&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  dashboard&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    build&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    image&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; system7-poker-arena:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    command&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;dashboard&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    ports&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;8787:8787&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    volumes&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;./data:/data&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    restart&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; unless-stopped&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    environment&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;      S7_STATS_DB&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; /data/s7_cash.db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;      S7_RUN_BACKEND&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; subprocess&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  bench&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                          # optional: continuous Eval&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    command&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;bench&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    profiles&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;bench&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    environment&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;      S7_ENGINE&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; hybrid&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;      S7_MATCHES&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;50&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The WAL that ate the disk.&lt;/strong&gt; SQLite in WAL mode is wonderful until a job gets stuck and the write-ahead log grows to &lt;strong&gt;gigabytes&lt;/strong&gt;. It happened to us. The hardening was three locks: &lt;code&gt;journal_size_limit&lt;/code&gt; so the WAL can&apos;t grow unbounded, a &lt;em&gt;per-match timeout&lt;/em&gt; so no job hangs forever, and a &lt;strong&gt;single-instance lock&lt;/strong&gt; so two processes don&apos;t fight over the same database. None of this is poker. All of this is what lets you &lt;em&gt;play&lt;/em&gt; poker.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# SQLite WAL hardening — three locks against runaway growth&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;conn &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; sqlite3&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;connect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;s7_cash.db&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;conn&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;execute&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;PRAGMA journal_mode = WAL&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;conn&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;execute&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;PRAGMA journal_size_limit = 67108864&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  # 64 MB cap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;conn&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;execute&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;PRAGMA busy_timeout = 30000&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;            # 30s lock wait&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;conn&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;execute&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;PRAGMA wal_autocheckpoint = 1000&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;       # checkpoint every 1000 pages&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Local self-play lies.&lt;/strong&gt; You&apos;d think the sensible way to measure an engine is to pit it against itself locally. Nope: the kit&apos;s self-play &lt;strong&gt;doesn&apos;t measure&lt;/strong&gt; positional strength well, because it pins the hero to the small blind and skews the HUD. An engine&apos;s real strength is only measured &lt;strong&gt;live&lt;/strong&gt;, in the Arena&apos;s Eval and PvP. Another lesson in statistical humility — of which we&apos;re now collecting a set.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The bottleneck wasn&apos;t the one we thought.&lt;/strong&gt; We bumped resources on the fly to &lt;strong&gt;6 cores / 4 GB&lt;/strong&gt;. And the engineer&apos;s intuition — &quot;if it&apos;s slow, it&apos;s the CPU&quot; — turned out false: each M3 match eats ~&lt;strong&gt;170 MB&lt;/strong&gt; of RAM, and the real bottleneck is &lt;strong&gt;RAM and the Arena&apos;s real-time tempo&lt;/strong&gt;, not compute. The deterministic engine answers in milliseconds; what sets the pace is the table. Incidentally, the LLM calls run on MiniMax/Xiaomi token plans, keys in &lt;code&gt;.env&lt;/code&gt; — no hardcoded providers.&lt;/p&gt;
&lt;h2 id=&quot;the-coach-that-improves-itself&quot;&gt;The coach that improves itself&lt;/h2&gt;
&lt;p&gt;The piece that&apos;s matured most is the &lt;strong&gt;coach&lt;/strong&gt;. In part 1 it was, above all, a diagnostician with LLM-powered hand reviews. Now it&apos;s a &lt;strong&gt;self-improving loop&lt;/strong&gt;: M3 reads the stats reports, spots leaks, and &lt;strong&gt;proposes new strategy versions&lt;/strong&gt; — those versioned JSONs — for us to A/B test. The human stays in the driver&apos;s seat (approving or discarding versions), but the &quot;here&apos;s a pattern, try raising this frequency&quot; work is done by the machine.&lt;/p&gt;
&lt;p&gt;Heads-up, the coach became position-aware: separate objectives for the button (SB) and big-blind defense, activating past the 500-hand mark and warning when the diagnosis goes stale because you&apos;ve played too many hands without updating the deployed strategy. Same old principle: don&apos;t trust an old read.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/coach-improvement-loop.svg&quot; alt=&quot;Self-improving coach loop&quot; width=&quot;800&quot; height=&quot;360&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;M3 reads stats, proposes strategy, A/B test, deploy&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;json&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// strategies/system7-hu.json — heads-up tuning&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;survival&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;game&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;cash&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;commit_value&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;       [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AA&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;KK&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;QQ&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;JJ&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;TT&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AKs&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AKo&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AQs&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;commit_value_deep&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;  [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AA&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;KK&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;QQ&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AKs&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;commit_value_allin&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;  [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AA&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;KK&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;knobs&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;commit_spr&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;commit_4bet_bb&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 8&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;commit_5bet_bb&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 22&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;commit_multi_n&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;honest-results-again&quot;&gt;Honest results, again&lt;/h2&gt;
&lt;p&gt;Here&apos;s where we have to stay true to ourselves. In part 1 we put concrete numbers down because we had them, with their ±20 bb/100 confidence intervals and all. In this entry we are &lt;strong&gt;not&lt;/strong&gt; going to invent a heads-up winrate for a tidy ending, because this season&apos;s serious measurement is still live and we don&apos;t want to sell you noise dressed up as signal.&lt;/p&gt;
&lt;p&gt;What we can say honestly is &lt;em&gt;directional&lt;/em&gt;: node-locking, which at 6-max was decoration, at heads-up &lt;strong&gt;has someone to aim at&lt;/strong&gt; and behaves as it should against the archetypes. Motor v1.5 bleeds less in the marginal multiway spots. And the equity curves — now split by season, with their skill line (solid) and their variance line (dashed) — finally tell a story that isn&apos;t contaminated by hands from another competition.&lt;/p&gt;
&lt;p&gt;The sample will tell the rest, once the sample is a sample. We&apos;d rather say &quot;still alive and iterating&quot; than a headline with a big number and an embarrassing confidence interval. That discipline was the heart of part 1, and we&apos;re not about to drop it now that things are starting to work.&lt;/p&gt;
&lt;h2 id=&quot;what-we-took-away-part-2&quot;&gt;What we took away (part 2)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Exploitation needs a target.&lt;/strong&gt; All of part 1&apos;s machinery was correct; it just lacked an opponent to focus the microscope on. Heads-up gave it one. The idea wasn&apos;t wrong; the table was.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Survival isn&apos;t the opposite of maximizing.&lt;/strong&gt; Optimizing every hand in a vacuum loses you stacks that matter. Motor v1.5 sacrifices a little point-EV to stay standing, and in a format with a ladder, that &lt;em&gt;is&lt;/em&gt; real EV.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reliability is a poker skill.&lt;/strong&gt; A runaway WAL, an ill-timed &lt;code&gt;--force-recreate&lt;/code&gt;, or a restart with no auto-resume cost you as many chips as a bad line. In an online tournament, uptime plays hands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The loop still beats the idea.&lt;/strong&gt; Same as part 1: author → test → deploy → coach → repeat. The coach that now proposes strategies isn&apos;t magic; it&apos;s the same loop, with one more rung automated.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We&apos;re still alive in the Arena. And for the first time, the exploiter we wrote with so much care has someone in front of it worth exploiting.&lt;/p&gt;
&lt;h2 id=&quot;resources--links&quot;&gt;Resources &amp;#x26; links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Code (v0.7.0):&lt;/strong&gt; &lt;a href=&quot;https://github.com/quantarmyz/system7-poker-arena&quot;&gt;github.com/quantarmyz/system7-poker-arena&lt;/a&gt; — deterministic engine, LLM hybrid, dashboard, and tooling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform:&lt;/strong&gt; &lt;a href=&quot;https://dev.fun&quot;&gt;dev.fun&lt;/a&gt; · &lt;a href=&quot;https://arena.dev.fun&quot;&gt;arena.dev.fun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reasoning model:&lt;/strong&gt; &lt;a href=&quot;https://minimax.io&quot;&gt;MiniMax&lt;/a&gt; (M3)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&quot;https://quantarmy.com/en/system-7-poker-agent-dev-fun/&quot;&gt;System 7: we taught an AI to exploit poker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And from the house: &lt;a href=&quot;https://rat-talks.com&quot;&gt;rat-talks.com&lt;/a&gt; · &lt;a href=&quot;https://unespeculador.com&quot;&gt;unespeculador.com&lt;/a&gt; · &lt;a href=&quot;https://pythonparatrading.com&quot;&gt;pythonparatrading.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;The project is still live in the Arena. If you&apos;re into the intersection of AI, game theory, and decision-making under uncertainty, the repo is open and the scars are documented.&lt;/em&gt;&lt;/p&gt;</content:encoded><enclosure url="https://quantarmy.com/content/images/2026/07/feature-system7-part2.svg" length="0" type="image/svg+xml"/><category>System 7</category><category>dev.fun</category><category>Poker</category><category>AI</category><category>LLM</category><category>GTO</category><category>ia</category><author>Jesus Cuesta</author></item><item><title>System 7 (parte 2): nos fuimos al heads-up, y el explotador por fin cobró</title><link>https://quantarmy.com/system-7-parte-2-heads-up-supervivencia/</link><guid isPermaLink="true">https://quantarmy.com/system-7-parte-2-heads-up-supervivencia/</guid><description>Segunda entrega del diario de System 7, nuestro agente de póker para el Arena de dev.fun: el giro al heads-up, el node-locking que por fin explota de verdad, el motor v1.5 con lógica de supervivencia y las historias de guerra de tenerlo en producción.</description><pubDate>Sun, 05 Jul 2026 21:03:34 GMT</pubDate><content:encoded>&lt;p&gt;En &lt;a href=&quot;https://quantarmy.com/system-7-agente-poker-dev-fun/&quot;&gt;la primera parte&lt;/a&gt; terminamos con una lección incómoda: construimos un motor explotador elaboradísimo —clasificación de manos, filtros matemáticos, node-locking, un LLM para los nudos difíciles— y perdió. Contra el panel de referencia, el node-locking heurístico puro hacía &lt;strong&gt;−9.75 bb/100&lt;/strong&gt; y la versión híbrida con LLM &lt;strong&gt;−1.66 bb/100&lt;/strong&gt;. Lo que ganaba, y por goleada, era la táctica más tonta imaginable: abrir muchísimo y robar ciegas sin complejos. &lt;strong&gt;+119 bb/100&lt;/strong&gt; con una estrategia que cabe en una servilleta.&lt;/p&gt;
&lt;p&gt;La moraleja de aquella entrega fue que &lt;em&gt;el motor le gana a la idea brillante&lt;/em&gt;: la ventaja no está en la jugada genial, sino en el bucle de autor → test → comparar → desplegar → coach → repetir. Y que la explotación solo paga cuando hay una fuga real que explotar.&lt;/p&gt;
&lt;p&gt;Lo que no contamos —porque todavía no había pasado— es qué ocurre cuando le das a ese motor &lt;strong&gt;un rival de verdad al que apuntar&lt;/strong&gt;. Esta es esa historia. Desde entonces cambiamos de mesa, reescribimos medio motor, lo metimos en Docker y aprendimos, a base de golpes, que en producción la fiabilidad es una habilidad de póker más.&lt;/p&gt;
&lt;h2 id=&quot;recapitulando-dónde-lo-dejamos&quot;&gt;Recapitulando: dónde lo dejamos&lt;/h2&gt;
&lt;p&gt;Para quien llegue nuevo: System 7 es un agente de No-Limit Hold&apos;em que juega en el Arena de &lt;a href=&quot;https://dev.fun&quot;&gt;dev.fun&lt;/a&gt;, un torneo donde agentes de software se enfrentan entre sí (y a humanos). El núcleo es Python determinista —rápido, reproducible, testeable— con un &quot;cerebro&quot; LLM (MiniMax M3) al que solo llamamos para los nudos difíciles. Todo está &lt;a href=&quot;https://github.com/quantarmyz/system7-poker-arena&quot;&gt;abierto en GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La parte 1 se jugó en mesas de &lt;strong&gt;6-max&lt;/strong&gt;. El diagnóstico honesto fue que el panel de referencia, aunque teóricamente sólido, tenía una fuga estructural: foldeaba demasiado preflop. Nuestra maquinaria de microscopio no hacía falta; bastaba un martillo. Pero un 6-max reparte la culpa entre cinco rivales y trocea la muestra: nunca ves suficientes manos de un mismo villano como para explotarlo con confianza. El microscopio no tenía a quién enfocar.&lt;/p&gt;
&lt;p&gt;Así que hicimos lo obvio que no habíamos hecho: quitamos a cuatro jugadores de la mesa.&lt;/p&gt;
&lt;h2 id=&quot;el-giro-al-heads-up-temporada-s4&quot;&gt;El giro al heads-up (temporada S4)&lt;/h2&gt;
&lt;p&gt;El heads-up —uno contra uno— lo cambia todo, y no por romanticismo. Lo cambia por &lt;strong&gt;estadística&lt;/strong&gt;. En 6-max, 500 manos son ~80 manos de cada rival: ruido. En heads-up, 500 manos son 500 manos &lt;em&gt;del mismo rival&lt;/em&gt;. Por fin la muestra crece lo bastante rápido como para que &quot;este tío foldea demasiado a la 3-bet&quot; pase de corazonada a número con intervalo de confianza.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/heads-up-vs-6max.svg&quot; alt=&quot;Hands per opponent: 6-max vs heads-up&quot; width=&quot;800&quot; height=&quot;320&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;6-max: ~80 manos/rival. Heads-up: ~500 del mismo rival&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;SPR&lt;/mtext&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mtext&gt;Effective stack&lt;/mtext&gt;&lt;mtext&gt;Pot&lt;/mtext&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{SPR} = \frac{\text{Effective stack}}{\text{Pot}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;SPR&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.0574em;vertical-align:-0.686em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3714em;&quot;&gt;&lt;span style=&quot;top:-2.314em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Pot&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Effective stack&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.686em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Toda la temporada S4 la dedicamos a rehacer el motor pensando en un solo oponente. En términos de repo, esto fue la &lt;strong&gt;v0.6.0&lt;/strong&gt;: activación de node-locking, EV en all-in, un coach específico de heads-up y un panel unificado. Pero la frase de una línea esconde el cambio de mentalidad: dejamos de preguntar &lt;em&gt;&quot;¿cuál es la jugada correcta contra el campo?&quot;&lt;/em&gt; y empezamos a preguntar &lt;em&gt;&quot;¿cuál es la jugada correcta contra &lt;strong&gt;este&lt;/strong&gt; que llevo 1.500 manos mirando?&quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Es exactamente la tesis de la parte 1 —explotar en lugar de jugar equilibrio— pero por fin con el terreno a favor.&lt;/p&gt;
&lt;h2 id=&quot;node-locking-que-por-fin-paga&quot;&gt;Node-locking que por fin paga&lt;/h2&gt;
&lt;p&gt;El node-locking, recordemos, es fijar (clavar, &lt;em&gt;lock&lt;/em&gt;) una parte de la estrategia del rival según lo que has observado, y recalcular tu respuesta óptima contra esa fuga concreta. En la parte 1 era, en la práctica, un adorno caro: la muestra no daba para fiarse del &lt;em&gt;lock&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;En heads-up sí da. Calibramos el umbral de adaptación a &lt;strong&gt;~1.900 manos por oponente&lt;/strong&gt;, que es el orden de magnitud que el Arena reparte en una sesión seria. Por debajo de eso, jugamos base sólida y no nos inventamos reads. Por encima, el motor empieza a explotar de verdad los arquetipos clásicos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NIT&lt;/strong&gt; — el que solo juega manos premium: le robamos las ciegas sin descanso y le pagamos poquísimo cuando por fin despierta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;STATION&lt;/strong&gt; — el que paga todo: dejamos de farolear y engordamos el valor. Aquí el farol es literalmente prender dinero.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LAG&lt;/strong&gt; — el agresivo suelto: le devolvemos la agresión donde la matemática aguanta y le tendemos trampas en los nudos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MANIAC&lt;/strong&gt; — la versión extrema: paciencia, trampas y dejar que se estrelle solo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con esto vinieron dos ajustes finos que suenan a poco y valen mucho. Primero, ampliamos el rango de &lt;strong&gt;c-bet en botón&lt;/strong&gt; a boards coordinados: en heads-up, la iniciativa vale, y ceder demasiado te convierte en el NIT que quieres explotar. Segundo, arreglamos una fuga propia que llevábamos arrastrando: las &lt;strong&gt;parejas bajas en boards emparejados&lt;/strong&gt; (una pareja de menos frente a, digamos, KK en el board) dejaron de tratarse como manos de compromiso y pasaron a clasificarse como lo que son, &lt;em&gt;bluff-catchers&lt;/em&gt;. Es una corrección pequeña de una tabla de clasificación de manos, y de esas viven o mueren los bb/100.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _archetype&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;st&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; dict&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Classify a villain from agent-stats. N-gated by sampleSize.&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    n &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;N&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 500&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                    # too few hands -&gt; don&apos;t trust the read&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;UNKNOWN&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    vpip&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _pct&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;vpid&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;]),&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _pct&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;pfr&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 15&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;STATION&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # calls everything&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 40&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;MANIAC&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    # ultra-aggressive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 15&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 6&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;NIT&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;       # only premiums&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 26&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 20&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;LAG&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;        # loose-aggressive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;TAG&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                                          # solid default&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Todo el afinado vive en &lt;code&gt;system7-hu.json&lt;/code&gt;: tamaños de apertura, frecuencias de barril, 3-bets de farol y rangos de ciega pequeña. Estrategia como dato, versionada, intercambiable con una variable de entorno. Ese diseño —lo prometimos en la parte 1— es lo que hace que iterar sea barato.&lt;/p&gt;
&lt;h2 id=&quot;motor-v15-la-lógica-de-supervivencia&quot;&gt;Motor v1.5: la lógica de supervivencia&lt;/h2&gt;
&lt;p&gt;Y aquí llegamos a lo de hoy mismo. La &lt;strong&gt;v0.7.0&lt;/strong&gt;, publicada esta misma tarde, trae lo que internamente llamamos &lt;strong&gt;motor v1.5, &quot;supervivencia&quot;&lt;/strong&gt;. Es el cambio conceptual más grande desde la parte 1, y nace de una observación fea: un motor optimizado para maximizar EV en cada mano toma decisiones estupendas para el largo plazo y ruinosas para &lt;em&gt;seguir en la mesa&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;El ejemplo canónico es &lt;strong&gt;AKo&lt;/strong&gt;. Contra un solo rival, meter la pila con AKo suele estar bien. Pero en secuencias multiway de 4-bet/5-bet, meterla plano con AKo es tirar fichas: cuando entra tanto dinero de tanta gente, tu mano preciosa es, con demasiada frecuencia, la segunda mejor. El motor v1.5 deja de hacerlo.&lt;/p&gt;
&lt;p&gt;La pieza nueva son los &lt;strong&gt;niveles de compromiso&lt;/strong&gt; —&lt;code&gt;shallow&lt;/code&gt; / &lt;code&gt;deep&lt;/code&gt; / &lt;code&gt;all-in&lt;/code&gt;— indexados por la &lt;strong&gt;profundidad de la re-subida&lt;/strong&gt;. En vez de una regla uniforme de &quot;con esta fuerza, voy con todo&quot;, el compromiso se gradúa por tramo: cuanto más se recrudece la guerra de re-raises, más selectiva se vuelve la mano con la que aceptas jugarte la pila. En multiway, además, las parejas dejan de comprometerse automáticamente en SPR bajo. El comportamiento en heads-up puro se conserva intacto: allí seguimos jugando a maximizar.&lt;/p&gt;
&lt;p&gt;Dos detalles de ingeniería que importan más de lo que parece. Todo esto está &lt;strong&gt;detrás de un flag&lt;/strong&gt;, &lt;code&gt;survival:true&lt;/code&gt;: por defecto el comportamiento no cambia, así que nadie se lleva sorpresas y podemos hacer A/B contra el motor anterior. Y llegó acompañado de &lt;strong&gt;18 tests nuevos&lt;/strong&gt;. Porque una regla de compromiso mal escrita no falla ruidosamente: falla silenciosamente, una pila cada varias horas, justo del tipo de fuga que la parte 1 nos enseñó a temer.&lt;/p&gt;
&lt;p&gt;Supervivencia no es lo contrario de maximización. Es reconocer que en un formato con escalera y temporadas, &lt;em&gt;seguir jugando&lt;/em&gt; tiene un valor que la EV mano a mano no captura.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _commit_tier&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;seats&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; seat_n&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; hero_bet&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; call_chips&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; eff&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; bb&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Commitment depth -&gt; how much stack to risk.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &apos;shallow&apos; (1st 3-bet) -&gt; &apos;deep&apos; (4-bet) -&gt; &apos;allin&apos; (5-bet+/jam).&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    thr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(KN[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;commit_4bet_bb&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; bb, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;0.2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; eff)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    n_committed &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; sum&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; s &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; seats&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;                      if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; s[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;seatNumber&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; seat_n&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;                      and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;is_allin&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(s) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; s.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;currentBetChips&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; thr))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    risk &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; call_chips &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(eff, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    hb &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; hero_bet &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; bb &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; bb &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n_committed &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; risk &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.6&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; hb &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 22&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;allin&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n_committed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; hb &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 8&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; risk &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.35&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;deep&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n_committed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;shallow&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n_committed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/commitment-tier-pyramid.svg&quot; alt=&quot;Commitment tier pyramid&quot; width=&quot;800&quot; height=&quot;360&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;Niveles de compromiso: shallow, deep, all-in&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;EV&lt;/mtext&gt;&lt;mtext&gt;total&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mtext&gt;EV&lt;/mtext&gt;&lt;mtext&gt;hand&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mtext&gt;EV&lt;/mtext&gt;&lt;mtext&gt;survival&lt;/mtext&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{EV}_{\text{total}} = \text{EV}_{\text{hand}} + \text{EV}_{\text{survival}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;EV&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;total&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;EV&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;hand&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;EV&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;survival&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h2 id=&quot;equity-por-temporada-escalera-heads-up-y-auto-reanudación&quot;&gt;Equity por temporada, escalera heads-up y auto-reanudación&lt;/h2&gt;
&lt;p&gt;La v0.7.0 trae además tres piezas menos glamurosas y absolutamente necesarias:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Equity por temporada.&lt;/strong&gt; Antes, las curvas de equity mezclaban manos de competiciones distintas y te pintaban un dibujo mentiroso. Ahora la curva se acota por &lt;code&gt;competition_id&lt;/code&gt;: cada temporada, su gráfica. Suena a contabilidad, y lo es —pero medir bien fue el tema central de la parte 1, y mezclar temporadas es exactamente la clase de autoengaño estadístico contra el que predicábamos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Escalera heads-up (el &lt;em&gt;ladder bot&lt;/em&gt;).&lt;/strong&gt; Empaquetamos un agente estático en su propio directorio &lt;code&gt;ladder/&lt;/code&gt;, con un adaptador defensivo y la librería &lt;code&gt;treys&lt;/code&gt; &lt;em&gt;vendorizada&lt;/em&gt; dentro. ¿Por qué? Porque el sandbox donde corren algunos agentes no tiene sistema de archivos ni forma de instalar dependencias. Un agente con &lt;strong&gt;cero dependencias de disco&lt;/strong&gt; es un agente que arranca donde sea. Es la diferencia entre &quot;funciona en mi máquina&quot; y &quot;funciona en la suya&quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auto-reanudación de PvP.&lt;/strong&gt; El bucle de juego persiste su estado en &lt;code&gt;data/prod_resume.json&lt;/code&gt; y sobrevive a reinicios del host, recreaciones del contenedor y caídas de subprocesos. Antes, un reinicio a deshora te dejaba una partida a medias y un hueco en los datos. Ahora se levanta solo y sigue donde estaba. Esto conecta directamente con la siguiente sección, porque aprendimos a valorarlo por las malas.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/seasonal-equity-curves.svg&quot; alt=&quot;Seasonal equity curves&quot; width=&quot;800&quot; height=&quot;350&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;Curva de equity por temporada: habilidad vs varianza&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;EV&lt;/mtext&gt;&lt;mtext&gt;ICM&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;munderover&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/munderover&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mtext&gt;place &lt;/mtext&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mtext&gt;Payout&lt;/mtext&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{EV}_{\text{ICM}} = \sum_{i=1}^{n} P(\text{place } i) \times \text{Payout}(i)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;EV&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3283em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;ICM&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.9291em;vertical-align:-1.2777em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.6514em;&quot;&gt;&lt;span style=&quot;top:-1.8723em;margin-left:0em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.05em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;mrel mtight&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.05em;&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop op-symbol large-op&quot;&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-4.3em;margin-left:0em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.05em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.2777em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.1389em;&quot;&gt;P&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;place &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Payout&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# PvP auto-resume — survive restarts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;RESUME_FILE &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;data/prod_resume.json&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; save_state&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;table_id&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; hand_num&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    with&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(RESUME_FILE, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;        json&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;dump&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;({&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;table_id&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;: table_id, &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;hand&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;: hand_num,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;                   &quot;ts&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;: time.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;()}, f)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; resume&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    try&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        with&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(RESUME_FILE)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;            return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; json&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(f)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    except&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; FileNotFoundError&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; None&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  # fresh start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;del-código-a-la-trinchera-historias-de-producción&quot;&gt;Del código a la trinchera: historias de producción&lt;/h2&gt;
&lt;p&gt;La parte 1 terminaba en el &quot;tooling&quot;: el panel de tres zonas (LAB / COACH / PRODUCCIÓN). Lo que no contaba es lo que cuesta tener eso &lt;em&gt;vivo&lt;/em&gt; semana tras semana. Spoiler: en un torneo online, la fiabilidad operativa es una habilidad de póker más. Estas son las cicatrices.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker, y el pecado de recrear el contenedor.&lt;/strong&gt; El despliegue vivo es Docker en &lt;code&gt;/opt/arena-system7-llm&lt;/code&gt; (imagen &lt;code&gt;system7-poker-arena:latest&lt;/code&gt;, dashboard en el puerto &lt;code&gt;8787&lt;/code&gt;, &lt;code&gt;restart: unless-stopped&lt;/code&gt;). Aprendimos la regla más cara del proyecto: &lt;strong&gt;nunca hagas &lt;code&gt;up -d --force-recreate&lt;/code&gt; con jobs en vuelo.&lt;/strong&gt; Los Eval y los PvP son subprocesos hijos del dashboard; recrear el contenedor los mata en seco, y te quedas con evaluaciones a medias y una carpeta &lt;code&gt;.clasif&lt;/code&gt; vacía. Horas de partidas convertidas en nada por un despliegue impaciente.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;yaml&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# docker-compose.yml — dashboard + optional workers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;services&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  dashboard&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    build&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    image&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; system7-poker-arena:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    command&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;dashboard&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    ports&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;8787:8787&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    volumes&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;./data:/data&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    restart&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; unless-stopped&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    environment&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;      S7_STATS_DB&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; /data/s7_cash.db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;      S7_RUN_BACKEND&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; subprocess&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  bench&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                          # optional: continuous Eval&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    command&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;bench&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    profiles&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;bench&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    environment&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;      S7_ENGINE&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; hybrid&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;      S7_MATCHES&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;50&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;El WAL que se comió el disco.&lt;/strong&gt; SQLite en modo WAL es maravilloso hasta que un job se atasca y el write-ahead log crece a &lt;strong&gt;gigabytes&lt;/strong&gt;. Nos pasó. El hardening fue a base de tres candados: &lt;code&gt;journal_size_limit&lt;/code&gt; para que el WAL no crezca sin freno, un &lt;em&gt;timeout por match&lt;/em&gt; para que ningún job se quede colgado eternamente, y un &lt;strong&gt;lock de instancia única&lt;/strong&gt; para que no haya dos procesos peleándose por la misma base de datos. Nada de esto es póker. Todo esto es lo que te permite &lt;em&gt;jugar&lt;/em&gt; al póker.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# SQLite WAL hardening — three locks against runaway growth&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;conn &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; sqlite3&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;connect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;s7_cash.db&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;conn&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;execute&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;PRAGMA journal_mode = WAL&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;conn&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;execute&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;PRAGMA journal_size_limit = 67108864&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  # 64 MB cap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;conn&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;execute&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;PRAGMA busy_timeout = 30000&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;            # 30s lock wait&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;conn&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;execute&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;PRAGMA wal_autocheckpoint = 1000&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;       # checkpoint every 1000 pages&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;El self-play local miente.&lt;/strong&gt; Uno pensaría que la forma sensata de medir un motor es enfrentarlo contra sí mismo en local. No: el self-play del kit &lt;strong&gt;no mide bien&lt;/strong&gt; la fuerza por posición, porque clava al héroe en la ciega pequeña y sesga el HUD. La fuerza real de un motor solo se mide &lt;strong&gt;en vivo&lt;/strong&gt;, en el Eval y el PvP del Arena. Otra lección de humildad estadística, de las que ya coleccionamos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;El cuello de botella no era el que creíamos.&lt;/strong&gt; Subimos los recursos en caliente a &lt;strong&gt;6 cores / 4 GB&lt;/strong&gt;. Y la intuición de ingeniero —&quot;si va lento, es la CPU&quot;— resultó falsa: cada partida con M3 come ~&lt;strong&gt;170 MB&lt;/strong&gt; de RAM, y el verdadero cuello es la &lt;strong&gt;RAM y el tempo en tiempo real del Arena&lt;/strong&gt;, no el cómputo. El motor determinista responde en milisegundos; lo que marca el ritmo es la mesa. Por cierto, las llamadas al LLM van sobre planes de tokens de MiniMax/Xiaomi, con las claves en &lt;code&gt;.env&lt;/code&gt; —nada de proveedores hardcodeados.&lt;/p&gt;
&lt;h2 id=&quot;el-coach-que-se-mejora-solo&quot;&gt;El coach que se mejora solo&lt;/h2&gt;
&lt;p&gt;La pieza que más ha madurado es el &lt;strong&gt;coach&lt;/strong&gt;. En la parte 1 era, sobre todo, un diagnosticador con reviews de manos vía LLM. Ahora es un &lt;strong&gt;bucle que se mejora a sí mismo&lt;/strong&gt;: M3 lee los informes de estadísticas, detecta fugas y &lt;strong&gt;propone nuevas versiones de estrategia&lt;/strong&gt; —esos JSON versionados— para que las probemos en A/B. El humano sigue en el asiento del conductor (aprobando o descartando versiones), pero el trabajo de &quot;aquí hay un patrón, prueba a subir esta frecuencia&quot; lo hace la máquina.&lt;/p&gt;
&lt;p&gt;En heads-up el coach se volvió consciente de la posición: objetivos distintos para el botón (SB) y para la defensa de ciega grande, activándose a partir de las 500 manos y avisando cuando el diagnóstico se queda obsoleto porque llevas demasiadas manos sin actualizar la estrategia desplegada. Es el mismo principio de siempre: no confíes en un read viejo.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/coach-improvement-loop.svg&quot; alt=&quot;Self-improving coach loop&quot; width=&quot;800&quot; height=&quot;360&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;M3 lee stats, propone estrategia, A/B test, deploy&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;json&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// strategies/system7-hu.json — heads-up tuning&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;survival&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;game&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;cash&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;commit_value&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;       [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AA&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;KK&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;QQ&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;JJ&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;TT&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AKs&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AKo&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AQs&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;commit_value_deep&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;  [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AA&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;KK&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;QQ&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AKs&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;commit_value_allin&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;  [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AA&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;KK&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;knobs&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;commit_spr&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;commit_4bet_bb&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 8&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;commit_5bet_bb&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 22&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;commit_multi_n&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;resultados-honestos-otra-vez&quot;&gt;Resultados honestos, otra vez&lt;/h2&gt;
&lt;p&gt;Aquí es donde nos toca ser fieles a nosotros mismos. En la parte 1 pusimos números concretos porque los teníamos, con sus intervalos de confianza de ±20 bb/100 y todo. En esta entrega &lt;strong&gt;no&lt;/strong&gt; vamos a inventarnos un winrate de heads-up para cerrar bonito, porque la medición seria de esta temporada sigue viva y no queremos venderte ruido disfrazado de señal.&lt;/p&gt;
&lt;p&gt;Lo que sí podemos decir con honestidad es &lt;em&gt;direccional&lt;/em&gt;: el node-locking, que en 6-max era decoración, en heads-up &lt;strong&gt;tiene a quién apuntar&lt;/strong&gt; y se comporta como debe contra los arquetipos. El motor v1.5 sangra menos en los multiway marginales. Y las curvas de equity —ahora separadas por temporada, con su línea de habilidad (sólida) y su línea de varianza (discontinua)— por fin cuentan una historia que no está contaminada por manos de otra competición.&lt;/p&gt;
&lt;p&gt;El resto lo dirá la muestra, cuando la muestra sea muestra. Preferimos &quot;seguimos vivos e iterando&quot; a un titular con un número grande y un intervalo de confianza vergonzoso. Esa disciplina fue el corazón de la parte 1, y no pensamos abandonarla ahora que las cosas empiezan a salir.&lt;/p&gt;
&lt;h2 id=&quot;lo-que-nos-llevamos-parte-2&quot;&gt;Lo que nos llevamos (parte 2)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;La explotación necesita un blanco.&lt;/strong&gt; Toda la maquinaria de la parte 1 era correcta; le faltaba un rival al que enfocar el microscopio. El heads-up se lo dio. La idea no estaba mal; estaba mal la mesa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supervivencia no es lo contrario de maximizar.&lt;/strong&gt; Optimizar cada mano en el vacío te hace perder pilas que importan. El motor v1.5 sacrifica algo de EV puntual a cambio de seguir en pie, y en un formato con escalera eso es EV de verdad.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La fiabilidad es una habilidad de póker.&lt;/strong&gt; Un WAL desbocado, un &lt;code&gt;--force-recreate&lt;/code&gt; a destiempo o un reinicio sin auto-reanudación te cuestan tantas fichas como una mala línea. En un torneo online, el &lt;em&gt;uptime&lt;/em&gt; juega manos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El bucle sigue ganándole a la idea.&lt;/strong&gt; Como en la parte 1: autor → test → desplegar → coach → repetir. El coach que ahora propone estrategias no es magia; es el mismo bucle, con un peldaño más automatizado.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Seguimos vivos en el Arena. Y por primera vez, el explotador que escribimos con tanto mimo tiene delante a alguien a quien explotar.&lt;/p&gt;
&lt;h2 id=&quot;recursos-y-enlaces&quot;&gt;Recursos y enlaces&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Código (v0.7.0):&lt;/strong&gt; &lt;a href=&quot;https://github.com/quantarmyz/system7-poker-arena&quot;&gt;github.com/quantarmyz/system7-poker-arena&lt;/a&gt; — motor determinista, híbrido con LLM, dashboard y tooling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plataforma:&lt;/strong&gt; &lt;a href=&quot;https://dev.fun&quot;&gt;dev.fun&lt;/a&gt; · &lt;a href=&quot;https://arena.dev.fun&quot;&gt;arena.dev.fun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modelo de razonamiento:&lt;/strong&gt; &lt;a href=&quot;https://minimax.io&quot;&gt;MiniMax&lt;/a&gt; (M3)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parte 1:&lt;/strong&gt; &lt;a href=&quot;https://quantarmy.com/system-7-agente-poker-dev-fun/&quot;&gt;System 7: enseñamos a una IA a exploitar el póker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Y por la casa: &lt;a href=&quot;https://rat-talks.com&quot;&gt;rat-talks.com&lt;/a&gt; · &lt;a href=&quot;https://unespeculador.com&quot;&gt;unespeculador.com&lt;/a&gt; · &lt;a href=&quot;https://pythonparatrading.com&quot;&gt;pythonparatrading.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;El proyecto sigue vivo en el Arena. Si te interesa el cruce entre IA, teoría de juegos y decisión bajo incertidumbre, el repo está abierto y las cicatrices, documentadas.&lt;/em&gt;&lt;/p&gt;</content:encoded><enclosure url="https://quantarmy.com/content/images/2026/07/feature-system7-part2.svg" length="0" type="image/svg+xml"/><category>System 7</category><category>dev.fun</category><category>Poker</category><category>AI</category><category>LLM</category><category>GTO</category><category>ia</category><author>Jesus Cuesta</author></item><item><title>System 7: we taught an AI to exploit poker — and what actually won was something else</title><link>https://quantarmy.com/en/system-7-poker-agent-dev-fun/</link><guid isPermaLink="true">https://quantarmy.com/en/system-7-poker-agent-dev-fun/</guid><description>A technical field report on building a poker agent for dev.fun&apos;s Arena: the heuristic method, LLMs at the table, and the honest results.</description><pubDate>Sun, 21 Jun 2026 20:44:05 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;A technical field report on building a poker agent for dev.fun&apos;s Arena: the heuristic method, LLMs at the table, and the honest results — including the ones we didn&apos;t expect.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-experiment&quot;&gt;The experiment&lt;/h2&gt;
&lt;p&gt;On &lt;strong&gt;&lt;a href=&quot;https://dev.fun&quot;&gt;dev.fun&lt;/a&gt;&lt;/strong&gt; there&apos;s a place where AI agents sit down at a &lt;strong&gt;No-Limit Texas Hold&apos;em&lt;/strong&gt; table and play each other. It&apos;s not a demo: real hands, real chips, real opponents (some humans behind a bot, some pure bots) and, in the tournaments, real on-chain money on the line.&lt;/p&gt;
&lt;p&gt;The question we asked is deceptively simple: &lt;strong&gt;how do you build an agent that wins?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The short answer, after months of code, thousands of hands, and a dashboard that ended up looking like a quant fund&apos;s control room, is this: we built an extraordinarily sophisticated machine to &lt;em&gt;exploit&lt;/em&gt; opponents… and the thing that actually beat the toughest adversary was an idea so simple it&apos;s almost dumb. This post is the long story of how we got there, and what it taught us about poker, about LLMs, and about measuring things honestly.&lt;/p&gt;
&lt;h2 id=&quot;devfun-and-the-arena&quot;&gt;dev.fun and the Arena&lt;/h2&gt;
&lt;p&gt;The dev.fun &lt;strong&gt;Arena&lt;/strong&gt; is a competition of poker agents. Your agent is a program that talks to a real-time API. The loop is always the same:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;join&lt;/code&gt;&lt;/strong&gt; — you take a seat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;pending-actions&lt;/code&gt;&lt;/strong&gt; — the API tells you &quot;it&apos;s your turn, here&apos;s the situation&quot; (your cards, the board, the bets, the stacks, who did what).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;action&lt;/code&gt;&lt;/strong&gt; — you respond: &lt;em&gt;fold, check, call, bet, raise&lt;/em&gt; and how much.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# System 7 — game loop against the Arena API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;client &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ArenaClient&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(base_url, api_key&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;ARENA_API_KEY)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(table_id)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                          # 1. take a seat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    table &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; client&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;pending_actions&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(table_id)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # 2. &quot;your turn, here&apos;s the situation&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    decision &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; hybrid&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;decide&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(table, deadline_s&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    client&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;action&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(table_id,                    &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# 3. respond: fold/check/call/bet/raise&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;                  action&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;decision[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;                  amount&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;decision.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;amount&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/api-loop-flowchart.svg&quot; alt=&quot;Arena API game loop&quot; width=&quot;800&quot; height=&quot;320&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;The game loop: join, pending-actions, action&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;There&apos;s a &lt;em&gt;deadline&lt;/em&gt; per decision: don&apos;t answer in time and you get &lt;em&gt;auto-folded&lt;/em&gt;. It&apos;s real poker, with a real clock.&lt;/p&gt;
&lt;p&gt;The Arena has three &quot;tracks,&quot; and the difference matters because each rewards different things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eval&lt;/strong&gt; — your agent plays &lt;strong&gt;500 hands against a fixed panel of five reference bots&lt;/strong&gt;. It&apos;s a benchmark: it scores you in &lt;strong&gt;bb/100&lt;/strong&gt; (big blinds won per 100 hands, poker&apos;s universal metric) and ranks you. No prize, &lt;strong&gt;one-shot&lt;/strong&gt; per agent. This is no field of fish: the panel is the closest thing to a &quot;perfect&quot; opponent you&apos;ll face.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Playground&lt;/strong&gt; — &lt;strong&gt;PvP with play money&lt;/strong&gt;, free and continuous. Here you &lt;em&gt;do&lt;/em&gt; get real opponents, with their quirks and their leaks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tournament&lt;/strong&gt; — an &lt;strong&gt;MTT&lt;/strong&gt; (multi-table tournament) with &lt;strong&gt;on-chain entry&lt;/strong&gt; (Monad chain, MON token): you buy in once, get a fixed stack, and compete across tables of 2 to 6 players that melt down until one champion remains.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That distinction — &lt;strong&gt;a near-perfect opponent (Eval) versus leaky opponents (Playground/Tournament)&lt;/strong&gt; — is the axis of everything that follows.&lt;/p&gt;
&lt;h2 id=&quot;two-ways-to-play-gto-versus-exploitation&quot;&gt;Two ways to play: GTO versus exploitation&lt;/h2&gt;
&lt;p&gt;Modern poker lives between two philosophies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GTO (Game Theory Optimal).&lt;/strong&gt; You play the Nash equilibrium: an &lt;em&gt;unexploitable&lt;/em&gt; strategy. Whatever you do, you don&apos;t lose in the long run, because you mix your plays so the opponent can never gain an edge. It&apos;s what solvers and &lt;em&gt;Counterfactual Regret Minimization&lt;/em&gt; (CFR/DeepCFR) networks approximate. GTO doesn&apos;t try to win big; it tries to &lt;strong&gt;never lose&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exploitation.&lt;/strong&gt; You give up part of that armor to &lt;strong&gt;punish the opponent&apos;s specific mistakes&lt;/strong&gt;. Folds too much to raises? You bluff more. Calls with anything? You stop bluffing and bet bigger for value. It&apos;s how human pros think: equilibrium is the floor, but the money is in the other guy&apos;s &lt;em&gt;leaks&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Our starting thesis was the exploitative player&apos;s: &lt;strong&gt;use GTO as a defensive floor and, from there, deviate aggressively to squeeze every weakness&lt;/strong&gt;. In the jargon, &lt;em&gt;node-locking&lt;/em&gt;: you mentally &quot;lock&quot; the opponent&apos;s error at a node of the decision tree and attack right there. We built an entire engine around this idea. It&apos;s called &lt;strong&gt;System 7&lt;/strong&gt;.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/gto-exploitation-spectrum.svg&quot; alt=&quot;GTO vs Exploitation spectrum&quot; width=&quot;800&quot; height=&quot;260&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;GTO as defensive floor + aggressive exploitative deviations&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;/msup&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;arg&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;munder&gt;&lt;mrow&gt;&lt;mi&gt;min&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mrow&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;/munder&gt;&lt;munder&gt;&lt;mrow&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mrow&gt;&lt;msup&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mo mathvariant=&quot;normal&quot; lspace=&quot;0em&quot; rspace=&quot;0em&quot;&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;/munder&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mo mathvariant=&quot;normal&quot; lspace=&quot;0em&quot; rspace=&quot;0em&quot;&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\sigma^* = \arg\min_{\sigma} \max_{\sigma&apos;} u(\sigma&apos;, \sigma)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.7387em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.0359em;&quot;&gt;σ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7387em;&quot;&gt;&lt;span style=&quot;top:-3.113em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mbin mtight&quot;&gt;∗&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.5459em;vertical-align:-0.744em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;ar&lt;span style=&quot;margin-right:0.0139em;&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6679em;&quot;&gt;&lt;span style=&quot;top:-2.4em;margin-left:0em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.0359em;&quot;&gt;σ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop&quot;&gt;min&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.4306em;&quot;&gt;&lt;span style=&quot;top:-2.356em;margin-left:0em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.0359em;&quot;&gt;σ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6828em;&quot;&gt;&lt;span style=&quot;top:-2.786em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop&quot;&gt;max&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.744em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.0359em;&quot;&gt;σ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8019em;&quot;&gt;&lt;span style=&quot;top:-3.113em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.0359em;&quot;&gt;σ&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h2 id=&quot;system-7-a-hand-written-exploitation-engine&quot;&gt;System 7: a hand-written exploitation engine&lt;/h2&gt;
&lt;p&gt;The first thing to understand about System 7 is what it is &lt;strong&gt;not&lt;/strong&gt;: it&apos;s not an LLM, and at decision time it &lt;strong&gt;calls no network and no model&lt;/strong&gt;. It&apos;s &lt;strong&gt;pure, deterministic Python&lt;/strong&gt; —and &lt;strong&gt;&lt;a href=&quot;https://github.com/quantarmyz/system7-poker-arena&quot;&gt;open source on GitHub&lt;/a&gt;&lt;/strong&gt;. It takes the table, runs the math, and returns a play in milliseconds. All the &quot;intelligence&quot; is encoded as rules, distilled from an exploitative methodology (the EducaPoker / &quot;University Strategy&quot; school, with the fingerprint of players like Raúl Mestre).&lt;/p&gt;
&lt;p&gt;The engine is organized into four directives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D1 — How much you trust what you see (the sample N).&lt;/strong&gt; You can&apos;t exploit an opponent you know nothing about. System 7 scales its aggression by how many hands it has observed the villain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;N &amp;#x3C; 100&lt;/strong&gt;: blindness. Ignore the stats (pure noise), play standard ranges, respect opponent aggression.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;100 ≤ N &amp;#x3C; 500&lt;/strong&gt;: start profiling by the &lt;em&gt;gap&lt;/em&gt; between VPIP (how often they put money in) and PFR (how often they raise). Out come the archetypes: &lt;strong&gt;Nit&lt;/strong&gt; (super-tight), &lt;strong&gt;TAG&lt;/strong&gt; (solid), &lt;strong&gt;LAG&lt;/strong&gt; (loose-aggressive), &lt;strong&gt;Calling Station&lt;/strong&gt; (calls everything) and &lt;strong&gt;Maniac&lt;/strong&gt;. Each is played differently: against the station, zero tolerance for bluffs and bigger value bets; against the nit, steal their blinds relentlessly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;N ≥ 500&lt;/strong&gt;: fine node-locking. If the opponent folds to 3-bets more than 55% of the time, we re-raise any hand with an Ace blocker. If they abandon the flop to a continuation bet more than 45% of the time, we bet 100% of our range with a small sizing.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _archetype&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;st&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; dict&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Classify a villain from agent-stats. N-gated by sampleSize.&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    n &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;N&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 500&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                    # too few hands -&gt; don&apos;t trust the read&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;UNKNOWN&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    vpip&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _pct&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;vpid&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;]),&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _pct&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;pfr&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 15&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;STATION&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # calls everything&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 40&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;MANIAC&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    # ultra-aggressive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 15&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 6&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;NIT&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;       # only premiums&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 26&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 20&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;LAG&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;        # loose-aggressive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;TAG&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                                          # solid default&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;D2 — What you have and where you are (the geometry).&lt;/strong&gt; Instead of thinking &quot;I have a pair of aces,&quot; System 7 classifies the hand by its &lt;strong&gt;relative fit with the board&lt;/strong&gt;: &lt;strong&gt;MMF&lt;/strong&gt; (monster hands: sets, flushes, straights), &lt;strong&gt;MF&lt;/strong&gt; (strong hands: top pair good kicker, overpair), &lt;strong&gt;MM&lt;/strong&gt; (medium), &lt;strong&gt;MD&lt;/strong&gt; (weak), and &lt;strong&gt;Air/Draws&lt;/strong&gt;. And it classifies the board by texture: &lt;strong&gt;dry&lt;/strong&gt;, &lt;strong&gt;semi-coordinated&lt;/strong&gt;, &lt;strong&gt;coordinated&lt;/strong&gt; and &lt;strong&gt;extremely coordinated&lt;/strong&gt; (where even a set drops a tier because the danger is huge). On top of that, the dynamics of the running cards: a &lt;em&gt;scary&lt;/em&gt; card (an Ace, a King that completes a flush) favors the aggressor and lowers the bluffing threshold; a defensive card brakes the aggression and calls for pot control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D3 — The relentless arithmetic (pot odds vs equity).&lt;/strong&gt; No hunches here. It computes the &lt;strong&gt;pot odds&lt;/strong&gt; (what you risk versus what you can win) and compares them to your &lt;strong&gt;real equity&lt;/strong&gt;, counting &lt;em&gt;adjusted outs&lt;/em&gt; for the texture — a flush draw is worth less if the opponent can hold a higher one; overcards are worth almost zero on a very coordinated board. The rule is a mandate: &lt;strong&gt;if your equity doesn&apos;t cover the pot odds, you fold&lt;/strong&gt; — unless the HUD certifies the opponent will fold (then the bluff has value of its own).&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _pme&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;call_chips&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; pot&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Pot odds: what you risk vs what you can win.&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    tot &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pot &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; call_chips&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; (call_chips &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; tot) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; tot &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _per&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;adj_outs&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; board_len&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Adjusted-outs equity (rule of 4/2).&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    mult &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; board_len &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; board_len &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; min&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;0.95&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;, adj_outs &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; mult &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 100.0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;PME&lt;/mtext&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mtext&gt;Call&lt;/mtext&gt;&lt;mrow&gt;&lt;mtext&gt;Pot&lt;/mtext&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mtext&gt;Call&lt;/mtext&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{PME} = \frac{\text{Call}}{\text{Pot} + \text{Call}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;PME&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.1408em;vertical-align:-0.7693em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3714em;&quot;&gt;&lt;span style=&quot;top:-2.314em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Pot&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Call&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Call&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7693em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;PER&lt;/mtext&gt;&lt;mtext&gt;flop&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mtext&gt;Outs&lt;/mtext&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mspace width=&quot;1em&quot;&gt;&lt;/mspace&gt;&lt;msub&gt;&lt;mtext&gt;PER&lt;/mtext&gt;&lt;mtext&gt;turn&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mtext&gt;Outs&lt;/mtext&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{PER}_{\text{flop}} = \frac{\text{Outs} \times 4}{100}, \quad \text{PER}_{\text{turn}} = \frac{\text{Outs} \times 2}{100}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.9694em;vertical-align:-0.2861em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;PER&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;flop&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.0463em;vertical-align:-0.686em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3603em;&quot;&gt;&lt;span style=&quot;top:-2.314em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Outs&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.686em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:1em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;PER&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;turn&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.0463em;vertical-align:-0.686em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3603em;&quot;&gt;&lt;span style=&quot;top:-2.314em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Outs&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.686em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;Call if PER&lt;/mtext&gt;&lt;mo&gt;≥&lt;/mo&gt;&lt;mtext&gt;PME&lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{Call if } \text{PER} \geq \text{PME}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8304em;vertical-align:-0.136em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Call if &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;PER&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≥&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;PME&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;strong&gt;D4 — The postflop and the &quot;Killer Parsley.&quot;&lt;/strong&gt; When the SPR (stack-to-pot ratio) drops below 3, you commit with any strong hand: pot control vanishes, you&apos;re all in. And for the bluffs there&apos;s the protocol nicknamed &lt;strong&gt;&quot;Perejil Asesino&quot; (Killer Parsley)&lt;/strong&gt;: a &lt;em&gt;conditional&lt;/em&gt; bluff. You only raise as a bluff if conditions are met (evident opponent weakness, a &lt;em&gt;lifeline&lt;/em&gt; of 8–10 real outs backing the play in case you get called, adjustments for the number of opponents…). You never bluff on impulse with trash; every aggression is backed by math or a documented leak.&lt;/p&gt;
&lt;p&gt;And above it all, the &lt;strong&gt;HUD&lt;/strong&gt;: a module that reads opponents&apos; live stats (sample size, VPIP, PFR, 3-bet, fold-to-cbet, showdown…), sorts them into archetypes, and feeds the D1 deviations. The HUD is what turns System 7 from a disciplined robot into an exploiter.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Strategy as versioned data — strategies/&amp;#x3C;name&gt;.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;SIZING &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;    &quot;dry&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;     {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;flop&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.33&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;turn&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.50&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;river&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.60&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;    &quot;semi&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;flop&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.50&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;turn&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.60&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;river&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.66&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;    &quot;coord&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;   {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;flop&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.66&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;turn&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.75&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;river&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.75&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;    &quot;extreme&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;flop&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.75&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;turn&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.80&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;river&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.80&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Toggle strategy: S7_STRAT=s7-opus uv run run_hybrid_system7.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It is, in short, a serious and complete attempt to encode how an exploitative pro thinks. It worked. The question was: &lt;strong&gt;did it win?&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;putting-an-llm-at-the-table&quot;&gt;Putting an LLM at the table&lt;/h2&gt;
&lt;p&gt;The heuristic engine is fast and cheap, but it has a ceiling: rules, however refined, don&apos;t cover every weird spot. So we tried a &lt;strong&gt;hybrid engine&lt;/strong&gt;: the heuristic handles the trivial spots (the vast majority) and, in the &lt;strong&gt;hard spots&lt;/strong&gt;, hands the decision to an &lt;strong&gt;LLM&lt;/strong&gt; that reasons the play out.&lt;/p&gt;
&lt;p&gt;We used &lt;strong&gt;&lt;a href=&quot;https://www.minimax.io&quot;&gt;MiniMax M3&lt;/a&gt;&lt;/strong&gt;, a reasoning model, with the method&apos;s own system prompt (the four directives in plain language, plus a JSON output contract). The LLM gets the reconstructed situation and returns a justified play. The cost? About &lt;strong&gt;27 seconds per decision&lt;/strong&gt; and non-trivial token usage — which is why it only steps in for the spots that truly warrant it (difficulty &lt;em&gt;gating&lt;/em&gt;).&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copied&quot;&gt;Copy&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _is_hard&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;table&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; dict&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; deadline_s&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; bool&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Gate: True =&gt; worth a slow LLM call (~27s).&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; deadline_s &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;            # M3 takes ~27s; don&apos;t risk auto-fold&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    board &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; list&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(table.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;boardCards&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; [])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; board&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                  # preflop: position ranges suffice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    texture &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; H&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;_texture&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(board)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    strength &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; H&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;_strength&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(hole, board, texture)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    outs &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; H&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;_adjusted_outs&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(hole, board, texture)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; strength &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;MMF&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;         # clear value / commit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; strength &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;MM&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; (strength &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AIR&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;MD&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; outs &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;               # thin value / semi-bluff / give-up&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; False&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here&apos;s a theme that&apos;s become central across the whole AI ecosystem: &lt;strong&gt;reasoning models&lt;/strong&gt;. An M3 or a &lt;a href=&quot;https://www.deepseek.com&quot;&gt;DeepSeek-R1&lt;/a&gt; &quot;thinks out loud&quot; before answering, which gives them a real edge on problems with many interdependent variables — and poker, in its hard spots, is exactly that. This comes back elegantly later, in our own &lt;em&gt;coach&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-happened-and-what-we-didnt-expect&quot;&gt;What happened (and what we didn&apos;t expect)&lt;/h2&gt;
&lt;p&gt;Here&apos;s the honest part, which is also the most interesting.&lt;/p&gt;
&lt;p&gt;The Eval panel — that &quot;near-perfect&quot; opponent — turned out to be &lt;strong&gt;five identical clones of a DeepCFR bot&lt;/strong&gt;: a balanced TAG (VPIP ~21.7, PFR ~16.4, aggression factor ~1.95), with no obvious leaks. The closest thing to GTO we&apos;d get to measure.&lt;/p&gt;
&lt;p&gt;We measured:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;System 7 heuristic (pure node-locking): −9.75 bb/100.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hybrid with M3 (reasoning the hard spots): −1.66 bb/100.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is: our elaborate exploitation machine &lt;strong&gt;lost&lt;/strong&gt; against the panel. The LLM improved it (from −9.75 to −1.66 — its reasoning in hard spots genuinely helped), but &lt;strong&gt;neither beat the opponent&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The lesson, in one sentence: &lt;strong&gt;you can&apos;t over-exploit someone who has no leaks.&lt;/strong&gt; The whole node-locking apparatus — the archetypes, the Killer Parsley, the fine deviations — only pays when the opponent makes &lt;em&gt;systematic&lt;/em&gt; errors. Against a near-GTO with no leaks, that machinery spins in a vacuum and even hurts you (you deviate from equilibrium for no reward).&lt;/p&gt;
&lt;p&gt;And then, the twist. We tried a strategy so simple it&apos;s almost dumb: &lt;strong&gt;very wide ranges and steal-aggression&lt;/strong&gt; (open far more hands, steal blinds relentlessly). Against the &lt;strong&gt;same panel&lt;/strong&gt;, that &lt;em&gt;wide&lt;/em&gt; strategy scored &lt;strong&gt;+119 bb/100&lt;/strong&gt; in the qualifiers.&lt;/p&gt;
&lt;p&gt;Why? Because the panel, &quot;GTO&quot; as it was, had &lt;strong&gt;one&lt;/strong&gt; exploitable property: it &lt;strong&gt;folded around 78% of its hands preflop&lt;/strong&gt;. Even a disciplined bot is, structurally, too tight. And that&apos;s a leak — just not the kind the HUD spots hand by hand, but a &lt;strong&gt;structural&lt;/strong&gt; one, punished with the oldest play in the book: stealing.&lt;/p&gt;
&lt;p&gt;There&apos;s the project&apos;s nice irony: &lt;strong&gt;exploitation did win — but the right exploit was the simple, structural one (steal), not the elaborate multi-street read.&lt;/strong&gt; We built a microscope to find subtle leaks when what paid was a hammer.&lt;/p&gt;
&lt;p&gt;A mandatory note of statistical humility: &lt;strong&gt;bb/100 over 500 hands has a ±20 confidence interval&lt;/strong&gt;. Both the −9.75 and the +119 are noisy in absolute terms. What &lt;em&gt;was&lt;/em&gt; consistent across runs was the &lt;em&gt;direction&lt;/em&gt;: against this panel, width ≫ node-locking. Treating a 500-hand number as a verdict is one of the easiest — and most expensive — mistakes to make.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/equity-curve-comparison.svg&quot; alt=&quot;Eval results comparison&quot; width=&quot;800&quot; height=&quot;400&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;Node-locking -9.75 vs Wide +119 bb/100 (CI +-20)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;CI&lt;/mtext&gt;&lt;mrow&gt;&lt;mn&gt;95&lt;/mn&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;%&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;≈&lt;/mo&gt;&lt;mo&gt;±&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;200&lt;/mn&gt;&lt;msqrt&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;/&lt;/mi&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mrow&gt;&lt;/msqrt&gt;&lt;/mfrac&gt;&lt;mtext&gt; bb/100&lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{CI}_{95\%} \approx \pm \frac{200}{\sqrt{N/100}} \text{ bb/100}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.9024em;vertical-align:-0.2191em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;CI&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.5198em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;95%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2191em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≈&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.4514em;vertical-align:-1.13em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;±&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3214em;&quot;&gt;&lt;span style=&quot;top:-2.175em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord sqrt&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.935em;&quot;&gt;&lt;span class=&quot;svg-align&quot; style=&quot;top:-3.2em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.2em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot; style=&quot;padding-left:1em;&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.109em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;/100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.895em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.2em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hide-tail&quot; style=&quot;min-width:1.02em;height:1.28em;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;400em&quot; height=&quot;1.28em&quot; viewBox=&quot;0 0 400000 1296&quot; preserveAspectRatio=&quot;xMinYMin slice&quot;&gt;&lt;path d=&quot;M263,681c0.7,0,18,39.7,52,119
c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120
c340,-704.7,510.7,-1060.3,512,-1067
l0 -0
c4.7,-7.3,11,-11,19,-11
H40000v40H1012.3
s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232
c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1
s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26
c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z
M1001 80h400000v40h-400000z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.305em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;200&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.13em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt; bb/100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;CI&lt;/mtext&gt;&lt;mrow&gt;&lt;mn&gt;95&lt;/mn&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;%&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;≈&lt;/mo&gt;&lt;mo&gt;±&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;200&lt;/mn&gt;&lt;msqrt&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;/&lt;/mi&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mrow&gt;&lt;/msqrt&gt;&lt;/mfrac&gt;&lt;mtext&gt; bb/100&lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{CI}_{95\%} \approx \pm \frac{200}{\sqrt{N/100}} \text{ bb/100}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.9024em;vertical-align:-0.2191em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;CI&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.5198em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;95%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2191em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≈&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.4514em;vertical-align:-1.13em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;±&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3214em;&quot;&gt;&lt;span style=&quot;top:-2.175em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord sqrt&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.935em;&quot;&gt;&lt;span class=&quot;svg-align&quot; style=&quot;top:-3.2em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.2em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot; style=&quot;padding-left:1em;&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.109em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;/100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.895em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.2em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hide-tail&quot; style=&quot;min-width:1.02em;height:1.28em;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;400em&quot; height=&quot;1.28em&quot; viewBox=&quot;0 0 400000 1296&quot; preserveAspectRatio=&quot;xMinYMin slice&quot;&gt;&lt;path d=&quot;M263,681c0.7,0,18,39.7,52,119
c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120
c340,-704.7,510.7,-1060.3,512,-1067
l0 -0
c4.7,-7.3,11,-11,19,-11
H40000v40H1012.3
s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232
c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1
s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26
c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z
M1001 80h400000v40h-400000z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.305em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;200&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.13em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt; bb/100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;So where does all the exploitative machinery shine? Where there are real leaks: in the &lt;strong&gt;Playground&lt;/strong&gt; and the &lt;strong&gt;Tournament&lt;/strong&gt;, against real opponents who do call too much, fold too little, and bluff badly. There the HUD and node-locking stop spinning in a vacuum.&lt;/p&gt;
&lt;h2 id=&quot;from-lab-to-production-the-tooling&quot;&gt;From lab to production: the tooling&lt;/h2&gt;
&lt;p&gt;An agent is nothing without the factory that produces it. Half the project is a &lt;strong&gt;control dashboard&lt;/strong&gt; that organizes the agent&apos;s whole lifecycle into three zones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LAB&lt;/strong&gt; — where a strategy is &lt;em&gt;born&lt;/em&gt;: a 13×13 grid (poker&apos;s 169 hands) to paint ranges by hand, pick engine (heuristic / hybrid), model, and HUD, and &lt;strong&gt;backtest&lt;/strong&gt; several agents at once (with concurrency capped so as not to blow up the APIs or trigger &lt;em&gt;rate-limits&lt;/em&gt;). Results are reported as bb/100 &lt;strong&gt;aggregated per strategy, with its confidence interval&lt;/strong&gt; — not as a single run.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;COACH&lt;/strong&gt; — where the agent &lt;em&gt;learns&lt;/em&gt;. A diagnosis of your play versus optimal (VPIP, PFR, c-bet… against reference bands) &lt;strong&gt;and an LLM coach&lt;/strong&gt; that critiques your hands and proposes concrete tweaks. The latest addition: a &lt;strong&gt;hand-by-hand&lt;/strong&gt; coach — you take your 10 most and least profitable hands, select them, and a &lt;strong&gt;reasoning model&lt;/strong&gt; (DeepSeek-R1) tells you for each one whether you played it well or badly and where the leak is. (A fun detail: the reasoning model is noticeably more critical than the standard one; where the standard model applauds an all-in, the reasoning model spots that the overbet scared off the worse hands and only got called by the better ones.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PRODUCTION&lt;/strong&gt; — where the agent &lt;em&gt;competes&lt;/em&gt;: live deployment, a real equity curve versus theoretical EV, a &lt;strong&gt;hand replayer&lt;/strong&gt; to review every play, and a &lt;em&gt;tracker&lt;/em&gt; that profiles opponents.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And all of it closes a &lt;strong&gt;self-improvement loop&lt;/strong&gt;: propose a version → test it → compare against the control → deploy it → the coach critiques it → repeat. An agent, and a coach for that agent, in the same place.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/self-improvement-loop.svg&quot; alt=&quot;Self-improvement loop&quot; width=&quot;800&quot; height=&quot;360&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;LAB, COACH, PRODUCTION: the self-improvement loop&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;the-jump-to-tournaments&quot;&gt;The jump to tournaments&lt;/h2&gt;
&lt;p&gt;Cash and tournaments don&apos;t play the same. In an MTT the blinds rise and your stack, measured in big blinds, shrinks — and the strategy has to change with depth. System 7 adapts its ranges by &lt;strong&gt;stack tier&lt;/strong&gt;: deep (you play normal poker), medium, short, and very short (&lt;strong&gt;push/fold&lt;/strong&gt;: shove or fold, no middle ground). At the final table, when the tournament narrows to two players, the engine detects &lt;strong&gt;heads-up dynamically&lt;/strong&gt; and switches to a position-aware frame (the button acts last postflop, c-bets its range, barrels). The finest part is still pending — &lt;strong&gt;ICM&lt;/strong&gt; (the fact that a chip&apos;s value isn&apos;t linear near the payouts) — but the tournament foundation is there.&lt;/p&gt;
&lt;h2 id=&quot;what-we-take-away&quot;&gt;What we take away&lt;/h2&gt;
&lt;p&gt;Beyond poker, the project leaves a few lessons that apply to any agent making decisions under uncertainty:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GTO and exploitation aren&apos;t rivals, they&apos;re layers.&lt;/strong&gt; Equilibrium is your floor; exploitation is your ceiling. But exploitation only pays if the other side has leaks — and the right leak might be the simplest of all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The LLM shines as judgment in the hard spots, not as a full controller.&lt;/strong&gt; The cheap, deterministic thing handles 95%; the expensive, slow model is reserved for the 5% that truly needs it. And &lt;em&gt;reasoning&lt;/em&gt; models add value where many variables are tangled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measuring honestly is half the work.&lt;/strong&gt; A noisy number is not a verdict. Confidence intervals, direction over absolute value, and the discipline not to fool yourself are worth more than any strategy trick.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The meta-game is building the factory.&lt;/strong&gt; The edge wasn&apos;t in a brilliant play but in the &lt;em&gt;loop&lt;/em&gt;: authoring → backtest → comparison → deployment → coaching → repeat. An agent is only as good as the machinery that iterates it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That, in the end, is what QuantArmy is about: &lt;strong&gt;agents for deciding under uncertainty.&lt;/strong&gt; Poker turned out to be a perfect testing ground — bounded, measurable, and merciless with self-deception. It teaches you fast that your mental model isn&apos;t reality, and that the toughest opponent isn&apos;t beaten with more sophistication, but with the right idea.&lt;/p&gt;
&lt;h2 id=&quot;resources--links&quot;&gt;Resources &amp;#x26; links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;💻 &lt;strong&gt;Code (open source)&lt;/strong&gt;: &lt;a href=&quot;https://github.com/quantarmyz/system7-poker-arena&quot;&gt;github.com/quantarmyz/system7-poker-arena&lt;/a&gt; — the heuristic engine, the LLM hybrid, the dashboard and all the tooling.&lt;/li&gt;
&lt;li&gt;🃏 &lt;strong&gt;The platform&lt;/strong&gt;: &lt;a href=&quot;https://dev.fun&quot;&gt;dev.fun&lt;/a&gt; · the &lt;a href=&quot;https://arena.dev.fun&quot;&gt;poker Arena&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Reasoning models&lt;/strong&gt;: &lt;a href=&quot;https://www.deepseek.com&quot;&gt;DeepSeek&lt;/a&gt; · &lt;a href=&quot;https://www.minimax.io&quot;&gt;MiniMax&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Part 2&lt;/strong&gt;: &lt;a href=&quot;https://quantarmy.com/en/system-7-part-2-heads-up-survival/&quot;&gt;we went heads-up, and the exploiter finally got paid&lt;/a&gt; — the diary continues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;The project is still live in the Arena. If you&apos;re into the intersection of AI, game theory, and decision-making under uncertainty, this is only the beginning.&lt;/em&gt;&lt;/p&gt;</content:encoded><enclosure url="https://quantarmy.com/content/images/2026/07/feature-system7-part1.svg" length="0" type="image/svg+xml"/><category>System 7</category><category>dev.fun</category><category>Poker</category><category>AI</category><category>LLM</category><category>GTO</category><category>ia</category><author>Jesus Cuesta</author></item><item><title>System 7: enseñamos a una IA a explotar el póker — y lo que de verdad ganó fue otra cosa</title><link>https://quantarmy.com/system-7-agente-poker-dev-fun/</link><guid isPermaLink="true">https://quantarmy.com/system-7-agente-poker-dev-fun/</guid><description>Crónica técnica de construir un agente de póker para el Arena de dev.fun: el método heurístico, los LLM en la mesa y los resultados honestos.</description><pubDate>Sun, 21 Jun 2026 20:44:05 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Crónica técnica de construir un agente de póker para el Arena de dev.fun: el método heurístico, los LLM en la mesa, y los resultados honestos — incluidos los que no esperábamos.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;el-experimento&quot;&gt;El experimento&lt;/h2&gt;
&lt;p&gt;En &lt;strong&gt;&lt;a href=&quot;https://dev.fun&quot;&gt;dev.fun&lt;/a&gt;&lt;/strong&gt; hay un sitio donde agentes de inteligencia artificial se sientan a una mesa de &lt;strong&gt;Texas Hold&apos;em No Limit&lt;/strong&gt; y juegan unos contra otros. No es una demo: hay manos reales, fichas reales, rivales reales (algunos humanos detrás de un bot, otros bots a secas) y, en los torneos, dinero on-chain en juego.&lt;/p&gt;
&lt;p&gt;La pregunta que nos hicimos es engañosamente simple: &lt;strong&gt;¿cómo construyes un agente que gane?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La respuesta corta, después de meses de código, miles de manos y un panel de control que acabó pareciendo la sala de un fondo cuantitativo, es esta: construimos una máquina sofisticadísima para &lt;em&gt;explotar&lt;/em&gt; a los rivales… y lo que de verdad batió al adversario más duro fue una idea tonta de tan simple. Este post es la historia larga de cómo llegamos ahí, qué aprendimos del póker, de los LLM y de medir las cosas con honestidad.&lt;/p&gt;
&lt;h2 id=&quot;devfun-y-el-arena&quot;&gt;dev.fun y el Arena&lt;/h2&gt;
&lt;p&gt;El &lt;strong&gt;Arena&lt;/strong&gt; de dev.fun es una competición de agentes de póker. Tu agente es un programa que habla con una API en tiempo real. El bucle es siempre el mismo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;join&lt;/code&gt;&lt;/strong&gt; — te sientas en una mesa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;pending-actions&lt;/code&gt;&lt;/strong&gt; — la API te dice &quot;es tu turno, esta es la situación&quot; (tus cartas, el board, las apuestas, las fichas, quién ha hecho qué).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;action&lt;/code&gt;&lt;/strong&gt; — respondes: &lt;em&gt;fold, check, call, bet, raise&lt;/em&gt; y cuánto.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# System 7 — game loop against the Arena API&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;client &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ArenaClient&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(base_url, api_key&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;ARENA_API_KEY)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;client&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(table_id)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                          # 1. take a seat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    table &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; client&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;pending_actions&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(table_id)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # 2. &quot;your turn, here&apos;s the situation&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    decision &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; hybrid&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;decide&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(table, deadline_s&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    client&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;action&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(table_id,                    &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# 3. respond: fold/check/call/bet/raise&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;                  action&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;decision[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;                  amount&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;decision.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;amount&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/api-loop-flowchart.svg&quot; alt=&quot;Arena API game loop&quot; width=&quot;800&quot; height=&quot;320&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;El bucle de juego: join, pending-actions, action&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Hay un &lt;em&gt;deadline&lt;/em&gt; por decisión: si no contestas a tiempo, te hacen &lt;em&gt;auto-fold&lt;/em&gt;. Es póker de verdad, con su reloj.&lt;/p&gt;
&lt;p&gt;El Arena tiene tres &quot;pistas&quot;, y entender la diferencia es clave porque cada una premia cosas distintas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eval&lt;/strong&gt; — tu agente juega &lt;strong&gt;500 manos contra un panel fijo de cinco bots de referencia&lt;/strong&gt;. Es un &lt;em&gt;benchmark&lt;/em&gt;: te puntúa en &lt;strong&gt;bb/100&lt;/strong&gt; (ciegas grandes ganadas por cada 100 manos, la métrica universal del póker) y te coloca en un ranking. No reparte premio y es &lt;strong&gt;de una sola tirada&lt;/strong&gt; por agente. Aquí no te enfrentas a peces: el panel es lo más cercano a un rival &quot;perfecto&quot; que vas a ver.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Playground&lt;/strong&gt; — &lt;strong&gt;PvP con dinero de juguete&lt;/strong&gt;, gratis y continuo. Aquí sí hay rivales reales, con sus manías y sus fugas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tournament&lt;/strong&gt; — un &lt;strong&gt;MTT&lt;/strong&gt; (torneo multi-mesa) con entrada &lt;em&gt;on-chain&lt;/em&gt; (cadena Monad, token MON): pagas una vez, recibes un stack fijo y compites en mesas de 2 a 6 jugadores que se van fundiendo hasta que queda un campeón.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esa distinción — &lt;strong&gt;un rival casi perfecto (Eval) frente a rivales con fugas (Playground/Torneo)&lt;/strong&gt; — es el eje de todo lo que viene.&lt;/p&gt;
&lt;h2 id=&quot;dos-formas-de-jugar-gto-contra-explotación&quot;&gt;Dos formas de jugar: GTO contra explotación&lt;/h2&gt;
&lt;p&gt;En el póker moderno conviven dos filosofías.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GTO (Game Theory Optimal).&lt;/strong&gt; Juegas el equilibrio de Nash: una estrategia &lt;em&gt;inexplotable&lt;/em&gt;. Hagas lo que hagas, no pierdes a la larga, porque mezclas tus jugadas de forma que el rival nunca puede sacarte ventaja. Es lo que aproximan los &lt;em&gt;solvers&lt;/em&gt; y las redes entrenadas con &lt;em&gt;Counterfactual Regret Minimization&lt;/em&gt; (CFR/DeepCFR). El GTO no intenta ganarte mucho; intenta &lt;strong&gt;no perder nunca&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explotación.&lt;/strong&gt; Renuncias a parte de esa coraza para &lt;strong&gt;castigar los errores concretos del rival&lt;/strong&gt;. ¿Foldea demasiado a las subidas? Faroleas más. ¿Paga con cualquier cosa? Dejas de farolear y subes el valor. Es la forma en que piensan los profesionales humanos: el equilibrio es la base, pero el dinero está en las &lt;em&gt;fugas&lt;/em&gt; del de enfrente.&lt;/p&gt;
&lt;p&gt;Nuestra tesis de partida fue la del jugador explotador: &lt;strong&gt;usar el GTO como suelo defensivo y, a partir de ahí, desviarse agresivamente para exprimir cada debilidad&lt;/strong&gt;. En la jerga, &lt;em&gt;node-locking&lt;/em&gt;: &quot;clavas&quot; mentalmente el error del rival en un nodo del árbol de decisión y atacas justo ahí. Construimos un motor entero alrededor de esta idea. Se llama &lt;strong&gt;System 7&lt;/strong&gt;.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/gto-exploitation-spectrum.svg&quot; alt=&quot;GTO vs Exploitation spectrum&quot; width=&quot;800&quot; height=&quot;260&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;GTO como suelo defensivo + desviaciones explotadoras&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mo&gt;∗&lt;/mo&gt;&lt;/msup&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;arg&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;munder&gt;&lt;mrow&gt;&lt;mi&gt;min&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mrow&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;/munder&gt;&lt;munder&gt;&lt;mrow&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mrow&gt;&lt;msup&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mo mathvariant=&quot;normal&quot; lspace=&quot;0em&quot; rspace=&quot;0em&quot;&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;/munder&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mo mathvariant=&quot;normal&quot; lspace=&quot;0em&quot; rspace=&quot;0em&quot;&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;σ&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\sigma^* = \arg\min_{\sigma} \max_{\sigma&apos;} u(\sigma&apos;, \sigma)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.7387em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.0359em;&quot;&gt;σ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7387em;&quot;&gt;&lt;span style=&quot;top:-3.113em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mbin mtight&quot;&gt;∗&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.5459em;vertical-align:-0.744em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;ar&lt;span style=&quot;margin-right:0.0139em;&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6679em;&quot;&gt;&lt;span style=&quot;top:-2.4em;margin-left:0em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.0359em;&quot;&gt;σ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop&quot;&gt;min&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.4306em;&quot;&gt;&lt;span style=&quot;top:-2.356em;margin-left:0em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.0359em;&quot;&gt;σ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6828em;&quot;&gt;&lt;span style=&quot;top:-2.786em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop&quot;&gt;max&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.744em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.0359em;&quot;&gt;σ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8019em;&quot;&gt;&lt;span style=&quot;top:-3.113em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.0359em;&quot;&gt;σ&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h2 id=&quot;system-7-un-motor-explotador-escrito-a-mano&quot;&gt;System 7: un motor explotador escrito a mano&lt;/h2&gt;
&lt;p&gt;Lo primero que hay que entender de System 7 es lo que &lt;strong&gt;no&lt;/strong&gt; es: no es un LLM, y en el momento de decidir &lt;strong&gt;no llama a ninguna red ni a ningún modelo&lt;/strong&gt;. Es &lt;strong&gt;Python puro y determinista&lt;/strong&gt; —y &lt;strong&gt;&lt;a href=&quot;https://github.com/quantarmyz/system7-poker-arena&quot;&gt;código abierto en GitHub&lt;/a&gt;&lt;/strong&gt;—. Recibe la mesa, hace cuentas y devuelve una jugada en milisegundos. Toda la &quot;inteligencia&quot; está codificada como reglas, destiladas de una metodología de juego explotador (la escuela de EducaPoker / &quot;Estrategia Universidad&quot;, con la huella de jugadores como Raúl Mestre).&lt;/p&gt;
&lt;p&gt;El motor se organiza en cuatro directivas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D1 — Cuánto te fías de lo que ves (la muestra N).&lt;/strong&gt; No puedes explotar a un rival del que no sabes nada. System 7 escala su agresividad según cuántas manos lleva observando al villano:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;N &amp;#x3C; 100&lt;/strong&gt;: ceguera. Ignora las estadísticas (puro ruido) y juega rangos estándar, respetando la agresión rival.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;100 ≤ N &amp;#x3C; 500&lt;/strong&gt;: empieza a perfilar por el &lt;em&gt;gap&lt;/em&gt; entre VPIP (con qué frecuencia mete fichas) y PFR (con qué frecuencia sube). De ahí salen los arquetipos: &lt;strong&gt;Nit&lt;/strong&gt; (tightísimo), &lt;strong&gt;TAG&lt;/strong&gt; (sólido), &lt;strong&gt;LAG&lt;/strong&gt; (agresivo y suelto), &lt;strong&gt;Calling Station&lt;/strong&gt; (paga todo) y &lt;strong&gt;Maníaco&lt;/strong&gt;. A cada uno se le juega distinto: a la station, tolerancia cero a los faroles y subir el valor; al nit, robarle las ciegas sin parar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;N ≥ 500&lt;/strong&gt;: &lt;em&gt;node-locking&lt;/em&gt; fino. Si el rival foldea a las resubidas más del 55% de las veces, le 3-beteamos cualquier mano con un As bloqueador. Si abandona el flop ante la apuesta de continuación más del 45%, le apostamos el 100% de nuestro rango con un &lt;em&gt;sizing&lt;/em&gt; pequeño.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _archetype&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;st&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; dict&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Classify a villain from agent-stats. N-gated by sampleSize.&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    n &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;N&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 500&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                    # too few hands -&gt; don&apos;t trust the read&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;UNKNOWN&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    vpip&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _pct&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;vpid&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;]),&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _pct&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(st[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;pfr&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 15&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;STATION&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # calls everything&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 40&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;MANIAC&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    # ultra-aggressive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 15&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; gap &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 6&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;NIT&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;       # only premiums&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; vpip &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 26&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pfr &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 20&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;   return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;LAG&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;        # loose-aggressive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;TAG&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                                          # solid default&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;D2 — Qué tienes y dónde estás (la geometría).&lt;/strong&gt; En lugar de pensar &quot;tengo pareja de ases&quot;, System 7 clasifica la mano por su &lt;strong&gt;encaje relativo con el board&lt;/strong&gt;: &lt;strong&gt;MMF&lt;/strong&gt; (manos monstruo: sets, colores, escaleras), &lt;strong&gt;MF&lt;/strong&gt; (manos fuertes: top pair con buen kicker, overpair), &lt;strong&gt;MM&lt;/strong&gt; (manos medias), &lt;strong&gt;MD&lt;/strong&gt; (manos débiles) y &lt;strong&gt;Aire/Proyectos&lt;/strong&gt;. Y clasifica la mesa por textura: &lt;strong&gt;seca&lt;/strong&gt;, &lt;strong&gt;semi-coordinada&lt;/strong&gt;, &lt;strong&gt;coordinada&lt;/strong&gt; y &lt;strong&gt;extremadamente coordinada&lt;/strong&gt; (donde hasta un set baja de categoría porque el peligro es enorme). Encima añade la dinámica de las cartas que van saliendo: una carta &lt;em&gt;scary&lt;/em&gt; (un As, un K que cierra un color) favorece al agresor y baja el umbral para farolear; una carta defensiva frena la agresión y pide control del bote.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D3 — La aritmética implacable (PME vs PER).&lt;/strong&gt; Aquí no hay corazonadas. Calcula el &lt;strong&gt;PME&lt;/strong&gt; (las &lt;em&gt;pot odds&lt;/em&gt;: cuánto arriesgas frente a lo que puedes ganar) y lo compara con el &lt;strong&gt;PER&lt;/strong&gt; (tu equity real, contando &lt;em&gt;outs ajustadas&lt;/em&gt; por la textura — un proyecto de color vale menos si el rival puede tener uno mayor; las sobrecartas valen casi cero en una mesa muy coordinada). La regla es un mandato: &lt;strong&gt;si tu equity no cubre las &lt;em&gt;pot odds&lt;/em&gt;, foldeas&lt;/strong&gt;, salvo que el HUD certifique que el rival se va a tirar (entonces el farol tiene su propio valor).&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _pme&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;call_chips&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; pot&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Pot odds: what you risk vs what you can win.&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    tot &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; pot &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; call_chips&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; (call_chips &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; tot) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; tot &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _per&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;adj_outs&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; board_len&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Adjusted-outs equity (rule of 4/2).&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    mult &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; board_len &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; board_len &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; min&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;0.95&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;, adj_outs &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; mult &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 100.0&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;PME&lt;/mtext&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mtext&gt;Call&lt;/mtext&gt;&lt;mrow&gt;&lt;mtext&gt;Pot&lt;/mtext&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mtext&gt;Call&lt;/mtext&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{PME} = \frac{\text{Call}}{\text{Pot} + \text{Call}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;PME&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.1408em;vertical-align:-0.7693em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3714em;&quot;&gt;&lt;span style=&quot;top:-2.314em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Pot&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Call&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Call&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7693em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;PER&lt;/mtext&gt;&lt;mtext&gt;flop&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mtext&gt;Outs&lt;/mtext&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mspace width=&quot;1em&quot;&gt;&lt;/mspace&gt;&lt;msub&gt;&lt;mtext&gt;PER&lt;/mtext&gt;&lt;mtext&gt;turn&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mtext&gt;Outs&lt;/mtext&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{PER}_{\text{flop}} = \frac{\text{Outs} \times 4}{100}, \quad \text{PER}_{\text{turn}} = \frac{\text{Outs} \times 2}{100}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.9694em;vertical-align:-0.2861em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;PER&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;flop&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.0463em;vertical-align:-0.686em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3603em;&quot;&gt;&lt;span style=&quot;top:-2.314em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Outs&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.686em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:1em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;PER&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;turn&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.0463em;vertical-align:-0.686em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3603em;&quot;&gt;&lt;span style=&quot;top:-2.314em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Outs&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.686em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mtext&gt;Call if PER&lt;/mtext&gt;&lt;mo&gt;≥&lt;/mo&gt;&lt;mtext&gt;PME&lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{Call if } \text{PER} \geq \text{PME}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8304em;vertical-align:-0.136em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;Call if &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;PER&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≥&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;PME&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;strong&gt;D4 — El postflop y el &quot;Perejil Asesino&quot;.&lt;/strong&gt; Cuando el SPR (la relación entre el bote y las fichas que quedan) baja de 3, te comprometes con cualquier mano fuerte: el control del bote desaparece, vas con todo. Y para los faroles está el protocolo bautizado como &lt;strong&gt;&quot;Perejil Asesino&quot;&lt;/strong&gt;: un farol &lt;em&gt;condicionado&lt;/em&gt;. Solo subes de farol si se cumplen condiciones (debilidad evidente del rival, un &lt;em&gt;salvavidas&lt;/em&gt; de 8 a 10 &lt;em&gt;outs&lt;/em&gt; reales que respalda la jugada por si te pagan, ajustes por número de rivales…). Nunca se farolea por impulso con basura; cada agresión va respaldada por matemática o por una fuga documentada.&lt;/p&gt;
&lt;p&gt;Y por encima de todo, el &lt;strong&gt;HUD&lt;/strong&gt;: un módulo que lee en vivo las estadísticas de los rivales (tamaño de muestra, VPIP, PFR, 3-bet, fold-to-cbet, &lt;em&gt;showdown&lt;/em&gt;…), los clasifica en arquetipos y alimenta las desviaciones de la D1. El HUD es lo que convierte a System 7 de un robot disciplinado en un explotador.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Strategy as versioned data — strategies/&amp;#x3C;name&gt;.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;SIZING &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;    &quot;dry&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;     {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;flop&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.33&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;turn&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.50&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;river&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.60&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;    &quot;semi&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;flop&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.50&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;turn&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.60&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;river&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.66&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;    &quot;coord&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;   {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;flop&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.66&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;turn&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.75&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;river&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.75&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;    &quot;extreme&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;flop&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.75&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;turn&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.80&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;river&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 0.80&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Toggle strategy: S7_STRAT=s7-opus uv run run_hybrid_system7.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Es, en resumen, un intento serio y completo de codificar cómo piensa un profesional explotador. Funcionaba. La pregunta era: &lt;strong&gt;¿ganaba?&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;meter-un-llm-en-la-mesa&quot;&gt;Meter un LLM en la mesa&lt;/h2&gt;
&lt;p&gt;El motor heurístico es rápido y barato, pero tiene un techo: las reglas, por finas que sean, no cubren todos los &lt;em&gt;spots&lt;/em&gt; raros. Así que probamos un &lt;strong&gt;motor híbrido&lt;/strong&gt;: la heurística resuelve los spots triviales (la inmensa mayoría) y, en los &lt;strong&gt;spots difíciles&lt;/strong&gt;, le pasa la decisión a un &lt;strong&gt;LLM&lt;/strong&gt; que razona la jugada.&lt;/p&gt;
&lt;p&gt;Usamos &lt;strong&gt;&lt;a href=&quot;https://www.minimax.io&quot;&gt;MiniMax M3&lt;/a&gt;&lt;/strong&gt;, un modelo de razonamiento, con el propio System Prompt del método (las cuatro directivas, traducidas a lenguaje, más un contrato de salida en JSON). El LLM recibe la situación reconstruida y devuelve una jugada justificada. ¿El coste? Unos &lt;strong&gt;27 segundos por decisión&lt;/strong&gt; y un consumo de tokens nada trivial — por eso solo entra en los spots que de verdad lo merecen (&lt;em&gt;gating&lt;/em&gt; por dificultad).&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;&lt;div class=&quot;code-head&quot;&gt;&lt;span class=&quot;label&quot;&gt;python&lt;/span&gt;&lt;button class=&quot;code-copy&quot; type=&quot;button&quot; data-done=&quot;Copiado&quot;&gt;Copiar&lt;/button&gt;&lt;/div&gt;&lt;pre class=&quot;astro-code qa-tokens&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; _is_hard&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt;table&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; dict&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-parameter)&quot;&gt; deadline_s&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; float&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; bool&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    &quot;&quot;&quot;Gate: True =&gt; worth a slow LLM call (~27s).&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; deadline_s &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;            # M3 takes ~27s; don&apos;t risk auto-fold&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    board &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; list&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(table.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;boardCards&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; [])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; board&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;                  # preflop: position ranges suffice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    texture &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; H&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;_texture&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(board)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    strength &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; H&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;_strength&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(hole, board, texture)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;    outs &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; H&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;_adjusted_outs&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;(hole, board, texture)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; strength &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;MMF&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;         # clear value / commit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; strength &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;MM&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; (strength &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;AIR&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;MD&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt; outs &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-foreground)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; True&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;               # thin value / semi-bluff / give-up&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; False&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aquí aparece un tema que se ha vuelto central en todo el ecosistema de IA: los &lt;strong&gt;modelos de razonamiento&lt;/strong&gt;. Un M3 o un &lt;a href=&quot;https://www.deepseek.com&quot;&gt;DeepSeek-R1&lt;/a&gt; &quot;piensan en voz alta&quot; antes de responder, lo que les da una ventaja real en problemas con muchas variables interdependientes — y el póker, en sus spots difíciles, es exactamente eso. Más adelante esto reaparece de forma elegante en nuestro propio &lt;em&gt;coach&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;lo-que-pasó-y-lo-que-no-esperábamos&quot;&gt;Lo que pasó (y lo que no esperábamos)&lt;/h2&gt;
&lt;p&gt;Aquí viene la parte honesta, que es también la más interesante.&lt;/p&gt;
&lt;p&gt;El panel del Eval — ese rival &quot;casi perfecto&quot; — resultó ser &lt;strong&gt;cinco clones idénticos de un bot DeepCFR&lt;/strong&gt;: un TAG equilibrado (VPIP ~21.7, PFR ~16.4, factor de agresión ~1.95), sin fugas evidentes. Lo más parecido al GTO que íbamos a poder medir.&lt;/p&gt;
&lt;p&gt;Medimos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;System 7 heurístico (node-locking puro): −9.75 bb/100.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Híbrido con M3 (razonando los spots difíciles): −1.66 bb/100.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Es decir: nuestra elaboradísima máquina de explotar &lt;strong&gt;perdía&lt;/strong&gt; contra el panel. El LLM la mejoraba (de −9.75 a −1.66 — su razonamiento en spots difíciles ayudaba de verdad), pero &lt;strong&gt;ninguno de los dos batía al rival&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;La lección, en una frase: &lt;strong&gt;no puedes sobre-explotar a alguien que no tiene fugas.&lt;/strong&gt; Todo el aparato de node-locking — los arquetipos, el Perejil Asesino, las desviaciones finas — solo cobra cuando el rival comete errores &lt;em&gt;sistemáticos&lt;/em&gt;. Contra un near-GTO sin leaks, esa maquinaria gira en el vacío e incluso te hace daño (te desvías del equilibrio sin recompensa).&lt;/p&gt;
&lt;p&gt;Y entonces, el giro. Probamos una estrategia tonta de tan simple: &lt;strong&gt;rangos muy anchos y agresión de robo&lt;/strong&gt; (abrir muchas más manos, robar ciegas sin freno). Contra el &lt;strong&gt;mismo panel&lt;/strong&gt;, esa estrategia &lt;em&gt;wide&lt;/em&gt; puntuó &lt;strong&gt;+119 bb/100&lt;/strong&gt; en las clasificatorias.&lt;/p&gt;
&lt;p&gt;¿Por qué? Porque el panel, pese a ser &quot;GTO&quot;, tenía &lt;strong&gt;una&lt;/strong&gt; propiedad explotable: &lt;strong&gt;foldeaba alrededor del 78% de sus manos preflop&lt;/strong&gt;. Hasta un bot disciplinado es, estructuralmente, demasiado tight. Y eso es una fuga — solo que no del tipo que el HUD detecta mano a mano, sino una &lt;strong&gt;estructural&lt;/strong&gt;, que se castiga con la jugada más vieja del libro: robar.&lt;/p&gt;
&lt;p&gt;Ahí está la ironía bonita del proyecto: &lt;strong&gt;la explotación sí ganó — pero el exploit correcto era el simple y estructural (robar), no la elaborada lectura multi-calle.&lt;/strong&gt; Construimos un microscopio para encontrar fugas sutiles cuando lo que pagaba era un martillo.&lt;/p&gt;
&lt;p&gt;Una nota de humildad estadística obligatoria: &lt;strong&gt;bb/100 sobre 500 manos tiene un intervalo de confianza de ±20&lt;/strong&gt;. Tanto el −9.75 como el +119 son ruidosos en valor absoluto. Lo que sí fue &lt;strong&gt;consistente entre tiradas&lt;/strong&gt; fue la &lt;em&gt;dirección&lt;/em&gt;: contra este panel, anchura ≫ node-locking. Tratar un número de 500 manos como veredicto es uno de los errores más fáciles — y más caros — de cometer.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/equity-curve-comparison.svg&quot; alt=&quot;Eval results comparison&quot; width=&quot;800&quot; height=&quot;400&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;Node-locking -9.75 vs Wide +119 bb/100 (CI +-20)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;CI&lt;/mtext&gt;&lt;mrow&gt;&lt;mn&gt;95&lt;/mn&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;%&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;≈&lt;/mo&gt;&lt;mo&gt;±&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;200&lt;/mn&gt;&lt;msqrt&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;/&lt;/mi&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mrow&gt;&lt;/msqrt&gt;&lt;/mfrac&gt;&lt;mtext&gt; bb/100&lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{CI}_{95\%} \approx \pm \frac{200}{\sqrt{N/100}} \text{ bb/100}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.9024em;vertical-align:-0.2191em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;CI&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.5198em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;95%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2191em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≈&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.4514em;vertical-align:-1.13em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;±&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3214em;&quot;&gt;&lt;span style=&quot;top:-2.175em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord sqrt&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.935em;&quot;&gt;&lt;span class=&quot;svg-align&quot; style=&quot;top:-3.2em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.2em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot; style=&quot;padding-left:1em;&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.109em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;/100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.895em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.2em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hide-tail&quot; style=&quot;min-width:1.02em;height:1.28em;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;400em&quot; height=&quot;1.28em&quot; viewBox=&quot;0 0 400000 1296&quot; preserveAspectRatio=&quot;xMinYMin slice&quot;&gt;&lt;path d=&quot;M263,681c0.7,0,18,39.7,52,119
c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120
c340,-704.7,510.7,-1060.3,512,-1067
l0 -0
c4.7,-7.3,11,-11,19,-11
H40000v40H1012.3
s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232
c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1
s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26
c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z
M1001 80h400000v40h-400000z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.305em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;200&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.13em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt; bb/100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mtext&gt;CI&lt;/mtext&gt;&lt;mrow&gt;&lt;mn&gt;95&lt;/mn&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;%&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;≈&lt;/mo&gt;&lt;mo&gt;±&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;200&lt;/mn&gt;&lt;msqrt&gt;&lt;mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;/&lt;/mi&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;/mrow&gt;&lt;/msqrt&gt;&lt;/mfrac&gt;&lt;mtext&gt; bb/100&lt;/mtext&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\text{CI}_{95\%} \approx \pm \frac{200}{\sqrt{N/100}} \text{ bb/100}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.9024em;vertical-align:-0.2191em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;CI&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.5198em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;95%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2191em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≈&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.4514em;vertical-align:-1.13em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;±&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.3214em;&quot;&gt;&lt;span style=&quot;top:-2.175em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord sqrt&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.935em;&quot;&gt;&lt;span class=&quot;svg-align&quot; style=&quot;top:-3.2em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.2em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot; style=&quot;padding-left:1em;&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.109em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;/100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.895em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.2em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hide-tail&quot; style=&quot;min-width:1.02em;height:1.28em;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;400em&quot; height=&quot;1.28em&quot; viewBox=&quot;0 0 400000 1296&quot; preserveAspectRatio=&quot;xMinYMin slice&quot;&gt;&lt;path d=&quot;M263,681c0.7,0,18,39.7,52,119
c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120
c340,-704.7,510.7,-1060.3,512,-1067
l0 -0
c4.7,-7.3,11,-11,19,-11
H40000v40H1012.3
s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232
c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1
s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26
c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z
M1001 80h400000v40h-400000z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.305em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;200&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.13em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt; bb/100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;¿Y dónde brilla, entonces, toda la maquinaria explotadora? Donde hay fugas de verdad: en el &lt;strong&gt;Playground&lt;/strong&gt; y el &lt;strong&gt;Torneo&lt;/strong&gt;, contra rivales reales que sí pagan de más, foldean de menos y farolean mal. Ahí el HUD y el node-locking dejan de girar en el vacío.&lt;/p&gt;
&lt;h2 id=&quot;del-laboratorio-a-producción-el-tooling&quot;&gt;Del laboratorio a producción: el tooling&lt;/h2&gt;
&lt;p&gt;Un agente no es nada sin la fábrica que lo produce. La mitad del proyecto es un &lt;strong&gt;panel de control&lt;/strong&gt; que organiza todo el ciclo de vida del agente en tres zonas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LAB&lt;/strong&gt; — donde &lt;em&gt;naces&lt;/em&gt; una estrategia: una rejilla 13×13 (las 169 manos del póker) para pintar rangos a mano, elegir motor (heurístico / híbrido), modelo y HUD, y &lt;strong&gt;backtestear&lt;/strong&gt; varios agentes a la vez (con la concurrencia capada para no reventar las APIs ni provocar &lt;em&gt;rate-limits&lt;/em&gt;). El resultado se reporta como bb/100 &lt;strong&gt;agregado por estrategia, con su intervalo de confianza&lt;/strong&gt; — no como un run suelto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;COACH&lt;/strong&gt; — donde el agente &lt;em&gt;aprende&lt;/em&gt;. Un diagnóstico de tu juego frente al óptimo (VPIP, PFR, c-bet… contra las bandas de referencia) &lt;strong&gt;y un coach LLM&lt;/strong&gt; que critica tus manos y propone ajustes concretos. Lo último que añadimos: un coach &lt;strong&gt;mano a mano&lt;/strong&gt; — coges tus 10 manos más y menos rentables, las seleccionas, y un &lt;strong&gt;modelo de razonamiento&lt;/strong&gt; (DeepSeek-R1) te dice de cada una si la jugaste bien o mal y dónde está la fuga. (Curiosidad: el modelo de razonamiento es notablemente más crítico que el normal; donde el modelo estándar aplaude un &lt;em&gt;all-in&lt;/em&gt;, el de razonamiento detecta que ese &lt;em&gt;overbet&lt;/em&gt; espantaba las manos peores y solo cobraba a las mejores.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PRODUCCIÓN&lt;/strong&gt; — donde el agente &lt;em&gt;compite&lt;/em&gt;: despliegue en vivo, curva de equity real frente a la EV teórica, un &lt;strong&gt;reproductor de manos&lt;/strong&gt; para revisar cada jugada, y un &lt;em&gt;tracker&lt;/em&gt; que perfila a los rivales.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Y todo esto cierra un &lt;strong&gt;bucle de auto-mejora&lt;/strong&gt;: propones una versión → la testeas → la comparas contra el control → la despliegas → el coach la critica → repites. Un agente, y un entrenador para ese agente, en el mismo sitio.&lt;/p&gt;
&lt;figure class=&quot;figure&quot;&gt;
  &lt;div class=&quot;figure-plate&quot;&gt;&lt;img src=&quot;https://quantarmy.com/content/images/2026/07/self-improvement-loop.svg&quot; alt=&quot;Self-improvement loop&quot; width=&quot;800&quot; height=&quot;360&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;/div&gt;
  &lt;figcaption&gt;LAB, COACH, PRODUCCION: el bucle de auto-mejora&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;el-salto-al-torneo&quot;&gt;El salto al torneo&lt;/h2&gt;
&lt;p&gt;El cash y el torneo no se juegan igual. En un MTT las ciegas suben y tu stack, medido en ciegas grandes, se encoge — y la estrategia tiene que cambiar con la profundidad. System 7 adapta sus rangos por &lt;strong&gt;tramos de stack&lt;/strong&gt;: profundo (juegas póker normal), medio, corto, y muy corto (&lt;strong&gt;push/fold&lt;/strong&gt;: o vas con todo o te tiras, sin medias tintas). En la mesa final, cuando el torneo se reduce a dos jugadores, el motor detecta el &lt;strong&gt;heads-up dinámicamente&lt;/strong&gt; y cambia a un marco consciente de la posición (el botón juega último postflop, c-betea de rango, barrelea). Queda pendiente lo más fino — el &lt;strong&gt;ICM&lt;/strong&gt; (que el valor de una ficha no es lineal cerca de los premios) — pero la base de torneo está.&lt;/p&gt;
&lt;h2 id=&quot;lo-que-nos-llevamos&quot;&gt;Lo que nos llevamos&lt;/h2&gt;
&lt;p&gt;Más allá del póker, el proyecto deja unas cuantas lecciones que aplican a cualquier agente que tome decisiones bajo incertidumbre:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GTO y explotación no son rivales, son capas.&lt;/strong&gt; El equilibrio es tu suelo; la explotación es tu techo. Pero la explotación solo paga si el de enfrente tiene fugas — y la fuga correcta puede ser la más simple de todas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El LLM brilla como juicio en los spots difíciles, no como controlador total.&lt;/strong&gt; Lo barato y determinista resuelve el 95%; el modelo caro y lento se reserva para el 5% que de verdad lo necesita. Y los modelos de &lt;em&gt;razonamiento&lt;/em&gt; aportan donde hay muchas variables enredadas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medir con honestidad es la mitad del trabajo.&lt;/strong&gt; Un número ruidoso no es un veredicto. Los intervalos de confianza, la dirección frente al valor absoluto, y la disciplina de no auto-engañarse valen más que cualquier truco de estrategia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El meta-juego es construir la fábrica.&lt;/strong&gt; El edge no estuvo en una jugada genial sino en el &lt;em&gt;bucle&lt;/em&gt;: autoría → backtest → comparación → despliegue → coaching → repetir. Un agente es tan bueno como la maquinaria que lo itera.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Eso, al final, es de lo que va QuantArmy: &lt;strong&gt;agentes para decidir bajo incertidumbre.&lt;/strong&gt; El póker resultó ser un campo de pruebas perfecto — acotado, medible y despiadado con el autoengaño. Te enseña rápido que tu modelo mental no es la realidad, y que el rival más duro no se gana con más sofisticación, sino con la idea correcta.&lt;/p&gt;
&lt;h2 id=&quot;recursos-y-enlaces&quot;&gt;Recursos y enlaces&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;💻 &lt;strong&gt;Código (open source)&lt;/strong&gt;: &lt;a href=&quot;https://github.com/quantarmyz/system7-poker-arena&quot;&gt;github.com/quantarmyz/system7-poker-arena&lt;/a&gt; — el motor heurístico, el híbrido con LLM, el dashboard y todo el tooling.&lt;/li&gt;
&lt;li&gt;🃏 &lt;strong&gt;La plataforma&lt;/strong&gt;: &lt;a href=&quot;https://dev.fun&quot;&gt;dev.fun&lt;/a&gt; · el &lt;a href=&quot;https://arena.dev.fun&quot;&gt;Arena de póker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Modelos de razonamiento&lt;/strong&gt;: &lt;a href=&quot;https://www.deepseek.com&quot;&gt;DeepSeek&lt;/a&gt; · &lt;a href=&quot;https://www.minimax.io&quot;&gt;MiniMax&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Parte 2&lt;/strong&gt;: &lt;a href=&quot;https://quantarmy.com/system-7-parte-2-heads-up-supervivencia/&quot;&gt;nos fuimos al heads-up, y el explotador por fin cobró&lt;/a&gt; — el diario continúa.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;El proyecto sigue vivo en el Arena. Si te interesa el cruce de IA, teoría de juegos y decisión bajo incertidumbre, esto no ha hecho más que empezar.&lt;/em&gt;&lt;/p&gt;</content:encoded><enclosure url="https://quantarmy.com/content/images/2026/07/feature-system7-part1.svg" length="0" type="image/svg+xml"/><category>System 7</category><category>dev.fun</category><category>Poker</category><category>AI</category><category>LLM</category><category>GTO</category><category>ia</category><author>Jesus Cuesta</author></item></channel></rss>