{"abstract":"After a reverse the next player is the one in the old direction.","category":"Card game rule engines","checks":8,"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].","evaluation_group":"w2-card-game-rule-engines-uno-turn","failed_approach":"Negating the step for every card inverts play direction for ordinary cards.","family":"w2-card-game-rule-engines-uno-turn-reverse-timing","id":"FA-83516","implementations":{"attempt":{"sha256":"b9c3d1509b9c50fa17fa639697fdccaf7f018abdd46b2abbcd0d57a1c2b31ac9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    n, cur, direction, card = x\n    step = 1\n    victim = None\n    draw = 0\n    if card == 'reverse':\n        direction = -direction\n        if n == 2:\n            step = 2\n    elif card == 'skip':\n        step = 2\n    elif card in ('draw2', 'wild4'):\n        victim = (cur + direction) % n\n        draw = 2 if card == 'draw2' else 4\n        step = 2\n    nxt = (cur - direction * step) % n\n    return [nxt, direction, draw, victim]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[2, 1, 1, 'wild'], [0, 1, 0, None]], [[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, 'reverse'], [1, 1, 0, None]], [[3, 0, -1, 'wild4'], [1, -1, 4, 2]]], [[[3, 0, -1, 'skip'], [1, -1, 0, None]], [[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, 'num'], [0, -1, 0, None]], [[4, 0, 1, 'reverse'], [3, -1, 0, None]]], [[[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]], [[4, 3, 1, 'reverse'], [2, -1, 0, None]]], [[[3, 2, 1, 'wild4'], [1, 1, 4, 0]], [[3, 2, -1, 'skip'], [0, -1, 0, None]], [[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]], [[5, 2, 1, 'reverse'], [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, 'reverse'], [0, -1, 0, None]], [[6, 0, 1, 'reverse'], [5, -1, 0, None]]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"turn case %d\" % i, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"79583007159cab66a34d1c8b4b718fbb6f4a4abf38d69ae754322921fa390866","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    n, cur, direction, card = x\n    step = 1\n    victim = None\n    draw = 0\n    if card == 'reverse':\n        if n == 2:\n            step = 2\n    elif card == 'skip':\n        step = 2\n    elif card in ('draw2', 'wild4'):\n        victim = (cur + direction) % n\n        draw = 2 if card == 'draw2' else 4\n        step = 2\n    nxt = (cur + direction * step) % n\n    if card == 'reverse':\n        direction = -direction\n    return [nxt, direction, draw, victim]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[2, 1, 1, 'wild'], [0, 1, 0, None]], [[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, 'reverse'], [1, 1, 0, None]], [[3, 0, -1, 'wild4'], [1, -1, 4, 2]]], [[[3, 0, -1, 'skip'], [1, -1, 0, None]], [[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, 'num'], [0, -1, 0, None]], [[4, 0, 1, 'reverse'], [3, -1, 0, None]]], [[[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]], [[4, 3, 1, 'reverse'], [2, -1, 0, None]]], [[[3, 2, 1, 'wild4'], [1, 1, 4, 0]], [[3, 2, -1, 'skip'], [0, -1, 0, None]], [[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]], [[5, 2, 1, 'reverse'], [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, 'reverse'], [0, -1, 0, None]], [[6, 0, 1, 'reverse'], [5, -1, 0, None]]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"turn case %d\" % i, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"5d4362ec041e79520cfe26b96145a947ce647208308f8fc914db2cd9749521cf","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    n, cur, direction, card = x\n    step = 1\n    victim = None\n    draw = 0\n    if card == 'reverse':\n        direction = -direction\n        if n == 2:\n            step = 2\n    elif card == 'skip':\n        step = 2\n    elif card in ('draw2', 'wild4'):\n        victim = (cur + direction) % n\n        draw = 2 if card == 'draw2' else 4\n        step = 2\n    nxt = (cur + direction * step) % n\n    return [nxt, direction, draw, victim]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[2, 1, 1, 'wild'], [0, 1, 0, None]], [[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, 'reverse'], [1, 1, 0, None]], [[3, 0, -1, 'wild4'], [1, -1, 4, 2]]], [[[3, 0, -1, 'skip'], [1, -1, 0, None]], [[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, 'num'], [0, -1, 0, None]], [[4, 0, 1, 'reverse'], [3, -1, 0, None]]], [[[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]], [[4, 3, 1, 'reverse'], [2, -1, 0, None]]], [[[3, 2, 1, 'wild4'], [1, 1, 4, 0]], [[3, 2, -1, 'skip'], [0, -1, 0, None]], [[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]], [[5, 2, 1, 'reverse'], [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, 'reverse'], [0, -1, 0, None]], [[6, 0, 1, 'reverse'], [5, -1, 0, None]]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"turn case %d\" % i, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-card-game-rule-engines-uno-turn-reverse-timing","generated_at":"2026-09-29T14:50:22.295797+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Card-game engines, scoring apps and online tables apply this rule automatically on every hand.","repair":"Flip direction before advancing.","root_cause":"The direction is flipped after computing the next player.","sha256":"e660f9404d8184e8c907f36f63ce6441922343f8e47dc23888f2654a8e14cc81","title":"Reverse moves play in the old direction first · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.227,"exit_code":1,"observations":[{"actual":[0,1,0,null],"check":"turn case 0","expected":[0,1,0,null],"passed":true},{"actual":[1,1,4,0],"check":"turn case 1","expected":[1,1,4,0],"passed":true},{"actual":[1,-1,0,null],"check":"turn case 2","expected":[1,-1,0,null],"passed":true},{"actual":[0,-1,0,null],"check":"turn case 3","expected":[0,-1,0,null],"passed":true},{"actual":[1,1,2,1],"check":"turn case 4","expected":[2,1,2,1],"passed":false},{"actual":[2,1,0,null],"check":"turn case 5","expected":[1,1,0,null],"passed":false},{"actual":[2,1,0,null],"check":"turn case 6","expected":[1,1,0,null],"passed":false},{"actual":[2,-1,4,2],"check":"turn case 7","expected":[1,-1,4,2],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"turn case 0\", \"actual\": [0, 1, 0, null], \"expected\": [0, 1, 0, null], \"passed\": true}, {\"check\": \"turn case 1\", \"actual\": [1, 1, 4, 0], \"expected\": [1, 1, 4, 0], \"passed\": true}, {\"check\": \"turn case 2\", \"actual\": [1, -1, 0, null], \"expected\": [1, -1, 0, null], \"passed\": true}, {\"check\": \"turn case 3\", \"actual\": [0, -1, 0, null], \"expected\": [0, -1, 0, null], \"passed\": true}, {\"check\": \"turn case 4\", \"actual\": [1, 1, 2, 1], \"expected\": [2, 1, 2, 1], \"passed\": false}, {\"check\": \"turn case 5\", \"actual\": [2, 1, 0, null], \"expected\": [1, 1, 0, null], \"passed\": false}, {\"check\": \"turn case 6\", \"actual\": [2, 1, 0, null], \"expected\": [1, 1, 0, null], \"passed\": false}, {\"check\": \"turn case 7\", \"actual\": [2, -1, 4, 2], \"expected\": [1, -1, 4, 2], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.356,"exit_code":1,"observations":[{"actual":[0,1,0,null],"check":"turn case 0","expected":[0,1,0,null],"passed":true},{"actual":[1,1,4,0],"check":"turn case 1","expected":[1,1,4,0],"passed":true},{"actual":[1,-1,0,null],"check":"turn case 2","expected":[1,-1,0,null],"passed":true},{"actual":[0,-1,0,null],"check":"turn case 3","expected":[0,-1,0,null],"passed":true},{"actual":[2,1,2,1],"check":"turn case 4","expected":[2,1,2,1],"passed":true},{"actual":[1,1,0,null],"check":"turn case 5","expected":[1,1,0,null],"passed":true},{"actual":[2,1,0,null],"check":"turn case 6","expected":[1,1,0,null],"passed":false},{"actual":[1,-1,4,2],"check":"turn case 7","expected":[1,-1,4,2],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"turn case 0\", \"actual\": [0, 1, 0, null], \"expected\": [0, 1, 0, null], \"passed\": true}, {\"check\": \"turn case 1\", \"actual\": [1, 1, 4, 0], \"expected\": [1, 1, 4, 0], \"passed\": true}, {\"check\": \"turn case 2\", \"actual\": [1, -1, 0, null], \"expected\": [1, -1, 0, null], \"passed\": true}, {\"check\": \"turn case 3\", \"actual\": [0, -1, 0, null], \"expected\": [0, -1, 0, null], \"passed\": true}, {\"check\": \"turn case 4\", \"actual\": [2, 1, 2, 1], \"expected\": [2, 1, 2, 1], \"passed\": true}, {\"check\": \"turn case 5\", \"actual\": [1, 1, 0, null], \"expected\": [1, 1, 0, null], \"passed\": true}, {\"check\": \"turn case 6\", \"actual\": [2, 1, 0, null], \"expected\": [1, 1, 0, null], \"passed\": false}, {\"check\": \"turn case 7\", \"actual\": [1, -1, 4, 2], \"expected\": [1, -1, 4, 2], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.373,"exit_code":0,"observations":[{"actual":[0,1,0,null],"check":"turn case 0","expected":[0,1,0,null],"passed":true},{"actual":[1,1,4,0],"check":"turn case 1","expected":[1,1,4,0],"passed":true},{"actual":[1,-1,0,null],"check":"turn case 2","expected":[1,-1,0,null],"passed":true},{"actual":[0,-1,0,null],"check":"turn case 3","expected":[0,-1,0,null],"passed":true},{"actual":[2,1,2,1],"check":"turn case 4","expected":[2,1,2,1],"passed":true},{"actual":[1,1,0,null],"check":"turn case 5","expected":[1,1,0,null],"passed":true},{"actual":[1,1,0,null],"check":"turn case 6","expected":[1,1,0,null],"passed":true},{"actual":[1,-1,4,2],"check":"turn case 7","expected":[1,-1,4,2],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"turn case 0\", \"actual\": [0, 1, 0, null], \"expected\": [0, 1, 0, null], \"passed\": true}, {\"check\": \"turn case 1\", \"actual\": [1, 1, 4, 0], \"expected\": [1, 1, 4, 0], \"passed\": true}, {\"check\": \"turn case 2\", \"actual\": [1, -1, 0, null], \"expected\": [1, -1, 0, null], \"passed\": true}, {\"check\": \"turn case 3\", \"actual\": [0, -1, 0, null], \"expected\": [0, -1, 0, null], \"passed\": true}, {\"check\": \"turn case 4\", \"actual\": [2, 1, 2, 1], \"expected\": [2, 1, 2, 1], \"passed\": true}, {\"check\": \"turn case 5\", \"actual\": [1, 1, 0, null], \"expected\": [1, 1, 0, null], \"passed\": true}, {\"check\": \"turn case 6\", \"actual\": [1, 1, 0, null], \"expected\": [1, 1, 0, null], \"passed\": true}, {\"check\": \"turn case 7\", \"actual\": [1, -1, 4, 2], \"expected\": [1, -1, 4, 2], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}