FAILURE MAP
← Case archive

FA-82736 / Chess move legality / Open access

En passant deletes the wrong square · case 01

An en passant capture fails because the removal targets an empty square.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The victim square uses the origin file and destination rank.

VERIFIED REPAIR

The captured pawn is on the destination file and origin rank.

Unsuccessful approach: Assuming the victim is one rank below the destination only works for white.

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['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[fr[0]+to[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'})],
 [('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'}),
  ('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'}),
  ('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'}),
  ('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'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', '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'}),
  ('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 fixtureActualExpectedOutcome
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 passanterror:KeyError{'d6': 'P', 'e1': 'K', 'e8': 'k'}Failed
black en passanterror:KeyError{'e1': 'K', 'e3': 'p', 'e8': 'k'}Failed
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 / 43ce5d17e85445517f93e4446daf0525bf8c35aeee2cb5aa8125f76773b3b728

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.pop('a'+to[1])
        if p in ('P','p') and fr[0]!=to[0] and to not in b:
            b.pop(to[0]+str(int(to[1])-1),None)
        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'})],
 [('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'}),
  ('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'}),
  ('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'}),
  ('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'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', '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'}),
  ('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 fixtureActualExpectedOutcome
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', 'e4': 'P', 'e8': 'k'}{'e1': 'K', 'e3': 'p', 'e8': 'k'}Failed
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 / 518e1fd868cd0b99e30295ff0534a4a7085a1a601cd5cac1015ad643bf6d662d

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'})],
 [('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'}),
  ('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'}),
  ('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'}),
  ('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'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', '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'}),
  ('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 fixtureActualExpectedOutcome
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 / 1a6b282fc6089a985877699c4057efb2f532d59233f75669306ba383e9905517

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.770581+00:00.

Case digest / fdef025d414dc19178bac61e16e313c883cb1456ffa94b76d84e2dff30fd5001