FA-83526 / Card game rule engines / Open access
The draw victim still takes a turn · case 01
After a draw two the victim plays immediately.
ROOT CAUSE
The draw branch advances one seat.
VERIFIED REPAIR
Draw cards also skip the victim.
Unsuccessful approach: Skipping only on wild draw four lets draw-two victims play.
Case contract
Input [players, current, direction(+1/-1), card]. Reverse flips direction (with two players it acts as skip); skip jumps one player; draw2/wild4 make the next player draw 2/4 and lose their turn. Return [next_player, direction, draw_count, victim_or_None].
Why this case matters
Card-game engines, scoring apps and online tables apply this rule automatically on every hand.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
n, cur, direction, card = x
step = 1
victim = None
draw = 0
if card == 'reverse':
direction = -direction
if n == 2:
step = 2
elif card == 'skip':
step = 2
elif card in ('draw2', 'wild4'):
victim = (cur + direction) % n
draw = 2 if card == 'draw2' else 4
step = 1
nxt = (cur + direction * step) % n
return [nxt, direction, draw, victim]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[2, 0, 1, 'draw2'], [0, 1, 2, 1]], [[2, 1, 1, 'wild4'], [1, 1, 4, 0]], [[2, 1, -1, 'skip'], [1, -1, 0, None]], [[2, 1, -1, 'wild'], [0, -1, 0, None]], [[3, 0, 1, 'draw2'], [2, 1, 2, 1]], [[3, 0, 1, 'wild'], [1, 1, 0, None]], [[3, 0, 1, 'wild4'], [2, 1, 4, 1]], [[4, 2, -1, 'draw2'], [0, -1, 2, 1]]], [[[3, 0, 1, 'draw2'], [2, 1, 2, 1]], [[3, 0, -1, 'reverse'], [1, 1, 0, None]], [[3, 0, -1, 'wild'], [2, -1, 0, None]], [[3, 0, -1, 'wild4'], [1, -1, 4, 2]], [[3, 1, 1, 'num'], [2, 1, 0, None]], [[3, 1, 1, 'skip'], [0, 1, 0, None]], [[3, 1, 1, 'wild'], [2, 1, 0, None]], [[5, 3, 1, 'draw2'], [0, 1, 2, 4]]], [[[3, 1, 1, 'wild4'], [0, 1, 4, 2]], [[3, 1, -1, 'num'], [0, -1, 0, None]], [[3, 1, -1, 'skip'], [2, -1, 0, None]], [[3, 1, -1, 'reverse'], [2, 1, 0, None]], [[3, 1, -1, 'wild4'], [2, -1, 4, 0]], [[3, 2, 1, 'skip'], [1, 1, 0, None]], [[3, 2, 1, 'draw2'], [1, 1, 2, 0]], [[6, 3, -1, 'draw2'], [1, -1, 2, 2]]], [[[3, 2, 1, 'draw2'], [1, 1, 2, 0]], [[3, 2, 1, 'wild4'], [1, 1, 4, 0]], [[3, 2, -1, 'reverse'], [0, 1, 0, None]], [[3, 2, -1, 'wild4'], [0, -1, 4, 1]], [[4, 0, 1, 'num'], [1, 1, 0, None]], [[4, 0, 1, 'skip'], [2, 1, 0, None]], [[4, 0, 1, 'reverse'], [3, -1, 0, None]], [[4, 0, 1, 'wild'], [1, 1, 0, None]]], [[[4, 0, 1, 'wild'], [1, 1, 0, None]], [[4, 0, 1, 'wild4'], [2, 1, 4, 1]], [[4, 0, -1, 'num'], [3, -1, 0, None]], [[4, 0, -1, 'skip'], [2, -1, 0, None]], [[4, 0, -1, 'wild4'], [2, -1, 4, 3]], [[4, 1, 1, 'num'], [2, 1, 0, None]], [[4, 1, 1, 'skip'], [3, 1, 0, None]], [[5, 0, 1, 'draw2'], [2, 1, 2, 1]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("turn case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| turn case 0 | [1, 1, 2, 1] | [0, 1, 2, 1] | Failed |
| turn case 1 | [0, 1, 4, 0] | [1, 1, 4, 0] | Failed |
| turn case 2 | [1, -1, 0, None] | [1, -1, 0, None] | Passed |
| turn case 3 | [0, -1, 0, None] | [0, -1, 0, None] | Passed |
| turn case 4 | [1, 1, 2, 1] | [2, 1, 2, 1] | Failed |
| turn case 5 | [1, 1, 0, None] | [1, 1, 0, None] | Passed |
| turn case 6 | [1, 1, 4, 1] | [2, 1, 4, 1] | Failed |
| turn case 7 | [1, -1, 2, 1] | [0, -1, 2, 1] | Failed |
SHA-256 / e52ecff65547e482afb657faedabf811527a13b7aef0ea3129f1d0a5c90098dd
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
n, cur, direction, card = x
step = 1
victim = None
draw = 0
if card == 'reverse':
direction = -direction
if n == 2:
step = 2
elif card == 'skip':
step = 2
elif card in ('draw2', 'wild4'):
victim = (cur + direction) % n
draw = 2 if card == 'draw2' else 4
step = 2 if card == 'wild4' else 1
nxt = (cur + direction * step) % n
return [nxt, direction, draw, victim]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[2, 0, 1, 'draw2'], [0, 1, 2, 1]], [[2, 1, 1, 'wild4'], [1, 1, 4, 0]], [[2, 1, -1, 'skip'], [1, -1, 0, None]], [[2, 1, -1, 'wild'], [0, -1, 0, None]], [[3, 0, 1, 'draw2'], [2, 1, 2, 1]], [[3, 0, 1, 'wild'], [1, 1, 0, None]], [[3, 0, 1, 'wild4'], [2, 1, 4, 1]], [[4, 2, -1, 'draw2'], [0, -1, 2, 1]]], [[[3, 0, 1, 'draw2'], [2, 1, 2, 1]], [[3, 0, -1, 'reverse'], [1, 1, 0, None]], [[3, 0, -1, 'wild'], [2, -1, 0, None]], [[3, 0, -1, 'wild4'], [1, -1, 4, 2]], [[3, 1, 1, 'num'], [2, 1, 0, None]], [[3, 1, 1, 'skip'], [0, 1, 0, None]], [[3, 1, 1, 'wild'], [2, 1, 0, None]], [[5, 3, 1, 'draw2'], [0, 1, 2, 4]]], [[[3, 1, 1, 'wild4'], [0, 1, 4, 2]], [[3, 1, -1, 'num'], [0, -1, 0, None]], [[3, 1, -1, 'skip'], [2, -1, 0, None]], [[3, 1, -1, 'reverse'], [2, 1, 0, None]], [[3, 1, -1, 'wild4'], [2, -1, 4, 0]], [[3, 2, 1, 'skip'], [1, 1, 0, None]], [[3, 2, 1, 'draw2'], [1, 1, 2, 0]], [[6, 3, -1, 'draw2'], [1, -1, 2, 2]]], [[[3, 2, 1, 'draw2'], [1, 1, 2, 0]], [[3, 2, 1, 'wild4'], [1, 1, 4, 0]], [[3, 2, -1, 'reverse'], [0, 1, 0, None]], [[3, 2, -1, 'wild4'], [0, -1, 4, 1]], [[4, 0, 1, 'num'], [1, 1, 0, None]], [[4, 0, 1, 'skip'], [2, 1, 0, None]], [[4, 0, 1, 'reverse'], [3, -1, 0, None]], [[4, 0, 1, 'wild'], [1, 1, 0, None]]], [[[4, 0, 1, 'wild'], [1, 1, 0, None]], [[4, 0, 1, 'wild4'], [2, 1, 4, 1]], [[4, 0, -1, 'num'], [3, -1, 0, None]], [[4, 0, -1, 'skip'], [2, -1, 0, None]], [[4, 0, -1, 'wild4'], [2, -1, 4, 3]], [[4, 1, 1, 'num'], [2, 1, 0, None]], [[4, 1, 1, 'skip'], [3, 1, 0, None]], [[5, 0, 1, 'draw2'], [2, 1, 2, 1]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("turn case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| turn case 0 | [1, 1, 2, 1] | [0, 1, 2, 1] | Failed |
| turn case 1 | [1, 1, 4, 0] | [1, 1, 4, 0] | Passed |
| turn case 2 | [1, -1, 0, None] | [1, -1, 0, None] | Passed |
| turn case 3 | [0, -1, 0, None] | [0, -1, 0, None] | Passed |
| turn case 4 | [1, 1, 2, 1] | [2, 1, 2, 1] | Failed |
| turn case 5 | [1, 1, 0, None] | [1, 1, 0, None] | Passed |
| turn case 6 | [2, 1, 4, 1] | [2, 1, 4, 1] | Passed |
| turn case 7 | [1, -1, 2, 1] | [0, -1, 2, 1] | Failed |
SHA-256 / 71d2f207a2bc47d0ee22932e3a8521121491dce108a381f5a04e5d2dc9f2ecb1
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
n, cur, direction, card = x
step = 1
victim = None
draw = 0
if card == 'reverse':
direction = -direction
if n == 2:
step = 2
elif card == 'skip':
step = 2
elif card in ('draw2', 'wild4'):
victim = (cur + direction) % n
draw = 2 if card == 'draw2' else 4
step = 2
nxt = (cur + direction * step) % n
return [nxt, direction, draw, victim]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[2, 0, 1, 'draw2'], [0, 1, 2, 1]], [[2, 1, 1, 'wild4'], [1, 1, 4, 0]], [[2, 1, -1, 'skip'], [1, -1, 0, None]], [[2, 1, -1, 'wild'], [0, -1, 0, None]], [[3, 0, 1, 'draw2'], [2, 1, 2, 1]], [[3, 0, 1, 'wild'], [1, 1, 0, None]], [[3, 0, 1, 'wild4'], [2, 1, 4, 1]], [[4, 2, -1, 'draw2'], [0, -1, 2, 1]]], [[[3, 0, 1, 'draw2'], [2, 1, 2, 1]], [[3, 0, -1, 'reverse'], [1, 1, 0, None]], [[3, 0, -1, 'wild'], [2, -1, 0, None]], [[3, 0, -1, 'wild4'], [1, -1, 4, 2]], [[3, 1, 1, 'num'], [2, 1, 0, None]], [[3, 1, 1, 'skip'], [0, 1, 0, None]], [[3, 1, 1, 'wild'], [2, 1, 0, None]], [[5, 3, 1, 'draw2'], [0, 1, 2, 4]]], [[[3, 1, 1, 'wild4'], [0, 1, 4, 2]], [[3, 1, -1, 'num'], [0, -1, 0, None]], [[3, 1, -1, 'skip'], [2, -1, 0, None]], [[3, 1, -1, 'reverse'], [2, 1, 0, None]], [[3, 1, -1, 'wild4'], [2, -1, 4, 0]], [[3, 2, 1, 'skip'], [1, 1, 0, None]], [[3, 2, 1, 'draw2'], [1, 1, 2, 0]], [[6, 3, -1, 'draw2'], [1, -1, 2, 2]]], [[[3, 2, 1, 'draw2'], [1, 1, 2, 0]], [[3, 2, 1, 'wild4'], [1, 1, 4, 0]], [[3, 2, -1, 'reverse'], [0, 1, 0, None]], [[3, 2, -1, 'wild4'], [0, -1, 4, 1]], [[4, 0, 1, 'num'], [1, 1, 0, None]], [[4, 0, 1, 'skip'], [2, 1, 0, None]], [[4, 0, 1, 'reverse'], [3, -1, 0, None]], [[4, 0, 1, 'wild'], [1, 1, 0, None]]], [[[4, 0, 1, 'wild'], [1, 1, 0, None]], [[4, 0, 1, 'wild4'], [2, 1, 4, 1]], [[4, 0, -1, 'num'], [3, -1, 0, None]], [[4, 0, -1, 'skip'], [2, -1, 0, None]], [[4, 0, -1, 'wild4'], [2, -1, 4, 3]], [[4, 1, 1, 'num'], [2, 1, 0, None]], [[4, 1, 1, 'skip'], [3, 1, 0, None]], [[5, 0, 1, 'draw2'], [2, 1, 2, 1]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("turn case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| turn case 0 | [0, 1, 2, 1] | [0, 1, 2, 1] | Passed |
| turn case 1 | [1, 1, 4, 0] | [1, 1, 4, 0] | Passed |
| turn case 2 | [1, -1, 0, None] | [1, -1, 0, None] | Passed |
| turn case 3 | [0, -1, 0, None] | [0, -1, 0, None] | Passed |
| turn case 4 | [2, 1, 2, 1] | [2, 1, 2, 1] | Passed |
| turn case 5 | [1, 1, 0, None] | [1, 1, 0, None] | Passed |
| turn case 6 | [2, 1, 4, 1] | [2, 1, 4, 1] | Passed |
| turn case 7 | [0, -1, 2, 1] | [0, -1, 2, 1] | Passed |
SHA-256 / e0953cfa1e3dab0f7dc64b0f836d3436ca1d92865721cf30bf884dda97234719
Verification & scope
A bounded toy rule contract stated explicitly in the contract field; cards are two-character codes (rank, suit). Not a complete implementation of any published rulebook or casino table rules. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:50:22.460705+00:00.
Case digest / 6e8c2876654ddc3da4e1d296bb78c383f96db2e36d52468379c7b6dd9b30f377