FAILURE MAP
← Case archive

FA-82731 / Chess move legality / Open access

Any king step onto the g-file drags the rook · case 01

Kf1-g1 moves the h1 rook to f1.

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

ROOT CAUSE

Castling is recognized by the destination file instead of a two-file king move.

VERIFIED REPAIR

A king move is castling only when it travels exactly two files.

Unsuccessful approach: Accepting only rightward two-file moves ignores queenside castling.

Case contract

Input: {"board", "moves": [uci strings]}. Apply the moves in order and return the final board sorted by square. A king moving two files castles: the rook jumps from h to f (g-file destination) or from a to d (c-file destination). A pawn moving diagonally onto an empty square captures en passant, removing the pawn on the destination file and origin rank. A fifth character promotes to that piece in the mover's colour.

Why this case matters

Move application defines the position every later legality check sees.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    b=dict(x['board'])
    for u in x['moves']:
        fr,to,pr=u[:2],u[2:4],u[4:]
        p=b.pop(fr)
        if p in ('K','k') and to[0] in 'gc':
            if to[0]=='g': b['f'+to[1]]=b.pop('h'+to[1])
            else: b['d'+to[1]]=b.pop('a'+to[1])
        if p in ('P','p') and fr[0]!=to[0] and to not in b:
            del b[to[0]+fr[1]]
        if pr: p=pr.upper() if p=='P' else pr.lower()
        b[to]=p
    return dict(sorted(b.items()))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
   {'e1': 'K', 'f8': 'r', 'g8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
  ('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
   {'e1': 'K', 'e8': 'k', 'g1': 'n'}),
  ('quiet sequence',
   {'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
   {'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
  ('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
   {'c4': 'P', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
   {'e1': 'K', 'f8': 'r', 'g8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('quiet sequence',
   {'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
   {'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
  ('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
   {'c4': 'P', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
   {'e1': 'K', 'f8': 'r', 'g8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
  ('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
   {'e1': 'K', 'e8': 'k', 'g1': 'n'})]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'error:' + type(exc).__name__
    check(label, actual, expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary 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', 'f1': 'R', 'g1': 'K'}{'e8': 'k', 'g1': 'K', 'h1': 'R'}Failed
king step to c8{'c8': 'k', 'd8': 'r', 'e1': 'K'}{'a8': 'r', 'c8': 'k', 'e1': 'K'}Failed
white en passant{'d6': 'P', 'e1': 'K', 'e8': 'k'}{'d6': 'P', 'e1': 'K', 'e8': 'k'}Passed
black en passant{'e1': 'K', 'e3': 'p', 'e8': 'k'}{'e1': 'K', 'e3': 'p', 'e8': 'k'}Passed
ordinary pawn capture{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}Passed
white promotion{'b8': 'Q', 'e1': 'K', 'e8': 'k'}{'b8': 'Q', 'e1': 'K', 'e8': 'k'}Passed

SHA-256 / 5c78dcea7b9478847d4ffba314690b7b6b84327fd33da02c21cb4d98d7b00984

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    b=dict(x['board'])
    for u in x['moves']:
        fr,to,pr=u[:2],u[2:4],u[4:]
        p=b.pop(fr)
        if p in ('K','k') and ord(to[0])-ord(fr[0])==2:
            if to[0]=='g': b['f'+to[1]]=b.pop('h'+to[1])
            else: b['d'+to[1]]=b.pop('a'+to[1])
        if p in ('P','p') and fr[0]!=to[0] and to not in b:
            del b[to[0]+fr[1]]
        if pr: p=pr.upper() if p=='P' else pr.lower()
        b[to]=p
    return dict(sorted(b.items()))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
   {'e1': 'K', 'f8': 'r', 'g8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
  ('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
   {'e1': 'K', 'e8': 'k', 'g1': 'n'}),
  ('quiet sequence',
   {'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
   {'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
  ('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
   {'c4': 'P', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
   {'e1': 'K', 'f8': 'r', 'g8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('quiet sequence',
   {'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
   {'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
  ('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
   {'c4': 'P', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
   {'e1': 'K', 'f8': 'r', 'g8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
  ('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
   {'e1': 'K', 'e8': 'k', 'g1': 'n'})]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'error:' + type(exc).__name__
    check(label, actual, expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
white long castle{'a1': 'R', 'c1': 'K', 'e8': 'k'}{'c1': 'K', 'd1': 'R', 'e8': 'k'}Failed
black short castle{'e1': 'K', 'f8': 'r', 'g8': 'k'}{'e1': 'K', 'f8': 'r', 'g8': 'k'}Passed
king step to g1{'e8': 'k', 'g1': 'K', 'h1': 'R'}{'e8': 'k', 'g1': 'K', 'h1': 'R'}Passed
king step to c8{'a8': 'r', 'c8': 'k', 'e1': 'K'}{'a8': 'r', 'c8': 'k', 'e1': 'K'}Passed
white en passant{'d6': 'P', 'e1': 'K', 'e8': 'k'}{'d6': 'P', 'e1': 'K', 'e8': 'k'}Passed
black en passant{'e1': 'K', 'e3': 'p', 'e8': 'k'}{'e1': 'K', 'e3': 'p', 'e8': 'k'}Passed
ordinary pawn capture{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}{'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}Passed
white promotion{'b8': 'Q', 'e1': 'K', 'e8': 'k'}{'b8': 'Q', 'e1': 'K', 'e8': 'k'}Passed

SHA-256 / 737ed38480e2f62aca075537dda0c5f4e6b45b6712be4d4772aeab04d924d648

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    b=dict(x['board'])
    for u in x['moves']:
        fr,to,pr=u[:2],u[2:4],u[4:]
        p=b.pop(fr)
        if p in ('K','k') and abs(ord(to[0])-ord(fr[0]))==2:
            if to[0]=='g': b['f'+to[1]]=b.pop('h'+to[1])
            else: b['d'+to[1]]=b.pop('a'+to[1])
        if p in ('P','p') and fr[0]!=to[0] and to not in b:
            del b[to[0]+fr[1]]
        if pr: p=pr.upper() if p=='P' else pr.lower()
        b[to]=p
    return dict(sorted(b.items()))
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
   {'e1': 'K', 'f8': 'r', 'g8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
  ('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
   {'e1': 'K', 'e8': 'k', 'g1': 'n'}),
  ('quiet sequence',
   {'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
   {'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
  ('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
   {'c4': 'P', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
   {'e1': 'K', 'f8': 'r', 'g8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('quiet sequence',
   {'board': {'b8': 'n', 'e1': 'K', 'e8': 'k', 'g1': 'N'}, 'moves': ['g1f3', 'b8c6', 'f3e5']},
   {'c6': 'n', 'e1': 'K', 'e5': 'N', 'e8': 'k'}),
  ('pawn push', {'board': {'c2': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['c2c4']},
   {'c4': 'P', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('black short castle', {'board': {'e1': 'K', 'e8': 'k', 'h8': 'r'}, 'moves': ['e8g8']},
   {'e1': 'K', 'f8': 'r', 'g8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'})],
 [('white long castle', {'board': {'a1': 'R', 'e1': 'K', 'e8': 'k'}, 'moves': ['e1c1']},
   {'c1': 'K', 'd1': 'R', 'e8': 'k'}),
  ('king step to g1', {'board': {'e8': 'k', 'f1': 'K', 'h1': 'R'}, 'moves': ['f1g1']},
   {'e8': 'k', 'g1': 'K', 'h1': 'R'}),
  ('king step to c8', {'board': {'a8': 'r', 'd8': 'k', 'e1': 'K'}, 'moves': ['d8c8']},
   {'a8': 'r', 'c8': 'k', 'e1': 'K'}),
  ('white en passant',
   {'board': {'d7': 'p', 'e1': 'K', 'e5': 'P', 'e8': 'k'}, 'moves': ['d7d5', 'e5d6']},
   {'d6': 'P', 'e1': 'K', 'e8': 'k'}),
  ('black en passant',
   {'board': {'d4': 'p', 'e1': 'K', 'e2': 'P', 'e8': 'k'}, 'moves': ['e2e4', 'd4e3']},
   {'e1': 'K', 'e3': 'p', 'e8': 'k'}),
  ('ordinary pawn capture',
   {'board': {'d4': 'N', 'd5': 'p', 'e1': 'K', 'e4': 'P', 'e8': 'k'}, 'moves': ['e4d5']},
   {'d4': 'N', 'd5': 'P', 'e1': 'K', 'e8': 'k'}),
  ('white promotion', {'board': {'b7': 'P', 'e1': 'K', 'e8': 'k'}, 'moves': ['b7b8q']},
   {'b8': 'Q', 'e1': 'K', 'e8': 'k'}),
  ('black underpromotion', {'board': {'e1': 'K', 'e8': 'k', 'g2': 'p'}, 'moves': ['g2g1n']},
   {'e1': 'K', 'e8': 'k', 'g1': 'n'})]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'error:' + type(exc).__name__
    check(label, actual, expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary 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 / e93489a33cfd4bfa20933cfe2c9dea806a2b3af003f3d2f9d45aa9131cb30ee3

Verification & scope

A deterministic toy model with an explicitly stated contract; boards are {square: piece} with white upper-case and black lower-case pieces; no claim of full FIDE Laws conformance. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:50:14.769579+00:00.

Case digest / a1fa65a592b01389152f8812f46dcb2f5471c879d7f27ae25a14126d9b1f3620