{
  "schemaVersion": "ssr-learning-evidence-v1",
  "recordId": "ssr-machine-and-ai-learning-2026-10-30",
  "publishedDate": "2026-10-30",
  "canonicalUrl": "https://simoneresearch.com/evidence/machine-and-ai-learning/",
  "jsonUrl": "https://simoneresearch.com/evidence/learning-evidence-record.json",
  "title": "Machine learning and AI learning: 10 inspectable demonstrations across game theory, control, pixel RL, adversarial evaluation, and closed-loop gating",
  "summary": "I directed the team (AI coding and research agents across two local research workspaces, PTCG-Learning-Lab and agentlearning) to build, verify, and red-team machine learning and AI learning systems from first principles. Every claim below separates training from evaluation in a fresh process, compares learned weights against untrained and reset baselines on held-out seeds, and preserves negative confirmation gates alongside positive proofs.",
  "workspaces": [
    {
      "id": "ptcg-learning-lab",
      "label": "PTCG-Learning-Lab (closed-loop game theory, Atari Pong pixel PPO, weight adaptation, and Pokemon TCG 5,600-game confirmation gate)",
      "dateInspected": "2026-10-30",
      "scope": "Local research workspace with SHA-256 hashed evaluation artifacts, separated trainer/evaluator PIDs, and independent review scripts."
    },
    {
      "id": "agentlearning",
      "label": "agentlearning (10-seed LunarLander PPO, 10M-step Pong sticky-action audit, NES Mario byte-wrap forensics, 68/68 adversarial Fakes Suite, and L01-L27 research ledger)",
      "dateInspected": "2026-10-30",
      "scope": "Local reinforcement-learning and evaluator red-team workspace with fail-closed precheck and 5-version adversarial evaluator evolution."
    }
  ],
  "demonstrations": [
    {
      "number": 1,
      "id": "kuhn-poker-cfr",
      "category": "Imperfect-information game theory (Tabular Counterfactual Regret Minimization)",
      "title": "Kuhn Poker CFR: discovering deception, hero-calling, and slow-playing without human heuristics",
      "status": "Confirmed on exact 64 x 64 pure-strategy best-response evaluation",
      "trainerPid": 78400,
      "evaluatorPid": 77484,
      "runtimeSeconds": 1.172,
      "initialExploitability": 0.45833333333333326,
      "finalExploitability": 0.0009376166469929614,
      "resetExploitability": 0.45833333333333326,
      "relativeReductionPercent": 99.7954,
      "summary": "Starting from a uniform 50/50 policy across all 12 information states, tabular Counterfactual Regret Minimization (CFR) reduces exact best-response exploitability from 0.458333 to 0.000938 (-99.80%) in 1,000 updates (1.172 seconds). Without domain rules, CFR converges to the coupled analytical Nash family parameterized by alpha = 0.1940: bluffing Jack after a pass at 33.30% (exact Nash 1/3), calling with Queen facing a bet at 33.64% (exact Nash 1/3), slow-playing King 41.59% of the time (betting 58.41% vs 3*alpha = 58.20%), and calling with Queen after pass-bet at 53.05% (vs alpha + 1/3 = 52.73%).",
      "sourceArtifacts": [
        "PTCG-Learning-Lab/KUHN-LEARNING-RESULT.md",
        "PTCG-Learning-Lab/checks/kuhn-learning/evaluation.json",
        "PTCG-Learning-Lab/checks/kuhn-learning/policy-0000.json",
        "PTCG-Learning-Lab/checks/kuhn-learning/policy-0010.json",
        "PTCG-Learning-Lab/checks/kuhn-learning/policy-0100.json",
        "PTCG-Learning-Lab/checks/kuhn-learning/policy-1000.json"
      ],
      "stateMeta": [
        {
          "key": "0",
          "player": 1,
          "card": "Jack (0)",
          "history": "Opening action",
          "actionLabels": [
            "Pass",
            "Bet (bluff)"
          ],
          "nashFormula": "P(Bet) = alpha in [0, 1/3]",
          "nashTargetNote": "At 1,000 updates: alpha = 0.1940 (19.40% opening bluff)"
        },
        {
          "key": "0b",
          "player": 2,
          "card": "Jack (0)",
          "history": "Facing P1 bet",
          "actionLabels": [
            "Fold (pass)",
            "Call (bet)"
          ],
          "nashFormula": "P(Call) = 0",
          "nashTargetNote": "Always fold worst card facing a bet (0.05% residual at 1,000 updates)"
        },
        {
          "key": "0p",
          "player": 2,
          "card": "Jack (0)",
          "history": "After P1 pass",
          "actionLabels": [
            "Check behind",
            "Bet (bluff)"
          ],
          "nashFormula": "P(Bet) = 1/3 (33.33%)",
          "nashTargetNote": "Exact Nash bluff frequency 1/3; learned 0.3330 (33.30%)"
        },
        {
          "key": "0pb",
          "player": 1,
          "card": "Jack (0)",
          "history": "Passed, facing P2 bet",
          "actionLabels": [
            "Fold (pass)",
            "Call (bet)"
          ],
          "nashFormula": "P(Call) = 0",
          "nashTargetNote": "Always fold Jack to a bet (0.03% residual at 1,000 updates)"
        },
        {
          "key": "1",
          "player": 1,
          "card": "Queen (1)",
          "history": "Opening action",
          "actionLabels": [
            "Pass (check)",
            "Bet"
          ],
          "nashFormula": "P(Bet) = 0",
          "nashTargetNote": "Check medium strength hand (99.25% check at 1,000 updates)"
        },
        {
          "key": "1b",
          "player": 2,
          "card": "Queen (1)",
          "history": "Facing P1 bet",
          "actionLabels": [
            "Fold (pass)",
            "Call (hero call)"
          ],
          "nashFormula": "P(Call) = 1/3 (33.33%)",
          "nashTargetNote": "Exact Nash indifference call 1/3; learned 0.3364 (33.64%)"
        },
        {
          "key": "1p",
          "player": 2,
          "card": "Queen (1)",
          "history": "After P1 pass",
          "actionLabels": [
            "Check behind",
            "Bet"
          ],
          "nashFormula": "P(Bet) = 0",
          "nashTargetNote": "Check Queen to showdown (99.65% check at 1,000 updates)"
        },
        {
          "key": "1pb",
          "player": 1,
          "card": "Queen (1)",
          "history": "Passed, facing P2 bet",
          "actionLabels": [
            "Fold (pass)",
            "Call (bet)"
          ],
          "nashFormula": "P(Call) = alpha + 1/3",
          "nashTargetNote": "Coupled to P1 Jack bluff: 0.1940 + 0.3333 = 0.5273; learned 0.5305 (53.05%)"
        },
        {
          "key": "2",
          "player": 1,
          "card": "King (2)",
          "history": "Opening action",
          "actionLabels": [
            "Slow-play pass",
            "Value bet"
          ],
          "nashFormula": "P(Bet) = 3 * alpha",
          "nashTargetNote": "Coupled 3-to-1 to P1 Jack bluff: 3 * 0.1940 = 0.5820; learned 0.5841 (58.41%)"
        },
        {
          "key": "2b",
          "player": 2,
          "card": "King (2)",
          "history": "Facing P1 bet",
          "actionLabels": [
            "Fold (pass)",
            "Call (bet)"
          ],
          "nashFormula": "P(Call) = 1 (100%)",
          "nashTargetNote": "Always call with best card (99.95% call at 1,000 updates)"
        },
        {
          "key": "2p",
          "player": 2,
          "card": "King (2)",
          "history": "After P1 pass",
          "actionLabels": [
            "Check behind",
            "Value bet"
          ],
          "nashFormula": "P(Bet) = 1 (100%)",
          "nashTargetNote": "Always bet King when checked to (99.90% bet at 1,000 updates)"
        },
        {
          "key": "2pb",
          "player": 1,
          "card": "King (2)",
          "history": "Slow-played, facing P2 bet",
          "actionLabels": [
            "Fold (pass)",
            "Trap call"
          ],
          "nashFormula": "P(Call) = 1 (100%)",
          "nashTargetNote": "Always call after trapping with King (99.94% call at 1,000 updates)"
        }
      ],
      "checkpoints": [
        {
          "id": "u0",
          "updates": 0,
          "label": "0 updates (uniform initialization)",
          "exploitability": 0.45833333333333326,
          "bestResponseValues": [
            0.5,
            0.4166666666666666
          ],
          "changedRows": 0,
          "rows": {
            "0": [
              0.5,
              0.5
            ],
            "1": [
              0.5,
              0.5
            ],
            "2": [
              0.5,
              0.5
            ],
            "0b": [
              0.5,
              0.5
            ],
            "0p": [
              0.5,
              0.5
            ],
            "0pb": [
              0.5,
              0.5
            ],
            "1b": [
              0.5,
              0.5
            ],
            "1p": [
              0.5,
              0.5
            ],
            "1pb": [
              0.5,
              0.5
            ],
            "2b": [
              0.5,
              0.5
            ],
            "2p": [
              0.5,
              0.5
            ],
            "2pb": [
              0.5,
              0.5
            ]
          }
        },
        {
          "id": "u1",
          "updates": 1,
          "label": "1 update (regret tables seeded)",
          "exploitability": 0.45833333333333326,
          "bestResponseValues": [
            0.5,
            0.4166666666666666
          ],
          "changedRows": 0,
          "rows": {
            "0": [
              0.5,
              0.5
            ],
            "1": [
              0.5,
              0.5
            ],
            "2": [
              0.5,
              0.5
            ],
            "0b": [
              0.5,
              0.5
            ],
            "0p": [
              0.5,
              0.5
            ],
            "0pb": [
              0.5,
              0.5
            ],
            "1b": [
              0.5,
              0.5
            ],
            "1p": [
              0.5,
              0.5
            ],
            "1pb": [
              0.5,
              0.5
            ],
            "2b": [
              0.5,
              0.5
            ],
            "2p": [
              0.5,
              0.5
            ],
            "2pb": [
              0.5,
              0.5
            ]
          }
        },
        {
          "id": "u10",
          "updates": 10,
          "label": "10 updates (-85.01% exploitability)",
          "exploitability": 0.06869879381715754,
          "bestResponseValues": [
            0.01601048486772516,
            0.12138710276658993
          ],
          "changedRows": 12,
          "rows": {
            "0": [
              0.8088407070498244,
              0.1911592929501757
            ],
            "1": [
              0.3289565839791485,
              0.6710434160208514
            ],
            "2": [
              0.22574344340288718,
              0.7742565565971129
            ],
            "0b": [
              0.95,
              0.05
            ],
            "0p": [
              0.6769685453968245,
              0.32303145460317556
            ],
            "0pb": [
              0.969091565518277,
              0.030908434481722997
            ],
            "1b": [
              0.5691988555078684,
              0.43080114449213164
            ],
            "1p": [
              0.65,
              0.35
            ],
            "1pb": [
              0.32076600861399135,
              0.6792339913860087
            ],
            "2b": [
              0.05,
              0.95
            ],
            "2p": [
              0.1,
              0.9
            ],
            "2pb": [
              0.11074518764818424,
              0.8892548123518158
            ]
          }
        },
        {
          "id": "u100",
          "updates": 100,
          "label": "100 updates (-98.21% exploitability)",
          "exploitability": 0.008225977315915206,
          "bestResponseValues": [
            -0.04664087117880977,
            0.06309282581064019
          ],
          "changedRows": 12,
          "rows": {
            "0": [
              0.8146984655833112,
              0.18530153441668878
            ],
            "1": [
              0.9250791859907233,
              0.07492081400927672
            ],
            "2": [
              0.4232649741985938,
              0.5767350258014061
            ],
            "0b": [
              0.995,
              0.005
            ],
            "0p": [
              0.6832151203708584,
              0.3167848796291416
            ],
            "0pb": [
              0.9969313800066998,
              0.0030686199933002683
            ],
            "1b": [
              0.6512754678145757,
              0.3487245321854244
            ],
            "1p": [
              0.965,
              0.035
            ],
            "1pb": [
              0.4741664468968698,
              0.5258335531031302
            ],
            "2b": [
              0.005,
              0.995
            ],
            "2p": [
              0.01,
              0.99
            ],
            "2pb": [
              0.005906465576872921,
              0.9940935344231271
            ]
          }
        },
        {
          "id": "u1000",
          "updates": 1000,
          "label": "1,000 updates (-99.80% exploitability)",
          "exploitability": 0.0009376166469929614,
          "bestResponseValues": [
            -0.05484584288114258,
            0.056721076175128504
          ],
          "changedRows": 12,
          "rows": {
            "0": [
              0.8060180241057096,
              0.19398197589429045
            ],
            "1": [
              0.9925079185990724,
              0.007492081400927672
            ],
            "2": [
              0.41588375032927416,
              0.5841162496707258
            ],
            "0b": [
              0.9995,
              0.0005
            ],
            "0p": [
              0.6669814150653379,
              0.333018584934662
            ],
            "0pb": [
              0.9996898332388071,
              0.00031016676119293866
            ],
            "1b": [
              0.6635936422215174,
              0.33640635777848255
            ],
            "1p": [
              0.9965,
              0.0035
            ],
            "1pb": [
              0.4694587905279552,
              0.5305412094720448
            ],
            "2b": [
              0.0005,
              0.9995
            ],
            "2p": [
              0.001,
              0.999
            ],
            "2pb": [
              0.0006011295218965955,
              0.9993988704781034
            ]
          }
        }
      ]
    },
    {
      "number": 2,
      "id": "pong-pixel-rl",
      "category": "End-to-end deep reinforcement learning from pixels (ALE/Pong-v5)",
      "title": "From -21.00 (0/20 wins) to +19.25 (20/20 wins) from raw 4 x 84 x 84 pixel stacks",
      "status": "Confirmed across separated trainer/evaluator PIDs and independent seed-block replay",
      "trainerPid": 48704,
      "evaluatorPid": 7004,
      "environmentSteps": 2000896,
      "optimizerUpdates": 31264,
      "rollouts": 1954,
      "epochsPerRollout": 4,
      "minibatchesPerEpoch": 4,
      "trainingDurationSeconds": 1300.08,
      "initialParamSha256": "6a5f2c086bb1802511a8c00bacce7d91c772ba244e67e0e2050bb1c6a1309f84",
      "finalParamSha256": "3b55949ee318620b30bc07d075fc109d1b1158ceca79241d0e8a2647788dfdec",
      "videoAsset": {
        "path": "/media/learning/pong-before-after.mp4",
        "bytes": 389629,
        "sha256": "af5509437cb6bec2196aab16a2557d4caeac0cea824fadeaaf833ccd183008dd",
        "seed": 910001
      },
      "authorHeldOut": {
        "seedRange": "910001 to 910020 (20 episodes)",
        "initialMean": -21,
        "initialWins": "0/20",
        "finalMean": 19.25,
        "finalWins": "20/20",
        "pairedGainMean": 40.25,
        "pairedGainCi95": [
          40.1,
          40.45
        ],
        "resetMean": -21
      },
      "independentReviewHeldOut": {
        "seedRange": "930001 to 930020 (20 fresh episodes)",
        "initialMean": -21,
        "initialWins": "0/20",
        "finalMean": 19.5,
        "finalWins": "20/20"
      },
      "sourceArtifacts": [
        "PTCG-Learning-Lab/PONG-LEARNING-RESULT.md",
        "PTCG-Learning-Lab/checks/pong-learning.json",
        "PTCG-Learning-Lab/checks/pong-independent-review/REVIEW.md",
        "PTCG-Learning-Lab/runs/pong-learning/before-after.mp4"
      ]
    },
    {
      "number": 3,
      "id": "pong-sticky-generalization",
      "category": "Environment stochasticity and trajectory memorization audit (Machado et al. 2018)",
      "title": "Why a +21.00 (30/30) Atari score can be an open-loop memorization illusion unless tested at sticky = 0.25",
      "status": "Confirmed across 2M-step and 10M-step checkpoints",
      "tenMillionCheckpointSha256": "59f2e93a4db15c2a0f4488a3ca6271cd5910b9b59ff2640c10faef94c31e3a04",
      "verdictDocSha256": "1f8c18c0",
      "regimes": [
        {
          "id": "sticky-0",
          "label": "Deterministic regime (repeat_action_probability = 0.0)",
          "uniqueInitialObservationsIn20Seeds": 2,
          "uniqueTrajectoriesIn20Seeds": 15,
          "lab1Score2M": "+19.25 mean (20/20 wins on 910001-910020; +19.50 on 930001-930020)",
          "lab2Score10M": "+21.00 +/- 0.00 (30/30 shutouts on 5000-5029, 9000-9029, and 30 secret random seeds)",
          "interpretation": "Because the Atari 2600 RNG after reset collapses 20 seeds into only 2 initial observations when sticky=0.0, a policy can win 21-0 by replaying a memorized action sequence rather than tracking the ball."
        },
        {
          "id": "sticky-025",
          "label": "Stochastic regime (repeat_action_probability = 0.25, Machado 2018 standard)",
          "uniqueInitialObservationsIn20Seeds": 20,
          "uniqueTrajectoriesIn20Seeds": 20,
          "lab1Score2M": "+7.65 mean (19/20 wins on 920001-920020 zero-shot; +10.60 mean, 20/20 wins after B adaptation)",
          "lab2Score10M": "Mean +6.23, IQM +6.75 [5.12, 8.31] (26/30 wins on 5000-5029); Mean +7.60, IQM +7.38 [6.38, 8.69] (29/30 wins on fresh 9000-9029)",
          "baselinesAtSticky025": {
            "untrained": -21,
            "random": -20.33,
            "scriptedRamBallTracker": -15
          },
          "interpretation": "When 25% of frames repeat the previous action, open-loop sequences desynchronize immediately. Winning 29/30 episodes (IQM +7.38) while a scripted RAM ball-Y tracker loses -15.0 proves closed-loop visual control."
        }
      ],
      "sourceArtifacts": [
        "V:/agentlearning/pong/EVALUATOR_VERDICT.md",
        "PTCG-Learning-Lab/checks/pong-independent-review/REVIEW.md"
      ]
    },
    {
      "number": 4,
      "id": "selection-bias-and-multi-seed-ppo",
      "category": "Statistical methodology (Agarwal et al. 2021 IQM, bootstrap CIs, and post-selection shrinkage)",
      "title": "Why 1 seed is an anecdote, 42-checkpoint selection inflates scores by +1.14 points, and 10 x 200 seeds prove LunarLander-v3 PPO",
      "status": "Confirmed with 0.0 bit-for-bit replay difference across 1,000 logged episodes",
      "lunarRerunSha256": "4844bea74d6c7e16a2593b9f768d42131fb603203915e4c183b7",
      "lunarRerunSha256Status": "incomplete_historical_digest",
      "lunarRerunSha256Note": "The historical record retains a 52-character value, not a complete SHA-256 and not an exact prefix. It is preserved for compatibility and is not usable for integrity verification. The full historical digest has not been established.",
      "cases": {
        "cartpoleSingleSeedTrap": {
          "seed0Mean": 457.9,
          "seed0Std": 76.2,
          "seed1Mean": 9.3,
          "seed1Std": 0.8,
          "lesson": "L05: Reporting seed 0 alone (+457.9) hides complete training collapse on seed 1 (+9.3)."
        },
        "pongCheckpointSelectionBias": {
          "checkpointsEvaluated": 42,
          "selectedCheckpoint": "best_8750000",
          "scoreOnSelectionSeeds5000To5029": {
            "mean": 8.87,
            "iqm": 8.81,
            "ci95": [
              7.69,
              10.25
            ]
          },
          "scoreOnFreshSeeds9000To9029": {
            "mean": 7.73,
            "iqm": 8.06,
            "ci95": [
              6.19,
              9.56
            ]
          },
          "scoreOnSecretRandomSeeds": {
            "mean": 7.27
          },
          "unselectedFinal10MOnFreshSeeds": {
            "mean": 7.6,
            "iqm": 7.38,
            "ci95": [
              6.38,
              8.69
            ]
          },
          "lesson": "Selecting the best of 42 checkpoints on seeds 5000-5029 inflated the apparent score by +1.14 points; on fresh seeds it was indistinguishable from the final 10M checkpoint."
        },
        "lunarLanderMultiSeedProof": {
          "trainingSeeds": 10,
          "stepsPerSeed": 1015808,
          "wallMinutesCpu": 18,
          "perSeedMeansOrig100": [
            252.8,
            256.4,
            255.3,
            262.7,
            250.4,
            242.8,
            225.2,
            256.9,
            257.5,
            253.1
          ],
          "perSeedUntrainedMeansOrig100": [
            -293,
            -859.5,
            -295.6,
            -902.5,
            -562.9,
            -488.7,
            -149.2,
            -600.4,
            -819.1,
            -263.8
          ],
          "orig100Summary": {
            "episodes": 1000,
            "trainedIqm": 254.1,
            "trainedCi95": [
              246.2,
              257
            ],
            "untrainedIqm": -510,
            "untrainedCi95": [
              -742.1,
              -315.9
            ],
            "randomIqm": -191.7,
            "randomCi95": [
              -199.1,
              -185.2
            ],
            "episodesGe200": 984
          },
          "all200IndependentRerun": {
            "episodes": 2000,
            "trainedIqm": 253.88,
            "trainedCi95": [
              252.66,
              255.11
            ],
            "untrainedIqm": -445.42,
            "untrainedCi95": [
              -454.46,
              -436.51
            ],
            "randomIqm": -160.2,
            "randomCi95": [
              -165.79,
              -154.95
            ],
            "fractionGe200": 0.974,
            "probabilityOfImprovement": 1,
            "replayMaxAbsDiff": 0,
            "replayExactMatches": 1000
          }
        }
      },
      "sourceArtifacts": [
        "V:/agentlearning/results/phase1/20261029-072205-1000k/summary.md",
        "V:/agentlearning/eval/lunarlander_rerun/results.json",
        "V:/agentlearning/pong/EVALUATOR_VERDICT.md"
      ]
    },
    {
      "number": 5,
      "id": "mario-byte-wrap-forensics",
      "category": "Reward-channel integrity & 8-bit RAM telemetry forensics (Super Mario Bros World 1-1)",
      "title": "How stepping 1 pixel left of spawn turns unsigned NES RAM 0x6D into x = 65,535 (20x past the flagpole)",
      "status": "Fixed in mario_env.py and guarded by checklist_v5 rule f_x_3600",
      "marioEnvSha256": "2bb34169c25b19b471574074d62e84b9d131a539c57675f85de2ed4b94647704",
      "ramPageAddress": "0x006D",
      "ramOffsetAddress": "0x0086",
      "world1FlagpoleX": 3161,
      "evaluatorWrapGuardMaxX": 3500,
      "bugFormula": "x_unsigned = 256 * r[0x6D] + r[0x86]",
      "fixFormula": "page = r[0x6D] - 256 if r[0x6D] >= 128 else r[0x6D]; x_clamped = max(0, 256 * page + r[0x86])",
      "summary": "In Super Mario Bros (NES), horizontal progress is stored across two 8-bit RAM bytes: screen page 0x006D and screen pixel offset 0x0086. When an agent steps 1 pixel left of spawn (x = 0), the 8-bit page byte underflows from 0x00 to 0xFF (255) with offset 0xFF (255). An unsigned decoder computes 256 * 255 + 255 = 65,535 (more than 20 times the World 1-1 flagpole at x = 3,161), rewarding the policy for walking backward into the left wall.",
      "sourceArtifacts": [
        "V:/agentlearning/nes/mario/mario_env.py",
        "V:/agentlearning/LEARNINGS.md",
        "V:/agentlearning/eval/TABLE_v5.md"
      ]
    },
    {
      "number": 6,
      "id": "fakes-red-team-sandbox",
      "category": "Adversarial evaluator verification (68/68 Fakes Suite + 51/51 scorer tamper suite)",
      "title": "Fakes-first verification: building 68 synthetic fraud artifacts to red-team the evaluator before trusting a single training run",
      "status": "68/68 caught in checklist_v5 (0 false positives) + 51/51 scorer tamper cases caught",
      "precheckSha256": "71d1170b5c71732d6f49e84874b6895f50385e641fb779ff3ab906342df2b580",
      "evolution": [
        {
          "version": "checklist_v1",
          "totalCases": 68,
          "slippedThrough": 39,
          "falsePositives": 0
        },
        {
          "version": "checklist_v2",
          "totalCases": 68,
          "slippedThrough": 24,
          "falsePositives": 0
        },
        {
          "version": "checklist_v3",
          "totalCases": 68,
          "slippedThrough": 14,
          "falsePositives": 0
        },
        {
          "version": "checklist_v4",
          "totalCases": 68,
          "slippedThrough": 5,
          "falsePositives": 0
        },
        {
          "version": "checklist_v5",
          "totalCases": 68,
          "slippedThrough": 0,
          "falsePositives": 0
        }
      ],
      "interactiveCases": [
        {
          "id": "v5_00_control_valid",
          "label": "Valid multi-seed control package (v5_00_control_valid)",
          "attackVector": "None: 5 independent training seeds, matching SHA-256 manifest, untrained baseline, and held-out evaluation.",
          "v1Verdict": "PASS (valid)",
          "v5Verdict": "PASS (valid)",
          "invariantRule": "All schema, manifest, seed-diversity, baseline, and replay checks satisfied."
        },
        {
          "id": "v2_01_lunar_999_consistent2",
          "label": "Internally consistent +999 reward fabrication (v2_01_lunar_999_consistent2)",
          "attackVector": "Fabricates +999.0 episode returns across JSON summary, CSV rows, and recalculated IQM so internal arithmetic matches.",
          "v1Verdict": "SLIPPED THROUGH (accepted fake)",
          "v5Verdict": "REJECTED (caught)",
          "invariantRule": "Domain physical ceiling & live checkpoint weight-replay check (LunarLander-v3 theoretical ceiling ~320)."
        },
        {
          "id": "v2_18_checkpoint_pool",
          "label": "42-checkpoint cherry-picking on evaluation seeds (v2_18_checkpoint_pool)",
          "attackVector": "Evaluates 42 intermediate checkpoints on the test seed block and reports only the highest-scoring checkpoint without a fresh holdout block.",
          "v1Verdict": "SLIPPED THROUGH (accepted fake)",
          "v5Verdict": "REJECTED (caught)",
          "invariantRule": "Mandatory disjoint holdout seed block when checkpoint selection is performed."
        },
        {
          "id": "v2_04_train_init_short",
          "label": "Truncated 5-step untrained baseline (v2_04_train_init_short)",
          "attackVector": "Cuts off the untrained baseline rollout after 5 steps so the trained policy looks artificially superior.",
          "v1Verdict": "SLIPPED THROUGH (accepted fake)",
          "v5Verdict": "REJECTED (caught)",
          "invariantRule": "Matched episode termination / horizon parity between initial_policy and final_policy."
        },
        {
          "id": "v5_b_untrained_swapped_worse",
          "label": "Deliberately sabotaged untrained baseline (v5_b_untrained_swapped_worse)",
          "attackVector": "Replaces random-initialized weights with anti-policy weights that dive into the ground, inflating paired delta.",
          "v1Verdict": "SLIPPED THROUGH (accepted fake)",
          "v5Verdict": "REJECTED (caught)",
          "invariantRule": "Untrained baseline distribution check against fresh random policy initialization."
        },
        {
          "id": "f_x_3600",
          "label": "Mario unsigned byte-wrap exploit (f_x_3600)",
          "attackVector": "Reports max_x = 3,600 (> flagpole 3,161) from a policy that stepped left of x = 0 and underflowed RAM byte 0x6D.",
          "v1Verdict": "SLIPPED THROUGH (accepted fake)",
          "v5Verdict": "REJECTED (caught)",
          "invariantRule": "NES RAM coordinate physical bound (0 <= max_x <= 3,500) and signed page-byte verification."
        },
        {
          "id": "x4_manifest_line_removed",
          "label": "Manifest line omission attack (x4_manifest_line_removed)",
          "attackVector": "Edits a result file and deletes its corresponding line from manifest.sha256 so every remaining line still hashes cleanly.",
          "v1Verdict": "SLIPPED THROUGH (accepted fake)",
          "v5Verdict": "REJECTED (caught by precheck.py 71d1170b)",
          "invariantRule": "Bidirectional directory-to-manifest completeness check (every artifact on disk must appear in manifest.sha256)."
        },
        {
          "id": "connect4_anchor_drift",
          "label": "Connect-4 self-play moving-opponent illusion (0.60 -> 0.53)",
          "attackVector": "Reports 60% win rate against the previous generation in self-play while actual win rate against a frozen anchor drops to 53%.",
          "v1Verdict": "SLIPPED THROUGH (accepted fake)",
          "v5Verdict": "REJECTED (caught)",
          "invariantRule": "Frozen external anchor evaluation required for all self-play and league claims."
        }
      ],
      "sourceArtifacts": [
        "V:/agentlearning/eval/TABLE_v5.md",
        "V:/agentlearning/eval/SCORER_FAKES_RESULTS.md",
        "V:/agentlearning/AUDIT-prior-claims.md"
      ]
    },
    {
      "number": 7,
      "id": "pong-adaptation-and-retention",
      "category": "Transfer learning vs continual forgetting (Regime A sticky=0.0 -> Regime B sticky=0.25)",
      "title": "Weight reuse beats scratch training by +21.25 points, but doubling adaptation steps degrades Regime A retention below the -3.0 gate",
      "status": "Mixed result: Weight Reuse PASS (+21.25); Adaptation vs Original FAIL (+2.95 < +5.0); Retention FAIL (-3.35 lower bound < -3.0)",
      "checkpoints": [
        {
          "id": "frozen_original",
          "label": "Frozen original (trained on A: sticky=0.0, 2M steps)",
          "regimeAMean": 19.35,
          "regimeAWins": "20/20",
          "regimeBMean": 7.65,
          "regimeBWins": "19/20",
          "note": "Strong zero-shot transfer to sticky=0.25 (+7.65), but loses 1 game and drops 11.70 points vs A."
        },
        {
          "id": "prior_retained_1m",
          "label": "Prior retained (+1M steps on B from original weights)",
          "regimeAMean": 19.15,
          "regimeAWins": "20/20",
          "regimeBMean": 10.55,
          "regimeBWins": "20/20",
          "note": "Lifts B by +2.90 points (20/20 wins) while losing only -0.20 points on A."
        },
        {
          "id": "extended_retained_2m",
          "label": "Extended retained (+2M steps on B from original weights)",
          "regimeAMean": 17.55,
          "regimeAWins": "20/20",
          "regimeBMean": 10.6,
          "regimeBWins": "20/20",
          "note": "Second +1M on B adds only +0.05 [-2.35, +2.00] on B while degrading A retention to 17.55 (-1.80, 95% lower bound -3.35)."
        },
        {
          "id": "prior_fresh_1m",
          "label": "Prior fresh (1M steps on B from random initialization)",
          "regimeAMean": -18.85,
          "regimeAWins": "0/20",
          "regimeBMean": -17.05,
          "regimeBWins": "0/20",
          "note": "From-scratch training at 1M steps cannot yet rally reliably on either regime."
        },
        {
          "id": "extended_fresh_2m",
          "label": "Extended fresh (2M steps on B from random initialization)",
          "regimeAMean": -9.25,
          "regimeAWins": "4/20",
          "regimeBMean": -10.65,
          "regimeBWins": "0/20",
          "note": "Even at 2M steps from scratch, B reaches only -10.65 vs +10.60 for weight reuse (+21.25 advantage)."
        }
      ],
      "gates": [
        {
          "gate": "Weight reuse vs matched fresh training on B (2M steps)",
          "measured": "+21.25 points (+10.60 vs -10.65), 95% CI [+18.750, +23.500]",
          "bar": "Lower 95% CI > 0",
          "verdict": "PASS"
        },
        {
          "gate": "Adaptation gain on B vs frozen original",
          "measured": "+2.95 points (+10.60 vs +7.65), 95% CI [+1.05, +4.75]",
          "bar": "Mean gain >= +5.0 points and 95% CI > 0",
          "verdict": "FAIL (positive CI, but below +5.0 bar)"
        },
        {
          "gate": "Old-regime (A) retention after extended B training",
          "measured": "-1.80 points (17.55 vs 19.35), 95% CI [-3.65, -0.10], one-sided 95% lower bound -3.35",
          "bar": "One-sided 95% lower bound >= -3.0 points",
          "verdict": "FAIL (-3.35 < -3.0 bar)"
        },
        {
          "gate": "Extended dose (+2M vs +1M retained on B)",
          "measured": "+0.05 points (+10.60 vs +10.55), 95% CI [-2.35, +2.00]",
          "bar": "95% CI > 0",
          "verdict": "FAIL (diminishing returns saturated at +1M)"
        }
      ],
      "sourceArtifacts": [
        "PTCG-Learning-Lab/PONG-ADAPTATION-RESULT.md",
        "PTCG-Learning-Lab/checks/pong-adaptation/evaluation.json"
      ]
    },
    {
      "number": 8,
      "id": "pokemon-tcg-closed-loop-gate",
      "category": "Closed-loop contextual bandit & off-policy Effective Sample Size (ESS) diagnosis",
      "title": "Why a -0.0031% confidence-interval bound stopped a +5.625 pp Pokemon TCG promotion across 5,600 fresh games (1,002,605 actions)",
      "status": "Mechanism verified (812-868 changed decisions); Competitive improvement NOT established (all 3 confirmation gates failed)",
      "developmentDataset": {
        "totalGames": 512,
        "eligibleGames": 511,
        "ineligibleGames": 1,
        "wins": 412,
        "losses": 98,
        "draws": 1,
        "meanMenuOptions": 10.865,
        "minActionProbability": 0.03333333333333333,
        "maxActionProbability": 0.3333333333333333
      },
      "studies": [
        {
          "id": "tcg-scorer-v1",
          "label": "Study 1: 88-feature Ridge action scorer (tcg-scorer-v1)",
          "modelSha256": "52462522da349b9485402eb46e557eb60b2fa0e557a82026b4da4122ba1f0ca2",
          "features": 88,
          "nonzeroCoefficients": 84,
          "freshGames": 800,
          "verifiedActions": 216710,
          "parentScore": 0.7625,
          "parentRecord": "305 W / 0 D / 95 L",
          "challengerScore": 0.81875,
          "challengerRecord": "327 W / 1 D / 72 L",
          "changedChoices": 266,
          "meanDeltaPp": 5.625,
          "ci95Pp": [
            -0.003125,
            11.125
          ],
          "verdict": "FAIL (lower 95% CI bound -0.003125 pp <= 0)"
        },
        {
          "id": "tcg-scorer-replication-v1",
          "label": "Study 2: Higher-power 2,400-game replication (tcg-scorer-replication-v1/attempt2)",
          "modelSha256": "52462522da349b9485402eb46e557eb60b2fa0e557a82026b4da4122ba1f0ca2",
          "features": 88,
          "nonzeroCoefficients": 84,
          "freshGames": 2400,
          "verifiedActions": 391026,
          "parentScore": 0.7970833333333334,
          "parentRecord": "956 W / 1 D / 243 L",
          "challengerScore": 0.8070833333333334,
          "challengerRecord": "968 W / 1 D / 231 L",
          "changedChoices": 812,
          "meanDeltaPp": 1,
          "ci95Pp": [
            -2.125,
            4.125
          ],
          "verdict": "FAIL (effect shrank from +5.625 pp to +1.00 pp; 95% CI spans zero)"
        },
        {
          "id": "tcg-relational-v1",
          "label": "Study 3: 90-feature relational card-copy scorer (tcg-relational-v1)",
          "modelSha256": "389221c97b3c90e42b1c23da56268c6525ebfd15edca124f275a31094c2c0e63",
          "features": 90,
          "nonzeroCoefficients": 86,
          "normalEquationResidual": 1.4921397450962104e-13,
          "freshGames": 2400,
          "verifiedActions": 394869,
          "parentScore": 0.8141666666666667,
          "parentRecord": "977 W / 0 D / 223 L",
          "challengerScore": 0.7991666666666667,
          "challengerRecord": "959 W / 0 D / 241 L",
          "changedChoices": 868,
          "changedVsLinearScorer": 99,
          "meanDeltaPp": -1.5,
          "ci95Pp": [
            -4.666666666666667,
            1.6666666666666667
          ],
          "verdict": "FAIL (-1.50 pp vs parent; relational features alone did not rescue uniform exploration)"
        }
      ],
      "aliasingDiagnosis": {
        "diagnosisSha256": "ad5cebda7357b05897a77092f90df1641512fd82f35f514f41fc56e83552d50f",
        "aliasGroupCount": 58,
        "aliasedRows": 236,
        "groupsWithDistinctHands": 58,
        "groupsWithDistinctBoards": 45,
        "workedPair": {
          "rowA": "dev-0010 (turn 1, hand 7, deck 42, baseline 646, board [112, 646, 860], holds 0 copies of target card 647 in hand)",
          "rowB": "dev-0145 (turn 1, hand 7, deck 42, baseline 646, board [112, 646, 860], already holds 1 copy of target card 647 in hand)",
          "explanation": "Under the 88-feature representation, both game states produced identical feature vectors for every candidate card despite different hand holdings."
        }
      },
      "supportAndEssDiagnosis": {
        "analysisScriptSha256": "b4611886f13fd7cecfdf3782c58875b916f6bb4d71605212db52db27bc193e2d",
        "exactParentMatches": 58,
        "eligibleRows": 511,
        "exactParentMatchRatePercent": 11.35,
        "parentEss": 48.06526707006267,
        "requiredDirectComparisonScreen": 100,
        "weightSum": 512,
        "maxNonzeroWeight": 27,
        "strata": [
          {
            "opponent": "Alakazam",
            "seat": 0,
            "rows": 128,
            "exactParentMatches": 14,
            "parentEss": 11.88,
            "meanMenu": 10.69
          },
          {
            "opponent": "Alakazam",
            "seat": 1,
            "rows": 127,
            "exactParentMatches": 15,
            "parentEss": 13.06,
            "meanMenu": 10.69
          },
          {
            "opponent": "Control",
            "seat": 0,
            "rows": 128,
            "exactParentMatches": 10,
            "parentEss": 8.69,
            "meanMenu": 11.38
          },
          {
            "opponent": "Control",
            "seat": 1,
            "rows": 128,
            "exactParentMatches": 19,
            "parentEss": 15.22,
            "meanMenu": 10.7
          }
        ],
        "nextMathematicalDesign": "Replace uniform 1/K exploration (K ~ 10.86, max inverse-propensity weight 27.0) with paired 1/2 parent-vs-single-challenger randomization at disagreement states (bounded weight w <= 2)."
      },
      "sourceArtifacts": [
        "PTCG-Learning-Lab/checks/tcg-scorer-v1/RESULT.md",
        "PTCG-Learning-Lab/checks/tcg-scorer-replication-v1/RESULT.md",
        "PTCG-Learning-Lab/checks/tcg-scorer-diagnosis-v1/RESULT.md",
        "PTCG-Learning-Lab/checks/tcg-relational-v1/RESULT.md",
        "PTCG-Learning-Lab/checks/learning-design-v1/RESULT.md",
        "PTCG-Learning-Lab/checks/learning-design-v1/CORRECTION.md",
        "PTCG-Learning-Lab/checks/learning-design-v1/analysis-v2.json"
      ]
    },
    {
      "number": 9,
      "id": "hardware-and-numerics-forensics",
      "category": "Hardware numerical determinism & vectorized rollout physics",
      "title": "Measuring 1.80e-5 CPU-vs-CUDA float drift, SB3 rollout-buffer batch scaling (n_steps x n_envs), and 32 GB DLL pagefile traps",
      "status": "Verified on RTX 5080 (CUDA) and Windows multiprocessing workers",
      "probeDatasetSha256": "f830f1d96ebbd2a8c28d98bb23aaed20b4c1c28321cf0c8fa548be84b510b15d",
      "cpuVsCudaMaxProbDiff": 0.00001800060272216797,
      "cudaReloadMaxProbDiff": 0,
      "argmaxAgreement": "8/8 probes identical across CPU and CUDA",
      "sb3RolloutPhysics": {
        "documentationUrl": "https://stable-baselines3.readthedocs.io/en/master/modules/ppo.html#parameters",
        "rulingSha256": "0c77bc04",
        "workerSha256": "7763e7fb",
        "explanation": "In Stable-Baselines3 PPO, the rollout buffer holds n_steps * n_envs transitions. Raising n_envs from 8 to 20 with n_steps = 256 increases that buffer from 2,048 to 5,120 transitions, so complete rollout collection and training cycles occur 2.5 times less often per million transitions. This alone does not establish fewer optimizer steps: those also depend on minibatch size, optimization epochs and early stopping. The original training configuration has not been verified here, so its optimizer-step frequency remains unresolved. Furthermore, importing torch inside 20 Windows spawn workers reserves ~1.6 GB of CUDA DLL virtual memory per process (~32 GB pagefile). Isolating Ctypes/LaiNES workers in a torch-free module (mario_worker.py) eliminates the pagefile exhaustion."
      },
      "sourceArtifacts": [
        "PTCG-Learning-Lab/checks/pong-independent-review/numerics.json",
        "V:/agentlearning/nes/RULING_mario_envs.md",
        "V:/agentlearning/nes/mario/mario_worker.py"
      ]
    },
    {
      "number": 10,
      "id": "ai-research-learning-ledger",
      "category": "Agentic operational learning (Prose instructions vs executable fail-closed gates)",
      "title": "When AI research agents actually learn (and when prose lessons fail): L01-L27, V01-V06, and the Sprawl Audit",
      "status": "Audited across 27 operational lessons, 6 valuable discoveries, and 8 sprawl-audit records",
      "entries": [
        {
          "id": "AUDIT-PRIOR-CLAIMS",
          "type": "Retraction & baseline audit",
          "title": "Retracted unverified early claims before Phase 1 rerun",
          "evidence": "AUDIT-prior-claims.md & L01-L09",
          "outcome": "Withdrew single-seed CartPole (+457.9 on seed 0 vs +9.3 on seed 1), unanchored Connect-4 self-play (0.60 -> 0.53 vs frozen anchor), and truncated-baseline LunarLander claims; rebuilt evaluation around 10-seed x 200-episode IQM and checklist_v5."
        },
        {
          "id": "L16-TO-L19-REUSE",
          "type": "Confirmed procedural reuse",
          "title": "Zero-exploration migration of BO3 Playground contract (L16 -> L19)",
          "evidence": "PTCG-Learning-Lab/LESSONS.md & REUSE.md",
          "outcome": "After recording the exact 3-step recipe in L16, a subsequent agent task applied it in L19 with 0 exploratory tool calls and passed 7/7 automated checks on the first run."
        },
        {
          "id": "L17-L21-L25-PROSE-FAILURE",
          "type": "Preserved negative finding on prose rules",
          "title": "Written prose lessons failed to prevent repeat process errors until turned into code",
          "evidence": "PTCG-Learning-Lab/LESSONS.md (L17, L21, L25) & precheck.py (71d1170b)",
          "outcome": "Recording a prose lesson in LESSONS.md did not stop agents from repeating a worktree deletion mistake (L17 -> L21) or launching an unapproved replication run before diagnosis (L25). Only executable fail-closed gates (precheck.py, checklist_v5, and pre-registered spec hashes) reliably prevented regressions."
        },
        {
          "id": "CORRECTION-2026-10-30",
          "type": "Preserved mathematical self-correction",
          "title": "Withdrew an initial 64-game ESS = 100 formula before running a single new game",
          "evidence": "PTCG-Learning-Lab/checks/learning-design-v1/CORRECTION.md & analysis-v2.json",
          "outcome": "A review caught that normalizing inverse-propensity weights across all 511 games inflated apparent parent coverage. Recomputing exact parent-indicator support revealed 58/511 matches (11.35%) and ESS = 48.06, stopping a flawed 64-game study before execution."
        }
      ],
      "sourceArtifacts": [
        "V:/agentlearning/LEARNINGS.md",
        "V:/agentlearning/VALUABLE.md",
        "V:/agentlearning/AUDIT-prior-claims.md",
        "PTCG-Learning-Lab/LESSONS.md",
        "PTCG-Learning-Lab/REUSE.md",
        "PTCG-Learning-Lab/checks/sprawl-audit-v1/knowledge.jsonl"
      ]
    }
  ],
  "scopeAndLimits": [
    "All experiments are author-directed runs in local workspaces (PTCG-Learning-Lab and agentlearning); separate evaluator processes and second-model reviews in the same workspace are internal checks, not external independent reproduction.",
    "Kuhn Poker CFR, LunarLander-v3 PPO (10 seeds x 200 episodes), and Atari Pong pixel PPO (sticky=0.0 and sticky=0.25) demonstrate confirmed learning on those benchmarks. They do not establish general algorithmic novelty.",
    "In Pokemon TCG, the closed-loop linear and relational scorers changed 266, 812, and 868 search decisions across 5,600 fresh games, proving the closed-loop mechanism runs end-to-end, but all three held-out confirmation gates failed (+5.625 pp [-0.0031, +11.125], +1.00 pp [-2.125, +4.125], and -1.50 pp [-4.667, +1.667]). Retained competitive improvement in Pokemon TCG remains an open objective.",
    "In Pong regime adaptation (sticky=0.0 -> sticky=0.25), weight reuse beat matched scratch training by +21.25 points, but doubling continuation steps degraded Regime A retention below the one-sided -3.0 gate (-3.35)."
  ]
}
