{"abstract":"With king and enemy rook on the fifth rank and only the two pawns between them, en passant is allowed.","category":"Chess move legality","checks":8,"contract":"Input: {\"board\", \"move\": [from, to], \"ep\": target square or null}. Return true when the move is a legal en passant capture: a pawn on its fifth rank moves diagonally forward onto the ep square, an enemy pawn stands beside it on the origin rank, and after removing both pawns from their squares and placing the capturer, no enemy rook, bishop or queen attacks the mover's king along an open line.","evaluation_group":"w2-chess_move_legality-en-passant-legality","failed_approach":"Removing only the victim leaves the capturer on its origin square as a shield.","family":"w2-chess_move_legality-en-passant-legality-both-pawns-vacate-the-rank","id":"FA-82416","implementations":{"attempt":{"sha256":"a612c39df2fbef55d2901b4e65dd8e7fe38a9afeb728c234d53750775cafd44c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    b=dict(x['board']); fr,to=x['move']; p=b.get(fr)\n    if p not in ('P','p') or to!=x['ep']: return False\n    white=p=='P'\n    d=1 if white else -1\n    f0,r0=ord(fr[0])-97,int(fr[1])-1\n    f1,r1=ord(to[0])-97,int(to[1])-1\n    if r1-r0!=d or abs(f1-f0)!=1: return False\n    if r0!=(4 if white else 3): return False\n    victim=to[0]+fr[1]\n    if b.get(victim)!=('p' if white else 'P'): return False\n    del b[victim]; b[to]=p\n    ks=[s for s,v in b.items() if v==('K' if white else 'k')][0]\n    kf,kr=ord(ks[0])-97,int(ks[1])-1\n    for df,dr in ((1,0),(-1,0),(0,1),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1)):\n        cf,cr=kf+df,kr+dr\n        while 0<=cf<8 and 0<=cr<8:\n            v=b.get(chr(97+cf)+str(cr+1))\n            if v:\n                if v.isupper()!=white and v.lower() in (('r','q') if df==0 or dr==0 else ('b','q')): return False\n                break\n            cf+=df; cr+=dr\n    return True\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('plain ep',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd6', 'move': ['e5', 'd6']},\n   True),\n  ('black ep',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'e3', 'move': ['d4', 'e3']},\n   True),\n  ('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('bishop diagonal after ep',\n   {'board': {'c3': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p', 'f6': 'n', 'h8': 'b'},\n    'ep': 'f6',\n    'move': ['e5', 'f6']},\n   True),\n  ('no ep square',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': None, 'move': ['e5', 'd6']},\n   False),\n  ('wrong target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p'},\n    'ep': 'd6',\n    'move': ['e5', 'f6']},\n   False),\n  ('wrong rank for white',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'd5', 'move': ['e4', 'd5']},\n   False)],\n [('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('no ep square',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': None, 'move': ['e5', 'd6']},\n   False),\n  ('wrong target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p'},\n    'ep': 'd6',\n    'move': ['e5', 'f6']},\n   False),\n  ('wrong rank for white',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'd5', 'move': ['e4', 'd5']},\n   False),\n  ('black wrong rank',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'e4', 'move': ['d5', 'e4']},\n   False),\n  ('file rook behind pawn',\n   {'board': {'d1': 'K', 'd5': 'p', 'd8': 'r', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('same file ep target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd3', 'move': ['e5', 'd6']},\n   False)],\n [('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('black wrong rank',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'e4', 'move': ['d5', 'e4']},\n   False),\n  ('file rook behind pawn',\n   {'board': {'d1': 'K', 'd5': 'p', 'd8': 'r', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('same file ep target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd3', 'move': ['e5', 'd6']},\n   False),\n  ('pin by own rook harmless',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'R'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('bishop on the rank',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'b'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('rook on the diagonal',\n   {'board': {'c3': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'g7': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True)],\n [('plain ep',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd6', 'move': ['e5', 'd6']},\n   True),\n  ('black ep',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'e3', 'move': ['d4', 'e3']},\n   True),\n  ('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('pin by own rook harmless',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'R'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('bishop on the rank',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'b'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('rook on the diagonal',\n   {'board': {'c3': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'g7': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('rook on file of ep square',\n   {'board': {'a1': 'K', 'd1': 'r', 'd5': 'p', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False)],\n [('plain ep',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd6', 'move': ['e5', 'd6']},\n   True),\n  ('black ep',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'e3', 'move': ['d4', 'e3']},\n   True),\n  ('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('bishop diagonal after ep',\n   {'board': {'c3': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p', 'f6': 'n', 'h8': 'b'},\n    'ep': 'f6',\n    'move': ['e5', 'f6']},\n   True),\n  ('no ep square',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': None, 'move': ['e5', 'd6']},\n   False),\n  ('wrong target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p'},\n    'ep': 'd6',\n    'move': ['e5', 'f6']},\n   False),\n  ('rook on file of ep square',\n   {'board': {'a1': 'K', 'd1': 'r', 'd5': 'p', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False)]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, 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":"5e5adb91453dba1a3064c0b21bad638ab01e53f3b24ac7e5efb9096cb67a8c84","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    b=dict(x['board']); fr,to=x['move']; p=b.get(fr)\n    if p not in ('P','p') or to!=x['ep']: return False\n    white=p=='P'\n    d=1 if white else -1\n    f0,r0=ord(fr[0])-97,int(fr[1])-1\n    f1,r1=ord(to[0])-97,int(to[1])-1\n    if r1-r0!=d or abs(f1-f0)!=1: return False\n    if r0!=(4 if white else 3): return False\n    victim=to[0]+fr[1]\n    if b.get(victim)!=('p' if white else 'P'): return False\n    del b[fr]; b[to]=p\n    ks=[s for s,v in b.items() if v==('K' if white else 'k')][0]\n    kf,kr=ord(ks[0])-97,int(ks[1])-1\n    for df,dr in ((1,0),(-1,0),(0,1),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1)):\n        cf,cr=kf+df,kr+dr\n        while 0<=cf<8 and 0<=cr<8:\n            v=b.get(chr(97+cf)+str(cr+1))\n            if v:\n                if v.isupper()!=white and v.lower() in (('r','q') if df==0 or dr==0 else ('b','q')): return False\n                break\n            cf+=df; cr+=dr\n    return True\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('plain ep',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd6', 'move': ['e5', 'd6']},\n   True),\n  ('black ep',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'e3', 'move': ['d4', 'e3']},\n   True),\n  ('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('bishop diagonal after ep',\n   {'board': {'c3': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p', 'f6': 'n', 'h8': 'b'},\n    'ep': 'f6',\n    'move': ['e5', 'f6']},\n   True),\n  ('no ep square',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': None, 'move': ['e5', 'd6']},\n   False),\n  ('wrong target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p'},\n    'ep': 'd6',\n    'move': ['e5', 'f6']},\n   False),\n  ('wrong rank for white',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'd5', 'move': ['e4', 'd5']},\n   False)],\n [('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('no ep square',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': None, 'move': ['e5', 'd6']},\n   False),\n  ('wrong target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p'},\n    'ep': 'd6',\n    'move': ['e5', 'f6']},\n   False),\n  ('wrong rank for white',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'd5', 'move': ['e4', 'd5']},\n   False),\n  ('black wrong rank',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'e4', 'move': ['d5', 'e4']},\n   False),\n  ('file rook behind pawn',\n   {'board': {'d1': 'K', 'd5': 'p', 'd8': 'r', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('same file ep target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd3', 'move': ['e5', 'd6']},\n   False)],\n [('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('black wrong rank',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'e4', 'move': ['d5', 'e4']},\n   False),\n  ('file rook behind pawn',\n   {'board': {'d1': 'K', 'd5': 'p', 'd8': 'r', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('same file ep target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd3', 'move': ['e5', 'd6']},\n   False),\n  ('pin by own rook harmless',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'R'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('bishop on the rank',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'b'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('rook on the diagonal',\n   {'board': {'c3': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'g7': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True)],\n [('plain ep',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd6', 'move': ['e5', 'd6']},\n   True),\n  ('black ep',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'e3', 'move': ['d4', 'e3']},\n   True),\n  ('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('pin by own rook harmless',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'R'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('bishop on the rank',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'b'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('rook on the diagonal',\n   {'board': {'c3': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'g7': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('rook on file of ep square',\n   {'board': {'a1': 'K', 'd1': 'r', 'd5': 'p', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False)],\n [('plain ep',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd6', 'move': ['e5', 'd6']},\n   True),\n  ('black ep',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'e3', 'move': ['d4', 'e3']},\n   True),\n  ('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('bishop diagonal after ep',\n   {'board': {'c3': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p', 'f6': 'n', 'h8': 'b'},\n    'ep': 'f6',\n    'move': ['e5', 'f6']},\n   True),\n  ('no ep square',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': None, 'move': ['e5', 'd6']},\n   False),\n  ('wrong target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p'},\n    'ep': 'd6',\n    'move': ['e5', 'f6']},\n   False),\n  ('rook on file of ep square',\n   {'board': {'a1': 'K', 'd1': 'r', 'd5': 'p', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False)]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, 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":"cf293895bd33136e5c8e1fa57c4adc9a0a518206e453424fef04036246e8c119","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    b=dict(x['board']); fr,to=x['move']; p=b.get(fr)\n    if p not in ('P','p') or to!=x['ep']: return False\n    white=p=='P'\n    d=1 if white else -1\n    f0,r0=ord(fr[0])-97,int(fr[1])-1\n    f1,r1=ord(to[0])-97,int(to[1])-1\n    if r1-r0!=d or abs(f1-f0)!=1: return False\n    if r0!=(4 if white else 3): return False\n    victim=to[0]+fr[1]\n    if b.get(victim)!=('p' if white else 'P'): return False\n    del b[fr]; del b[victim]; b[to]=p\n    ks=[s for s,v in b.items() if v==('K' if white else 'k')][0]\n    kf,kr=ord(ks[0])-97,int(ks[1])-1\n    for df,dr in ((1,0),(-1,0),(0,1),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1)):\n        cf,cr=kf+df,kr+dr\n        while 0<=cf<8 and 0<=cr<8:\n            v=b.get(chr(97+cf)+str(cr+1))\n            if v:\n                if v.isupper()!=white and v.lower() in (('r','q') if df==0 or dr==0 else ('b','q')): return False\n                break\n            cf+=df; cr+=dr\n    return True\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('plain ep',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd6', 'move': ['e5', 'd6']},\n   True),\n  ('black ep',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'e3', 'move': ['d4', 'e3']},\n   True),\n  ('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('bishop diagonal after ep',\n   {'board': {'c3': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p', 'f6': 'n', 'h8': 'b'},\n    'ep': 'f6',\n    'move': ['e5', 'f6']},\n   True),\n  ('no ep square',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': None, 'move': ['e5', 'd6']},\n   False),\n  ('wrong target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p'},\n    'ep': 'd6',\n    'move': ['e5', 'f6']},\n   False),\n  ('wrong rank for white',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'd5', 'move': ['e4', 'd5']},\n   False)],\n [('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('no ep square',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': None, 'move': ['e5', 'd6']},\n   False),\n  ('wrong target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p'},\n    'ep': 'd6',\n    'move': ['e5', 'f6']},\n   False),\n  ('wrong rank for white',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'd5', 'move': ['e4', 'd5']},\n   False),\n  ('black wrong rank',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'e4', 'move': ['d5', 'e4']},\n   False),\n  ('file rook behind pawn',\n   {'board': {'d1': 'K', 'd5': 'p', 'd8': 'r', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('same file ep target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd3', 'move': ['e5', 'd6']},\n   False)],\n [('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('black wrong rank',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'e4', 'move': ['d5', 'e4']},\n   False),\n  ('file rook behind pawn',\n   {'board': {'d1': 'K', 'd5': 'p', 'd8': 'r', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('same file ep target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd3', 'move': ['e5', 'd6']},\n   False),\n  ('pin by own rook harmless',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'R'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('bishop on the rank',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'b'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('rook on the diagonal',\n   {'board': {'c3': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'g7': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True)],\n [('plain ep',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd6', 'move': ['e5', 'd6']},\n   True),\n  ('black ep',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'e3', 'move': ['d4', 'e3']},\n   True),\n  ('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('pin by own rook harmless',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'R'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('bishop on the rank',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'b'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('rook on the diagonal',\n   {'board': {'c3': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'g7': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   True),\n  ('rook on file of ep square',\n   {'board': {'a1': 'K', 'd1': 'r', 'd5': 'p', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False)],\n [('plain ep',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': 'd6', 'move': ['e5', 'd6']},\n   True),\n  ('black ep',\n   {'board': {'d4': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'ep': 'e3', 'move': ['d4', 'e3']},\n   True),\n  ('rank pin both pawns',\n   {'board': {'a5': 'K', 'd5': 'p', 'e5': 'P', 'e8': 'k', 'h5': 'r'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False),\n  ('rank pin black side',\n   {'board': {'a4': 'Q', 'd4': 'p', 'e1': 'K', 'e4': 'P', 'h4': 'k'},\n    'ep': 'e3',\n    'move': ['d4', 'e3']},\n   False),\n  ('bishop diagonal after ep',\n   {'board': {'c3': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p', 'f6': 'n', 'h8': 'b'},\n    'ep': 'f6',\n    'move': ['e5', 'f6']},\n   True),\n  ('no ep square',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'ep': None, 'move': ['e5', 'd6']},\n   False),\n  ('wrong target',\n   {'board': {'d5': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k', 'f5': 'p'},\n    'ep': 'd6',\n    'move': ['e5', 'f6']},\n   False),\n  ('rook on file of ep square',\n   {'board': {'a1': 'K', 'd1': 'r', 'd5': 'p', 'e5': 'P', 'e8': 'k'},\n    'ep': 'd6',\n    'move': ['e5', 'd6']},\n   False)]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, 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 deterministic toy model with an explicitly stated contract; boards are {square: piece} with white upper-case and black lower-case pieces; no claim of full FIDE Laws conformance. 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-chess_move_legality-en-passant-legality-both-pawns-vacate-the-rank","generated_at":"2026-09-29T14:50:12.053374+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Move validators gate every move in engines, servers and arbiters; accepting an illegal move or rejecting a legal one corrupts the game record.","repair":"Remove both the capturing pawn's origin and the captured pawn before testing king safety.","root_cause":"The captured pawn is left on the board during the safety test, so it still shields the king.","sha256":"0e1397ebbf2ca4e941835b39d2efec1ebd7b9b2466b093a235ff4a78c24090dd","title":"Horizontal pin through two pawns missed · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.314,"exit_code":1,"observations":[{"actual":true,"check":"plain ep","expected":true,"passed":true},{"actual":true,"check":"black ep","expected":true,"passed":true},{"actual":true,"check":"rank pin both pawns","expected":false,"passed":false},{"actual":true,"check":"rank pin black side","expected":false,"passed":false},{"actual":true,"check":"bishop diagonal after ep","expected":true,"passed":true},{"actual":false,"check":"no ep square","expected":false,"passed":true},{"actual":false,"check":"wrong target","expected":false,"passed":true},{"actual":false,"check":"wrong rank for white","expected":false,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"plain ep\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"black ep\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"rank pin both pawns\", \"actual\": true, \"expected\": false, \"passed\": false}, {\"check\": \"rank pin black side\", \"actual\": true, \"expected\": false, \"passed\": false}, {\"check\": \"bishop diagonal after ep\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"no ep square\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"wrong target\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"wrong rank for white\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.388,"exit_code":1,"observations":[{"actual":true,"check":"plain ep","expected":true,"passed":true},{"actual":true,"check":"black ep","expected":true,"passed":true},{"actual":true,"check":"rank pin both pawns","expected":false,"passed":false},{"actual":true,"check":"rank pin black side","expected":false,"passed":false},{"actual":true,"check":"bishop diagonal after ep","expected":true,"passed":true},{"actual":false,"check":"no ep square","expected":false,"passed":true},{"actual":false,"check":"wrong target","expected":false,"passed":true},{"actual":false,"check":"wrong rank for white","expected":false,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"plain ep\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"black ep\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"rank pin both pawns\", \"actual\": true, \"expected\": false, \"passed\": false}, {\"check\": \"rank pin black side\", \"actual\": true, \"expected\": false, \"passed\": false}, {\"check\": \"bishop diagonal after ep\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"no ep square\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"wrong target\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"wrong rank for white\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.368,"exit_code":0,"observations":[{"actual":true,"check":"plain ep","expected":true,"passed":true},{"actual":true,"check":"black ep","expected":true,"passed":true},{"actual":false,"check":"rank pin both pawns","expected":false,"passed":true},{"actual":false,"check":"rank pin black side","expected":false,"passed":true},{"actual":true,"check":"bishop diagonal after ep","expected":true,"passed":true},{"actual":false,"check":"no ep square","expected":false,"passed":true},{"actual":false,"check":"wrong target","expected":false,"passed":true},{"actual":false,"check":"wrong rank for white","expected":false,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"plain ep\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"black ep\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"rank pin both pawns\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"rank pin black side\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"bishop diagonal after ep\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"no ep square\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"wrong target\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"wrong rank for white\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}