{"abstract":"A rook attacking b1 prevents white from castling long.","category":"Chess move legality","checks":8,"contract":"Input: {\"board\", \"side\": \"w\" or \"b\", \"wing\": \"K\" or \"Q\", \"rights\": subset of \"KQkq\"}. Standard castling is legal when the right is held, the king is on e1/e8 and the matching own rook on h- or a-file, the squares between them are empty (f,g or b,c,d), and none of the king's squares e, f, g (kingside) or e, d, c (queenside) is attacked by the opponent.","evaluation_group":"w2-chess_move_legality-castling-legality","failed_approach":"Dropping the e-file square allows castling out of check.","family":"w2-chess_move_legality-castling-legality-king-path-attack-squares","id":"FA-82441","implementations":{"attempt":{"sha256":"b23701bf5e629fb374ca8055b5c06602f716d4a3a3148eca64bfaa37773e0295","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'; wing=x['wing']\n    rank='1' if white else '8'\n    right=wing if white else wing.lower()\n    if right not in x['rights']: return False\n    if b.get('e'+rank)!=('K' if white else 'k'): return False\n    rook_sq=('h' if wing=='K' else 'a')+rank\n    if b.get(rook_sq)!=('R' if white else 'r'): return False\n    between='fg' if wing=='K' else 'bcd'\n    if any(f+rank in b for f in between): return False\n    path='fg' if wing=='K' else 'dc'\n    return not any(attacked(b, f+rank, not white) for f in path)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('white kingside clear',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'KQkq', 'side': 'w', 'wing': 'K'}, True),\n  ('queenside b-file blocked',\n   {'board': {'a1': 'R', 'b1': 'N', 'e1': 'K', 'e8': 'k'},\n    'rights': 'KQ',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('f1 attacked',\n   {'board': {'c4': 'b', 'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black uses own right',\n   {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'rights': 'K', 'side': 'b', 'wing': 'K'}, False),\n  ('black has right',\n   {'board': {'a8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'q', 'side': 'b', 'wing': 'Q'}, True),\n  ('enemy rook in corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'r'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False)],\n [('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black uses own right',\n   {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'rights': 'K', 'side': 'b', 'wing': 'K'}, False),\n  ('black has right',\n   {'board': {'a8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'q', 'side': 'b', 'wing': 'Q'}, True),\n  ('enemy rook in corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'r'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False),\n  ('knight in rook corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'N'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False),\n  ('pawn attacks g1 from h2',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R', 'h2': 'p'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('white pawn on f2 harmless',\n   {'board': {'e1': 'K', 'e8': 'k', 'g2': 'P', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   True)],\n [('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('knight in rook corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'N'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False),\n  ('pawn attacks g1 from h2',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R', 'h2': 'p'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('white pawn on f2 harmless',\n   {'board': {'e1': 'K', 'e8': 'k', 'g2': 'P', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   True),\n  ('black pawn attacks f8 check',\n   {'board': {'e1': 'K', 'e7': 'P', 'e8': 'k', 'h8': 'r'}, 'rights': 'k', 'side': 'b', 'wing': 'K'},\n   False),\n  ('shielded rook attack',\n   {'board': {'a8': 'k', 'e1': 'K', 'f4': 'P', 'f8': 'r', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('own piece shields g1',\n   {'board': {'a8': 'k', 'e1': 'K', 'g3': 'N', 'g5': 'q', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True)],\n [('white kingside clear',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'KQkq', 'side': 'w', 'wing': 'K'}, True),\n  ('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black pawn attacks f8 check',\n   {'board': {'e1': 'K', 'e7': 'P', 'e8': 'k', 'h8': 'r'}, 'rights': 'k', 'side': 'b', 'wing': 'K'},\n   False),\n  ('shielded rook attack',\n   {'board': {'a8': 'k', 'e1': 'K', 'f4': 'P', 'f8': 'r', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('own piece shields g1',\n   {'board': {'a8': 'k', 'e1': 'K', 'g3': 'N', 'g5': 'q', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('c1 attacked',\n   {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h6': 'b'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   False),\n  ('d1 blocked',\n   {'board': {'a1': 'R', 'd1': 'Q', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   False)],\n [('white kingside clear',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'KQkq', 'side': 'w', 'wing': 'K'}, True),\n  ('queenside b-file blocked',\n   {'board': {'a1': 'R', 'b1': 'N', 'e1': 'K', 'e8': 'k'},\n    'rights': 'KQ',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('f1 attacked',\n   {'board': {'c4': 'b', 'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black uses own right',\n   {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'rights': 'K', 'side': 'b', 'wing': 'K'}, False),\n  ('c1 attacked',\n   {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h6': 'b'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   False),\n  ('d1 blocked',\n   {'board': {'a1': 'R', 'd1': 'Q', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', '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":"124da6bc41355b197496fcabaaf2cbcb58780d1e85c15c4aead920ff41538206","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'; wing=x['wing']\n    rank='1' if white else '8'\n    right=wing if white else wing.lower()\n    if right not in x['rights']: return False\n    if b.get('e'+rank)!=('K' if white else 'k'): return False\n    rook_sq=('h' if wing=='K' else 'a')+rank\n    if b.get(rook_sq)!=('R' if white else 'r'): return False\n    between='fg' if wing=='K' else 'bcd'\n    if any(f+rank in b for f in between): return False\n    path='efg' if wing=='K' else 'edcb'\n    return not any(attacked(b, f+rank, not white) for f in path)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('white kingside clear',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'KQkq', 'side': 'w', 'wing': 'K'}, True),\n  ('queenside b-file blocked',\n   {'board': {'a1': 'R', 'b1': 'N', 'e1': 'K', 'e8': 'k'},\n    'rights': 'KQ',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('f1 attacked',\n   {'board': {'c4': 'b', 'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black uses own right',\n   {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'rights': 'K', 'side': 'b', 'wing': 'K'}, False),\n  ('black has right',\n   {'board': {'a8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'q', 'side': 'b', 'wing': 'Q'}, True),\n  ('enemy rook in corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'r'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False)],\n [('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black uses own right',\n   {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'rights': 'K', 'side': 'b', 'wing': 'K'}, False),\n  ('black has right',\n   {'board': {'a8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'q', 'side': 'b', 'wing': 'Q'}, True),\n  ('enemy rook in corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'r'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False),\n  ('knight in rook corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'N'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False),\n  ('pawn attacks g1 from h2',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R', 'h2': 'p'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('white pawn on f2 harmless',\n   {'board': {'e1': 'K', 'e8': 'k', 'g2': 'P', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   True)],\n [('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('knight in rook corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'N'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False),\n  ('pawn attacks g1 from h2',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R', 'h2': 'p'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('white pawn on f2 harmless',\n   {'board': {'e1': 'K', 'e8': 'k', 'g2': 'P', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   True),\n  ('black pawn attacks f8 check',\n   {'board': {'e1': 'K', 'e7': 'P', 'e8': 'k', 'h8': 'r'}, 'rights': 'k', 'side': 'b', 'wing': 'K'},\n   False),\n  ('shielded rook attack',\n   {'board': {'a8': 'k', 'e1': 'K', 'f4': 'P', 'f8': 'r', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('own piece shields g1',\n   {'board': {'a8': 'k', 'e1': 'K', 'g3': 'N', 'g5': 'q', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True)],\n [('white kingside clear',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'KQkq', 'side': 'w', 'wing': 'K'}, True),\n  ('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black pawn attacks f8 check',\n   {'board': {'e1': 'K', 'e7': 'P', 'e8': 'k', 'h8': 'r'}, 'rights': 'k', 'side': 'b', 'wing': 'K'},\n   False),\n  ('shielded rook attack',\n   {'board': {'a8': 'k', 'e1': 'K', 'f4': 'P', 'f8': 'r', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('own piece shields g1',\n   {'board': {'a8': 'k', 'e1': 'K', 'g3': 'N', 'g5': 'q', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('c1 attacked',\n   {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h6': 'b'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   False),\n  ('d1 blocked',\n   {'board': {'a1': 'R', 'd1': 'Q', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   False)],\n [('white kingside clear',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'KQkq', 'side': 'w', 'wing': 'K'}, True),\n  ('queenside b-file blocked',\n   {'board': {'a1': 'R', 'b1': 'N', 'e1': 'K', 'e8': 'k'},\n    'rights': 'KQ',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('f1 attacked',\n   {'board': {'c4': 'b', 'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black uses own right',\n   {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'rights': 'K', 'side': 'b', 'wing': 'K'}, False),\n  ('c1 attacked',\n   {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h6': 'b'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   False),\n  ('d1 blocked',\n   {'board': {'a1': 'R', 'd1': 'Q', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', '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":"d22ba5f36b82ed3d0eebd867b977bb76834bf8f67cdf65d4c725a5909337e52d","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'; wing=x['wing']\n    rank='1' if white else '8'\n    right=wing if white else wing.lower()\n    if right not in x['rights']: return False\n    if b.get('e'+rank)!=('K' if white else 'k'): return False\n    rook_sq=('h' if wing=='K' else 'a')+rank\n    if b.get(rook_sq)!=('R' if white else 'r'): return False\n    between='fg' if wing=='K' else 'bcd'\n    if any(f+rank in b for f in between): return False\n    path='efg' if wing=='K' else 'edc'\n    return not any(attacked(b, f+rank, not white) for f in path)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('white kingside clear',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'KQkq', 'side': 'w', 'wing': 'K'}, True),\n  ('queenside b-file blocked',\n   {'board': {'a1': 'R', 'b1': 'N', 'e1': 'K', 'e8': 'k'},\n    'rights': 'KQ',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('f1 attacked',\n   {'board': {'c4': 'b', 'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black uses own right',\n   {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'rights': 'K', 'side': 'b', 'wing': 'K'}, False),\n  ('black has right',\n   {'board': {'a8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'q', 'side': 'b', 'wing': 'Q'}, True),\n  ('enemy rook in corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'r'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False)],\n [('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black uses own right',\n   {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'rights': 'K', 'side': 'b', 'wing': 'K'}, False),\n  ('black has right',\n   {'board': {'a8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'q', 'side': 'b', 'wing': 'Q'}, True),\n  ('enemy rook in corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'r'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False),\n  ('knight in rook corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'N'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False),\n  ('pawn attacks g1 from h2',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R', 'h2': 'p'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('white pawn on f2 harmless',\n   {'board': {'e1': 'K', 'e8': 'k', 'g2': 'P', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   True)],\n [('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('knight in rook corner',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'N'}, 'rights': 'K', 'side': 'w', 'wing': 'K'}, False),\n  ('pawn attacks g1 from h2',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R', 'h2': 'p'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('white pawn on f2 harmless',\n   {'board': {'e1': 'K', 'e8': 'k', 'g2': 'P', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   True),\n  ('black pawn attacks f8 check',\n   {'board': {'e1': 'K', 'e7': 'P', 'e8': 'k', 'h8': 'r'}, 'rights': 'k', 'side': 'b', 'wing': 'K'},\n   False),\n  ('shielded rook attack',\n   {'board': {'a8': 'k', 'e1': 'K', 'f4': 'P', 'f8': 'r', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('own piece shields g1',\n   {'board': {'a8': 'k', 'e1': 'K', 'g3': 'N', 'g5': 'q', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True)],\n [('white kingside clear',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'KQkq', 'side': 'w', 'wing': 'K'}, True),\n  ('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black pawn attacks f8 check',\n   {'board': {'e1': 'K', 'e7': 'P', 'e8': 'k', 'h8': 'r'}, 'rights': 'k', 'side': 'b', 'wing': 'K'},\n   False),\n  ('shielded rook attack',\n   {'board': {'a8': 'k', 'e1': 'K', 'f4': 'P', 'f8': 'r', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('own piece shields g1',\n   {'board': {'a8': 'k', 'e1': 'K', 'g3': 'N', 'g5': 'q', 'h1': 'R'},\n    'rights': 'K',\n    'side': 'w',\n    'wing': 'K'},\n   True),\n  ('c1 attacked',\n   {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h6': 'b'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   False),\n  ('d1 blocked',\n   {'board': {'a1': 'R', 'd1': 'Q', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   False)],\n [('white kingside clear',\n   {'board': {'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'KQkq', 'side': 'w', 'wing': 'K'}, True),\n  ('queenside b-file blocked',\n   {'board': {'a1': 'R', 'b1': 'N', 'e1': 'K', 'e8': 'k'},\n    'rights': 'KQ',\n    'side': 'w',\n    'wing': 'Q'},\n   False),\n  ('queenside b-file attacked',\n   {'board': {'a1': 'R', 'b8': 'r', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   True),\n  ('in check',\n   {'board': {'a8': 'k', 'e1': 'K', 'e8': 'r', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('f1 attacked',\n   {'board': {'c4': 'b', 'e1': 'K', 'e8': 'k', 'h1': 'R'}, 'rights': 'K', 'side': 'w', 'wing': 'K'},\n   False),\n  ('black uses own right',\n   {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'rights': 'K', 'side': 'b', 'wing': 'K'}, False),\n  ('c1 attacked',\n   {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h6': 'b'}, 'rights': 'Q', 'side': 'w', 'wing': 'Q'},\n   False),\n  ('d1 blocked',\n   {'board': {'a1': 'R', 'd1': 'Q', 'e1': 'K', 'e8': 'k'}, 'rights': 'Q', 'side': 'w', '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-castling-legality-king-path-attack-squares","generated_at":"2026-09-29T14:50:12.110004+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":"Only the king's start, transit and destination squares must be unattacked.","root_cause":"The attack test includes b1, a square only the rook crosses.","sha256":"e816d0d60b1b7ee587b2d1bcce7e71741153e700ba8e2da12c8bc2685592cb90","title":"Queenside castling forbidden when b1 is attacked · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.09,"exit_code":1,"observations":[{"actual":true,"check":"white kingside clear","expected":true,"passed":true},{"actual":false,"check":"queenside b-file blocked","expected":false,"passed":true},{"actual":true,"check":"queenside b-file attacked","expected":true,"passed":true},{"actual":true,"check":"in check","expected":false,"passed":false},{"actual":false,"check":"f1 attacked","expected":false,"passed":true},{"actual":false,"check":"black uses own right","expected":false,"passed":true},{"actual":true,"check":"black has right","expected":true,"passed":true},{"actual":false,"check":"enemy rook in corner","expected":false,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"white kingside clear\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"queenside b-file blocked\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"queenside b-file attacked\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"in check\", \"actual\": true, \"expected\": false, \"passed\": false}, {\"check\": \"f1 attacked\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"black uses own right\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"black has right\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"enemy rook in corner\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.901,"exit_code":1,"observations":[{"actual":true,"check":"white kingside clear","expected":true,"passed":true},{"actual":false,"check":"queenside b-file blocked","expected":false,"passed":true},{"actual":false,"check":"queenside b-file attacked","expected":true,"passed":false},{"actual":false,"check":"in check","expected":false,"passed":true},{"actual":false,"check":"f1 attacked","expected":false,"passed":true},{"actual":false,"check":"black uses own right","expected":false,"passed":true},{"actual":true,"check":"black has right","expected":true,"passed":true},{"actual":false,"check":"enemy rook in corner","expected":false,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"white kingside clear\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"queenside b-file blocked\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"queenside b-file attacked\", \"actual\": false, \"expected\": true, \"passed\": false}, {\"check\": \"in check\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"f1 attacked\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"black uses own right\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"black has right\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"enemy rook in corner\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.361,"exit_code":0,"observations":[{"actual":true,"check":"white kingside clear","expected":true,"passed":true},{"actual":false,"check":"queenside b-file blocked","expected":false,"passed":true},{"actual":true,"check":"queenside b-file attacked","expected":true,"passed":true},{"actual":false,"check":"in check","expected":false,"passed":true},{"actual":false,"check":"f1 attacked","expected":false,"passed":true},{"actual":false,"check":"black uses own right","expected":false,"passed":true},{"actual":true,"check":"black has right","expected":true,"passed":true},{"actual":false,"check":"enemy rook in corner","expected":false,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"white kingside clear\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"queenside b-file blocked\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"queenside b-file attacked\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"in check\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"f1 attacked\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"black uses own right\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"black has right\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"enemy rook in corner\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}