FAILURE MAP
← Case archive

FA-82381 / Chess move legality / Open access

Bishop never moves toward a1 · case 01

A bishop on f5 is not offered e4, d3 or the capture on c2, and some targets repeat.

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

ROOT CAUSE

The south-west diagonal (-1,-1) was typed as a second (1,1).

VERIFIED REPAIR

List the four distinct diagonal directions.

Unsuccessful approach: Duplicating (-1,-1) instead drops the south-east diagonal.

Case contract

Input: {"board", "from": square of a rook, bishop or queen}. Return the sorted pseudo-legal destinations: walk each ray until the edge; an empty square is added, an enemy piece is added and ends the ray, a friendly piece ends the ray without being added.

Why this case matters

Move validators gate every move in engines, servers and arbiters; accepting an illegal move or rejecting a legal one corrupts the game record.

1 / The failure

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

N = 1
observations = []
def solve(x):
    b=x['board']; sq=x['from']; p=b[sq]
    f,r=ord(sq[0])-97,int(sq[1])-1
    dirs={'r':[(1,0),(-1,0),(0,1),(0,-1)],'b':[(1,1),(1,-1),(-1,1),(1,1)]}
    dirs['q']=dirs['r']+dirs['b']
    out=[]
    for df,dr in dirs[p.lower()]:
        cf,cr=f+df,r+dr
        while 0<=cf<8 and 0<=cr<8:
            t=chr(97+cf)+str(cr+1)
            occ=b.get(t)
            if occ is None:
                out.append(t)
            else:
                if occ.isupper()!=p.isupper(): out.append(t)
                break
            cf+=df; cr+=dr
    return sorted(out)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop corner', {'board': {'e4': 'P', 'h1': 'b'}, 'from': 'h1'}, ['e4', 'f3', 'g2']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop corner', {'board': {'e4': 'P', 'h1': 'b'}, 'from': 'h1'}, ['e4', 'f3', 'g2']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop corner', {'board': {'e4': 'P', 'h1': 'b'}, 'from': 'h1'}, ['e4', 'f3', 'g2']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])]]
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
rook blocked by enemy['a2', 'a3', 'b1']['a2', 'a3', 'b1']Passed
rook behind enemy['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']Passed
bishop corner['e4', 'f3', 'g2']['e4', 'f3', 'g2']Passed
bishop centre['c5', 'e3', 'e5', 'e5', 'f2', 'f6', 'f6', 'g1']['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']Failed
queen boxed[][]Passed
queen open['a5', 'a8', 'b5', 'b7', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5', 'e6', 'e6', 'f3', 'f5', 'f7', 'f7', 'g2', 'g5', 'g8', 'g8', 'h1', 'h5']['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5', 'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']Failed
black rook top edge['f8', 'g8', 'h5', 'h6', 'h7']['f8', 'g8', 'h5', 'h6', 'h7']Passed
queen along diagonal capture['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'd2', 'e1', 'e3', 'e3', 'f1', 'f4', 'f4', 'g1', 'g5', 'g5', 'h1', 'h6', 'h6']['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']Failed

SHA-256 / 7e753c381002c8d6edf2909e6c2c4ea7775ebf9ae754cbf252af7220cab8be4f

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']; sq=x['from']; p=b[sq]
    f,r=ord(sq[0])-97,int(sq[1])-1
    dirs={'r':[(1,0),(-1,0),(0,1),(0,-1)],'b':[(1,1),(-1,-1),(-1,1),(-1,-1)]}
    dirs['q']=dirs['r']+dirs['b']
    out=[]
    for df,dr in dirs[p.lower()]:
        cf,cr=f+df,r+dr
        while 0<=cf<8 and 0<=cr<8:
            t=chr(97+cf)+str(cr+1)
            occ=b.get(t)
            if occ is None:
                out.append(t)
            else:
                if occ.isupper()!=p.isupper(): out.append(t)
                break
            cf+=df; cr+=dr
    return sorted(out)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop corner', {'board': {'e4': 'P', 'h1': 'b'}, 'from': 'h1'}, ['e4', 'f3', 'g2']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop corner', {'board': {'e4': 'P', 'h1': 'b'}, 'from': 'h1'}, ['e4', 'f3', 'g2']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop corner', {'board': {'e4': 'P', 'h1': 'b'}, 'from': 'h1'}, ['e4', 'f3', 'g2']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])]]
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
rook blocked by enemy['a2', 'a3', 'b1']['a2', 'a3', 'b1']Passed
rook behind enemy['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']Passed
bishop corner['e4', 'f3', 'g2']['e4', 'f3', 'g2']Passed
bishop centre['c3', 'c3', 'c5', 'e5', 'f6']['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']Failed
queen boxed[][]Passed
queen open['a2', 'a2', 'a5', 'a8', 'b3', 'b3', 'b5', 'b7', 'c4', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e5', 'e6', 'f5', 'f7', 'g5', 'g8', 'h5']['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5', 'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']Failed
black rook top edge['f8', 'g8', 'h5', 'h6', 'h7']['f8', 'g8', 'h5', 'h6', 'h7']Passed
queen along diagonal capture['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']Passed

SHA-256 / dc010483b844d1308011642d8ad1df7edce52e623421e82ed06fc2e4281f1f09

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']; sq=x['from']; p=b[sq]
    f,r=ord(sq[0])-97,int(sq[1])-1
    dirs={'r':[(1,0),(-1,0),(0,1),(0,-1)],'b':[(1,1),(1,-1),(-1,1),(-1,-1)]}
    dirs['q']=dirs['r']+dirs['b']
    out=[]
    for df,dr in dirs[p.lower()]:
        cf,cr=f+df,r+dr
        while 0<=cf<8 and 0<=cr<8:
            t=chr(97+cf)+str(cr+1)
            occ=b.get(t)
            if occ is None:
                out.append(t)
            else:
                if occ.isupper()!=p.isupper(): out.append(t)
                break
            cf+=df; cr+=dr
    return sorted(out)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop corner', {'board': {'e4': 'P', 'h1': 'b'}, 'from': 'h1'}, ['e4', 'f3', 'g2']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop corner', {'board': {'e4': 'P', 'h1': 'b'}, 'from': 'h1'}, ['e4', 'f3', 'g2']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop corner', {'board': {'e4': 'P', 'h1': 'b'}, 'from': 'h1'}, ['e4', 'f3', 'g2']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])],
 [('rook blocked by enemy', {'board': {'a1': 'R', 'a3': 'p', 'c1': 'N'}, 'from': 'a1'},
   ['a2', 'a3', 'b1']),
  ('rook behind enemy',
   {'board': {'b4': 'b', 'd4': 'R', 'd6': 'p', 'd8': 'k', 'f4': 'P'}, 'from': 'd4'},
   ['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']),
  ('bishop centre',
   {'board': {'b2': 'P', 'b6': 'P', 'd4': 'B', 'f6': 'n', 'g1': 'q'}, 'from': 'd4'},
   ['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']),
  ('queen boxed',
   {'board': {'d1': 'K', 'd2': 'P', 'e1': 'Q', 'e2': 'P', 'f1': 'B', 'f2': 'P'}, 'from': 'e1'},
   []),
  ('queen open', {'board': {'a5': 'R', 'd5': 'q', 'd7': 'p', 'g8': 'P'}, 'from': 'd5'},
   ['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5',
    'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']),
  ('black rook top edge', {'board': {'e8': 'k', 'h5': 'P', 'h8': 'r'}, 'from': 'h8'},
   ['f8', 'g8', 'h5', 'h6', 'h7']),
  ('queen along diagonal capture',
   {'board': {'a3': 'n', 'c1': 'Q', 'c3': 'P', 'h6': 'r'}, 'from': 'c1'},
   ['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']),
  ('bishop sw ray', {'board': {'c2': 'r', 'f5': 'B', 'h7': 'p'}, 'from': 'f5'},
   ['c2', 'c8', 'd3', 'd7', 'e4', 'e6', 'g4', 'g6', 'h3', 'h7'])]]
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
rook blocked by enemy['a2', 'a3', 'b1']['a2', 'a3', 'b1']Passed
rook behind enemy['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']['b4', 'c4', 'd1', 'd2', 'd3', 'd5', 'd6', 'e4']Passed
bishop corner['e4', 'f3', 'g2']['e4', 'f3', 'g2']Passed
bishop centre['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']['c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1']Passed
queen boxed[][]Passed
queen open['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5', 'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']['a2', 'a5', 'a8', 'b3', 'b5', 'b7', 'c4', 'c5', 'c6', 'd1', 'd2', 'd3', 'd4', 'd6', 'e4', 'e5', 'e6', 'f3', 'f5', 'f7', 'g2', 'g5', 'g8', 'h1', 'h5']Passed
black rook top edge['f8', 'g8', 'h5', 'h6', 'h7']['f8', 'g8', 'h5', 'h6', 'h7']Passed
queen along diagonal capture['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']['a1', 'a3', 'b1', 'b2', 'c2', 'd1', 'd2', 'e1', 'e3', 'f1', 'f4', 'g1', 'g5', 'h1', 'h6']Passed

SHA-256 / e04ab25d195caa7843632f87a5c0d203bc7d3c76999e8b5ba00f147a39281558

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

Case digest / 8cb2f1ee832c2fe1447e8a19c18d8ae4969c9606e3bf7ae4827f3cdaf3576444