FA-82731 / Chess move legality / Open access
Any king step onto the g-file drags the rook · case 01
Kf1-g1 moves the h1 rook to f1.
ROOT CAUSE
Castling is recognized by the destination file instead of a two-file king move.
VERIFIED REPAIR
A king move is castling only when it travels exactly two files.
Unsuccessful approach: Accepting only rightward two-file moves ignores queenside castling.
Case contract
Input: {"board", "moves": [uci strings]}. Apply the moves in order and return the final board sorted by square. A king moving two files castles: the rook jumps from h to f (g-file destination) or from a to d (c-file destination). A pawn moving diagonally onto an empty square captures en passant, removing the pawn on the destination file and origin rank. A fifth character promotes to that piece in the mover's colour.
Why this case matters
Move application defines the position every later legality check sees.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
b=dict(x['board'])
for u in x['moves']:
fr,to,pr=u[:2],u[2:4],u[4:]
p=b.pop(fr)
if p in ('K','k') and to[0] in 'gc':
if to[0]=='g': b['f'+to[1]]=b.pop('h'+to[1])
else: b['d'+to[1]]=b.pop('a'+to[1])
if p in ('P','p') and fr[0]!=to[0] and to not in b:
del b[to[0]+fr[1]]
if pr: p=pr.upper() if p=='P' else pr.lower()
b[to]=p
return dict(sorted(b.items()))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
{'e1': 'K', 'f8': 'r', 'g8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
{'e1': 'K', 'e8': 'k', 'g1': 'n'}),
('quiet sequence',
{'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
{'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
{'c4': 'P', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
{'e1': 'K', 'f8': 'r', 'g8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('quiet sequence',
{'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
{'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
{'c4': 'P', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
{'e1': 'K', 'f8': 'r', 'g8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
{'e1': 'K', 'e8': 'k', 'g1': 'n'})]]
for label, args, expected in fixtures[N-1]:
try:
actual = solve(args)
except Exception as exc:
actual = 'error:' + type(exc).__name__
check(label, actual, expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| white long castle | {'c1': 'K', 'd1': 'R', 'e8': 'k'} | {'c1': 'K', 'd1': 'R', 'e8': 'k'} | Passed |
| black short castle | {'e1': 'K', 'f8': 'r', 'g8': 'k'} | {'e1': 'K', 'f8': 'r', 'g8': 'k'} | Passed |
| king step to g1 | {'e8': 'k', 'f1': 'R', 'g1': 'K'} | {'e8': 'k', 'g1': 'K', 'h1': 'R'} | Failed |
| king step to c8 | {'c8': 'k', 'd8': 'r', 'e1': 'K'} | {'a8': 'r', 'c8': 'k', 'e1': 'K'} | Failed |
| white en passant | {'d6': 'P', 'e1': 'K', 'e8': 'k'} | {'d6': 'P', 'e1': 'K', 'e8': 'k'} | Passed |
| black en passant | {'e1': 'K', 'e3': 'p', 'e8': 'k'} | {'e1': 'K', 'e3': 'p', 'e8': 'k'} | Passed |
| ordinary pawn capture | {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'} | {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'} | Passed |
| white promotion | {'b8': 'Q', 'e1': 'K', 'e8': 'k'} | {'b8': 'Q', 'e1': 'K', 'e8': 'k'} | Passed |
SHA-256 / 5c78dcea7b9478847d4ffba314690b7b6b84327fd33da02c21cb4d98d7b00984
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
b=dict(x['board'])
for u in x['moves']:
fr,to,pr=u[:2],u[2:4],u[4:]
p=b.pop(fr)
if p in ('K','k') and ord(to[0])-ord(fr[0])==2:
if to[0]=='g': b['f'+to[1]]=b.pop('h'+to[1])
else: b['d'+to[1]]=b.pop('a'+to[1])
if p in ('P','p') and fr[0]!=to[0] and to not in b:
del b[to[0]+fr[1]]
if pr: p=pr.upper() if p=='P' else pr.lower()
b[to]=p
return dict(sorted(b.items()))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
{'e1': 'K', 'f8': 'r', 'g8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
{'e1': 'K', 'e8': 'k', 'g1': 'n'}),
('quiet sequence',
{'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
{'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
{'c4': 'P', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
{'e1': 'K', 'f8': 'r', 'g8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('quiet sequence',
{'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
{'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
{'c4': 'P', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
{'e1': 'K', 'f8': 'r', 'g8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
{'e1': 'K', 'e8': 'k', 'g1': 'n'})]]
for label, args, expected in fixtures[N-1]:
try:
actual = solve(args)
except Exception as exc:
actual = 'error:' + type(exc).__name__
check(label, actual, expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| white long castle | {'a1': 'R', 'c1': 'K', 'e8': 'k'} | {'c1': 'K', 'd1': 'R', 'e8': 'k'} | Failed |
| black short castle | {'e1': 'K', 'f8': 'r', 'g8': 'k'} | {'e1': 'K', 'f8': 'r', 'g8': 'k'} | Passed |
| king step to g1 | {'e8': 'k', 'g1': 'K', 'h1': 'R'} | {'e8': 'k', 'g1': 'K', 'h1': 'R'} | Passed |
| king step to c8 | {'a8': 'r', 'c8': 'k', 'e1': 'K'} | {'a8': 'r', 'c8': 'k', 'e1': 'K'} | Passed |
| white en passant | {'d6': 'P', 'e1': 'K', 'e8': 'k'} | {'d6': 'P', 'e1': 'K', 'e8': 'k'} | Passed |
| black en passant | {'e1': 'K', 'e3': 'p', 'e8': 'k'} | {'e1': 'K', 'e3': 'p', 'e8': 'k'} | Passed |
| ordinary pawn capture | {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'} | {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'} | Passed |
| white promotion | {'b8': 'Q', 'e1': 'K', 'e8': 'k'} | {'b8': 'Q', 'e1': 'K', 'e8': 'k'} | Passed |
SHA-256 / 737ed38480e2f62aca075537dda0c5f4e6b45b6712be4d4772aeab04d924d648
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
b=dict(x['board'])
for u in x['moves']:
fr,to,pr=u[:2],u[2:4],u[4:]
p=b.pop(fr)
if p in ('K','k') and abs(ord(to[0])-ord(fr[0]))==2:
if to[0]=='g': b['f'+to[1]]=b.pop('h'+to[1])
else: b['d'+to[1]]=b.pop('a'+to[1])
if p in ('P','p') and fr[0]!=to[0] and to not in b:
del b[to[0]+fr[1]]
if pr: p=pr.upper() if p=='P' else pr.lower()
b[to]=p
return dict(sorted(b.items()))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
{'e1': 'K', 'f8': 'r', 'g8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
{'e1': 'K', 'e8': 'k', 'g1': 'n'}),
('quiet sequence',
{'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
{'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
{'c4': 'P', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
{'e1': 'K', 'f8': 'r', 'g8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('quiet sequence',
{'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
{'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
{'c4': 'P', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
{'e1': 'K', 'f8': 'r', 'g8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
{'c1': 'K', 'd1': 'R', 'e8': 'k'}),
('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
{'e8': 'k', 'g1': 'K', 'h1': 'R'}),
('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
{'a8': 'r', 'c8': 'k', 'e1': 'K'}),
('white en passant',
{'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
{'d6': 'P', 'e1': 'K', 'e8': 'k'}),
('black en passant',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
{'e1': 'K', 'e3': 'p', 'e8': 'k'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
{'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
{'e1': 'K', 'e8': 'k', 'g1': 'n'})]]
for label, args, expected in fixtures[N-1]:
try:
actual = solve(args)
except Exception as exc:
actual = 'error:' + type(exc).__name__
check(label, actual, expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| white long castle | {'c1': 'K', 'd1': 'R', 'e8': 'k'} | {'c1': 'K', 'd1': 'R', 'e8': 'k'} | Passed |
| black short castle | {'e1': 'K', 'f8': 'r', 'g8': 'k'} | {'e1': 'K', 'f8': 'r', 'g8': 'k'} | Passed |
| king step to g1 | {'e8': 'k', 'g1': 'K', 'h1': 'R'} | {'e8': 'k', 'g1': 'K', 'h1': 'R'} | Passed |
| king step to c8 | {'a8': 'r', 'c8': 'k', 'e1': 'K'} | {'a8': 'r', 'c8': 'k', 'e1': 'K'} | Passed |
| white en passant | {'d6': 'P', 'e1': 'K', 'e8': 'k'} | {'d6': 'P', 'e1': 'K', 'e8': 'k'} | Passed |
| black en passant | {'e1': 'K', 'e3': 'p', 'e8': 'k'} | {'e1': 'K', 'e3': 'p', 'e8': 'k'} | Passed |
| ordinary pawn capture | {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'} | {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'} | Passed |
| white promotion | {'b8': 'Q', 'e1': 'K', 'e8': 'k'} | {'b8': 'Q', 'e1': 'K', 'e8': 'k'} | Passed |
SHA-256 / e93489a33cfd4bfa20933cfe2c9dea806a2b3af003f3d2f9d45aa9131cb30ee3
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:50:14.769579+00:00.
Case digest / a1fa65a592b01389152f8812f46dcb2f5471c879d7f27ae25a14126d9b1f3620