docs(dashboard): add how-to-read guide per panel

This commit is contained in:
2026-08-24 09:25:14 +02:00
parent f47925eeb0
commit 08d1c44ca8
2 changed files with 398 additions and 364 deletions
+356 -350
View File
@@ -1,363 +1,369 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1400" height="1720" viewBox="0 0 1400 1720" font-family="sans-serif"> <svg xmlns="http://www.w3.org/2000/svg" width="1400" height="1720" viewBox="0 0 1400 1720" font-family="sans-serif">
<rect width="1400" height="1720" fill="white"/> <rect width="1400" height="1720" fill="white"/>
<text x="700" y="32" text-anchor="middle" font-size="21" font-weight="bold">SAC-LSTM campaign dashboard - live run (current only)</text> <text x="700" y="32" text-anchor="middle" font-size="21" font-weight="bold">SAC-LSTM campaign dashboard - live run (current only)</text>
<text x="700" y="56" text-anchor="middle" font-size="12" fill="#555">generated 2026-08-24 09:22:32 - auto-reloads every 60 s (open this file in Chrome)</text> <text x="700" y="56" text-anchor="middle" font-size="12" fill="#555">generated 2026-08-24 09:24:45 - auto-reloads every 60 s (open this file in Chrome)</text>
<text x="70" y="100" font-size="15" font-weight="bold">Test matches - win % vs opponents</text> <text x="70" y="100" font-size="15" font-weight="bold">Test matches - win % vs opponents</text>
<text x="70" y="115" font-size="11" fill="#555">raw dots = single test matches, thick = rolling-mean-10</text> <text x="70" y="115" font-size="11" fill="#555">raw dots = single test matches, thick = rolling-mean-10</text>
<line x1="70" y1="720.0" x2="697" y2="720.0" stroke="#dddddd"/> <text x="70" y="133" font-size="12" font-style="italic" fill="#555">What: How often the bot wins against each opponent in test battles.</text>
<line x1="70" y1="600.0" x2="697" y2="600.0" stroke="#dddddd"/> <text x="70" y="149" font-size="12" font-style="italic" fill="#555">Axes: X = training progress (match number); Y = win rate, 0-100%.</text>
<line x1="70" y1="480.0" x2="697" y2="480.0" stroke="#dddddd"/> <text x="70" y="165" font-size="12" font-style="italic" fill="#555">Better: higher is better.</text>
<line x1="70" y1="360.0" x2="697" y2="360.0" stroke="#dddddd"/> <line x1="70" y1="784.0" x2="697" y2="784.0" stroke="#dddddd"/>
<line x1="70" y1="240.0" x2="697" y2="240.0" stroke="#dddddd"/> <line x1="70" y1="664.0" x2="697" y2="664.0" stroke="#dddddd"/>
<line x1="70" y1="120.0" x2="697" y2="120.0" stroke="#dddddd"/> <line x1="70" y1="544.0" x2="697" y2="544.0" stroke="#dddddd"/>
<line x1="70" y1="720" x2="697" y2="720" stroke="black"/> <line x1="70" y1="424.0" x2="697" y2="424.0" stroke="#dddddd"/>
<line x1="70" y1="720" x2="70" y2="120" stroke="black"/> <line x1="70" y1="304.0" x2="697" y2="304.0" stroke="#dddddd"/>
<line x1="70.0" y1="720" x2="70.0" y2="724" stroke="black"/> <line x1="70" y1="184.0" x2="697" y2="184.0" stroke="#dddddd"/>
<text x="70.0" y="737" text-anchor="middle" font-size="11">1</text> <line x1="70" y1="784" x2="697" y2="784" stroke="black"/>
<line x1="114.8" y1="720" x2="114.8" y2="724" stroke="black"/> <line x1="70" y1="784" x2="70" y2="184" stroke="black"/>
<text x="114.8" y="737" text-anchor="middle" font-size="11">2</text> <line x1="70.0" y1="784" x2="70.0" y2="788" stroke="black"/>
<line x1="159.6" y1="720" x2="159.6" y2="724" stroke="black"/> <text x="70.0" y="801" text-anchor="middle" font-size="11">1</text>
<text x="159.6" y="737" text-anchor="middle" font-size="11">3</text> <line x1="114.8" y1="784" x2="114.8" y2="788" stroke="black"/>
<line x1="204.4" y1="720" x2="204.4" y2="724" stroke="black"/> <text x="114.8" y="801" text-anchor="middle" font-size="11">2</text>
<text x="204.4" y="737" text-anchor="middle" font-size="11">4</text> <line x1="159.6" y1="784" x2="159.6" y2="788" stroke="black"/>
<line x1="249.1" y1="720" x2="249.1" y2="724" stroke="black"/> <text x="159.6" y="801" text-anchor="middle" font-size="11">3</text>
<text x="249.1" y="737" text-anchor="middle" font-size="11">5</text> <line x1="204.4" y1="784" x2="204.4" y2="788" stroke="black"/>
<line x1="293.9" y1="720" x2="293.9" y2="724" stroke="black"/> <text x="204.4" y="801" text-anchor="middle" font-size="11">4</text>
<text x="293.9" y="737" text-anchor="middle" font-size="11">6</text> <line x1="249.1" y1="784" x2="249.1" y2="788" stroke="black"/>
<line x1="338.7" y1="720" x2="338.7" y2="724" stroke="black"/> <text x="249.1" y="801" text-anchor="middle" font-size="11">5</text>
<text x="338.7" y="737" text-anchor="middle" font-size="11">7</text> <line x1="293.9" y1="784" x2="293.9" y2="788" stroke="black"/>
<line x1="383.5" y1="720" x2="383.5" y2="724" stroke="black"/> <text x="293.9" y="801" text-anchor="middle" font-size="11">6</text>
<text x="383.5" y="737" text-anchor="middle" font-size="11">8</text> <line x1="338.7" y1="784" x2="338.7" y2="788" stroke="black"/>
<line x1="428.3" y1="720" x2="428.3" y2="724" stroke="black"/> <text x="338.7" y="801" text-anchor="middle" font-size="11">7</text>
<text x="428.3" y="737" text-anchor="middle" font-size="11">9</text> <line x1="383.5" y1="784" x2="383.5" y2="788" stroke="black"/>
<line x1="473.1" y1="720" x2="473.1" y2="724" stroke="black"/> <text x="383.5" y="801" text-anchor="middle" font-size="11">8</text>
<text x="473.1" y="737" text-anchor="middle" font-size="11">10</text> <line x1="428.3" y1="784" x2="428.3" y2="788" stroke="black"/>
<line x1="517.9" y1="720" x2="517.9" y2="724" stroke="black"/> <text x="428.3" y="801" text-anchor="middle" font-size="11">9</text>
<text x="517.9" y="737" text-anchor="middle" font-size="11">11</text> <line x1="473.1" y1="784" x2="473.1" y2="788" stroke="black"/>
<line x1="562.6" y1="720" x2="562.6" y2="724" stroke="black"/> <text x="473.1" y="801" text-anchor="middle" font-size="11">10</text>
<text x="562.6" y="737" text-anchor="middle" font-size="11">12</text> <line x1="517.9" y1="784" x2="517.9" y2="788" stroke="black"/>
<line x1="607.4" y1="720" x2="607.4" y2="724" stroke="black"/> <text x="517.9" y="801" text-anchor="middle" font-size="11">11</text>
<text x="607.4" y="737" text-anchor="middle" font-size="11">13</text> <line x1="562.6" y1="784" x2="562.6" y2="788" stroke="black"/>
<line x1="652.2" y1="720" x2="652.2" y2="724" stroke="black"/> <text x="562.6" y="801" text-anchor="middle" font-size="11">12</text>
<text x="652.2" y="737" text-anchor="middle" font-size="11">14</text> <line x1="607.4" y1="784" x2="607.4" y2="788" stroke="black"/>
<line x1="697.0" y1="720" x2="697.0" y2="724" stroke="black"/> <text x="607.4" y="801" text-anchor="middle" font-size="11">13</text>
<text x="697.0" y="737" text-anchor="middle" font-size="11">15</text> <line x1="652.2" y1="784" x2="652.2" y2="788" stroke="black"/>
<line x1="66" y1="720.0" x2="70" y2="720.0" stroke="black"/> <text x="652.2" y="801" text-anchor="middle" font-size="11">14</text>
<text x="63" y="724.0" text-anchor="end" font-size="11">0</text> <line x1="697.0" y1="784" x2="697.0" y2="788" stroke="black"/>
<line x1="66" y1="600.0" x2="70" y2="600.0" stroke="black"/> <text x="697.0" y="801" text-anchor="middle" font-size="11">15</text>
<text x="63" y="604.0" text-anchor="end" font-size="11">20</text> <line x1="66" y1="784.0" x2="70" y2="784.0" stroke="black"/>
<line x1="66" y1="480.0" x2="70" y2="480.0" stroke="black"/> <text x="63" y="788.0" text-anchor="end" font-size="11">0</text>
<text x="63" y="484.0" text-anchor="end" font-size="11">40</text> <line x1="66" y1="664.0" x2="70" y2="664.0" stroke="black"/>
<line x1="66" y1="360.0" x2="70" y2="360.0" stroke="black"/> <text x="63" y="668.0" text-anchor="end" font-size="11">20</text>
<text x="63" y="364.0" text-anchor="end" font-size="11">60</text> <line x1="66" y1="544.0" x2="70" y2="544.0" stroke="black"/>
<line x1="66" y1="240.0" x2="70" y2="240.0" stroke="black"/> <text x="63" y="548.0" text-anchor="end" font-size="11">40</text>
<text x="63" y="244.0" text-anchor="end" font-size="11">80</text> <line x1="66" y1="424.0" x2="70" y2="424.0" stroke="black"/>
<line x1="66" y1="120.0" x2="70" y2="120.0" stroke="black"/> <text x="63" y="428.0" text-anchor="end" font-size="11">60</text>
<text x="63" y="124.0" text-anchor="end" font-size="11">100</text> <line x1="66" y1="304.0" x2="70" y2="304.0" stroke="black"/>
<text x="383" y="753" text-anchor="middle" font-size="12">test match number (each opponent)</text> <text x="63" y="308.0" text-anchor="end" font-size="11">80</text>
<text x="16" y="420" text-anchor="middle" font-size="12" transform="rotate(-90 16 420)">win rate (%)</text> <line x1="66" y1="184.0" x2="70" y2="184.0" stroke="black"/>
<circle cx="70.0" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <text x="63" y="188.0" text-anchor="end" font-size="11">100</text>
<circle cx="114.8" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <text x="383" y="817" text-anchor="middle" font-size="12">test match number (each opponent)</text>
<circle cx="159.6" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <text x="16" y="484" text-anchor="middle" font-size="12" transform="rotate(-90 16 484)">win rate (%)</text>
<circle cx="204.4" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="70.0" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="249.1" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="114.8" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="293.9" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="159.6" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="338.7" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="204.4" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="383.5" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="249.1" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="428.3" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="293.9" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="473.1" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="338.7" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="517.9" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="383.5" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="562.6" cy="660.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="428.3" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="607.4" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="473.1" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="652.2" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="517.9" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="697.0" cy="720.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="562.6" cy="724.0" r="2" fill="#d62728" opacity="0.25"/>
<polyline points="70.0,720.0 114.8,720.0 159.6,720.0 204.4,720.0 249.1,720.0 293.9,720.0 338.7,720.0 383.5,720.0 428.3,720.0 473.1,720.0 517.9,720.0 562.6,714.0 607.4,714.0 652.2,714.0 697.0,714.0" fill="none" stroke="#d62728" stroke-width="3.5" opacity="1.0"/> <circle cx="607.4" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="70.0" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="652.2" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="114.8" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="697.0" cy="784.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="159.6" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <polyline points="70.0,784.0 114.8,784.0 159.6,784.0 204.4,784.0 249.1,784.0 293.9,784.0 338.7,784.0 383.5,784.0 428.3,784.0 473.1,784.0 517.9,784.0 562.6,778.0 607.4,778.0 652.2,778.0 697.0,778.0" fill="none" stroke="#d62728" stroke-width="3.5" opacity="1.0"/>
<circle cx="204.4" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="70.0" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="249.1" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="114.8" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="293.9" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="159.6" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="338.7" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="204.4" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="383.5" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="249.1" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="428.3" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="293.9" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="473.1" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="338.7" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="517.9" cy="720.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="383.5" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="562.6" cy="480.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="428.3" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="607.4" cy="240.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="473.1" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="652.2" cy="660.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="517.9" cy="784.0" r="2" fill="#1f77b4" opacity="0.25"/>
<polyline points="70.0,720.0 114.8,720.0 159.6,720.0 204.4,720.0 249.1,720.0 293.9,720.0 338.7,720.0 383.5,720.0 428.3,720.0 473.1,720.0 517.9,720.0 562.6,696.0 607.4,648.0 652.2,642.0" fill="none" stroke="#1f77b4" stroke-width="3.5" opacity="1.0"/> <circle cx="562.6" cy="544.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="70.0" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="607.4" cy="304.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="114.8" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="652.2" cy="724.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="159.6" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="697.0" cy="364.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="204.4" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <polyline points="70.0,784.0 114.8,784.0 159.6,784.0 204.4,784.0 249.1,784.0 293.9,784.0 338.7,784.0 383.5,784.0 428.3,784.0 473.1,784.0 517.9,784.0 562.6,760.0 607.4,712.0 652.2,706.0 697.0,664.0" fill="none" stroke="#1f77b4" stroke-width="3.5" opacity="1.0"/>
<circle cx="249.1" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="70.0" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="293.9" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="114.8" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="338.7" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="159.6" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="383.5" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="204.4" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="428.3" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="249.1" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="473.1" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="293.9" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="517.9" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="338.7" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="562.6" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="383.5" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="607.4" cy="720.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="428.3" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="652.2" cy="660.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="473.1" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<polyline points="70.0,720.0 114.8,720.0 159.6,720.0 204.4,720.0 249.1,720.0 293.9,720.0 338.7,720.0 383.5,720.0 428.3,720.0 473.1,720.0 517.9,720.0 562.6,720.0 607.4,720.0 652.2,714.0" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/> <circle cx="517.9" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<line x1="82" y1="772" x2="110" y2="772" stroke="#d62728" stroke-width="3"/> <circle cx="562.6" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<text x="116" y="776" font-size="12">Corners - 15 evals</text> <circle cx="607.4" cy="784.0" r="2" fill="#2ca02c" opacity="0.25"/>
<line x1="82" y1="790" x2="110" y2="790" stroke="#1f77b4" stroke-width="3"/> <circle cx="652.2" cy="724.0" r="2" fill="#2ca02c" opacity="0.25"/>
<text x="116" y="794" font-size="12">Crazy - 14 evals</text> <circle cx="697.0" cy="544.0" r="2" fill="#2ca02c" opacity="0.25"/>
<line x1="82" y1="808" x2="110" y2="808" stroke="#2ca02c" stroke-width="3"/> <polyline points="70.0,784.0 114.8,784.0 159.6,784.0 204.4,784.0 249.1,784.0 293.9,784.0 338.7,784.0 383.5,784.0 428.3,784.0 473.1,784.0 517.9,784.0 562.6,784.0 607.4,784.0 652.2,778.0 697.0,754.0" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/>
<text x="116" y="812" font-size="12">Target - 14 evals</text> <line x1="82" y1="836" x2="110" y2="836" stroke="#d62728" stroke-width="3"/>
<text x="116" y="840" font-size="12">Corners - 15 evals</text>
<line x1="82" y1="854" x2="110" y2="854" stroke="#1f77b4" stroke-width="3"/>
<text x="116" y="858" font-size="12">Crazy - 15 evals</text>
<line x1="82" y1="872" x2="110" y2="872" stroke="#2ca02c" stroke-width="3"/>
<text x="116" y="876" font-size="12">Target - 15 evals</text>
<text x="747" y="100" font-size="15" font-weight="bold">Training losses (log) &amp; alpha (linear)</text> <text x="747" y="100" font-size="15" font-weight="bold">Training losses (log) &amp; alpha (linear)</text>
<text x="747" y="115" font-size="11" fill="#555">training_metrics.jsonl - big early spikes are normal</text> <text x="747" y="115" font-size="11" fill="#555">training_metrics.jsonl - big early spikes are normal</text>
<line x1="747" y1="720.0" x2="1329" y2="720.0" stroke="#dddddd"/> <text x="747" y="133" font-size="12" font-style="italic" fill="#555">What: How well the brain is learning: losses should fall; alpha sets explore/exploit.</text>
<line x1="747" y1="570.0" x2="1329" y2="570.0" stroke="#dddddd"/> <text x="747" y="149" font-size="12" font-style="italic" fill="#555">Axes: X = training progress; left Y (log) = losses; right Y (linear) = alpha.</text>
<line x1="747" y1="420.0" x2="1329" y2="420.0" stroke="#dddddd"/> <text x="747" y="165" font-size="12" font-style="italic" fill="#555">Better: lower losses = better; alpha falls over time as the bot gets confident.</text>
<line x1="747" y1="270.0" x2="1329" y2="270.0" stroke="#dddddd"/> <line x1="747" y1="784.0" x2="1329" y2="784.0" stroke="#dddddd"/>
<line x1="747" y1="120.0" x2="1329" y2="120.0" stroke="#dddddd"/> <line x1="747" y1="634.0" x2="1329" y2="634.0" stroke="#dddddd"/>
<line x1="747" y1="720" x2="1329" y2="720" stroke="black"/> <line x1="747" y1="484.0" x2="1329" y2="484.0" stroke="#dddddd"/>
<line x1="747" y1="720" x2="747" y2="120" stroke="black"/> <line x1="747" y1="334.0" x2="1329" y2="334.0" stroke="#dddddd"/>
<line x1="747.0" y1="720" x2="747.0" y2="724" stroke="black"/> <line x1="747" y1="184.0" x2="1329" y2="184.0" stroke="#dddddd"/>
<text x="747.0" y="737" text-anchor="middle" font-size="11">1</text> <line x1="747" y1="784" x2="1329" y2="784" stroke="black"/>
<line x1="892.5" y1="720" x2="892.5" y2="724" stroke="black"/> <line x1="747" y1="784" x2="747" y2="184" stroke="black"/>
<text x="892.5" y="737" text-anchor="middle" font-size="11">8</text> <line x1="747.0" y1="784" x2="747.0" y2="788" stroke="black"/>
<line x1="1038.0" y1="720" x2="1038.0" y2="724" stroke="black"/> <text x="747.0" y="801" text-anchor="middle" font-size="11">1</text>
<text x="1038.0" y="737" text-anchor="middle" font-size="11">16</text> <line x1="892.5" y1="784" x2="892.5" y2="788" stroke="black"/>
<line x1="1183.5" y1="720" x2="1183.5" y2="724" stroke="black"/> <text x="892.5" y="801" text-anchor="middle" font-size="11">9</text>
<text x="1183.5" y="737" text-anchor="middle" font-size="11">23</text> <line x1="1038.0" y1="784" x2="1038.0" y2="788" stroke="black"/>
<line x1="1329.0" y1="720" x2="1329.0" y2="724" stroke="black"/> <text x="1038.0" y="801" text-anchor="middle" font-size="11">16</text>
<text x="1329.0" y="737" text-anchor="middle" font-size="11">30</text> <line x1="1183.5" y1="784" x2="1183.5" y2="788" stroke="black"/>
<line x1="743" y1="720.0" x2="747" y2="720.0" stroke="black"/> <text x="1183.5" y="801" text-anchor="middle" font-size="11">24</text>
<text x="740" y="724.0" text-anchor="end" font-size="11">0.01</text> <line x1="1329.0" y1="784" x2="1329.0" y2="788" stroke="black"/>
<line x1="743" y1="570.0" x2="747" y2="570.0" stroke="black"/> <text x="1329.0" y="801" text-anchor="middle" font-size="11">32</text>
<text x="740" y="574.0" text-anchor="end" font-size="11">0.1</text> <line x1="743" y1="784.0" x2="747" y2="784.0" stroke="black"/>
<line x1="743" y1="420.0" x2="747" y2="420.0" stroke="black"/> <text x="740" y="788.0" text-anchor="end" font-size="11">0.01</text>
<text x="740" y="424.0" text-anchor="end" font-size="11">1</text> <line x1="743" y1="634.0" x2="747" y2="634.0" stroke="black"/>
<line x1="743" y1="270.0" x2="747" y2="270.0" stroke="black"/> <text x="740" y="638.0" text-anchor="end" font-size="11">0.1</text>
<text x="740" y="274.0" text-anchor="end" font-size="11">10</text> <line x1="743" y1="484.0" x2="747" y2="484.0" stroke="black"/>
<line x1="743" y1="120.0" x2="747" y2="120.0" stroke="black"/> <text x="740" y="488.0" text-anchor="end" font-size="11">1</text>
<text x="740" y="124.0" text-anchor="end" font-size="11">100</text> <line x1="743" y1="334.0" x2="747" y2="334.0" stroke="black"/>
<text x="1038" y="753" text-anchor="middle" font-size="12">metric line number</text> <text x="740" y="338.0" text-anchor="end" font-size="11">10</text>
<text x="16" y="420" text-anchor="middle" font-size="12" transform="rotate(-90 16 420)">loss (log)</text> <line x1="743" y1="184.0" x2="747" y2="184.0" stroke="black"/>
<polyline points="747.0,281.9 767.1,253.6 787.1,243.9 807.2,213.5 827.3,207.6 847.3,386.8 867.4,424.4 887.5,307.1 907.6,293.6 927.6,282.6 947.7,242.7 967.8,171.4 987.8,158.6 1007.9,169.7 1028.0,191.2 1048.0,253.6 1068.1,327.8 1088.2,625.2 1108.2,506.4 1128.3,374.2 1148.4,425.9 1168.4,351.1 1188.5,357.9 1208.6,330.0 1228.7,251.4 1248.7,339.4 1268.8,331.4 1288.9,283.3 1308.9,320.4 1329.0,339.4" fill="none" stroke="#1f77b4" stroke-width="1.8" opacity="1.0"/> <text x="740" y="188.0" text-anchor="end" font-size="11">100</text>
<polyline points="747.0,348.9 767.1,307.9 787.1,284.5 807.2,261.3 827.3,244.2 847.3,235.2 867.4,236.5 887.5,241.4 907.6,270.7 927.6,292.4 947.7,378.9 967.8,302.9 987.8,277.7 1007.9,264.4 1028.0,254.8 1048.0,246.5 1068.1,242.0 1088.2,251.8 1108.2,262.0 1128.3,273.4 1148.4,295.3 1168.4,327.5 1188.5,335.9 1208.6,438.0 1228.7,400.5 1248.7,500.9 1268.8,390.5 1288.9,329.2 1308.9,316.2 1329.0,311.3" fill="none" stroke="#ff7f0e" stroke-width="1.8" opacity="1.0"/> <text x="1038" y="817" text-anchor="middle" font-size="12">metric line number</text>
<line x1="747" y1="720.0" x2="1329" y2="720.0" stroke="#e9dcf5"/> <text x="16" y="484" text-anchor="middle" font-size="12" transform="rotate(-90 16 484)">loss (log)</text>
<line x1="747" y1="570.0" x2="1329" y2="570.0" stroke="#e9dcf5"/> <polyline points="747.0,345.9 765.8,317.6 784.5,307.9 803.3,277.5 822.1,271.6 840.9,450.8 859.6,488.4 878.4,371.1 897.2,357.6 916.0,346.6 934.7,306.7 953.5,235.4 972.3,222.6 991.1,233.7 1009.8,255.2 1028.6,317.6 1047.4,391.8 1066.2,689.2 1084.9,570.4 1103.7,438.2 1122.5,489.9 1141.3,415.1 1160.0,421.9 1178.8,394.0 1197.6,315.4 1216.4,403.4 1235.1,395.4 1253.9,347.3 1272.7,384.4 1291.5,403.4 1310.2,359.6 1329.0,281.5" fill="none" stroke="#1f77b4" stroke-width="1.8" opacity="1.0"/>
<line x1="747" y1="420.0" x2="1329" y2="420.0" stroke="#e9dcf5"/> <polyline points="747.0,412.9 765.8,371.9 784.5,348.5 803.3,325.3 822.1,308.2 840.9,299.2 859.6,300.5 878.4,305.4 897.2,334.7 916.0,356.4 934.7,442.9 953.5,366.9 972.3,341.7 991.1,328.4 1009.8,318.8 1028.6,310.5 1047.4,306.0 1066.2,315.8 1084.9,326.0 1103.7,337.4 1122.5,359.3 1141.3,391.5 1160.0,399.9 1178.8,502.0 1197.6,464.5 1216.4,564.9 1235.1,454.5 1253.9,393.2 1272.7,380.2 1291.5,375.3 1310.2,353.3 1329.0,352.2" fill="none" stroke="#ff7f0e" stroke-width="1.8" opacity="1.0"/>
<line x1="747" y1="270.0" x2="1329" y2="270.0" stroke="#e9dcf5"/> <line x1="747" y1="784.0" x2="1329" y2="784.0" stroke="#e9dcf5"/>
<line x1="747" y1="120.0" x2="1329" y2="120.0" stroke="#e9dcf5"/> <line x1="747" y1="634.0" x2="1329" y2="634.0" stroke="#e9dcf5"/>
<line x1="1329" y1="720" x2="1329" y2="120" stroke="#9467bd"/> <line x1="747" y1="484.0" x2="1329" y2="484.0" stroke="#e9dcf5"/>
<line x1="1329" y1="720.0" x2="1333" y2="720.0" stroke="#9467bd"/> <line x1="747" y1="334.0" x2="1329" y2="334.0" stroke="#e9dcf5"/>
<text x="1336" y="724.0" font-size="11" fill="#9467bd">0</text> <line x1="747" y1="184.0" x2="1329" y2="184.0" stroke="#e9dcf5"/>
<line x1="1329" y1="570.0" x2="1333" y2="570.0" stroke="#9467bd"/> <line x1="1329" y1="784" x2="1329" y2="184" stroke="#9467bd"/>
<text x="1336" y="574.0" font-size="11" fill="#9467bd">0.25</text> <line x1="1329" y1="784.0" x2="1333" y2="784.0" stroke="#9467bd"/>
<line x1="1329" y1="420.0" x2="1333" y2="420.0" stroke="#9467bd"/> <text x="1336" y="788.0" font-size="11" fill="#9467bd">0</text>
<text x="1336" y="424.0" font-size="11" fill="#9467bd">0.5</text> <line x1="1329" y1="634.0" x2="1333" y2="634.0" stroke="#9467bd"/>
<line x1="1329" y1="270.0" x2="1333" y2="270.0" stroke="#9467bd"/> <text x="1336" y="638.0" font-size="11" fill="#9467bd">0.25</text>
<text x="1336" y="274.0" font-size="11" fill="#9467bd">0.75</text> <line x1="1329" y1="484.0" x2="1333" y2="484.0" stroke="#9467bd"/>
<line x1="1329" y1="120.0" x2="1333" y2="120.0" stroke="#9467bd"/> <text x="1336" y="488.0" font-size="11" fill="#9467bd">0.5</text>
<text x="1336" y="124.0" font-size="11" fill="#9467bd">1</text> <line x1="1329" y1="334.0" x2="1333" y2="334.0" stroke="#9467bd"/>
<text x="1346" y="420" text-anchor="middle" font-size="12" fill="#9467bd" transform="rotate(90 1346 420)">alpha</text> <text x="1336" y="338.0" font-size="11" fill="#9467bd">0.75</text>
<polyline points="747.0,120.2 767.1,120.9 787.1,121.6 807.2,122.3 827.3,123.1 847.3,123.8 867.4,124.1 887.5,124.5 907.6,125.2 927.6,125.6 947.7,126.3 967.8,126.9 987.8,126.1 1007.9,125.4 1028.0,124.7 1048.0,124.0 1068.1,123.3 1088.2,122.6 1108.2,121.9 1128.3,121.2 1148.4,121.7 1168.4,122.4 1188.5,123.2 1208.6,123.9 1228.7,124.6 1248.7,126.0 1268.8,126.7 1288.9,127.4 1308.9,128.1 1329.0,128.5" fill="none" stroke="#9467bd" stroke-width="1.8" opacity="1.0"/> <line x1="1329" y1="184.0" x2="1333" y2="184.0" stroke="#9467bd"/>
<line x1="759" y1="772" x2="787" y2="772" stroke="#1f77b4" stroke-width="3"/> <text x="1336" y="188.0" font-size="11" fill="#9467bd">1</text>
<text x="793" y="776" font-size="12">critic_loss</text> <text x="1346" y="484" text-anchor="middle" font-size="12" fill="#9467bd" transform="rotate(90 1346 484)">alpha</text>
<line x1="759" y1="790" x2="787" y2="790" stroke="#ff7f0e" stroke-width="3"/> <polyline points="747.0,184.2 765.8,184.9 784.5,185.6 803.3,186.3 822.1,187.1 840.9,187.8 859.6,188.1 878.4,188.5 897.2,189.2 916.0,189.6 934.7,190.3 953.5,190.9 972.3,190.1 991.1,189.4 1009.8,188.7 1028.6,188.0 1047.4,187.3 1066.2,186.6 1084.9,185.9 1103.7,185.2 1122.5,185.7 1141.3,186.4 1160.0,187.2 1178.8,187.9 1197.6,188.6 1216.4,190.0 1235.1,190.7 1253.9,191.4 1272.7,192.1 1291.5,192.5 1310.2,192.4 1329.0,192.1" fill="none" stroke="#9467bd" stroke-width="1.8" opacity="1.0"/>
<text x="793" y="794" font-size="12">|actor_loss|</text> <line x1="759" y1="836" x2="787" y2="836" stroke="#1f77b4" stroke-width="3"/>
<line x1="759" y1="808" x2="787" y2="808" stroke="#9467bd" stroke-width="3"/> <text x="793" y="840" font-size="12">critic_loss</text>
<text x="793" y="812" font-size="12">alpha</text> <line x1="759" y1="854" x2="787" y2="854" stroke="#ff7f0e" stroke-width="3"/>
<text x="793" y="858" font-size="12">|actor_loss|</text>
<line x1="759" y1="872" x2="787" y2="872" stroke="#9467bd" stroke-width="3"/>
<text x="793" y="876" font-size="12">alpha</text>
<text x="70" y="940" font-size="15" font-weight="bold">Throughput - games per hour</text> <text x="70" y="940" font-size="15" font-weight="bold">Throughput - games per hour</text>
<text x="70" y="955" font-size="11" fill="#555">method: training_metrics.jsonl 'epoch' deltas; 1 row = one 10-game chunk</text> <text x="70" y="955" font-size="11" fill="#555">method: training_metrics.jsonl 'epoch' deltas; 1 row = one 10-game chunk</text>
<line x1="70" y1="1428.0" x2="697" y2="1428.0" stroke="#dddddd"/> <text x="70" y="973" font-size="12" font-style="italic" fill="#555">What: How many games per hour the bot trains (its learning speed).</text>
<line x1="70" y1="1310.5" x2="697" y2="1310.5" stroke="#dddddd"/> <text x="70" y="989" font-size="12" font-style="italic" fill="#555">Axes: X = training progress (10-game chunks); Y = games per hour.</text>
<line x1="70" y1="1193.0" x2="697" y2="1193.0" stroke="#dddddd"/> <text x="70" y="1005" font-size="12" font-style="italic" fill="#555">Better: higher = faster learning; a steady line beats a spiky one.</text>
<line x1="70" y1="1075.5" x2="697" y2="1075.5" stroke="#dddddd"/> <line x1="70" y1="1494.0" x2="697" y2="1494.0" stroke="#dddddd"/>
<line x1="70" y1="958.0" x2="697" y2="958.0" stroke="#dddddd"/> <line x1="70" y1="1376.5" x2="697" y2="1376.5" stroke="#dddddd"/>
<line x1="70" y1="1428" x2="697" y2="1428" stroke="black"/> <line x1="70" y1="1259.0" x2="697" y2="1259.0" stroke="#dddddd"/>
<line x1="70" y1="1428" x2="70" y2="958" stroke="black"/> <line x1="70" y1="1141.5" x2="697" y2="1141.5" stroke="#dddddd"/>
<line x1="92.4" y1="1428" x2="92.4" y2="1432" stroke="black"/> <line x1="70" y1="1024.0" x2="697" y2="1024.0" stroke="#dddddd"/>
<text x="92.4" y="1445" text-anchor="middle" font-size="11">2</text> <line x1="70" y1="1494" x2="697" y2="1494" stroke="black"/>
<line x1="137.2" y1="1428" x2="137.2" y2="1432" stroke="black"/> <line x1="70" y1="1494" x2="70" y2="1024" stroke="black"/>
<text x="137.2" y="1445" text-anchor="middle" font-size="11">4</text> <line x1="111.8" y1="1494" x2="111.8" y2="1498" stroke="black"/>
<line x1="182.0" y1="1428" x2="182.0" y2="1432" stroke="black"/> <text x="111.8" y="1511" text-anchor="middle" font-size="11">3</text>
<text x="182.0" y="1445" text-anchor="middle" font-size="11">6</text> <line x1="174.5" y1="1494" x2="174.5" y2="1498" stroke="black"/>
<line x1="226.8" y1="1428" x2="226.8" y2="1432" stroke="black"/> <text x="174.5" y="1511" text-anchor="middle" font-size="11">6</text>
<text x="226.8" y="1445" text-anchor="middle" font-size="11">8</text> <line x1="237.2" y1="1494" x2="237.2" y2="1498" stroke="black"/>
<line x1="271.5" y1="1428" x2="271.5" y2="1432" stroke="black"/> <text x="237.2" y="1511" text-anchor="middle" font-size="11">9</text>
<text x="271.5" y="1445" text-anchor="middle" font-size="11">10</text> <line x1="299.9" y1="1494" x2="299.9" y2="1498" stroke="black"/>
<line x1="316.3" y1="1428" x2="316.3" y2="1432" stroke="black"/> <text x="299.9" y="1511" text-anchor="middle" font-size="11">12</text>
<text x="316.3" y="1445" text-anchor="middle" font-size="11">12</text> <line x1="362.6" y1="1494" x2="362.6" y2="1498" stroke="black"/>
<line x1="361.1" y1="1428" x2="361.1" y2="1432" stroke="black"/> <text x="362.6" y="1511" text-anchor="middle" font-size="11">15</text>
<text x="361.1" y="1445" text-anchor="middle" font-size="11">14</text> <line x1="425.3" y1="1494" x2="425.3" y2="1498" stroke="black"/>
<line x1="405.9" y1="1428" x2="405.9" y2="1432" stroke="black"/> <text x="425.3" y="1511" text-anchor="middle" font-size="11">18</text>
<text x="405.9" y="1445" text-anchor="middle" font-size="11">16</text> <line x1="488.0" y1="1494" x2="488.0" y2="1498" stroke="black"/>
<line x1="450.7" y1="1428" x2="450.7" y2="1432" stroke="black"/> <text x="488.0" y="1511" text-anchor="middle" font-size="11">21</text>
<text x="450.7" y="1445" text-anchor="middle" font-size="11">18</text> <line x1="550.7" y1="1494" x2="550.7" y2="1498" stroke="black"/>
<line x1="495.5" y1="1428" x2="495.5" y2="1432" stroke="black"/> <text x="550.7" y="1511" text-anchor="middle" font-size="11">24</text>
<text x="495.5" y="1445" text-anchor="middle" font-size="11">20</text> <line x1="613.4" y1="1494" x2="613.4" y2="1498" stroke="black"/>
<line x1="540.2" y1="1428" x2="540.2" y2="1432" stroke="black"/> <text x="613.4" y="1511" text-anchor="middle" font-size="11">27</text>
<text x="540.2" y="1445" text-anchor="middle" font-size="11">22</text> <line x1="676.1" y1="1494" x2="676.1" y2="1498" stroke="black"/>
<line x1="585.0" y1="1428" x2="585.0" y2="1432" stroke="black"/> <text x="676.1" y="1511" text-anchor="middle" font-size="11">30</text>
<text x="585.0" y="1445" text-anchor="middle" font-size="11">24</text> <line x1="66" y1="1494.0" x2="70" y2="1494.0" stroke="black"/>
<line x1="629.8" y1="1428" x2="629.8" y2="1432" stroke="black"/> <text x="63" y="1498.0" text-anchor="end" font-size="11">0</text>
<text x="629.8" y="1445" text-anchor="middle" font-size="11">26</text> <line x1="66" y1="1376.5" x2="70" y2="1376.5" stroke="black"/>
<line x1="674.6" y1="1428" x2="674.6" y2="1432" stroke="black"/> <text x="63" y="1380.5" text-anchor="end" font-size="11">1653</text>
<text x="674.6" y="1445" text-anchor="middle" font-size="11">28</text> <line x1="66" y1="1259.0" x2="70" y2="1259.0" stroke="black"/>
<line x1="66" y1="1428.0" x2="70" y2="1428.0" stroke="black"/> <text x="63" y="1263.0" text-anchor="end" font-size="11">3305</text>
<text x="63" y="1432.0" text-anchor="end" font-size="11">0</text> <line x1="66" y1="1141.5" x2="70" y2="1141.5" stroke="black"/>
<line x1="66" y1="1310.5" x2="70" y2="1310.5" stroke="black"/> <text x="63" y="1145.5" text-anchor="end" font-size="11">4958</text>
<text x="63" y="1314.5" text-anchor="end" font-size="11">1653</text> <line x1="66" y1="1024.0" x2="70" y2="1024.0" stroke="black"/>
<line x1="66" y1="1193.0" x2="70" y2="1193.0" stroke="black"/> <text x="63" y="1028.0" text-anchor="end" font-size="11">6611</text>
<text x="63" y="1197.0" text-anchor="end" font-size="11">3305</text> <text x="383" y="1527" text-anchor="middle" font-size="12">chunk interval (10-game chunks)</text>
<line x1="66" y1="1075.5" x2="70" y2="1075.5" stroke="black"/> <text x="16" y="1259" text-anchor="middle" font-size="12" transform="rotate(-90 16 1259)">games / hour</text>
<text x="63" y="1079.5" text-anchor="end" font-size="11">4958</text> <circle cx="70.0" cy="1225.8" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<line x1="66" y1="958.0" x2="70" y2="958.0" stroke="black"/> <circle cx="90.9" cy="1479.4" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<text x="63" y="962.0" text-anchor="end" font-size="11">6611</text> <circle cx="111.8" cy="1214.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<text x="383" y="1461" text-anchor="middle" font-size="12">chunk interval (10-game chunks)</text> <circle cx="132.7" cy="1470.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<text x="16" y="1193" text-anchor="middle" font-size="12" transform="rotate(-90 16 1193)">games / hour</text> <circle cx="153.6" cy="1219.6" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="70.0" cy="1159.8" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="174.5" cy="1465.6" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="92.4" cy="1413.4" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="195.4" cy="1066.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="114.8" cy="1148.0" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="216.3" cy="1465.5" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="137.2" cy="1404.7" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="237.2" cy="1087.4" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="159.6" cy="1153.6" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="258.1" cy="1460.8" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="182.0" cy="1399.6" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="279.0" cy="1442.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="204.4" cy="1000.7" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="299.9" cy="1460.4" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="226.8" cy="1399.5" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="320.8" cy="1196.1" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="249.1" cy="1021.4" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="341.7" cy="1465.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="271.5" cy="1394.8" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="362.6" cy="1242.5" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="293.9" cy="1376.2" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="383.5" cy="1468.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="316.3" cy="1394.4" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="404.4" cy="1224.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="338.7" cy="1130.1" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="425.3" cy="1466.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="361.1" cy="1399.7" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="446.2" cy="1215.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="383.5" cy="1176.5" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="467.1" cy="1466.6" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="405.9" cy="1402.0" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="488.0" cy="1237.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="428.3" cy="1158.0" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="508.9" cy="1471.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="450.7" cy="1400.0" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="529.8" cy="1228.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="473.1" cy="1149.2" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="550.7" cy="1482.5" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="495.5" cy="1400.6" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="571.6" cy="1441.5" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="517.9" cy="1171.7" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="592.5" cy="1481.7" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="540.2" cy="1405.2" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="613.4" cy="1228.0" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="562.6" cy="1162.2" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="634.3" cy="1481.1" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="585.0" cy="1416.5" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="655.2" cy="1141.1" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="607.4" cy="1375.5" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="676.1" cy="1481.6" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="629.8" cy="1415.7" r="1.6" fill="#7f7f7f" opacity="0.25"/> <circle cx="697.0" cy="1141.2" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="652.2" cy="1162.0" r="1.6" fill="#7f7f7f" opacity="0.25"/> <polyline points="70.0,1352.6 90.9,1342.3 132.7,1342.6 153.6,1266.1 195.4,1274.1 237.2,1451.3 258.1,1330.9 299.9,1355.2 320.8,1345.0 362.6,1340.9 383.5,1354.5 425.3,1228.2 446.2,1482.5 488.0,1441.5 508.9,1481.7 550.7,1228.0 592.5,1481.1 613.4,1141.1 655.2,1481.6 676.1,1141.2" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/>
<circle cx="674.6" cy="1415.1" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<circle cx="697.0" cy="1075.1" r="1.6" fill="#7f7f7f" opacity="0.25"/>
<polyline points="70.0,1286.6 92.4,1276.3 137.2,1276.6 159.6,1200.1 204.4,1208.1 226.8,1385.3 249.1,1264.9 293.9,1289.2 316.3,1279.0 361.1,1149.2 383.5,1400.6 428.3,1171.7 450.7,1405.2 495.5,1162.2 517.9,1416.5 540.2,1375.5 585.0,1415.7 607.4,1162.0 652.2,1415.1 674.6,1075.1" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/>
<text x="747" y="940" font-size="15" font-weight="bold">Max score per eval cycle</text> <text x="747" y="940" font-size="15" font-weight="bold">Max score per eval cycle</text>
<text x="747" y="955" font-size="11" fill="#555">campaign_v4_stdout.log - max of the 10 deterministic round scores per eval</text> <text x="747" y="955" font-size="11" fill="#555">campaign_v4_stdout.log - max of the 10 deterministic round scores per eval</text>
<line x1="747" y1="1428.0" x2="1375" y2="1428.0" stroke="#dddddd"/> <text x="747" y="973" font-size="12" font-style="italic" fill="#555">What: Best single-round score the bot managed in each test cycle.</text>
<line x1="747" y1="1310.5" x2="1375" y2="1310.5" stroke="#dddddd"/> <text x="747" y="989" font-size="12" font-style="italic" fill="#555">Axes: X = eval cycle number; Y = best score achieved.</text>
<line x1="747" y1="1193.0" x2="1375" y2="1193.0" stroke="#dddddd"/> <text x="747" y="1005" font-size="12" font-style="italic" fill="#555">Better: higher is better; a rising trend means the bot is improving.</text>
<line x1="747" y1="1075.5" x2="1375" y2="1075.5" stroke="#dddddd"/> <line x1="747" y1="1494.0" x2="1375" y2="1494.0" stroke="#dddddd"/>
<line x1="747" y1="958.0" x2="1375" y2="958.0" stroke="#dddddd"/> <line x1="747" y1="1376.5" x2="1375" y2="1376.5" stroke="#dddddd"/>
<line x1="747" y1="1428" x2="1375" y2="1428" stroke="black"/> <line x1="747" y1="1259.0" x2="1375" y2="1259.0" stroke="#dddddd"/>
<line x1="747" y1="1428" x2="747" y2="958" stroke="black"/> <line x1="747" y1="1141.5" x2="1375" y2="1141.5" stroke="#dddddd"/>
<line x1="747.0" y1="1428" x2="747.0" y2="1432" stroke="black"/> <line x1="747" y1="1024.0" x2="1375" y2="1024.0" stroke="#dddddd"/>
<text x="747.0" y="1445" text-anchor="middle" font-size="11">1</text> <line x1="747" y1="1494" x2="1375" y2="1494" stroke="black"/>
<line x1="791.9" y1="1428" x2="791.9" y2="1432" stroke="black"/> <line x1="747" y1="1494" x2="747" y2="1024" stroke="black"/>
<text x="791.9" y="1445" text-anchor="middle" font-size="11">2</text> <line x1="747.0" y1="1494" x2="747.0" y2="1498" stroke="black"/>
<line x1="836.7" y1="1428" x2="836.7" y2="1432" stroke="black"/> <text x="747.0" y="1511" text-anchor="middle" font-size="11">1</text>
<text x="836.7" y="1445" text-anchor="middle" font-size="11">3</text> <line x1="791.9" y1="1494" x2="791.9" y2="1498" stroke="black"/>
<line x1="881.6" y1="1428" x2="881.6" y2="1432" stroke="black"/> <text x="791.9" y="1511" text-anchor="middle" font-size="11">2</text>
<text x="881.6" y="1445" text-anchor="middle" font-size="11">4</text> <line x1="836.7" y1="1494" x2="836.7" y2="1498" stroke="black"/>
<line x1="926.4" y1="1428" x2="926.4" y2="1432" stroke="black"/> <text x="836.7" y="1511" text-anchor="middle" font-size="11">3</text>
<text x="926.4" y="1445" text-anchor="middle" font-size="11">5</text> <line x1="881.6" y1="1494" x2="881.6" y2="1498" stroke="black"/>
<line x1="971.3" y1="1428" x2="971.3" y2="1432" stroke="black"/> <text x="881.6" y="1511" text-anchor="middle" font-size="11">4</text>
<text x="971.3" y="1445" text-anchor="middle" font-size="11">6</text> <line x1="926.4" y1="1494" x2="926.4" y2="1498" stroke="black"/>
<line x1="1016.1" y1="1428" x2="1016.1" y2="1432" stroke="black"/> <text x="926.4" y="1511" text-anchor="middle" font-size="11">5</text>
<text x="1016.1" y="1445" text-anchor="middle" font-size="11">7</text> <line x1="971.3" y1="1494" x2="971.3" y2="1498" stroke="black"/>
<line x1="1061.0" y1="1428" x2="1061.0" y2="1432" stroke="black"/> <text x="971.3" y="1511" text-anchor="middle" font-size="11">6</text>
<text x="1061.0" y="1445" text-anchor="middle" font-size="11">8</text> <line x1="1016.1" y1="1494" x2="1016.1" y2="1498" stroke="black"/>
<line x1="1105.9" y1="1428" x2="1105.9" y2="1432" stroke="black"/> <text x="1016.1" y="1511" text-anchor="middle" font-size="11">7</text>
<text x="1105.9" y="1445" text-anchor="middle" font-size="11">9</text> <line x1="1061.0" y1="1494" x2="1061.0" y2="1498" stroke="black"/>
<line x1="1150.7" y1="1428" x2="1150.7" y2="1432" stroke="black"/> <text x="1061.0" y="1511" text-anchor="middle" font-size="11">8</text>
<text x="1150.7" y="1445" text-anchor="middle" font-size="11">10</text> <line x1="1105.9" y1="1494" x2="1105.9" y2="1498" stroke="black"/>
<line x1="1195.6" y1="1428" x2="1195.6" y2="1432" stroke="black"/> <text x="1105.9" y="1511" text-anchor="middle" font-size="11">9</text>
<text x="1195.6" y="1445" text-anchor="middle" font-size="11">11</text> <line x1="1150.7" y1="1494" x2="1150.7" y2="1498" stroke="black"/>
<line x1="1240.4" y1="1428" x2="1240.4" y2="1432" stroke="black"/> <text x="1150.7" y="1511" text-anchor="middle" font-size="11">10</text>
<text x="1240.4" y="1445" text-anchor="middle" font-size="11">12</text> <line x1="1195.6" y1="1494" x2="1195.6" y2="1498" stroke="black"/>
<line x1="1285.3" y1="1428" x2="1285.3" y2="1432" stroke="black"/> <text x="1195.6" y="1511" text-anchor="middle" font-size="11">11</text>
<text x="1285.3" y="1445" text-anchor="middle" font-size="11">13</text> <line x1="1240.4" y1="1494" x2="1240.4" y2="1498" stroke="black"/>
<line x1="1330.1" y1="1428" x2="1330.1" y2="1432" stroke="black"/> <text x="1240.4" y="1511" text-anchor="middle" font-size="11">12</text>
<text x="1330.1" y="1445" text-anchor="middle" font-size="11">14</text> <line x1="1285.3" y1="1494" x2="1285.3" y2="1498" stroke="black"/>
<line x1="1375.0" y1="1428" x2="1375.0" y2="1432" stroke="black"/> <text x="1285.3" y="1511" text-anchor="middle" font-size="11">13</text>
<text x="1375.0" y="1445" text-anchor="middle" font-size="11">15</text> <line x1="1330.1" y1="1494" x2="1330.1" y2="1498" stroke="black"/>
<line x1="743" y1="1428.0" x2="747" y2="1428.0" stroke="black"/> <text x="1330.1" y="1511" text-anchor="middle" font-size="11">14</text>
<text x="740" y="1432.0" text-anchor="end" font-size="11">0</text> <line x1="1375.0" y1="1494" x2="1375.0" y2="1498" stroke="black"/>
<line x1="743" y1="1310.5" x2="747" y2="1310.5" stroke="black"/> <text x="1375.0" y="1511" text-anchor="middle" font-size="11">15</text>
<text x="740" y="1314.5" text-anchor="end" font-size="11">52</text> <line x1="743" y1="1494.0" x2="747" y2="1494.0" stroke="black"/>
<line x1="743" y1="1193.0" x2="747" y2="1193.0" stroke="black"/> <text x="740" y="1498.0" text-anchor="end" font-size="11">0</text>
<text x="740" y="1197.0" text-anchor="end" font-size="11">103</text> <line x1="743" y1="1376.5" x2="747" y2="1376.5" stroke="black"/>
<line x1="743" y1="1075.5" x2="747" y2="1075.5" stroke="black"/> <text x="740" y="1380.5" text-anchor="end" font-size="11">52</text>
<text x="740" y="1079.5" text-anchor="end" font-size="11">155</text> <line x1="743" y1="1259.0" x2="747" y2="1259.0" stroke="black"/>
<line x1="743" y1="958.0" x2="747" y2="958.0" stroke="black"/> <text x="740" y="1263.0" text-anchor="end" font-size="11">103</text>
<text x="740" y="962.0" text-anchor="end" font-size="11">207</text> <line x1="743" y1="1141.5" x2="747" y2="1141.5" stroke="black"/>
<text x="1061" y="1461" text-anchor="middle" font-size="12">eval cycle number</text> <text x="740" y="1145.5" text-anchor="end" font-size="11">155</text>
<text x="16" y="1193" text-anchor="middle" font-size="12" transform="rotate(-90 16 1193)">best single-round score</text> <line x1="743" y1="1024.0" x2="747" y2="1024.0" stroke="black"/>
<circle cx="747.0" cy="1259.8" r="2" fill="#d62728" opacity="0.25"/> <text x="740" y="1028.0" text-anchor="end" font-size="11">207</text>
<circle cx="791.9" cy="1200.7" r="2" fill="#d62728" opacity="0.25"/> <text x="1061" y="1527" text-anchor="middle" font-size="12">eval cycle number</text>
<circle cx="836.7" cy="1359.8" r="2" fill="#d62728" opacity="0.25"/> <text x="16" y="1259" text-anchor="middle" font-size="12" transform="rotate(-90 16 1259)">best single-round score</text>
<circle cx="881.6" cy="1396.2" r="2" fill="#d62728" opacity="0.25"/> <circle cx="747.0" cy="1325.8" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="926.4" cy="1398.5" r="2" fill="#d62728" opacity="0.25"/> <circle cx="791.9" cy="1266.7" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="971.3" cy="1357.5" r="2" fill="#d62728" opacity="0.25"/> <circle cx="836.7" cy="1425.8" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1016.1" cy="1391.6" r="2" fill="#d62728" opacity="0.25"/> <circle cx="881.6" cy="1462.2" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1061.0" cy="1357.5" r="2" fill="#d62728" opacity="0.25"/> <circle cx="926.4" cy="1464.5" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1105.9" cy="1391.6" r="2" fill="#d62728" opacity="0.25"/> <circle cx="971.3" cy="1423.5" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1150.7" cy="1378.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="1016.1" cy="1457.6" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1195.6" cy="1362.1" r="2" fill="#d62728" opacity="0.25"/> <circle cx="1061.0" cy="1423.5" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1240.4" cy="1278.0" r="2" fill="#d62728" opacity="0.25"/> <circle cx="1105.9" cy="1457.6" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1285.3" cy="1291.6" r="2" fill="#d62728" opacity="0.25"/> <circle cx="1150.7" cy="1444.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1330.1" cy="1425.7" r="2" fill="#d62728" opacity="0.25"/> <circle cx="1195.6" cy="1428.1" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1375.0" cy="1291.6" r="2" fill="#d62728" opacity="0.25"/> <circle cx="1240.4" cy="1344.0" r="2" fill="#d62728" opacity="0.25"/>
<polyline points="747.0,1259.8 791.9,1200.7 836.7,1359.8 881.6,1396.2 926.4,1398.5 971.3,1357.5 1016.1,1391.6 1061.0,1357.5 1105.9,1391.6 1150.7,1378.0 1195.6,1362.1 1240.4,1278.0 1285.3,1291.6 1330.1,1425.7 1375.0,1291.6" fill="none" stroke="#d62728" stroke-width="2.5" opacity="1.0"/> <circle cx="1285.3" cy="1357.6" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="747.0" cy="1403.0" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="1330.1" cy="1491.7" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="791.9" cy="1407.5" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="1375.0" cy="1357.6" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="836.7" cy="1378.0" r="2" fill="#1f77b4" opacity="0.25"/> <polyline points="747.0,1325.8 791.9,1266.7 836.7,1425.8 881.6,1462.2 926.4,1464.5 971.3,1423.5 1016.1,1457.6 1061.0,1423.5 1105.9,1457.6 1150.7,1444.0 1195.6,1428.1 1240.4,1344.0 1285.3,1357.6 1330.1,1491.7 1375.0,1357.6" fill="none" stroke="#d62728" stroke-width="2.5" opacity="1.0"/>
<circle cx="881.6" cy="1364.4" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="747.0" cy="1469.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="926.4" cy="1373.5" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="791.9" cy="1473.5" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="971.3" cy="1284.8" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="836.7" cy="1444.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1016.1" cy="1330.3" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="881.6" cy="1430.4" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1061.0" cy="1318.9" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="926.4" cy="1439.5" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1105.9" cy="1325.7" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="971.3" cy="1350.8" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1150.7" cy="1155.3" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="1016.1" cy="1396.3" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1195.6" cy="1359.8" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="1061.0" cy="1384.9" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1240.4" cy="1268.9" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="1105.9" cy="1391.7" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1285.3" cy="1271.2" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="1150.7" cy="1221.3" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1330.1" cy="1273.5" r="2" fill="#1f77b4" opacity="0.25"/> <circle cx="1195.6" cy="1425.8" r="2" fill="#1f77b4" opacity="0.25"/>
<polyline points="747.0,1403.0 791.9,1407.5 836.7,1378.0 881.6,1364.4 926.4,1373.5 971.3,1284.8 1016.1,1330.3 1061.0,1318.9 1105.9,1325.7 1150.7,1155.3 1195.6,1359.8 1240.4,1268.9 1285.3,1271.2 1330.1,1273.5" fill="none" stroke="#1f77b4" stroke-width="2.5" opacity="1.0"/> <circle cx="1240.4" cy="1334.9" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="747.0" cy="1218.9" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="1285.3" cy="1337.2" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="791.9" cy="1223.5" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="1330.1" cy="1339.5" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="836.7" cy="1218.9" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="1375.0" cy="1341.7" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="881.6" cy="1348.5" r="2" fill="#2ca02c" opacity="0.25"/> <polyline points="747.0,1469.0 791.9,1473.5 836.7,1444.0 881.6,1430.4 926.4,1439.5 971.3,1350.8 1016.1,1396.3 1061.0,1384.9 1105.9,1391.7 1150.7,1221.3 1195.6,1425.8 1240.4,1334.9 1285.3,1337.2 1330.1,1339.5 1375.0,1341.7" fill="none" stroke="#1f77b4" stroke-width="2.5" opacity="1.0"/>
<circle cx="926.4" cy="1400.7" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="747.0" cy="1284.9" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="971.3" cy="1359.8" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="791.9" cy="1289.5" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1016.1" cy="1000.7" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="836.7" cy="1284.9" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1061.0" cy="1355.3" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="881.6" cy="1414.5" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1105.9" cy="1368.9" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="926.4" cy="1466.7" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1150.7" cy="1278.0" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="971.3" cy="1425.8" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1195.6" cy="1307.5" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="1016.1" cy="1066.7" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1240.4" cy="1309.8" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="1061.0" cy="1421.3" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1285.3" cy="1291.6" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="1105.9" cy="1434.9" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1330.1" cy="1198.5" r="2" fill="#2ca02c" opacity="0.25"/> <circle cx="1150.7" cy="1344.0" r="2" fill="#2ca02c" opacity="0.25"/>
<polyline points="747.0,1218.9 791.9,1223.5 836.7,1218.9 881.6,1348.5 926.4,1400.7 971.3,1359.8 1016.1,1000.7 1061.0,1355.3 1105.9,1368.9 1150.7,1278.0 1195.6,1307.5 1240.4,1309.8 1285.3,1291.6 1330.1,1198.5" fill="none" stroke="#2ca02c" stroke-width="2.5" opacity="1.0"/> <circle cx="1195.6" cy="1373.5" r="2" fill="#2ca02c" opacity="0.25"/>
<polyline points="747.0,1218.9 791.9,1200.7 836.7,1218.9 881.6,1348.5 926.4,1373.5 971.3,1284.8 1016.1,1000.7 1061.0,1318.9 1105.9,1325.7 1150.7,1155.3 1195.6,1307.5 1240.4,1268.9 1285.3,1271.2 1330.1,1198.5 1375.0,1291.6" fill="none" stroke="#555555" stroke-width="2.5" opacity="1.0" stroke-dasharray="6 4"/> <circle cx="1240.4" cy="1375.8" r="2" fill="#2ca02c" opacity="0.25"/>
<line x1="759" y1="1480" x2="787" y2="1480" stroke="#d62728" stroke-width="3"/> <circle cx="1285.3" cy="1357.6" r="2" fill="#2ca02c" opacity="0.25"/>
<text x="793" y="1484" font-size="12">Corners - 15 evals</text> <circle cx="1330.1" cy="1264.5" r="2" fill="#2ca02c" opacity="0.25"/>
<line x1="759" y1="1498" x2="787" y2="1498" stroke="#1f77b4" stroke-width="3"/> <circle cx="1375.0" cy="1357.6" r="2" fill="#2ca02c" opacity="0.25"/>
<text x="793" y="1502" font-size="12">Crazy - 14 evals</text> <polyline points="747.0,1284.9 791.9,1289.5 836.7,1284.9 881.6,1414.5 926.4,1466.7 971.3,1425.8 1016.1,1066.7 1061.0,1421.3 1105.9,1434.9 1150.7,1344.0 1195.6,1373.5 1240.4,1375.8 1285.3,1357.6 1330.1,1264.5 1375.0,1357.6" fill="none" stroke="#2ca02c" stroke-width="2.5" opacity="1.0"/>
<line x1="759" y1="1516" x2="787" y2="1516" stroke="#2ca02c" stroke-width="3"/> <polyline points="747.0,1284.9 791.9,1266.7 836.7,1284.9 881.6,1414.5 926.4,1439.5 971.3,1350.8 1016.1,1066.7 1061.0,1384.9 1105.9,1391.7 1150.7,1221.3 1195.6,1373.5 1240.4,1334.9 1285.3,1337.2 1330.1,1264.5 1375.0,1341.7" fill="none" stroke="#555555" stroke-width="2.5" opacity="1.0" stroke-dasharray="6 4"/>
<text x="793" y="1520" font-size="12">Target - 14 evals</text> <line x1="759" y1="1546" x2="787" y2="1546" stroke="#d62728" stroke-width="3"/>
<line x1="759" y1="1534" x2="787" y2="1534" stroke="#555555" stroke-width="3"/> <text x="793" y="1550" font-size="12">Corners - 15 evals</text>
<text x="793" y="1538" font-size="12">combined max</text> <line x1="759" y1="1564" x2="787" y2="1564" stroke="#1f77b4" stroke-width="3"/>
<rect x="0" y="1540" width="1400" height="180" fill="#f2f2f2"/> <text x="793" y="1568" font-size="12">Crazy - 15 evals</text>
<text x="16" y="1561" font-size="15" font-weight="bold">How to read</text> <line x1="759" y1="1582" x2="787" y2="1582" stroke="#2ca02c" stroke-width="3"/>
<text x="1384" y="1560" text-anchor="end" font-size="11" fill="#666">Regenerate anytime: python3 tools/plot_progress.py</text> <text x="793" y="1586" font-size="12">Target - 15 evals</text>
<text x="16" y="1583" font-size="13">Test matches: dots are single fights, thick line shows trend.</text> <line x1="759" y1="1600" x2="787" y2="1600" stroke="#555555" stroke-width="3"/>
<text x="16" y="1600" font-size="13">Loss spikes are normal early; endless growth is bad.</text> <text x="793" y="1604" font-size="12">combined max</text>
<text x="16" y="1617" font-size="13">Throughput flat is healthy; dips mean something slowed.</text> <rect x="0" y="1640" width="1400" height="80" fill="#f2f2f2"/>
<text x="16" y="1634" font-size="13">Max score: best single-round score the bot managed in that eval cycle.</text> <text x="16" y="1661" font-size="15" font-weight="bold">How to read</text>
<text x="16" y="1651" font-size="13">This file reloads itself in Chrome every sixty seconds.</text> <text x="1384" y="1660" text-anchor="end" font-size="11" fill="#666">Regenerate anytime: python3 tools/plot_progress.py</text>
<text x="16" y="1668" font-size="13">Regenerate anytime with tools/watch_dashboard.sh or the python command.</text> <text x="16" y="1683" font-size="13">This file reloads itself in Chrome every sixty seconds.</text>
<text x="16" y="1700" font-size="13">Regenerate anytime with tools/watch_dashboard.sh or the python command.</text>
<script type="text/javascript"><![CDATA[ setTimeout(function(){ location.reload(); }, 60000); ]]></script> <script type="text/javascript"><![CDATA[ setTimeout(function(){ location.reload(); }, 60000); ]]></script>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 29 KiB

+42 -14
View File
@@ -46,15 +46,17 @@ ALPHA_C = "#9467bd" # alpha line on the losses panel
RELOAD_JS = ('<script type="text/javascript"><![CDATA[ ' RELOAD_JS = ('<script type="text/javascript"><![CDATA[ '
'setTimeout(function(){ location.reload(); }, 60000); ]]></script>') 'setTimeout(function(){ location.reload(); }, 60000); ]]></script>')
W, H = 1400, 1720 W, H = 1400, 1720
TITLE_H, GUIDE_H = 80, 180 TITLE_H, GUIDE_H = 80, 80
# rows: (header_y, panel_top_y, panel_bottom_y, x_left, x_right) # rows: (header_y, panel_top_y, panel_bottom_y, x_left, x_right)
# panel_top sits low enough to leave room under header+sub for the
# per-panel how-to-read guide (3 italic lines, see panel_guide)
C1_L, C1_R = 70, 697 C1_L, C1_R = 70, 697
C2_L, C2_R = 747, 1375 C2_L, C2_R = 747, 1375
ROWS = { ROWS = {
1: (100, 120, 720, C1_L, C1_R), 1: (100, 184, 784, C1_L, C1_R),
2: (100, 120, 720, C2_L, C2_R), 2: (100, 184, 784, C2_L, C2_R),
3: (940, 958, 1428, C1_L, C1_R), 3: (940, 1024, 1494, C1_L, C1_R),
4: (940, 958, 1428, C2_L, C2_R), 4: (940, 1024, 1494, C2_L, C2_R),
} }
PANEL_TITLES = [ PANEL_TITLES = [
"Test matches - win % vs opponents", "Test matches - win % vs opponents",
@@ -62,11 +64,22 @@ PANEL_TITLES = [
"Throughput - games per hour", "Throughput - games per hour",
"Max score per eval cycle", "Max score per eval cycle",
] ]
# per-panel how-to-read notes: (what it shows, axes, which direction is better)
GUIDES = {
1: ("How often the bot wins against each opponent in test battles.",
"X = training progress (match number); Y = win rate, 0-100%.",
"higher is better."),
2: ("How well the brain is learning: losses should fall; alpha sets explore/exploit.",
"X = training progress; left Y (log) = losses; right Y (linear) = alpha.",
"lower losses = better; alpha falls over time as the bot gets confident."),
3: ("How many games per hour the bot trains (its learning speed).",
"X = training progress (10-game chunks); Y = games per hour.",
"higher = faster learning; a steady line beats a spiky one."),
4: ("Best single-round score the bot managed in each test cycle.",
"X = eval cycle number; Y = best score achieved.",
"higher is better; a rising trend means the bot is improving."),
}
GUIDE_LINES = [ GUIDE_LINES = [
"Test matches: dots are single fights, thick line shows trend.",
"Loss spikes are normal early; endless growth is bad.",
"Throughput flat is healthy; dips mean something slowed.",
"Max score: best single-round score the bot managed in that eval cycle.",
"This file reloads itself in Chrome every sixty seconds.", "This file reloads itself in Chrome every sixty seconds.",
"Regenerate anytime with tools/watch_dashboard.sh or the python command.", "Regenerate anytime with tools/watch_dashboard.sh or the python command.",
] ]
@@ -289,6 +302,16 @@ def header(x, y, title, sub=None):
return s return s
def panel_guide(x0, y, guide):
"""Italic how-to-read note between a panel's header and its plot area."""
what, axes, better = guide
s = ""
for i, txt in enumerate((f"What: {what}", f"Axes: {axes}", f"Better: {better}")):
s += (f'<text x="{x0}" y="{y + i * 16}" font-size="12" font-style="italic" '
f'fill="#555">{esc(txt)}</text>\n')
return s
# ---------- panels ---------- # ---------- panels ----------
def panel_test_matches(series, geo): def panel_test_matches(series, geo):
@@ -455,21 +478,22 @@ def build_dashboard(campaign, metrics_f, out):
f'(open this file in Chrome)</text>\n') f'(open this file in Chrome)</text>\n')
drawers = [ drawers = [
(ROWS[1], PANEL_TITLES[0], (ROWS[1], PANEL_TITLES[0], GUIDES[1],
"raw dots = single test matches, thick = rolling-mean-%d" % TREND_WINDOW, "raw dots = single test matches, thick = rolling-mean-%d" % TREND_WINDOW,
lambda: panel_test_matches(series, ROWS[1])), lambda: panel_test_matches(series, ROWS[1])),
(ROWS[2], PANEL_TITLES[1], (ROWS[2], PANEL_TITLES[1], GUIDES[2],
"training_metrics.jsonl - big early spikes are normal", "training_metrics.jsonl - big early spikes are normal",
lambda: panel_losses(rows, ROWS[2])), lambda: panel_losses(rows, ROWS[2])),
(ROWS[3], PANEL_TITLES[2], (ROWS[3], PANEL_TITLES[2], GUIDES[3],
"method: training_metrics.jsonl 'epoch' deltas; 1 row = one 10-game chunk", "method: training_metrics.jsonl 'epoch' deltas; 1 row = one 10-game chunk",
lambda: panel_throughput(rows, ROWS[3])), lambda: panel_throughput(rows, ROWS[3])),
(ROWS[4], PANEL_TITLES[3], (ROWS[4], PANEL_TITLES[3], GUIDES[4],
"campaign_v4_stdout.log - max of the 10 deterministic round scores per eval", "campaign_v4_stdout.log - max of the 10 deterministic round scores per eval",
lambda: panel_max_score(maxes, ROWS[4])), lambda: panel_max_score(maxes, ROWS[4])),
] ]
for geo, title, sub, drawer in drawers: for geo, title, guide, sub, drawer in drawers:
s += header(geo[3], geo[0], title, sub) s += header(geo[3], geo[0], title, sub)
s += panel_guide(geo[3], geo[0] + 33, guide)
s += drawer() or "" # panels bare-return None on their no-data path s += drawer() or "" # panels bare-return None on their no-data path
s += guide_block(W, H, GUIDE_LINES) s += guide_block(W, H, GUIDE_LINES)
@@ -530,6 +554,10 @@ def selftest():
assert text.count(PANEL_TITLES[0]) == 1 assert text.count(PANEL_TITLES[0]) == 1
assert "How to read" in text, "reading guide missing" assert "How to read" in text, "reading guide missing"
assert 'width="1400"' in text and 'height="1720"' in text assert 'width="1400"' in text and 'height="1720"' in text
# every panel carries its own What/Axes/Better how-to-read note
assert text.count("What:") == len(PANEL_TITLES), text.count("What:")
for g in GUIDES.values():
assert esc(g[0]) in text, f"panel guide missing: {g[0]}"
# circles: 4 eval dots (panel 1) + 2 throughput rate dots (panel 3) # circles: 4 eval dots (panel 1) + 2 throughput rate dots (panel 3)
# + 2 cycles x 2 opponents max-score dots (panel 4) # + 2 cycles x 2 opponents max-score dots (panel 4)
assert text.count("<circle") == 10, text.count("<circle") assert text.count("<circle") == 10, text.count("<circle")