{"abstract":"King d1 castles \"kingside\" with the rook on b1.","category":"Chess move legality","checks":8,"contract":"Input: {\"board\", \"side\", \"wing\", \"king_from\", \"rook_from\"}; rights are assumed held. Chess960 castling: the king ends on g (kingside) or c (queenside) and the rook on f or d; the kingside rook must be on the king's h-side and the queenside rook on its a-side. Every square from the leftmost to the rightmost of king start, king end, rook start and rook end must be empty apart from the castling king and rook, and no square the king stands on or passes through (start to end inclusive) may be attacked.","evaluation_group":"w2-chess_move_legality-chess960-castling","failed_approach":"Allowing the adjacent a-side file still accepts rooks on the wrong side.","family":"w2-chess_move_legality-chess960-castling-rook-side-check","id":"FA-82706","implementations":{"attempt":{"sha256":"ca2e3102de1ace246eec445f22d490cb17558a998ba86a5479ab546a4a1d0ab7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    def attacked(bd, sq, by_white):\n        f,r=ord(sq[0])-97,int(sq[1])-1\n        def at(ff,rr):\n            return bd.get(chr(97+ff)+str(rr+1)) if 0<=ff<8 and 0<=rr<8 else None\n        P,N,B,R,Q,K=('PNBRQK' if by_white else 'pnbrqk')\n        pr=r-1 if by_white else r+1\n        if at(f-1,pr)==P or at(f+1,pr)==P: return True\n        for df,dr in ((1,2),(2,1),(-1,2),(-2,1),(1,-2),(2,-1),(-1,-2),(-2,-1)):\n            if at(f+df,r+dr)==N: return True\n        for df in (-1,0,1):\n            for dr in (-1,0,1):\n                if (df or dr) and at(f+df,r+dr)==K: return True\n        for df,dr,kinds in ((1,0,(R,Q)),(-1,0,(R,Q)),(0,1,(R,Q)),(0,-1,(R,Q)),(1,1,(B,Q)),(1,-1,(B,Q)),(-1,1,(B,Q)),(-1,-1,(B,Q))):\n            ff,rr=f+df,r+dr\n            while 0<=ff<8 and 0<=rr<8:\n                v=at(ff,rr)\n                if v:\n                    if v in kinds: return True\n                    break\n                ff+=df; rr+=dr\n        return False\n    \n    b=x['board']; white=x['side']=='w'; rank='1' if white else '8'\n    kf=ord(x['king_from'][0])-97; rf=ord(x['rook_from'][0])-97\n    if b.get(x['king_from'])!=('K' if white else 'k') or b.get(x['rook_from'])!=('R' if white else 'r'): return False\n    if x['wing']=='K':\n        if rf<kf-1: return False\n        kd,rd=6,5\n    else:\n        if rf>kf: return False\n        kd,rd=2,3\n    lo=min(kf,kd,rf,rd); hi=max(kf,kd,rf,rd)\n    for f in range(lo,hi+1):\n        q=chr(97+f)+rank\n        if q in b and f not in (kf,rf): return False\n    step=1 if kd>=kf else -1\n    for f in range(kf,kd+step,step):\n        if attacked(b, chr(97+f)+rank, not white): return False\n    return True\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('king b1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'K', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   True),\n  ('king b1 rook c1 kingside',\n   {'board': {'b1': 'K', 'c1': 'R', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king f1 rook h1',\n   {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king g1 rook h1 stays',\n   {'board': {'e8': 'k', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook destination occupied',\n   {'board': {'e8': 'k', 'f1': 'B', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('queenside d1 occupied',\n   {'board': {'a1': 'R', 'b1': 'K', 'd1': 'N', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False)],\n [('king g1 rook h1 stays',\n   {'board': {'e8': 'k', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook destination occupied',\n   {'board': {'e8': 'k', 'f1': 'B', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('queenside d1 occupied',\n   {'board': {'a1': 'R', 'b1': 'K', 'd1': 'N', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king destination attacked',\n   {'board': {'a8': 'k', 'e1': 'K', 'g8': 'r', 'h1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king in check',\n   {'board': {'a8': 'k', 'f1': 'K', 'f8': 'r', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('black queenside c8 d8',\n   {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'},\n    'king_from': 'd8',\n    'rook_from': 'a8',\n    'side': 'b',\n    'wing': 'Q'},\n   True),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False)],\n [('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king destination attacked',\n   {'board': {'a8': 'k', 'e1': 'K', 'g8': 'r', 'h1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king in check',\n   {'board': {'a8': 'k', 'f1': 'K', 'f8': 'r', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('black queenside c8 d8',\n   {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'},\n    'king_from': 'd8',\n    'rook_from': 'a8',\n    'side': 'b',\n    'wing': 'Q'},\n   True),\n  ('king c1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'N', 'c1': 'K', 'e8': 'k'},\n    'king_from': 'c1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook f1 king e1 kingside',\n   {'board': {'e1': 'K', 'e8': 'k', 'f1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'f1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king b1 rook c1 f1 attacked',\n   {'board': {'a8': 'k', 'b1': 'K', 'c1': 'R', 'f8': 'r'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False)],\n [('king b1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'K', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   True),\n  ('king b1 rook c1 kingside',\n   {'board': {'b1': 'K', 'c1': 'R', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king c1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'N', 'c1': 'K', 'e8': 'k'},\n    'king_from': 'c1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook f1 king e1 kingside',\n   {'board': {'e1': 'K', 'e8': 'k', 'f1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'f1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king b1 rook c1 f1 attacked',\n   {'board': {'a8': 'k', 'b1': 'K', 'c1': 'R', 'f8': 'r'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king b1 rook a1 c1 attacked',\n   {'board': {'a1': 'R', 'b1': 'K', 'c8': 'r', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False)],\n [('king b1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'K', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   True),\n  ('king b1 rook c1 kingside',\n   {'board': {'b1': 'K', 'c1': 'R', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king f1 rook h1',\n   {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king g1 rook h1 stays',\n   {'board': {'e8': 'k', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook destination occupied',\n   {'board': {'e8': 'k', 'f1': 'B', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king b1 rook a1 c1 attacked',\n   {'board': {'a1': 'R', 'b1': 'K', 'c8': 'r', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\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":"1da8c182fae3e79c88bc0524a6b1b9589bc067f6895e669f69723c58dc6cef00","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    def attacked(bd, sq, by_white):\n        f,r=ord(sq[0])-97,int(sq[1])-1\n        def at(ff,rr):\n            return bd.get(chr(97+ff)+str(rr+1)) if 0<=ff<8 and 0<=rr<8 else None\n        P,N,B,R,Q,K=('PNBRQK' if by_white else 'pnbrqk')\n        pr=r-1 if by_white else r+1\n        if at(f-1,pr)==P or at(f+1,pr)==P: return True\n        for df,dr in ((1,2),(2,1),(-1,2),(-2,1),(1,-2),(2,-1),(-1,-2),(-2,-1)):\n            if at(f+df,r+dr)==N: return True\n        for df in (-1,0,1):\n            for dr in (-1,0,1):\n                if (df or dr) and at(f+df,r+dr)==K: return True\n        for df,dr,kinds in ((1,0,(R,Q)),(-1,0,(R,Q)),(0,1,(R,Q)),(0,-1,(R,Q)),(1,1,(B,Q)),(1,-1,(B,Q)),(-1,1,(B,Q)),(-1,-1,(B,Q))):\n            ff,rr=f+df,r+dr\n            while 0<=ff<8 and 0<=rr<8:\n                v=at(ff,rr)\n                if v:\n                    if v in kinds: return True\n                    break\n                ff+=df; rr+=dr\n        return False\n    \n    b=x['board']; white=x['side']=='w'; rank='1' if white else '8'\n    kf=ord(x['king_from'][0])-97; rf=ord(x['rook_from'][0])-97\n    if b.get(x['king_from'])!=('K' if white else 'k') or b.get(x['rook_from'])!=('R' if white else 'r'): return False\n    if x['wing']=='K':\n        pass\n        kd,rd=6,5\n    else:\n        if rf>kf: return False\n        kd,rd=2,3\n    lo=min(kf,kd,rf,rd); hi=max(kf,kd,rf,rd)\n    for f in range(lo,hi+1):\n        q=chr(97+f)+rank\n        if q in b and f not in (kf,rf): return False\n    step=1 if kd>=kf else -1\n    for f in range(kf,kd+step,step):\n        if attacked(b, chr(97+f)+rank, not white): return False\n    return True\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('king b1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'K', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   True),\n  ('king b1 rook c1 kingside',\n   {'board': {'b1': 'K', 'c1': 'R', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king f1 rook h1',\n   {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king g1 rook h1 stays',\n   {'board': {'e8': 'k', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook destination occupied',\n   {'board': {'e8': 'k', 'f1': 'B', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('queenside d1 occupied',\n   {'board': {'a1': 'R', 'b1': 'K', 'd1': 'N', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False)],\n [('king g1 rook h1 stays',\n   {'board': {'e8': 'k', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook destination occupied',\n   {'board': {'e8': 'k', 'f1': 'B', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('queenside d1 occupied',\n   {'board': {'a1': 'R', 'b1': 'K', 'd1': 'N', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king destination attacked',\n   {'board': {'a8': 'k', 'e1': 'K', 'g8': 'r', 'h1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king in check',\n   {'board': {'a8': 'k', 'f1': 'K', 'f8': 'r', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('black queenside c8 d8',\n   {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'},\n    'king_from': 'd8',\n    'rook_from': 'a8',\n    'side': 'b',\n    'wing': 'Q'},\n   True),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False)],\n [('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king destination attacked',\n   {'board': {'a8': 'k', 'e1': 'K', 'g8': 'r', 'h1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king in check',\n   {'board': {'a8': 'k', 'f1': 'K', 'f8': 'r', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('black queenside c8 d8',\n   {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'},\n    'king_from': 'd8',\n    'rook_from': 'a8',\n    'side': 'b',\n    'wing': 'Q'},\n   True),\n  ('king c1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'N', 'c1': 'K', 'e8': 'k'},\n    'king_from': 'c1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook f1 king e1 kingside',\n   {'board': {'e1': 'K', 'e8': 'k', 'f1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'f1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king b1 rook c1 f1 attacked',\n   {'board': {'a8': 'k', 'b1': 'K', 'c1': 'R', 'f8': 'r'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False)],\n [('king b1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'K', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   True),\n  ('king b1 rook c1 kingside',\n   {'board': {'b1': 'K', 'c1': 'R', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king c1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'N', 'c1': 'K', 'e8': 'k'},\n    'king_from': 'c1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook f1 king e1 kingside',\n   {'board': {'e1': 'K', 'e8': 'k', 'f1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'f1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king b1 rook c1 f1 attacked',\n   {'board': {'a8': 'k', 'b1': 'K', 'c1': 'R', 'f8': 'r'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king b1 rook a1 c1 attacked',\n   {'board': {'a1': 'R', 'b1': 'K', 'c8': 'r', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False)],\n [('king b1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'K', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   True),\n  ('king b1 rook c1 kingside',\n   {'board': {'b1': 'K', 'c1': 'R', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king f1 rook h1',\n   {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king g1 rook h1 stays',\n   {'board': {'e8': 'k', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook destination occupied',\n   {'board': {'e8': 'k', 'f1': 'B', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king b1 rook a1 c1 attacked',\n   {'board': {'a1': 'R', 'b1': 'K', 'c8': 'r', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\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":"a779bc4bac230d3cb05a3eed5def8d090a03be0f2ca6d221543b98f20a06bede","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    def attacked(bd, sq, by_white):\n        f,r=ord(sq[0])-97,int(sq[1])-1\n        def at(ff,rr):\n            return bd.get(chr(97+ff)+str(rr+1)) if 0<=ff<8 and 0<=rr<8 else None\n        P,N,B,R,Q,K=('PNBRQK' if by_white else 'pnbrqk')\n        pr=r-1 if by_white else r+1\n        if at(f-1,pr)==P or at(f+1,pr)==P: return True\n        for df,dr in ((1,2),(2,1),(-1,2),(-2,1),(1,-2),(2,-1),(-1,-2),(-2,-1)):\n            if at(f+df,r+dr)==N: return True\n        for df in (-1,0,1):\n            for dr in (-1,0,1):\n                if (df or dr) and at(f+df,r+dr)==K: return True\n        for df,dr,kinds in ((1,0,(R,Q)),(-1,0,(R,Q)),(0,1,(R,Q)),(0,-1,(R,Q)),(1,1,(B,Q)),(1,-1,(B,Q)),(-1,1,(B,Q)),(-1,-1,(B,Q))):\n            ff,rr=f+df,r+dr\n            while 0<=ff<8 and 0<=rr<8:\n                v=at(ff,rr)\n                if v:\n                    if v in kinds: return True\n                    break\n                ff+=df; rr+=dr\n        return False\n    \n    b=x['board']; white=x['side']=='w'; rank='1' if white else '8'\n    kf=ord(x['king_from'][0])-97; rf=ord(x['rook_from'][0])-97\n    if b.get(x['king_from'])!=('K' if white else 'k') or b.get(x['rook_from'])!=('R' if white else 'r'): return False\n    if x['wing']=='K':\n        if rf<kf: return False\n        kd,rd=6,5\n    else:\n        if rf>kf: return False\n        kd,rd=2,3\n    lo=min(kf,kd,rf,rd); hi=max(kf,kd,rf,rd)\n    for f in range(lo,hi+1):\n        q=chr(97+f)+rank\n        if q in b and f not in (kf,rf): return False\n    step=1 if kd>=kf else -1\n    for f in range(kf,kd+step,step):\n        if attacked(b, chr(97+f)+rank, not white): return False\n    return True\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('king b1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'K', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   True),\n  ('king b1 rook c1 kingside',\n   {'board': {'b1': 'K', 'c1': 'R', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king f1 rook h1',\n   {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king g1 rook h1 stays',\n   {'board': {'e8': 'k', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook destination occupied',\n   {'board': {'e8': 'k', 'f1': 'B', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('queenside d1 occupied',\n   {'board': {'a1': 'R', 'b1': 'K', 'd1': 'N', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False)],\n [('king g1 rook h1 stays',\n   {'board': {'e8': 'k', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook destination occupied',\n   {'board': {'e8': 'k', 'f1': 'B', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('queenside d1 occupied',\n   {'board': {'a1': 'R', 'b1': 'K', 'd1': 'N', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king destination attacked',\n   {'board': {'a8': 'k', 'e1': 'K', 'g8': 'r', 'h1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king in check',\n   {'board': {'a8': 'k', 'f1': 'K', 'f8': 'r', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('black queenside c8 d8',\n   {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'},\n    'king_from': 'd8',\n    'rook_from': 'a8',\n    'side': 'b',\n    'wing': 'Q'},\n   True),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False)],\n [('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king destination attacked',\n   {'board': {'a8': 'k', 'e1': 'K', 'g8': 'r', 'h1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king in check',\n   {'board': {'a8': 'k', 'f1': 'K', 'f8': 'r', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('black queenside c8 d8',\n   {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'},\n    'king_from': 'd8',\n    'rook_from': 'a8',\n    'side': 'b',\n    'wing': 'Q'},\n   True),\n  ('king c1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'N', 'c1': 'K', 'e8': 'k'},\n    'king_from': 'c1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook f1 king e1 kingside',\n   {'board': {'e1': 'K', 'e8': 'k', 'f1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'f1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king b1 rook c1 f1 attacked',\n   {'board': {'a8': 'k', 'b1': 'K', 'c1': 'R', 'f8': 'r'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False)],\n [('king b1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'K', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   True),\n  ('king b1 rook c1 kingside',\n   {'board': {'b1': 'K', 'c1': 'R', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king c1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'N', 'c1': 'K', 'e8': 'k'},\n    'king_from': 'c1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('rook f1 king e1 kingside',\n   {'board': {'e1': 'K', 'e8': 'k', 'f1': 'R'},\n    'king_from': 'e1',\n    'rook_from': 'f1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king b1 rook c1 f1 attacked',\n   {'board': {'a8': 'k', 'b1': 'K', 'c1': 'R', 'f8': 'r'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king b1 rook a1 c1 attacked',\n   {'board': {'a1': 'R', 'b1': 'K', 'c8': 'r', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   False)],\n [('king b1 rook a1 queenside',\n   {'board': {'a1': 'R', 'b1': 'K', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\n   True),\n  ('king b1 rook c1 kingside',\n   {'board': {'b1': 'K', 'c1': 'R', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king f1 rook h1',\n   {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'},\n    'king_from': 'f1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('king g1 rook h1 stays',\n   {'board': {'e8': 'k', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('rook destination occupied',\n   {'board': {'e8': 'k', 'f1': 'B', 'g1': 'K', 'h1': 'R'},\n    'king_from': 'g1',\n    'rook_from': 'h1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook on wrong side',\n   {'board': {'b1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'b1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('rook adjacent on a-side kingside',\n   {'board': {'c1': 'R', 'd1': 'K', 'e8': 'k'},\n    'king_from': 'd1',\n    'rook_from': 'c1',\n    'side': 'w',\n    'wing': 'K'},\n   False),\n  ('king b1 rook a1 c1 attacked',\n   {'board': {'a1': 'R', 'b1': 'K', 'c8': 'r', 'e8': 'k'},\n    'king_from': 'b1',\n    'rook_from': 'a1',\n    'side': 'w',\n    'wing': 'Q'},\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-chess960-castling-rook-side-check","generated_at":"2026-09-29T14:50:14.639614+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Chess960 castling generalizes standard rules; standard-chess shortcuts break it.","repair":"The kingside rook must stand on a file greater than the king's.","root_cause":"The rook's side relative to the king is never checked for kingside castling.","sha256":"1724333a66517118dca953121ccd63bc0e1fc2f7ebcf6421ca9ec1736911abe5","title":"Kingside castling with a rook on the a-side · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.648,"exit_code":1,"observations":[{"actual":true,"check":"king b1 rook a1 queenside","expected":true,"passed":true},{"actual":true,"check":"king b1 rook c1 kingside","expected":true,"passed":true},{"actual":true,"check":"king f1 rook h1","expected":true,"passed":true},{"actual":true,"check":"king g1 rook h1 stays","expected":true,"passed":true},{"actual":false,"check":"rook destination occupied","expected":false,"passed":true},{"actual":false,"check":"queenside d1 occupied","expected":false,"passed":true},{"actual":false,"check":"rook on wrong side","expected":false,"passed":true},{"actual":true,"check":"rook adjacent on a-side kingside","expected":false,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"king b1 rook a1 queenside\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"king b1 rook c1 kingside\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"king f1 rook h1\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"king g1 rook h1 stays\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"rook destination occupied\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"queenside d1 occupied\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"rook on wrong side\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"rook adjacent on a-side kingside\", \"actual\": true, \"expected\": false, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.43,"exit_code":1,"observations":[{"actual":true,"check":"king b1 rook a1 queenside","expected":true,"passed":true},{"actual":true,"check":"king b1 rook c1 kingside","expected":true,"passed":true},{"actual":true,"check":"king f1 rook h1","expected":true,"passed":true},{"actual":true,"check":"king g1 rook h1 stays","expected":true,"passed":true},{"actual":false,"check":"rook destination occupied","expected":false,"passed":true},{"actual":false,"check":"queenside d1 occupied","expected":false,"passed":true},{"actual":true,"check":"rook on wrong side","expected":false,"passed":false},{"actual":true,"check":"rook adjacent on a-side kingside","expected":false,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"king b1 rook a1 queenside\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"king b1 rook c1 kingside\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"king f1 rook h1\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"king g1 rook h1 stays\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"rook destination occupied\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"queenside d1 occupied\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"rook on wrong side\", \"actual\": true, \"expected\": false, \"passed\": false}, {\"check\": \"rook adjacent on a-side kingside\", \"actual\": true, \"expected\": false, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.061,"exit_code":0,"observations":[{"actual":true,"check":"king b1 rook a1 queenside","expected":true,"passed":true},{"actual":true,"check":"king b1 rook c1 kingside","expected":true,"passed":true},{"actual":true,"check":"king f1 rook h1","expected":true,"passed":true},{"actual":true,"check":"king g1 rook h1 stays","expected":true,"passed":true},{"actual":false,"check":"rook destination occupied","expected":false,"passed":true},{"actual":false,"check":"queenside d1 occupied","expected":false,"passed":true},{"actual":false,"check":"rook on wrong side","expected":false,"passed":true},{"actual":false,"check":"rook adjacent on a-side kingside","expected":false,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"king b1 rook a1 queenside\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"king b1 rook c1 kingside\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"king f1 rook h1\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"king g1 rook h1 stays\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"rook destination occupied\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"queenside d1 occupied\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"rook on wrong side\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"rook adjacent on a-side kingside\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}