{"abstract":"Capturing two stones marks the first captured point as a ko point.","category":"Go territory scoring","checks":8,"contract":"Input [board_after_move, row, col, captured_points]. A ko ban point exists only when exactly one stone was captured, the played stone has no friendly orthogonal neighbour, and it has exactly one liberty. Return the captured point or None.","contract_signature":"x","evaluation_group":"w2-go-territory-scoring-ko-point","failed_approach":"Combining the size test with the liberty test using and lets a multi-stone capture through when the stone has one liberty.","family":"w2-go-territory-scoring-ko-point-single-stone-capture-requirement","id":"FA-82916","implementations":{"attempt":{"sha256":"e0d4ac21a9ccac87b7c8a48a1c8e4b2d63cfa685094729ba2cdead4a93faa20a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    board, r, c, captured = x\n    n = len(board)\n    m = len(board[0])\n    color = board[r][c]\n    same = 0\n    libs = []\n    for p, q in ((r + 1, c), (r - 1, c), (r, c + 1), (r, c - 1)):\n        if 0 <= p < n and 0 <= q < m:\n            if board[p][q] == color:\n                same += 1\n            elif board[p][q] == '.':\n                libs.append([p, q])\n    if len(captured) != 1 and len(libs) != 1:\n        return None\n    if same:\n        return None\n    if len(libs) != 1:\n        return None\n    return captured[0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[['.W.B.', 'W.WB.', 'BWB..', '.B...', 'B....'], 2, 0, [[3, 0]]], [3, 0]], [[['.W.B.', 'W.WB.', '.WB..', 'WB...', '.W...'], 4, 1, [[4, 0]]], None], [[['BBBB', 'B..B', 'B.BB', 'BBBB'], 2, 2, []], None], [[['...', '.B.', '...'], 1, 1, [[0, 0], [0, 1], [0, 2], [1, 0], [1, 2], [2, 0], [2, 1], [2, 2]]], None], [[['B.W', '...', 'WWB'], 2, 1, []], None], [[['.B...', 'B....', '..W..', '....W', '...W.'], 2, 2, []], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None]], [[[['.B...', 'B....', '.....', '...WW', '...W.'], 3, 3, []], None], [[['.....', '.BBB.', '.B.BB', '.BBB.', '.....'], 2, 4, []], None], [[['.....', '.BBB.', '.B.B.', 'WBBB.', '.....'], 3, 0, []], None], [[['B....B', '......', '..WWB.', '..WW..', '......', 'B....B'], 2, 4, []], None], [[['B....B', '......', '..WW..', '.WWW..', '......', 'B....B'], 3, 1, []], None], [[['B.B', '.B.', 'BWB', 'WBW', 'BB.'], 0, 2, [[1, 2], [0, 1]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None]], [[[['BW.', '.BW', 'BWB', 'WB.', 'BBB'], 4, 2, [[3, 2]]], None], [[['BW.', '.BW', 'BWB', 'W.W', '..W'], 4, 2, [[3, 1], [4, 0], [4, 1]]], None], [[['..BWW', '....W', 'W..B.'], 2, 0, []], None], [[['W.W.B', '.WW..', '.W.BB'], 0, 0, [[1, 0], [2, 0], [0, 1]]], None], [[['..W..', 'B..WW', '...BW', 'W..B.', '..W.W'], 0, 2, [[0, 3], [0, 4]]], None], [[['.W..', 'W..W', '.B.W'], 0, 1, [[0, 0]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None]], [[[['BW..', 'W.W.', 'BWW.', 'B.BW', 'B..W'], 1, 2, [[1, 1]]], None], [[['BW..', 'WB.B', 'BWW.', 'B.BW', 'B..W'], 1, 3, []], None], [[['.....', '..W..', 'W.WB.', 'BW.W.'], 2, 3, []], None], [[['..W', 'WWW', 'WBW', '...'], 0, 2, [[0, 0], [0, 1]]], None], [[['BB.', 'WWW', 'W.W', '.W.'], 3, 1, [[2, 1]]], None], [[['.BB', 'B.B', 'BWB', 'W.W'], 2, 1, [[3, 1]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None]], [[[['W.WWB', '.WB.B', 'BW.BW', '.B.BW', '...WW'], 0, 2, [[0, 1]]], None], [[['.B.WB', 'BWB.B', 'BW.BW', '.B.BW', '...WW'], 1, 0, [[0, 0]]], None], [[['WB.W.', '.WBW.', 'BW.BW', '.B.BW', '...WW'], 1, 3, [[0, 4], [1, 4]]], None], [[['WB.WB', '.WB.B', 'BW.B.', '.B.B.', '..B..'], 4, 2, [[2, 4], [3, 4], [4, 3], [4, 4]]], None], [[['BB.', 'BBB', 'BB.', '..B', 'B.B'], 2, 1, [[3, 0], [3, 1], [4, 1]]], None], [[['BB.', 'BBB', 'B.W', 'WW.', 'BW.'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"ko point case %d\" % i, solve(args), 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":"a6232d0890a1e39ce6e98b69c2956606b4e7471735d349396d7af91337f4b76d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    board, r, c, captured = x\n    n = len(board)\n    m = len(board[0])\n    color = board[r][c]\n    same = 0\n    libs = []\n    for p, q in ((r + 1, c), (r - 1, c), (r, c + 1), (r, c - 1)):\n        if 0 <= p < n and 0 <= q < m:\n            if board[p][q] == color:\n                same += 1\n            elif board[p][q] == '.':\n                libs.append([p, q])\n    if not captured:\n        return None\n    if same:\n        return None\n    if len(libs) != 1:\n        return None\n    return captured[0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[['.W.B.', 'W.WB.', 'BWB..', '.B...', 'B....'], 2, 0, [[3, 0]]], [3, 0]], [[['.W.B.', 'W.WB.', '.WB..', 'WB...', '.W...'], 4, 1, [[4, 0]]], None], [[['BBBB', 'B..B', 'B.BB', 'BBBB'], 2, 2, []], None], [[['...', '.B.', '...'], 1, 1, [[0, 0], [0, 1], [0, 2], [1, 0], [1, 2], [2, 0], [2, 1], [2, 2]]], None], [[['B.W', '...', 'WWB'], 2, 1, []], None], [[['.B...', 'B....', '..W..', '....W', '...W.'], 2, 2, []], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None]], [[[['.B...', 'B....', '.....', '...WW', '...W.'], 3, 3, []], None], [[['.....', '.BBB.', '.B.BB', '.BBB.', '.....'], 2, 4, []], None], [[['.....', '.BBB.', '.B.B.', 'WBBB.', '.....'], 3, 0, []], None], [[['B....B', '......', '..WWB.', '..WW..', '......', 'B....B'], 2, 4, []], None], [[['B....B', '......', '..WW..', '.WWW..', '......', 'B....B'], 3, 1, []], None], [[['B.B', '.B.', 'BWB', 'WBW', 'BB.'], 0, 2, [[1, 2], [0, 1]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None]], [[[['BW.', '.BW', 'BWB', 'WB.', 'BBB'], 4, 2, [[3, 2]]], None], [[['BW.', '.BW', 'BWB', 'W.W', '..W'], 4, 2, [[3, 1], [4, 0], [4, 1]]], None], [[['..BWW', '....W', 'W..B.'], 2, 0, []], None], [[['W.W.B', '.WW..', '.W.BB'], 0, 0, [[1, 0], [2, 0], [0, 1]]], None], [[['..W..', 'B..WW', '...BW', 'W..B.', '..W.W'], 0, 2, [[0, 3], [0, 4]]], None], [[['.W..', 'W..W', '.B.W'], 0, 1, [[0, 0]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None]], [[[['BW..', 'W.W.', 'BWW.', 'B.BW', 'B..W'], 1, 2, [[1, 1]]], None], [[['BW..', 'WB.B', 'BWW.', 'B.BW', 'B..W'], 1, 3, []], None], [[['.....', '..W..', 'W.WB.', 'BW.W.'], 2, 3, []], None], [[['..W', 'WWW', 'WBW', '...'], 0, 2, [[0, 0], [0, 1]]], None], [[['BB.', 'WWW', 'W.W', '.W.'], 3, 1, [[2, 1]]], None], [[['.BB', 'B.B', 'BWB', 'W.W'], 2, 1, [[3, 1]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None]], [[[['W.WWB', '.WB.B', 'BW.BW', '.B.BW', '...WW'], 0, 2, [[0, 1]]], None], [[['.B.WB', 'BWB.B', 'BW.BW', '.B.BW', '...WW'], 1, 0, [[0, 0]]], None], [[['WB.W.', '.WBW.', 'BW.BW', '.B.BW', '...WW'], 1, 3, [[0, 4], [1, 4]]], None], [[['WB.WB', '.WB.B', 'BW.B.', '.B.B.', '..B..'], 4, 2, [[2, 4], [3, 4], [4, 3], [4, 4]]], None], [[['BB.', 'BBB', 'BB.', '..B', 'B.B'], 2, 1, [[3, 0], [3, 1], [4, 1]]], None], [[['BB.', 'BBB', 'B.W', 'WW.', 'BW.'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None], [[['.BBBW', 'W.BBW', 'BBWBB', 'WW.WW', 'BW.WW'], 2, 2, [[3, 2], [4, 2]]], None]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"ko point case %d\" % i, solve(args), 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":"Small rectangular toy boards given as strings of B, W and dot; a bounded teaching model of one scoring or bookkeeping rule, not a complete rules engine or server implementation. 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-go-territory-scoring-ko-point-single-stone-capture-requirement","generated_at":"2026-09-29T14:50:16.576201+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Go servers and scoring tools compute this value automatically; a wrong answer changes a game result.","root_cause":"The capture-size check accepts any non-empty capture.","sha256":"ccdf69006c3009dbdbde5c606e36e3dc332204dce77444c13a3bcddece0fd1ff","title":"Multi-stone captures create a ko ban · 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":39.718,"exit_code":1,"observations":[{"actual":[3,0],"check":"ko point case 0","expected":[3,0],"passed":true},{"actual":null,"check":"ko point case 1","expected":null,"passed":true},{"actual":null,"check":"ko point case 2","expected":null,"passed":true},{"actual":null,"check":"ko point case 3","expected":null,"passed":true},{"actual":null,"check":"ko point case 4","expected":null,"passed":true},{"actual":null,"check":"ko point case 5","expected":null,"passed":true},{"actual":[3,2],"check":"ko point case 6","expected":null,"passed":false},{"actual":[3,2],"check":"ko point case 7","expected":null,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ko point case 0\", \"actual\": [3, 0], \"expected\": [3, 0], \"passed\": true}, {\"check\": \"ko point case 1\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 2\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 3\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 5\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 6\", \"actual\": [3, 2], \"expected\": null, \"passed\": false}, {\"check\": \"ko point case 7\", \"actual\": [3, 2], \"expected\": null, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.423,"exit_code":1,"observations":[{"actual":[3,0],"check":"ko point case 0","expected":[3,0],"passed":true},{"actual":null,"check":"ko point case 1","expected":null,"passed":true},{"actual":null,"check":"ko point case 2","expected":null,"passed":true},{"actual":null,"check":"ko point case 3","expected":null,"passed":true},{"actual":null,"check":"ko point case 4","expected":null,"passed":true},{"actual":null,"check":"ko point case 5","expected":null,"passed":true},{"actual":[3,2],"check":"ko point case 6","expected":null,"passed":false},{"actual":[3,2],"check":"ko point case 7","expected":null,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ko point case 0\", \"actual\": [3, 0], \"expected\": [3, 0], \"passed\": true}, {\"check\": \"ko point case 1\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 2\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 3\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 5\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 6\", \"actual\": [3, 2], \"expected\": null, \"passed\": false}, {\"check\": \"ko point case 7\", \"actual\": [3, 2], \"expected\": null, \"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."}}