{
  "schema": "poker51-table-v1-verify",
  "rules": "poker51-table-v1",
  "riemann": "poker51-table-riemann-v1",
  "service": "table51-v1",
  "date": "2026-09-29",
  "node": "v24.16.0",
  "checks": [
    {
      "name": "20,000 seeded hands, 2–5 seats: legal moves, exact cents, side pots, cards and flows",
      "pass": true,
      "ms": 3564,
      "coverage": {
        "hands": 20000,
        "fiveSeats": 5000,
        "sidePots": 10969,
        "splits": 1244,
        "uncontested": 5382,
        "showdowns": 14618,
        "allInCallShort": 7598,
        "incompleteRaise": 1459,
        "capReached": 2588,
        "forcedFolds": 3489,
        "drawFive": 1211,
        "standPat": 4243,
        "openAllIn": 4529
      }
    },
    {
      "name": "odd cents: a three-way split hands the extra cents out in turn from the seat after the button",
      "pass": true,
      "ms": 2
    },
    {
      "name": "five seats that all draw five use 50 cards; the 51st is never needed",
      "pass": true,
      "ms": 0
    },
    {
      "name": "deterministic: the same deck and moves give the same hand, byte for byte",
      "pass": true,
      "ms": 67
    },
    {
      "name": "illegal moves are refused and leave the hand unchanged",
      "pass": true,
      "ms": 0
    },
    {
      "name": "heads-up, Riemann’s call prices equal v0.3’s B/(P0+2B) and B/(P0+6B); post-draw choices match v0.3 in 1,000 spots",
      "pass": true,
      "ms": 84,
      "matched": 1000
    },
    {
      "name": "abits: 1,500 seeded table sessions with Riemann coming and going; each human cashes out buy-in + net vs humans, and no view shows another seat’s cards",
      "pass": true,
      "ms": 19560,
      "stats": {
        "hands": 13074,
        "riemannHands": 9299,
        "departures": 2287,
        "leaves": 3760,
        "midHandLeaves": 585,
        "escrowReturned": 1977,
        "abitsWon": 3067,
        "viewsChecked": 154498
      }
    },
    {
      "name": "abits fixture: 10 jbits in, Riemann gets 10 abits; a lost pot is held and returned; a won pot pays back first, then abits",
      "pass": true,
      "ms": 2,
      "riemannWon": 500,
      "adaWon": 100
    }
  ],
  "scope": "Seeded finite tests. They check accounting, legality, side pots against an independent fractional split, odd-cent order, card uniqueness, Riemann's heads-up prices against v0.3, the abits invariant and view filtering. They do not prove the rules correct for every input or establish optimal play."
}
