FA-82726 / Chess move legality / Open access
Long castling puts the rook on the king's square · case 01
After e1c1 the rook is placed on c1 and then overwritten by the king.
ROOT CAUSE
The queenside rook destination is the c-file instead of the d-file.
VERIFIED REPAIR
On queenside castling the rook moves from a to d.
Unsuccessful approach: Copying the rook to d without removing it from a duplicates the rook.
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 abs(ord(to[0])-ord(fr[0]))==2:
if to[0]=='g': b['f'+to[1]]=b.pop('h'+to[1])
else: b['c'+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'}),
('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'}),
('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 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'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', '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'}),
('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', '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 / 9978545b390c54ab3a550f210f2466ae8785854d36ec1c70d7bf3c4073d2cb3f
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 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.get('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'}),
('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'}),
('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 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'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', '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'}),
('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', 'd1': 'R', '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 / 248ad2a0bc4747d8a6a8eab63a874f60fc95f6aee3fb09bbd36a2f25b07c1e08
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'}),
('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'}),
('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 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'}),
('ordinary pawn capture',
{'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
{'d4': 'N', 'd5': 'P', 'e1': 'K', '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'}),
('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 / 5a5284c7f002375dfa4ca65ae284dae0b9ab2dffeb3519f95301eeb7ae49ffd4
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.724446+00:00.
Case digest / ff2c5d71f6811b681567af2653c2d515ac7eb3d0b28d23f8c5249cecfb66cc8d