{
  "schemaVersion": 1,
  "published": "2026-09-03",
  "generatedBy": "scripts/generate-short-all-in-reopening-data.mjs",
  "question": "For one named player at one NL/PL decision point, does the wager-level change satisfy the Poker TDA 2024 full-increment test for raise rights?",
  "modelClaim": "The TDA validation fixtures implement the three-number actor test from Poker TDA 2024 Rules 43 and 47. The WSOP fixture is a labeled numerical comparison and is not part of the TDA validation claim.",
  "primaryRuleset": {
    "id": "poker-tda-2024-v1-rules-43-47",
    "label": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
    "editionDate": "2024-10-09",
    "accessed": "2026-09-03",
    "url": "https://www.pokertda.com/view-poker-tda-rules/"
  },
  "comparisonRuleset": {
    "id": "wsop-2026-rule-96-comparison",
    "label": "2026 WSOP Tournament Rules, Rule 96 comparison",
    "editionDate": "2026",
    "accessed": "2026-09-03",
    "url": "https://assets.wsopcdn.com/wsop/1a72ba28-781c-409d-a9c3-5ca13c4c5718.pdf"
  },
  "numericContract": {
    "representation": "Base-10 strings parsed to integers scaled by 1,000,000; JavaScript Number is never used for wager arithmetic.",
    "maximumInput": "1000000000000",
    "decimalPlaces": 6,
    "randomSampling": false
  },
  "decisionRule": {
    "actedPlayer": "mayRaise = currentWager - wagerLevelAfterLastAction >= lastFullIncrement",
    "unactedActivePlayer": "mayRaise = true; a posted blind does not count as voluntary action",
    "minimumFullRaiseTo": "when mayRaise is true: currentWager + lastFullIncrement",
    "openingUnderbet": "lastFullIncrement may exceed currentWager when a short all-in opens below the minimum full opening bet",
    "inactivePlayer": "folded and all-in states return not applicable"
  },
  "assumptions": [
    "The decision point and applicable full increment have already been identified correctly for the current betting round; after a short opening all-in, that input is the minimum full opening bet.",
    "The active state means a live player with chips behind; stack size is intentionally not an input.",
    "Each fixture is a single-player snapshot, so raise rights are evaluated separately for every actor."
  ],
  "exclusions": [
    "Pot-limit maximum wager calculations.",
    "Stack sufficiency, chips-behind amount, and whether a player can fund the displayed full raise-to.",
    "Fixed-limit reopening rules.",
    "Interpretation of verbal declarations, physical chips, calls, undercalls, or malformed live action.",
    "House rules, event-specific discretion, and floor rulings."
  ],
  "fixtures": [
    {
      "id": "tda-47-example-1-player-a",
      "label": "TDA Example 1 — action returns to A",
      "claimSet": "tda-validation",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Illustration Addendum to Rule 47, Example 1",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "post-flop",
      "player": "A",
      "context": "A opened to 100; short all-ins moved the wager through 125 to 200, with calls between them.",
      "input": {
        "currentWager": "200",
        "lastFullIncrement": "100",
        "hasActed": true,
        "wagerLevelAfterLastAction": "100",
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": true,
        "incrementNowFaced": "100",
        "reopeningThresholdWagerLevel": "200",
        "minimumFullRaiseTo": "300",
        "reasonCode": "acted-player-faces-full-increment"
      }
    },
    {
      "id": "tda-47-example-1-a",
      "label": "TDA Example 1-A — action reaches C after A calls",
      "claimSet": "tda-validation",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Illustration Addendum to Rule 47, Example 1-A",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "post-flop",
      "player": "C",
      "context": "C previously called 125; after A calls 200, C faces a wager of 200.",
      "input": {
        "currentWager": "200",
        "lastFullIncrement": "100",
        "hasActed": true,
        "wagerLevelAfterLastAction": "125",
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": false,
        "incrementNowFaced": "75",
        "reopeningThresholdWagerLevel": "225",
        "minimumFullRaiseTo": null,
        "reasonCode": "acted-player-below-full-increment"
      }
    },
    {
      "id": "tda-47-example-1-b",
      "label": "TDA Example 1-B — C faces A's full raise",
      "claimSet": "tda-validation",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Illustration Addendum to Rule 47, Example 1-B",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "post-flop",
      "player": "C",
      "context": "C previously called 125; A then makes a full raise to 300.",
      "input": {
        "currentWager": "300",
        "lastFullIncrement": "100",
        "hasActed": true,
        "wagerLevelAfterLastAction": "125",
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": true,
        "incrementNowFaced": "175",
        "reopeningThresholdWagerLevel": "225",
        "minimumFullRaiseTo": "400",
        "reasonCode": "acted-player-faces-full-increment"
      }
    },
    {
      "id": "tda-47-example-2",
      "label": "TDA Example 2 — unacted F after three short all-ins",
      "claimSet": "tda-validation",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Illustration Addendum to Rule 47, Example 2",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "post-flop",
      "player": "F",
      "context": "A opened to 300; all-ins moved the wager to 500, 650, and 800 before E called.",
      "input": {
        "currentWager": "800",
        "lastFullIncrement": "300",
        "hasActed": false,
        "wagerLevelAfterLastAction": null,
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": true,
        "incrementNowFaced": null,
        "reopeningThresholdWagerLevel": null,
        "minimumFullRaiseTo": "1100",
        "reasonCode": "unacted-player-retains-raise-rights"
      }
    },
    {
      "id": "tda-47-example-3-a-big-blind",
      "label": "TDA Example 3-A — big blind has not acted",
      "claimSet": "tda-validation",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Illustration Addendum to Rule 47, Example 3-A, big blind decision",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "preflop",
      "player": "BB",
      "context": "Blinds are 2,000/4,000; C is all-in for 7,500. Posting 4,000 did not count as BB acting.",
      "input": {
        "currentWager": "7500",
        "lastFullIncrement": "4000",
        "hasActed": false,
        "wagerLevelAfterLastAction": null,
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": true,
        "incrementNowFaced": null,
        "reopeningThresholdWagerLevel": null,
        "minimumFullRaiseTo": "11500",
        "reasonCode": "unacted-player-retains-raise-rights"
      }
    },
    {
      "id": "tda-47-example-3-a-limper",
      "label": "TDA Example 3-A — A after BB calls",
      "claimSet": "tda-validation",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Illustration Addendum to Rule 47, Example 3-A, limper decision",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "preflop",
      "player": "A",
      "context": "A called 4,000 before C moved all-in to 7,500; BB then called.",
      "input": {
        "currentWager": "7500",
        "lastFullIncrement": "4000",
        "hasActed": true,
        "wagerLevelAfterLastAction": "4000",
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": false,
        "incrementNowFaced": "3500",
        "reopeningThresholdWagerLevel": "8000",
        "minimumFullRaiseTo": null,
        "reasonCode": "acted-player-below-full-increment"
      }
    },
    {
      "id": "tda-47-example-3-b",
      "label": "TDA Example 3-B — A after BB raises",
      "claimSet": "tda-validation",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Illustration Addendum to Rule 47, Example 3-B",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "preflop",
      "player": "A",
      "context": "A previously acted at 4,000; BB makes the full minimum raise to 11,500.",
      "input": {
        "currentWager": "11500",
        "lastFullIncrement": "4000",
        "hasActed": true,
        "wagerLevelAfterLastAction": "4000",
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": true,
        "incrementNowFaced": "7500",
        "reopeningThresholdWagerLevel": "8000",
        "minimumFullRaiseTo": "15500",
        "reasonCode": "acted-player-faces-full-increment"
      }
    },
    {
      "id": "wsop-2026-rule-96-b-or-c",
      "label": "WSOP 2026 Rule 96 — comparison only",
      "claimSet": "wsop-comparison-not-tda-validation",
      "ruleset": "2026 WSOP Tournament Rules, Rule 96 comparison",
      "sourceRef": "wsop-2026-rule-96-comparison",
      "sourceLocation": "Rule 96(a)",
      "sourceUrl": "https://assets.wsopcdn.com/wsop/1a72ba28-781c-409d-a9c3-5ca13c4c5718.pdf",
      "sourceAccessed": "2026-09-03",
      "street": "unspecified betting round",
      "player": "B or C",
      "context": "A bets 500; B raises to 1,000; C calls; consecutive all-ins move the wager to 1,300 and 1,700.",
      "input": {
        "currentWager": "1700",
        "lastFullIncrement": "500",
        "hasActed": true,
        "wagerLevelAfterLastAction": "1000",
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": true,
        "incrementNowFaced": "700",
        "reopeningThresholdWagerLevel": "1500",
        "minimumFullRaiseTo": "2200",
        "reasonCode": "acted-player-faces-full-increment"
      }
    },
    {
      "id": "tda-derived-opening-underbet-acted-checker",
      "label": "TDA rule-derived boundary — checker faces a short opening all-in",
      "claimSet": "tda-rule-derived",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Synthetic opening-underbet check for an acted player derived from Poker TDA 2024 Rules 43 and 47",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "post-flop synthetic",
      "player": "A",
      "context": "A checks at wager level 0; B then opens all-in for 50 where a full opening bet would be 100.",
      "input": {
        "currentWager": "50",
        "lastFullIncrement": "100",
        "hasActed": true,
        "wagerLevelAfterLastAction": "0",
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": false,
        "incrementNowFaced": "50",
        "reopeningThresholdWagerLevel": "100",
        "minimumFullRaiseTo": null,
        "reasonCode": "acted-player-below-full-increment"
      }
    },
    {
      "id": "tda-derived-opening-underbet-unacted-player",
      "label": "TDA rule-derived boundary — unacted player faces a short opening all-in",
      "claimSet": "tda-rule-derived",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Synthetic opening-underbet check for an unacted player derived from Poker TDA 2024 Rules 43 and 47",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "post-flop synthetic",
      "player": "C",
      "context": "B opens all-in for 50 where a full opening bet would be 100; C has not acted on the round.",
      "input": {
        "currentWager": "50",
        "lastFullIncrement": "100",
        "hasActed": false,
        "wagerLevelAfterLastAction": null,
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": true,
        "incrementNowFaced": null,
        "reopeningThresholdWagerLevel": null,
        "minimumFullRaiseTo": "150",
        "reasonCode": "unacted-player-retains-raise-rights"
      }
    },
    {
      "id": "synthetic-decimal-equality",
      "label": "Synthetic boundary — equality at six-decimal precision",
      "claimSet": "synthetic-boundary",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Synthetic equality boundary derived from Poker TDA 2024 Rules 43 and 47",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "synthetic",
      "player": "Actor",
      "context": "The change in wager level equals the full increment exactly.",
      "input": {
        "currentWager": "200.000001",
        "lastFullIncrement": "100",
        "hasActed": true,
        "wagerLevelAfterLastAction": "100.000001",
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": true,
        "incrementNowFaced": "100",
        "reopeningThresholdWagerLevel": "200.000001",
        "minimumFullRaiseTo": "300.000001",
        "reasonCode": "acted-player-faces-full-increment"
      }
    },
    {
      "id": "synthetic-decimal-one-unit-short",
      "label": "Synthetic boundary — 0.000001 below equality",
      "claimSet": "synthetic-boundary",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Synthetic below-boundary check derived from Poker TDA 2024 Rules 43 and 47",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "synthetic",
      "player": "Actor",
      "context": "The change in wager level is one smallest supported decimal unit below the full increment.",
      "input": {
        "currentWager": "200",
        "lastFullIncrement": "100",
        "hasActed": true,
        "wagerLevelAfterLastAction": "100.000001",
        "playerState": "active"
      },
      "expected": {
        "applicable": true,
        "mayRaise": false,
        "incrementNowFaced": "99.999999",
        "reopeningThresholdWagerLevel": "200.000001",
        "minimumFullRaiseTo": null,
        "reasonCode": "acted-player-below-full-increment"
      }
    },
    {
      "id": "synthetic-folded-not-applicable",
      "label": "Synthetic status boundary — folded player",
      "claimSet": "synthetic-boundary",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Synthetic applicability check derived from Poker TDA 2024 Rules 43 and 47",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "synthetic",
      "player": "Actor",
      "context": "A folded player is outside the calculator's active-player scope.",
      "input": {
        "currentWager": "200",
        "lastFullIncrement": "100",
        "hasActed": true,
        "wagerLevelAfterLastAction": "100",
        "playerState": "folded"
      },
      "expected": {
        "applicable": false,
        "mayRaise": null,
        "incrementNowFaced": null,
        "reopeningThresholdWagerLevel": null,
        "minimumFullRaiseTo": null,
        "reasonCode": "player-folded"
      }
    },
    {
      "id": "synthetic-all-in-not-applicable",
      "label": "Synthetic status boundary — all-in player",
      "claimSet": "synthetic-boundary",
      "ruleset": "Poker TDA 2024 Rules Version 1.0, Rules 43 and 47",
      "sourceRef": "poker-tda-2024-v1-rules-43-47",
      "sourceLocation": "Synthetic applicability check derived from Poker TDA 2024 Rules 43 and 47",
      "sourceUrl": "https://www.pokertda.com/view-poker-tda-rules/",
      "sourceAccessed": "2026-09-03",
      "street": "synthetic",
      "player": "Actor",
      "context": "An all-in player has no later action and is outside the calculator's active-player scope.",
      "input": {
        "currentWager": "200",
        "lastFullIncrement": "100",
        "hasActed": true,
        "wagerLevelAfterLastAction": "100",
        "playerState": "all-in"
      },
      "expected": {
        "applicable": false,
        "mayRaise": null,
        "incrementNowFaced": null,
        "reopeningThresholdWagerLevel": null,
        "minimumFullRaiseTo": null,
        "reasonCode": "player-all-in"
      }
    }
  ]
}
