{"abstract":"A pawn on e2 with a knight on e3 is offered e4.","category":"Chess move legality","checks":8,"contract":"Input: {\"board\", \"from\": square of a pawn, \"ep\": en passant target square or null}. Return sorted pseudo-legal destinations: one step forward if empty; two steps from the starting rank if both squares are empty; diagonal captures of enemy pieces or onto the ep square. A destination on the last rank is expanded into four entries suffixed q, r, b, n.","contract_signature":"x","evaluation_group":"w2-chess_move_legality-pawn-move-generation","failed_approach":"Nesting the check but dropping the occupancy test on the far square lets the pawn land on a piece.","family":"w2-chess_move_legality-pawn-move-generation-double-push-path","id":"FA-82386","implementations":{"attempt":{"sha256":"243f113d169ed0b49269cf5231f17a0e4c5851cb901deddc08675974459ff589","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    b=x['board']; sq=x['from']; p=b[sq]; white=p=='P'\n    f,r=ord(sq[0])-97,int(sq[1])-1\n    d=1 if white else -1\n    start=1 if white else 6\n    last=7 if white else 0\n    def at(ff,rr): return chr(97+ff)+str(rr+1)\n    out=[]\n    if 0<=r+d<8 and at(f,r+d) not in b:\n        out.append(at(f,r+d))\n        if r==start: out.append(at(f,r+2*d))\n    for df in (-1,1):\n        ff=f+df\n        if not 0<=ff<8 or not 0<=r+d<8: continue\n        t=at(ff,r+d); occ=b.get(t)\n        if (occ and occ.isupper()!=white) or t==x.get('ep'): out.append(t)\n    res=[]\n    for t in out:\n        if int(t[1])-1==last: res+=[t+c for c in 'qrbn']\n        else: res.append(t)\n    return sorted(res)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('white double push', {'board': {'e2': 'P'}, 'ep': None, 'from': 'e2'}, ['e3', 'e4']),\n  ('black double push', {'board': {'d7': 'p'}, 'ep': None, 'from': 'd7'}, ['d5', 'd6']),\n  ('blocked jump', {'board': {'e2': 'P', 'e3': 'n'}, 'ep': None, 'from': 'e2'}, []),\n  ('far square blocked', {'board': {'c5': 'P', 'c7': 'p'}, 'ep': None, 'from': 'c7'}, ['c6']),\n  ('captures both colours', {'board': {'c5': 'p', 'd4': 'P', 'e5': 'B'}, 'ep': None, 'from': 'd4'},\n   ['c5', 'd5']),\n  ('black captures',\n   {'board': {'e5': 'P', 'f5': 'P', 'f6': 'p', 'g5': 'n'}, 'ep': None, 'from': 'f6'}, ['e5']),\n  ('white promotion', {'board': {'a8': 'r', 'b7': 'P'}, 'ep': None, 'from': 'b7'},\n   ['a8b', 'a8n', 'a8q', 'a8r', 'b8b', 'b8n', 'b8q', 'b8r']),\n  ('black blocked by own', {'board': {'a6': 'P', 'b6': 'p', 'b7': 'p'}, 'ep': None, 'from': 'b7'},\n   ['a6'])],\n [('blocked jump', {'board': {'e2': 'P', 'e3': 'n'}, 'ep': None, 'from': 'e2'}, []),\n  ('far square blocked', {'board': {'c5': 'P', 'c7': 'p'}, 'ep': None, 'from': 'c7'}, ['c6']),\n  ('black captures',\n   {'board': {'e5': 'P', 'f5': 'P', 'f6': 'p', 'g5': 'n'}, 'ep': None, 'from': 'f6'}, ['e5']),\n  ('white promotion', {'board': {'a8': 'r', 'b7': 'P'}, 'ep': None, 'from': 'b7'},\n   ['a8b', 'a8n', 'a8q', 'a8r', 'b8b', 'b8n', 'b8q', 'b8r']),\n  ('black promotion', {'board': {'h2': 'p'}, 'ep': None, 'from': 'h2'},\n   ['h1b', 'h1n', 'h1q', 'h1r']),\n  ('en passant target', {'board': {'d5': 'p', 'e5': 'P'}, 'ep': 'd6', 'from': 'e5'}, ['d6', 'e6']),\n  ('black on sixth rank', {'board': {'a6': 'p'}, 'ep': None, 'from': 'a6'}, ['a5']),\n  ('black blocked by own', {'board': {'a6': 'P', 'b6': 'p', 'b7': 'p'}, 'ep': None, 'from': 'b7'},\n   ['a6'])],\n [('white double push', {'board': {'e2': 'P'}, 'ep': None, 'from': 'e2'}, ['e3', 'e4']),\n  ('black double push', {'board': {'d7': 'p'}, 'ep': None, 'from': 'd7'}, ['d5', 'd6']),\n  ('blocked jump', {'board': {'e2': 'P', 'e3': 'n'}, 'ep': None, 'from': 'e2'}, []),\n  ('far square blocked', {'board': {'c5': 'P', 'c7': 'p'}, 'ep': None, 'from': 'c7'}, ['c6']),\n  ('en passant target', {'board': {'d5': 'p', 'e5': 'P'}, 'ep': 'd6', 'from': 'e5'}, ['d6', 'e6']),\n  ('black on sixth rank', {'board': {'a6': 'p'}, 'ep': None, 'from': 'a6'}, ['a5']),\n  ('white third rank', {'board': {'g3': 'P'}, 'ep': None, 'from': 'g3'}, ['g4']),\n  ('black blocked by own', {'board': {'a6': 'P', 'b6': 'p', 'b7': 'p'}, 'ep': None, 'from': 'b7'},\n   ['a6'])],\n [('white double push', {'board': {'e2': 'P'}, 'ep': None, 'from': 'e2'}, ['e3', 'e4']),\n  ('black double push', {'board': {'d7': 'p'}, 'ep': None, 'from': 'd7'}, ['d5', 'd6']),\n  ('blocked jump', {'board': {'e2': 'P', 'e3': 'n'}, 'ep': None, 'from': 'e2'}, []),\n  ('far square blocked', {'board': {'c5': 'P', 'c7': 'p'}, 'ep': None, 'from': 'c7'}, ['c6']),\n  ('captures both colours', {'board': {'c5': 'p', 'd4': 'P', 'e5': 'B'}, 'ep': None, 'from': 'd4'},\n   ['c5', 'd5']),\n  ('black captures',\n   {'board': {'e5': 'P', 'f5': 'P', 'f6': 'p', 'g5': 'n'}, 'ep': None, 'from': 'f6'}, ['e5']),\n  ('white promotion', {'board': {'a8': 'r', 'b7': 'P'}, 'ep': None, 'from': 'b7'},\n   ['a8b', 'a8n', 'a8q', 'a8r', 'b8b', 'b8n', 'b8q', 'b8r']),\n  ('black blocked by own', {'board': {'a6': 'P', 'b6': 'p', 'b7': 'p'}, 'ep': None, 'from': 'b7'},\n   ['a6'])],\n [('white double push', {'board': {'e2': 'P'}, 'ep': None, 'from': 'e2'}, ['e3', 'e4']),\n  ('black double push', {'board': {'d7': 'p'}, 'ep': None, 'from': 'd7'}, ['d5', 'd6']),\n  ('blocked jump', {'board': {'e2': 'P', 'e3': 'n'}, 'ep': None, 'from': 'e2'}, []),\n  ('far square blocked', {'board': {'c5': 'P', 'c7': 'p'}, 'ep': None, 'from': 'c7'}, ['c6']),\n  ('captures both colours', {'board': {'c5': 'p', 'd4': 'P', 'e5': 'B'}, 'ep': None, 'from': 'd4'},\n   ['c5', 'd5']),\n  ('black captures',\n   {'board': {'e5': 'P', 'f5': 'P', 'f6': 'p', 'g5': 'n'}, 'ep': None, 'from': 'f6'}, ['e5']),\n  ('white promotion', {'board': {'a8': 'r', 'b7': 'P'}, 'ep': None, 'from': 'b7'},\n   ['a8b', 'a8n', 'a8q', 'a8r', 'b8b', 'b8n', 'b8q', 'b8r']),\n  ('black blocked by own', {'board': {'a6': 'P', 'b6': 'p', 'b7': 'p'}, 'ep': None, 'from': 'b7'},\n   ['a6'])]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"445c53bf13880dce5ec932c6a4e23e7a71a1fb34e32ccd28304173fa2fa50d4d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    b=x['board']; sq=x['from']; p=b[sq]; white=p=='P'\n    f,r=ord(sq[0])-97,int(sq[1])-1\n    d=1 if white else -1\n    start=1 if white else 6\n    last=7 if white else 0\n    def at(ff,rr): return chr(97+ff)+str(rr+1)\n    out=[]\n    if 0<=r+d<8 and at(f,r+d) not in b:\n        out.append(at(f,r+d))\n    if r==start and at(f,r+2*d) not in b: out.append(at(f,r+2*d))\n    for df in (-1,1):\n        ff=f+df\n        if not 0<=ff<8 or not 0<=r+d<8: continue\n        t=at(ff,r+d); occ=b.get(t)\n        if (occ and occ.isupper()!=white) or t==x.get('ep'): out.append(t)\n    res=[]\n    for t in out:\n        if int(t[1])-1==last: res+=[t+c for c in 'qrbn']\n        else: res.append(t)\n    return sorted(res)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('white double push', {'board': {'e2': 'P'}, 'ep': None, 'from': 'e2'}, ['e3', 'e4']),\n  ('black double push', {'board': {'d7': 'p'}, 'ep': None, 'from': 'd7'}, ['d5', 'd6']),\n  ('blocked jump', {'board': {'e2': 'P', 'e3': 'n'}, 'ep': None, 'from': 'e2'}, []),\n  ('far square blocked', {'board': {'c5': 'P', 'c7': 'p'}, 'ep': None, 'from': 'c7'}, ['c6']),\n  ('captures both colours', {'board': {'c5': 'p', 'd4': 'P', 'e5': 'B'}, 'ep': None, 'from': 'd4'},\n   ['c5', 'd5']),\n  ('black captures',\n   {'board': {'e5': 'P', 'f5': 'P', 'f6': 'p', 'g5': 'n'}, 'ep': None, 'from': 'f6'}, ['e5']),\n  ('white promotion', {'board': {'a8': 'r', 'b7': 'P'}, 'ep': None, 'from': 'b7'},\n   ['a8b', 'a8n', 'a8q', 'a8r', 'b8b', 'b8n', 'b8q', 'b8r']),\n  ('black blocked by own', {'board': {'a6': 'P', 'b6': 'p', 'b7': 'p'}, 'ep': None, 'from': 'b7'},\n   ['a6'])],\n [('blocked jump', {'board': {'e2': 'P', 'e3': 'n'}, 'ep': None, 'from': 'e2'}, []),\n  ('far square blocked', {'board': {'c5': 'P', 'c7': 'p'}, 'ep': None, 'from': 'c7'}, ['c6']),\n  ('black captures',\n   {'board': {'e5': 'P', 'f5': 'P', 'f6': 'p', 'g5': 'n'}, 'ep': None, 'from': 'f6'}, ['e5']),\n  ('white promotion', {'board': {'a8': 'r', 'b7': 'P'}, 'ep': None, 'from': 'b7'},\n   ['a8b', 'a8n', 'a8q', 'a8r', 'b8b', 'b8n', 'b8q', 'b8r']),\n  ('black promotion', {'board': {'h2': 'p'}, 'ep': None, 'from': 'h2'},\n   ['h1b', 'h1n', 'h1q', 'h1r']),\n  ('en passant target', {'board': {'d5': 'p', 'e5': 'P'}, 'ep': 'd6', 'from': 'e5'}, ['d6', 'e6']),\n  ('black on sixth rank', {'board': {'a6': 'p'}, 'ep': None, 'from': 'a6'}, ['a5']),\n  ('black blocked by own', {'board': {'a6': 'P', 'b6': 'p', 'b7': 'p'}, 'ep': None, 'from': 'b7'},\n   ['a6'])],\n [('white double push', {'board': {'e2': 'P'}, 'ep': None, 'from': 'e2'}, ['e3', 'e4']),\n  ('black double push', {'board': {'d7': 'p'}, 'ep': None, 'from': 'd7'}, ['d5', 'd6']),\n  ('blocked jump', {'board': {'e2': 'P', 'e3': 'n'}, 'ep': None, 'from': 'e2'}, []),\n  ('far square blocked', {'board': {'c5': 'P', 'c7': 'p'}, 'ep': None, 'from': 'c7'}, ['c6']),\n  ('en passant target', {'board': {'d5': 'p', 'e5': 'P'}, 'ep': 'd6', 'from': 'e5'}, ['d6', 'e6']),\n  ('black on sixth rank', {'board': {'a6': 'p'}, 'ep': None, 'from': 'a6'}, ['a5']),\n  ('white third rank', {'board': {'g3': 'P'}, 'ep': None, 'from': 'g3'}, ['g4']),\n  ('black blocked by own', {'board': {'a6': 'P', 'b6': 'p', 'b7': 'p'}, 'ep': None, 'from': 'b7'},\n   ['a6'])],\n [('white double push', {'board': {'e2': 'P'}, 'ep': None, 'from': 'e2'}, ['e3', 'e4']),\n  ('black double push', {'board': {'d7': 'p'}, 'ep': None, 'from': 'd7'}, ['d5', 'd6']),\n  ('blocked jump', {'board': {'e2': 'P', 'e3': 'n'}, 'ep': None, 'from': 'e2'}, []),\n  ('far square blocked', {'board': {'c5': 'P', 'c7': 'p'}, 'ep': None, 'from': 'c7'}, ['c6']),\n  ('captures both colours', {'board': {'c5': 'p', 'd4': 'P', 'e5': 'B'}, 'ep': None, 'from': 'd4'},\n   ['c5', 'd5']),\n  ('black captures',\n   {'board': {'e5': 'P', 'f5': 'P', 'f6': 'p', 'g5': 'n'}, 'ep': None, 'from': 'f6'}, ['e5']),\n  ('white promotion', {'board': {'a8': 'r', 'b7': 'P'}, 'ep': None, 'from': 'b7'},\n   ['a8b', 'a8n', 'a8q', 'a8r', 'b8b', 'b8n', 'b8q', 'b8r']),\n  ('black blocked by own', {'board': {'a6': 'P', 'b6': 'p', 'b7': 'p'}, 'ep': None, 'from': 'b7'},\n   ['a6'])],\n [('white double push', {'board': {'e2': 'P'}, 'ep': None, 'from': 'e2'}, ['e3', 'e4']),\n  ('black double push', {'board': {'d7': 'p'}, 'ep': None, 'from': 'd7'}, ['d5', 'd6']),\n  ('blocked jump', {'board': {'e2': 'P', 'e3': 'n'}, 'ep': None, 'from': 'e2'}, []),\n  ('far square blocked', {'board': {'c5': 'P', 'c7': 'p'}, 'ep': None, 'from': 'c7'}, ['c6']),\n  ('captures both colours', {'board': {'c5': 'p', 'd4': 'P', 'e5': 'B'}, 'ep': None, 'from': 'd4'},\n   ['c5', 'd5']),\n  ('black captures',\n   {'board': {'e5': 'P', 'f5': 'P', 'f6': 'p', 'g5': 'n'}, 'ep': None, 'from': 'f6'}, ['e5']),\n  ('white promotion', {'board': {'a8': 'r', 'b7': 'P'}, 'ep': None, 'from': 'b7'},\n   ['a8b', 'a8n', 'a8q', 'a8r', 'b8b', 'b8n', 'b8q', 'b8r']),\n  ('black blocked by own', {'board': {'a6': 'P', 'b6': 'p', 'b7': 'p'}, 'ep': None, 'from': 'b7'},\n   ['a6'])]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-chess_move_legality-pawn-move-generation-double-push-path","generated_at":"2026-09-29T14:50:11.508884+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Move validators gate every move in engines, servers and arbiters; accepting an illegal move or rejecting a legal one corrupts the game record.","root_cause":"The two-square advance is checked outside the one-square branch, so only the destination square is tested.","sha256":"41012b9a52e096b94282c22d18ae7eebaf3950d44e9c51abbce5163e0cbe6467","title":"Pawn double step jumps over a blocker · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":40.028,"exit_code":1,"observations":[{"actual":["e3","e4"],"check":"white double push","expected":["e3","e4"],"passed":true},{"actual":["d5","d6"],"check":"black double push","expected":["d5","d6"],"passed":true},{"actual":[],"check":"blocked jump","expected":[],"passed":true},{"actual":["c5","c6"],"check":"far square blocked","expected":["c6"],"passed":false},{"actual":["c5","d5"],"check":"captures both colours","expected":["c5","d5"],"passed":true},{"actual":["e5"],"check":"black captures","expected":["e5"],"passed":true},{"actual":["a8b","a8n","a8q","a8r","b8b","b8n","b8q","b8r"],"check":"white promotion","expected":["a8b","a8n","a8q","a8r","b8b","b8n","b8q","b8r"],"passed":true},{"actual":["a6"],"check":"black blocked by own","expected":["a6"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"white double push\", \"actual\": [\"e3\", \"e4\"], \"expected\": [\"e3\", \"e4\"], \"passed\": true}, {\"check\": \"black double push\", \"actual\": [\"d5\", \"d6\"], \"expected\": [\"d5\", \"d6\"], \"passed\": true}, {\"check\": \"blocked jump\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"far square blocked\", \"actual\": [\"c5\", \"c6\"], \"expected\": [\"c6\"], \"passed\": false}, {\"check\": \"captures both colours\", \"actual\": [\"c5\", \"d5\"], \"expected\": [\"c5\", \"d5\"], \"passed\": true}, {\"check\": \"black captures\", \"actual\": [\"e5\"], \"expected\": [\"e5\"], \"passed\": true}, {\"check\": \"white promotion\", \"actual\": [\"a8b\", \"a8n\", \"a8q\", \"a8r\", \"b8b\", \"b8n\", \"b8q\", \"b8r\"], \"expected\": [\"a8b\", \"a8n\", \"a8q\", \"a8r\", \"b8b\", \"b8n\", \"b8q\", \"b8r\"], \"passed\": true}, {\"check\": \"black blocked by own\", \"actual\": [\"a6\"], \"expected\": [\"a6\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.734,"exit_code":1,"observations":[{"actual":["e3","e4"],"check":"white double push","expected":["e3","e4"],"passed":true},{"actual":["d5","d6"],"check":"black double push","expected":["d5","d6"],"passed":true},{"actual":["e4"],"check":"blocked jump","expected":[],"passed":false},{"actual":["c6"],"check":"far square blocked","expected":["c6"],"passed":true},{"actual":["c5","d5"],"check":"captures both colours","expected":["c5","d5"],"passed":true},{"actual":["e5"],"check":"black captures","expected":["e5"],"passed":true},{"actual":["a8b","a8n","a8q","a8r","b8b","b8n","b8q","b8r"],"check":"white promotion","expected":["a8b","a8n","a8q","a8r","b8b","b8n","b8q","b8r"],"passed":true},{"actual":["a6","b5"],"check":"black blocked by own","expected":["a6"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"white double push\", \"actual\": [\"e3\", \"e4\"], \"expected\": [\"e3\", \"e4\"], \"passed\": true}, {\"check\": \"black double push\", \"actual\": [\"d5\", \"d6\"], \"expected\": [\"d5\", \"d6\"], \"passed\": true}, {\"check\": \"blocked jump\", \"actual\": [\"e4\"], \"expected\": [], \"passed\": false}, {\"check\": \"far square blocked\", \"actual\": [\"c6\"], \"expected\": [\"c6\"], \"passed\": true}, {\"check\": \"captures both colours\", \"actual\": [\"c5\", \"d5\"], \"expected\": [\"c5\", \"d5\"], \"passed\": true}, {\"check\": \"black captures\", \"actual\": [\"e5\"], \"expected\": [\"e5\"], \"passed\": true}, {\"check\": \"white promotion\", \"actual\": [\"a8b\", \"a8n\", \"a8q\", \"a8r\", \"b8b\", \"b8n\", \"b8q\", \"b8r\"], \"expected\": [\"a8b\", \"a8n\", \"a8q\", \"a8r\", \"b8b\", \"b8n\", \"b8q\", \"b8r\"], \"passed\": true}, {\"check\": \"black blocked by own\", \"actual\": [\"a6\", \"b5\"], \"expected\": [\"a6\"], \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}