{"abstract":"A single-stone capture by a connected stone forbids an immediate recapture that is actually legal.","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.","evaluation_group":"w2-go-territory-scoring-ko-point","failed_approach":"Rejecting only stones with two or more friendly neighbours still bans recapture after a one-neighbour connection.","family":"w2-go-territory-scoring-ko-point-connected-capturing-stone","id":"FA-82906","implementations":{"attempt":{"sha256":"b7eb7e2d65ae3adabde57a56b746a5057244103de7626cfdbe63351b370e3bc4","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:\n        return None\n    if same > 1:\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], [[['BW.', '.BW', 'BWB', 'WB.', 'BBB'], 4, 2, [[3, 2]]], None], [[['..BW.', '...WW', 'W...B', 'B.B.B'], 0, 3, [[0, 4]]], 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], [[['WWW', '.WW', 'W.B', '..W'], 0, 0, [[1, 0]]], None], [[['B...B', '.BWWB', 'WBBB.', '...WB'], 1, 4, [[2, 4]]], 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], [[['....', '.BWW', 'WW.W', 'WWW.'], 2, 1, [[2, 2]]], None], [[['.B..', 'WBBB', 'BBBW', '.BBW', 'BBBB'], 2, 0, [[3, 0]]], 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], [[['.B.WB', 'BWB.B', 'BW.BW', '.B.BW', '...WW'], 1, 0, [[0, 0]]], None], [[['WWBW', 'WB..', '.WWW', 'BW.W'], 3, 1, [[3, 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], [[['WWBW', 'WB..', '.WWW', 'BW.W'], 3, 1, [[3, 2]]], None], [[['BBB.B', 'B.BW.', 'BBB.W'], 1, 0, [[1, 1]]], 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":"7b2abf73c3e4af4aed19d6eb2017fea7f05009053339471139486f46d9e5cbe3","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:\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], [[['BW.', '.BW', 'BWB', 'WB.', 'BBB'], 4, 2, [[3, 2]]], None], [[['..BW.', '...WW', 'W...B', 'B.B.B'], 0, 3, [[0, 4]]], 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], [[['WWW', '.WW', 'W.B', '..W'], 0, 0, [[1, 0]]], None], [[['B...B', '.BWWB', 'WBBB.', '...WB'], 1, 4, [[2, 4]]], 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], [[['....', '.BWW', 'WW.W', 'WWW.'], 2, 1, [[2, 2]]], None], [[['.B..', 'WBBB', 'BBBW', '.BBW', 'BBBB'], 2, 0, [[3, 0]]], 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], [[['.B.WB', 'BWB.B', 'BW.BW', '.B.BW', '...WW'], 1, 0, [[0, 0]]], None], [[['WWBW', 'WB..', '.WWW', 'BW.W'], 3, 1, [[3, 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], [[['WWBW', 'WB..', '.WWW', 'BW.W'], 3, 1, [[3, 2]]], None], [[['BBB.B', 'B.BW.', 'BBB.W'], 1, 0, [[1, 1]]], 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"},"fixed":{"sha256":"f3ba1d5fca608405a0b6b96ead577e0adf748384aeb9546cfc35274b6b85d18b","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:\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], [[['BW.', '.BW', 'BWB', 'WB.', 'BBB'], 4, 2, [[3, 2]]], None], [[['..BW.', '...WW', 'W...B', 'B.B.B'], 0, 3, [[0, 4]]], 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], [[['WWW', '.WW', 'W.B', '..W'], 0, 0, [[1, 0]]], None], [[['B...B', '.BWWB', 'WBBB.', '...WB'], 1, 4, [[2, 4]]], 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], [[['....', '.BWW', 'WW.W', 'WWW.'], 2, 1, [[2, 2]]], None], [[['.B..', 'WBBB', 'BBBW', '.BBW', 'BBBB'], 2, 0, [[3, 0]]], 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], [[['.B.WB', 'BWB.B', 'BW.BW', '.B.BW', '...WW'], 1, 0, [[0, 0]]], None], [[['WWBW', 'WB..', '.WWW', 'BW.W'], 3, 1, [[3, 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], [[['WWBW', 'WB..', '.WWW', 'BW.W'], 3, 1, [[3, 2]]], None], [[['BBB.B', 'B.BW.', 'BBB.W'], 1, 0, [[1, 1]]], 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-connected-capturing-stone","generated_at":"2026-09-29T14:50:16.576996+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.","repair":"Return None whenever the played stone has any friendly orthogonal neighbour.","root_cause":"The rule that the capturing stone must stand alone is not checked.","sha256":"726df7eeb9ef80f22c0bebe86e90f48306d6b29f2c863159bcf4d400313fcd75","title":"Ko ban is set when the capturing stone joins a friendly chain · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.709,"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":[0,4],"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\": [0, 4], \"expected\": null, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.027,"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":[0,4],"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\": [0, 4], \"expected\": null, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.536,"exit_code":0,"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":null,"check":"ko point case 6","expected":null,"passed":true},{"actual":null,"check":"ko point case 7","expected":null,"passed":true}],"passed":true,"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\": null, \"expected\": null, \"passed\": true}, {\"check\": \"ko point case 7\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}