FA-82581 / Chess move legality / Open access
En passant target set to the landing square · case 01
After e2-e4 the ep square is reported as e4 instead of e3.
ROOT CAUSE
The target uses the destination rank rather than the skipped middle rank.
VERIFIED REPAIR
The ep square is the midpoint between origin and destination.
Unsuccessful approach: Using the origin rank points at the pawn's starting square.
Case contract
Input: {"board" (before the move), "rights": castling rights string or "-", "move": [from, to], "halfmove"}. Return the next {"rights", "ep", "halfmove"}: a king move removes both of its side's rights; any move from or onto h1/a1/h8/a8 removes the matching right; a pawn double step sets ep to the skipped square only when an enemy pawn stands beside the destination; the halfmove clock resets on pawn moves and captures, else increments. Empty rights render as "-".
Why this case matters
These updates decide whether castling and en passant are legal on later moves.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
b=x['board']; fr,to=x['move']; p=b[fr]; cap=b.get(to)
rights=x['rights'].replace('-','')
if p=='K': rights=rights.replace('K','').replace('Q','')
if p=='k': rights=rights.replace('k','').replace('q','')
for sq,r in (('h1','K'),('a1','Q'),('h8','k'),('a8','q')):
if fr==sq or to==sq: rights=rights.replace(r,'')
ep=None
if p in ('P','p') and abs(int(to[1])-int(fr[1]))==2:
enemy='p' if p=='P' else 'P'
f=ord(to[0])-97
if any(b.get(chr(97+f+d)+to[1])==enemy for d in (-1,1)):
ep=fr[0]+to[1]
pawn_or_capture=p in ('P','p') or cap is not None
hm=0 if pawn_or_capture else x['halfmove']+1
return {'rights':rights or '-','ep':ep,'halfmove':hm}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('king move clears both',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h1': 'R'},
'halfmove': 3,
'move': ['e1', 'f1'],
'rights': 'KQkq'},
{'ep': None, 'halfmove': 4, 'rights': 'kq'}),
('black king move',
{'board': {'e1': 'K', 'e8': 'k'}, 'halfmove': 0, 'move': ['e8', 'd8'], 'rights': 'KQkq'},
{'ep': None, 'halfmove': 1, 'rights': 'KQ'}),
('rook captured on a8',
{'board': {'a8': 'r', 'b7': 'B', 'e1': 'K', 'e8': 'k'},
'halfmove': 5,
'move': ['b7', 'a8'],
'rights': 'Kkq'},
{'ep': None, 'halfmove': 0, 'rights': 'Kk'}),
('bishop takes h8 rook',
{'board': {'a1': 'B', 'e1': 'K', 'e8': 'k', 'h8': 'r'},
'halfmove': 5,
'move': ['a1', 'h8'],
'rights': 'KQk'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('rook leaves corner',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 9,
'move': ['a1', 'a5'],
'rights': 'KQ'},
{'ep': None, 'halfmove': 10, 'rights': 'K'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('double step no enemy beside',
{'board': {'a4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'})],
[('bishop takes h8 rook',
{'board': {'a1': 'B', 'e1': 'K', 'e8': 'k', 'h8': 'r'},
'halfmove': 5,
'move': ['a1', 'h8'],
'rights': 'KQk'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('rook leaves corner',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 9,
'move': ['a1', 'a5'],
'rights': 'KQ'},
{'ep': None, 'halfmove': 10, 'rights': 'K'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('double step no enemy beside',
{'board': {'a4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('double step beside own pawn',
{'board': {'e1': 'K', 'e2': 'P', 'e8': 'k', 'f4': 'P'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('black double step beside black pawn',
{'board': {'c7': 'p', 'd5': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': None, 'halfmove': 0, 'rights': 'kq'}),
('quiet knight move',
{'board': {'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'halfmove': 7, 'move': ['g1', 'f3'], 'rights': 'K'},
{'ep': None, 'halfmove': 8, 'rights': 'K'})],
[('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('double step beside own pawn',
{'board': {'e1': 'K', 'e2': 'P', 'e8': 'k', 'f4': 'P'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('black double step beside black pawn',
{'board': {'c7': 'p', 'd5': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': None, 'halfmove': 0, 'rights': 'kq'}),
('quiet knight move',
{'board': {'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'halfmove': 7, 'move': ['g1', 'f3'], 'rights': 'K'},
{'ep': None, 'halfmove': 8, 'rights': 'K'}),
('knight capture resets',
{'board': {'e1': 'K', 'e8': 'k', 'f3': 'p', 'g1': 'N'},
'halfmove': 7,
'move': ['g1', 'f3'],
'rights': 'K'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('single pawn step',
{'board': {'a2': 'P', 'e1': 'K', 'e8': 'k'},
'halfmove': 11,
'move': ['a2', 'a3'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('rook two-rank move',
{'board': {'c3': 'p', 'd1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 1,
'move': ['d1', 'd3'],
'rights': '-'},
{'ep': None, 'halfmove': 2, 'rights': '-'})],
[('king move clears both',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h1': 'R'},
'halfmove': 3,
'move': ['e1', 'f1'],
'rights': 'KQkq'},
{'ep': None, 'halfmove': 4, 'rights': 'kq'}),
('black king move',
{'board': {'e1': 'K', 'e8': 'k'}, 'halfmove': 0, 'move': ['e8', 'd8'], 'rights': 'KQkq'},
{'ep': None, 'halfmove': 1, 'rights': 'KQ'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('knight capture resets',
{'board': {'e1': 'K', 'e8': 'k', 'f3': 'p', 'g1': 'N'},
'halfmove': 7,
'move': ['g1', 'f3'],
'rights': 'K'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('single pawn step',
{'board': {'a2': 'P', 'e1': 'K', 'e8': 'k'},
'halfmove': 11,
'move': ['a2', 'a3'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('rook two-rank move',
{'board': {'c3': 'p', 'd1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 1,
'move': ['d1', 'd3'],
'rights': '-'},
{'ep': None, 'halfmove': 2, 'rights': '-'}),
('queen two-rank move',
{'board': {'c4': 'P', 'd6': 'q', 'e1': 'K', 'e8': 'k'},
'halfmove': 6,
'move': ['d6', 'd4'],
'rights': 'k'},
{'ep': None, 'halfmove': 7, 'rights': 'k'})],
[('king move clears both',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h1': 'R'},
'halfmove': 3,
'move': ['e1', 'f1'],
'rights': 'KQkq'},
{'ep': None, 'halfmove': 4, 'rights': 'kq'}),
('black king move',
{'board': {'e1': 'K', 'e8': 'k'}, 'halfmove': 0, 'move': ['e8', 'd8'], 'rights': 'KQkq'},
{'ep': None, 'halfmove': 1, 'rights': 'KQ'}),
('rook captured on a8',
{'board': {'a8': 'r', 'b7': 'B', 'e1': 'K', 'e8': 'k'},
'halfmove': 5,
'move': ['b7', 'a8'],
'rights': 'Kkq'},
{'ep': None, 'halfmove': 0, 'rights': 'Kk'}),
('bishop takes h8 rook',
{'board': {'a1': 'B', 'e1': 'K', 'e8': 'k', 'h8': 'r'},
'halfmove': 5,
'move': ['a1', 'h8'],
'rights': 'KQk'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('rook leaves corner',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 9,
'move': ['a1', 'a5'],
'rights': 'KQ'},
{'ep': None, 'halfmove': 10, 'rights': 'K'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('queen two-rank move',
{'board': {'c4': 'P', 'd6': 'q', 'e1': 'K', 'e8': 'k'},
'halfmove': 6,
'move': ['d6', 'd4'],
'rights': 'k'},
{'ep': None, 'halfmove': 7, 'rights': 'k'})]]
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 |
|---|---|---|---|
| king move clears both | {'ep': None, 'halfmove': 4, 'rights': 'kq'} | {'ep': None, 'halfmove': 4, 'rights': 'kq'} | Passed |
| black king move | {'ep': None, 'halfmove': 1, 'rights': 'KQ'} | {'ep': None, 'halfmove': 1, 'rights': 'KQ'} | Passed |
| rook captured on a8 | {'ep': None, 'halfmove': 0, 'rights': 'Kk'} | {'ep': None, 'halfmove': 0, 'rights': 'Kk'} | Passed |
| bishop takes h8 rook | {'ep': None, 'halfmove': 0, 'rights': 'K'} | {'ep': None, 'halfmove': 0, 'rights': 'K'} | Passed |
| rook leaves corner | {'ep': None, 'halfmove': 10, 'rights': 'K'} | {'ep': None, 'halfmove': 10, 'rights': 'K'} | Passed |
| double step with adjacent enemy | {'ep': 'e4', 'halfmove': 0, 'rights': '-'} | {'ep': 'e3', 'halfmove': 0, 'rights': '-'} | Failed |
| double step no enemy beside | {'ep': None, 'halfmove': 0, 'rights': '-'} | {'ep': None, 'halfmove': 0, 'rights': '-'} | Passed |
| black double step | {'ep': 'c5', 'halfmove': 0, 'rights': 'kq'} | {'ep': 'c6', 'halfmove': 0, 'rights': 'kq'} | Failed |
SHA-256 / 82f4b183bfd2f71208a677b3634695de33599b0653f553c627cab63db8069ff6
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
b=x['board']; fr,to=x['move']; p=b[fr]; cap=b.get(to)
rights=x['rights'].replace('-','')
if p=='K': rights=rights.replace('K','').replace('Q','')
if p=='k': rights=rights.replace('k','').replace('q','')
for sq,r in (('h1','K'),('a1','Q'),('h8','k'),('a8','q')):
if fr==sq or to==sq: rights=rights.replace(r,'')
ep=None
if p in ('P','p') and abs(int(to[1])-int(fr[1]))==2:
enemy='p' if p=='P' else 'P'
f=ord(to[0])-97
if any(b.get(chr(97+f+d)+to[1])==enemy for d in (-1,1)):
ep=fr[0]+fr[1]
pawn_or_capture=p in ('P','p') or cap is not None
hm=0 if pawn_or_capture else x['halfmove']+1
return {'rights':rights or '-','ep':ep,'halfmove':hm}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('king move clears both',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h1': 'R'},
'halfmove': 3,
'move': ['e1', 'f1'],
'rights': 'KQkq'},
{'ep': None, 'halfmove': 4, 'rights': 'kq'}),
('black king move',
{'board': {'e1': 'K', 'e8': 'k'}, 'halfmove': 0, 'move': ['e8', 'd8'], 'rights': 'KQkq'},
{'ep': None, 'halfmove': 1, 'rights': 'KQ'}),
('rook captured on a8',
{'board': {'a8': 'r', 'b7': 'B', 'e1': 'K', 'e8': 'k'},
'halfmove': 5,
'move': ['b7', 'a8'],
'rights': 'Kkq'},
{'ep': None, 'halfmove': 0, 'rights': 'Kk'}),
('bishop takes h8 rook',
{'board': {'a1': 'B', 'e1': 'K', 'e8': 'k', 'h8': 'r'},
'halfmove': 5,
'move': ['a1', 'h8'],
'rights': 'KQk'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('rook leaves corner',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 9,
'move': ['a1', 'a5'],
'rights': 'KQ'},
{'ep': None, 'halfmove': 10, 'rights': 'K'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('double step no enemy beside',
{'board': {'a4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'})],
[('bishop takes h8 rook',
{'board': {'a1': 'B', 'e1': 'K', 'e8': 'k', 'h8': 'r'},
'halfmove': 5,
'move': ['a1', 'h8'],
'rights': 'KQk'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('rook leaves corner',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 9,
'move': ['a1', 'a5'],
'rights': 'KQ'},
{'ep': None, 'halfmove': 10, 'rights': 'K'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('double step no enemy beside',
{'board': {'a4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('double step beside own pawn',
{'board': {'e1': 'K', 'e2': 'P', 'e8': 'k', 'f4': 'P'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('black double step beside black pawn',
{'board': {'c7': 'p', 'd5': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': None, 'halfmove': 0, 'rights': 'kq'}),
('quiet knight move',
{'board': {'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'halfmove': 7, 'move': ['g1', 'f3'], 'rights': 'K'},
{'ep': None, 'halfmove': 8, 'rights': 'K'})],
[('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('double step beside own pawn',
{'board': {'e1': 'K', 'e2': 'P', 'e8': 'k', 'f4': 'P'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('black double step beside black pawn',
{'board': {'c7': 'p', 'd5': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': None, 'halfmove': 0, 'rights': 'kq'}),
('quiet knight move',
{'board': {'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'halfmove': 7, 'move': ['g1', 'f3'], 'rights': 'K'},
{'ep': None, 'halfmove': 8, 'rights': 'K'}),
('knight capture resets',
{'board': {'e1': 'K', 'e8': 'k', 'f3': 'p', 'g1': 'N'},
'halfmove': 7,
'move': ['g1', 'f3'],
'rights': 'K'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('single pawn step',
{'board': {'a2': 'P', 'e1': 'K', 'e8': 'k'},
'halfmove': 11,
'move': ['a2', 'a3'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('rook two-rank move',
{'board': {'c3': 'p', 'd1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 1,
'move': ['d1', 'd3'],
'rights': '-'},
{'ep': None, 'halfmove': 2, 'rights': '-'})],
[('king move clears both',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h1': 'R'},
'halfmove': 3,
'move': ['e1', 'f1'],
'rights': 'KQkq'},
{'ep': None, 'halfmove': 4, 'rights': 'kq'}),
('black king move',
{'board': {'e1': 'K', 'e8': 'k'}, 'halfmove': 0, 'move': ['e8', 'd8'], 'rights': 'KQkq'},
{'ep': None, 'halfmove': 1, 'rights': 'KQ'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('knight capture resets',
{'board': {'e1': 'K', 'e8': 'k', 'f3': 'p', 'g1': 'N'},
'halfmove': 7,
'move': ['g1', 'f3'],
'rights': 'K'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('single pawn step',
{'board': {'a2': 'P', 'e1': 'K', 'e8': 'k'},
'halfmove': 11,
'move': ['a2', 'a3'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('rook two-rank move',
{'board': {'c3': 'p', 'd1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 1,
'move': ['d1', 'd3'],
'rights': '-'},
{'ep': None, 'halfmove': 2, 'rights': '-'}),
('queen two-rank move',
{'board': {'c4': 'P', 'd6': 'q', 'e1': 'K', 'e8': 'k'},
'halfmove': 6,
'move': ['d6', 'd4'],
'rights': 'k'},
{'ep': None, 'halfmove': 7, 'rights': 'k'})],
[('king move clears both',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h1': 'R'},
'halfmove': 3,
'move': ['e1', 'f1'],
'rights': 'KQkq'},
{'ep': None, 'halfmove': 4, 'rights': 'kq'}),
('black king move',
{'board': {'e1': 'K', 'e8': 'k'}, 'halfmove': 0, 'move': ['e8', 'd8'], 'rights': 'KQkq'},
{'ep': None, 'halfmove': 1, 'rights': 'KQ'}),
('rook captured on a8',
{'board': {'a8': 'r', 'b7': 'B', 'e1': 'K', 'e8': 'k'},
'halfmove': 5,
'move': ['b7', 'a8'],
'rights': 'Kkq'},
{'ep': None, 'halfmove': 0, 'rights': 'Kk'}),
('bishop takes h8 rook',
{'board': {'a1': 'B', 'e1': 'K', 'e8': 'k', 'h8': 'r'},
'halfmove': 5,
'move': ['a1', 'h8'],
'rights': 'KQk'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('rook leaves corner',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 9,
'move': ['a1', 'a5'],
'rights': 'KQ'},
{'ep': None, 'halfmove': 10, 'rights': 'K'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('queen two-rank move',
{'board': {'c4': 'P', 'd6': 'q', 'e1': 'K', 'e8': 'k'},
'halfmove': 6,
'move': ['d6', 'd4'],
'rights': 'k'},
{'ep': None, 'halfmove': 7, 'rights': 'k'})]]
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 |
|---|---|---|---|
| king move clears both | {'ep': None, 'halfmove': 4, 'rights': 'kq'} | {'ep': None, 'halfmove': 4, 'rights': 'kq'} | Passed |
| black king move | {'ep': None, 'halfmove': 1, 'rights': 'KQ'} | {'ep': None, 'halfmove': 1, 'rights': 'KQ'} | Passed |
| rook captured on a8 | {'ep': None, 'halfmove': 0, 'rights': 'Kk'} | {'ep': None, 'halfmove': 0, 'rights': 'Kk'} | Passed |
| bishop takes h8 rook | {'ep': None, 'halfmove': 0, 'rights': 'K'} | {'ep': None, 'halfmove': 0, 'rights': 'K'} | Passed |
| rook leaves corner | {'ep': None, 'halfmove': 10, 'rights': 'K'} | {'ep': None, 'halfmove': 10, 'rights': 'K'} | Passed |
| double step with adjacent enemy | {'ep': 'e2', 'halfmove': 0, 'rights': '-'} | {'ep': 'e3', 'halfmove': 0, 'rights': '-'} | Failed |
| double step no enemy beside | {'ep': None, 'halfmove': 0, 'rights': '-'} | {'ep': None, 'halfmove': 0, 'rights': '-'} | Passed |
| black double step | {'ep': 'c7', 'halfmove': 0, 'rights': 'kq'} | {'ep': 'c6', 'halfmove': 0, 'rights': 'kq'} | Failed |
SHA-256 / a720e80aab1003af414902eda936e103db6e6da052b2fa36f85caaed2cd2cb10
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
b=x['board']; fr,to=x['move']; p=b[fr]; cap=b.get(to)
rights=x['rights'].replace('-','')
if p=='K': rights=rights.replace('K','').replace('Q','')
if p=='k': rights=rights.replace('k','').replace('q','')
for sq,r in (('h1','K'),('a1','Q'),('h8','k'),('a8','q')):
if fr==sq or to==sq: rights=rights.replace(r,'')
ep=None
if p in ('P','p') and abs(int(to[1])-int(fr[1]))==2:
enemy='p' if p=='P' else 'P'
f=ord(to[0])-97
if any(b.get(chr(97+f+d)+to[1])==enemy for d in (-1,1)):
ep=fr[0]+str((int(fr[1])+int(to[1]))//2)
pawn_or_capture=p in ('P','p') or cap is not None
hm=0 if pawn_or_capture else x['halfmove']+1
return {'rights':rights or '-','ep':ep,'halfmove':hm}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('king move clears both',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h1': 'R'},
'halfmove': 3,
'move': ['e1', 'f1'],
'rights': 'KQkq'},
{'ep': None, 'halfmove': 4, 'rights': 'kq'}),
('black king move',
{'board': {'e1': 'K', 'e8': 'k'}, 'halfmove': 0, 'move': ['e8', 'd8'], 'rights': 'KQkq'},
{'ep': None, 'halfmove': 1, 'rights': 'KQ'}),
('rook captured on a8',
{'board': {'a8': 'r', 'b7': 'B', 'e1': 'K', 'e8': 'k'},
'halfmove': 5,
'move': ['b7', 'a8'],
'rights': 'Kkq'},
{'ep': None, 'halfmove': 0, 'rights': 'Kk'}),
('bishop takes h8 rook',
{'board': {'a1': 'B', 'e1': 'K', 'e8': 'k', 'h8': 'r'},
'halfmove': 5,
'move': ['a1', 'h8'],
'rights': 'KQk'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('rook leaves corner',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 9,
'move': ['a1', 'a5'],
'rights': 'KQ'},
{'ep': None, 'halfmove': 10, 'rights': 'K'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('double step no enemy beside',
{'board': {'a4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'})],
[('bishop takes h8 rook',
{'board': {'a1': 'B', 'e1': 'K', 'e8': 'k', 'h8': 'r'},
'halfmove': 5,
'move': ['a1', 'h8'],
'rights': 'KQk'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('rook leaves corner',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 9,
'move': ['a1', 'a5'],
'rights': 'KQ'},
{'ep': None, 'halfmove': 10, 'rights': 'K'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('double step no enemy beside',
{'board': {'a4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('double step beside own pawn',
{'board': {'e1': 'K', 'e2': 'P', 'e8': 'k', 'f4': 'P'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('black double step beside black pawn',
{'board': {'c7': 'p', 'd5': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': None, 'halfmove': 0, 'rights': 'kq'}),
('quiet knight move',
{'board': {'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'halfmove': 7, 'move': ['g1', 'f3'], 'rights': 'K'},
{'ep': None, 'halfmove': 8, 'rights': 'K'})],
[('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('double step beside own pawn',
{'board': {'e1': 'K', 'e2': 'P', 'e8': 'k', 'f4': 'P'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('black double step beside black pawn',
{'board': {'c7': 'p', 'd5': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': None, 'halfmove': 0, 'rights': 'kq'}),
('quiet knight move',
{'board': {'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'halfmove': 7, 'move': ['g1', 'f3'], 'rights': 'K'},
{'ep': None, 'halfmove': 8, 'rights': 'K'}),
('knight capture resets',
{'board': {'e1': 'K', 'e8': 'k', 'f3': 'p', 'g1': 'N'},
'halfmove': 7,
'move': ['g1', 'f3'],
'rights': 'K'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('single pawn step',
{'board': {'a2': 'P', 'e1': 'K', 'e8': 'k'},
'halfmove': 11,
'move': ['a2', 'a3'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('rook two-rank move',
{'board': {'c3': 'p', 'd1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 1,
'move': ['d1', 'd3'],
'rights': '-'},
{'ep': None, 'halfmove': 2, 'rights': '-'})],
[('king move clears both',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h1': 'R'},
'halfmove': 3,
'move': ['e1', 'f1'],
'rights': 'KQkq'},
{'ep': None, 'halfmove': 4, 'rights': 'kq'}),
('black king move',
{'board': {'e1': 'K', 'e8': 'k'}, 'halfmove': 0, 'move': ['e8', 'd8'], 'rights': 'KQkq'},
{'ep': None, 'halfmove': 1, 'rights': 'KQ'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('knight capture resets',
{'board': {'e1': 'K', 'e8': 'k', 'f3': 'p', 'g1': 'N'},
'halfmove': 7,
'move': ['g1', 'f3'],
'rights': 'K'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('single pawn step',
{'board': {'a2': 'P', 'e1': 'K', 'e8': 'k'},
'halfmove': 11,
'move': ['a2', 'a3'],
'rights': '-'},
{'ep': None, 'halfmove': 0, 'rights': '-'}),
('rook two-rank move',
{'board': {'c3': 'p', 'd1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 1,
'move': ['d1', 'd3'],
'rights': '-'},
{'ep': None, 'halfmove': 2, 'rights': '-'}),
('queen two-rank move',
{'board': {'c4': 'P', 'd6': 'q', 'e1': 'K', 'e8': 'k'},
'halfmove': 6,
'move': ['d6', 'd4'],
'rights': 'k'},
{'ep': None, 'halfmove': 7, 'rights': 'k'})],
[('king move clears both',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k', 'h1': 'R'},
'halfmove': 3,
'move': ['e1', 'f1'],
'rights': 'KQkq'},
{'ep': None, 'halfmove': 4, 'rights': 'kq'}),
('black king move',
{'board': {'e1': 'K', 'e8': 'k'}, 'halfmove': 0, 'move': ['e8', 'd8'], 'rights': 'KQkq'},
{'ep': None, 'halfmove': 1, 'rights': 'KQ'}),
('rook captured on a8',
{'board': {'a8': 'r', 'b7': 'B', 'e1': 'K', 'e8': 'k'},
'halfmove': 5,
'move': ['b7', 'a8'],
'rights': 'Kkq'},
{'ep': None, 'halfmove': 0, 'rights': 'Kk'}),
('bishop takes h8 rook',
{'board': {'a1': 'B', 'e1': 'K', 'e8': 'k', 'h8': 'r'},
'halfmove': 5,
'move': ['a1', 'h8'],
'rights': 'KQk'},
{'ep': None, 'halfmove': 0, 'rights': 'K'}),
('rook leaves corner',
{'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'},
'halfmove': 9,
'move': ['a1', 'a5'],
'rights': 'KQ'},
{'ep': None, 'halfmove': 10, 'rights': 'K'}),
('double step with adjacent enemy',
{'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'},
'halfmove': 4,
'move': ['e2', 'e4'],
'rights': '-'},
{'ep': 'e3', 'halfmove': 0, 'rights': '-'}),
('black double step',
{'board': {'b5': 'P', 'c7': 'p', 'e1': 'K', 'e8': 'k'},
'halfmove': 2,
'move': ['c7', 'c5'],
'rights': 'kq'},
{'ep': 'c6', 'halfmove': 0, 'rights': 'kq'}),
('queen two-rank move',
{'board': {'c4': 'P', 'd6': 'q', 'e1': 'K', 'e8': 'k'},
'halfmove': 6,
'move': ['d6', 'd4'],
'rights': 'k'},
{'ep': None, 'halfmove': 7, 'rights': 'k'})]]
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 |
|---|---|---|---|
| king move clears both | {'ep': None, 'halfmove': 4, 'rights': 'kq'} | {'ep': None, 'halfmove': 4, 'rights': 'kq'} | Passed |
| black king move | {'ep': None, 'halfmove': 1, 'rights': 'KQ'} | {'ep': None, 'halfmove': 1, 'rights': 'KQ'} | Passed |
| rook captured on a8 | {'ep': None, 'halfmove': 0, 'rights': 'Kk'} | {'ep': None, 'halfmove': 0, 'rights': 'Kk'} | Passed |
| bishop takes h8 rook | {'ep': None, 'halfmove': 0, 'rights': 'K'} | {'ep': None, 'halfmove': 0, 'rights': 'K'} | Passed |
| rook leaves corner | {'ep': None, 'halfmove': 10, 'rights': 'K'} | {'ep': None, 'halfmove': 10, 'rights': 'K'} | Passed |
| double step with adjacent enemy | {'ep': 'e3', 'halfmove': 0, 'rights': '-'} | {'ep': 'e3', 'halfmove': 0, 'rights': '-'} | Passed |
| double step no enemy beside | {'ep': None, 'halfmove': 0, 'rights': '-'} | {'ep': None, 'halfmove': 0, 'rights': '-'} | Passed |
| black double step | {'ep': 'c6', 'halfmove': 0, 'rights': 'kq'} | {'ep': 'c6', 'halfmove': 0, 'rights': 'kq'} | Passed |
SHA-256 / 0e545c44e80309dd9704f52dbb3942520c5bcec00c9f8fdb0ec65126dc86a8df
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:13.420444+00:00.
Case digest / efbe511ccc4cd198c847c10e4b1988e6bc6d794d5437a11a56e2552f8b17eb5c