FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 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 / 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