{"abstract":"White is charged or excused the equalising stone based on who passed first.","category":"Go territory scoring","checks":8,"contract":"Input [terr_b, terr_w, prisoners_b, prisoners_w, passes, komi_tenths]; passes lists passing colours in order. Each pass gives one prisoner to the opponent; if the final pass was black, white hands one extra stone to black. Return [black_tenths, white_tenths, winner] with winner B, W or tie.","evaluation_group":"w2-go-territory-scoring-aga-pass-stones","failed_approach":"Comparing pass counts per colour misjudges sequences such as W, B, B.","family":"w2-go-territory-scoring-aga-pass-stones-white-last-rule","id":"FA-83056","implementations":{"attempt":{"sha256":"c6c73f48db16ba071b10b106ed9e3aa305dafdb6a872e5ea130e60f55dbd0072","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    tb, tw, cb, cw, passes, komi = x\n    pb = cb + passes.count('W')\n    pw = cw + passes.count('B')\n    if passes.count('B') > passes.count('W'):\n        pb += 1\n    sb = (tb + pb) * 10\n    sw = (tw + pw) * 10 + komi\n    if sb > sw:\n        winner = 'B'\n    elif sw > sb:\n        winner = 'W'\n    else:\n        winner = 'tie'\n    return [sb, sw, winner]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[27, 1, 2, 3, ['B', 'B', 'W'], 75], [300, 135, 'B']], [[3, 12, 5, 1, ['W'], 5], [90, 135, 'W']], [[9, 19, 1, 1, ['W'], 5], [110, 205, 'W']], [[19, 16, 2, 4, ['B'], 75], [220, 285, 'W']], [[28, 11, 4, 3, ['B', 'W', 'W', 'B'], 0], [350, 160, 'B']], [[5, 17, 2, 2, [], 5], [70, 195, 'W']], [[16, 18, 1, 5, ['B'], 5], [180, 245, 'W']], [[24, 22, 2, 4, ['W', 'B'], 70], [280, 340, 'W']]], [[[22, 11, 2, 4, ['B', 'B'], 75], [250, 245, 'B']], [[7, 1, 1, 2, ['B', 'W', 'B'], 70], [100, 120, 'W']], [[28, 12, 2, 1, ['B', 'W'], 75], [310, 215, 'B']], [[9, 10, 4, 5, ['W', 'W', 'B', 'W'], 70], [160, 230, 'W']], [[19, 26, 4, 1, ['W'], 0], [240, 270, 'W']], [[25, 8, 5, 0, ['W', 'W', 'W', 'B'], 70], [340, 160, 'B']], [[15, 27, 0, 4, ['B', 'W'], 0], [160, 320, 'W']], [[9, 26, 2, 1, ['W', 'W', 'B', 'B'], 0], [140, 290, 'W']]], [[[15, 19, 1, 0, ['W', 'B'], 70], [180, 270, 'W']], [[24, 3, 3, 2, ['W', 'W'], 0], [290, 50, 'B']], [[23, 20, 1, 3, ['W', 'W'], 75], [260, 305, 'W']], [[9, 14, 1, 0, ['B', 'B', 'B', 'B'], 70], [110, 250, 'W']], [[27, 17, 0, 5, ['B'], 0], [280, 230, 'B']], [[18, 4, 0, 3, [], 5], [180, 75, 'B']], [[7, 19, 2, 1, ['W', 'B'], 70], [110, 280, 'W']], [[20, 13, 2, 0, ['B', 'B', 'W', 'W'], 70], [240, 220, 'B']]], [[[20, 13, 2, 0, ['B', 'B', 'W', 'W'], 70], [240, 220, 'B']], [[18, 21, 0, 1, ['B'], 5], [190, 235, 'W']], [[20, 18, 4, 4, ['B', 'W', 'B', 'B'], 75], [260, 325, 'W']], [[26, 10, 1, 0, ['W', 'W'], 5], [290, 105, 'B']], [[1, 17, 1, 2, ['B', 'W', 'W'], 5], [40, 205, 'W']], [[12, 11, 3, 5, ['W', 'B', 'B', 'B'], 70], [170, 260, 'W']], [[12, 19, 1, 1, ['B'], 5], [140, 215, 'W']], [[26, 20, 1, 2, ['B', 'B', 'W'], 75], [280, 315, 'W']]], [[[18, 1, 5, 2, [], 0], [230, 30, 'B']], [[9, 21, 1, 1, ['B', 'W', 'W', 'W'], 70], [130, 300, 'W']], [[25, 22, 0, 4, ['B', 'B', 'B'], 70], [260, 360, 'W']], [[29, 1, 0, 1, ['B', 'W'], 5], [300, 35, 'B']], [[23, 0, 0, 3, ['W', 'W'], 70], [250, 100, 'B']], [[28, 1, 0, 2, ['B'], 5], [290, 45, 'B']], [[24, 22, 2, 4, ['W', 'B'], 70], [280, 340, 'W']], [[18, 7, 2, 3, ['W', 'B', 'W', 'B'], 70], [230, 190, 'B']]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"pass stones 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":"fcc758e8bb71607b1cbd1ee4a1fd954982ed9f26d8e047d07343ccede1241d43","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    tb, tw, cb, cw, passes, komi = x\n    pb = cb + passes.count('W')\n    pw = cw + passes.count('B')\n    if passes and passes[0] == 'B':\n        pb += 1\n    sb = (tb + pb) * 10\n    sw = (tw + pw) * 10 + komi\n    if sb > sw:\n        winner = 'B'\n    elif sw > sb:\n        winner = 'W'\n    else:\n        winner = 'tie'\n    return [sb, sw, winner]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[27, 1, 2, 3, ['B', 'B', 'W'], 75], [300, 135, 'B']], [[3, 12, 5, 1, ['W'], 5], [90, 135, 'W']], [[9, 19, 1, 1, ['W'], 5], [110, 205, 'W']], [[19, 16, 2, 4, ['B'], 75], [220, 285, 'W']], [[28, 11, 4, 3, ['B', 'W', 'W', 'B'], 0], [350, 160, 'B']], [[5, 17, 2, 2, [], 5], [70, 195, 'W']], [[16, 18, 1, 5, ['B'], 5], [180, 245, 'W']], [[24, 22, 2, 4, ['W', 'B'], 70], [280, 340, 'W']]], [[[22, 11, 2, 4, ['B', 'B'], 75], [250, 245, 'B']], [[7, 1, 1, 2, ['B', 'W', 'B'], 70], [100, 120, 'W']], [[28, 12, 2, 1, ['B', 'W'], 75], [310, 215, 'B']], [[9, 10, 4, 5, ['W', 'W', 'B', 'W'], 70], [160, 230, 'W']], [[19, 26, 4, 1, ['W'], 0], [240, 270, 'W']], [[25, 8, 5, 0, ['W', 'W', 'W', 'B'], 70], [340, 160, 'B']], [[15, 27, 0, 4, ['B', 'W'], 0], [160, 320, 'W']], [[9, 26, 2, 1, ['W', 'W', 'B', 'B'], 0], [140, 290, 'W']]], [[[15, 19, 1, 0, ['W', 'B'], 70], [180, 270, 'W']], [[24, 3, 3, 2, ['W', 'W'], 0], [290, 50, 'B']], [[23, 20, 1, 3, ['W', 'W'], 75], [260, 305, 'W']], [[9, 14, 1, 0, ['B', 'B', 'B', 'B'], 70], [110, 250, 'W']], [[27, 17, 0, 5, ['B'], 0], [280, 230, 'B']], [[18, 4, 0, 3, [], 5], [180, 75, 'B']], [[7, 19, 2, 1, ['W', 'B'], 70], [110, 280, 'W']], [[20, 13, 2, 0, ['B', 'B', 'W', 'W'], 70], [240, 220, 'B']]], [[[20, 13, 2, 0, ['B', 'B', 'W', 'W'], 70], [240, 220, 'B']], [[18, 21, 0, 1, ['B'], 5], [190, 235, 'W']], [[20, 18, 4, 4, ['B', 'W', 'B', 'B'], 75], [260, 325, 'W']], [[26, 10, 1, 0, ['W', 'W'], 5], [290, 105, 'B']], [[1, 17, 1, 2, ['B', 'W', 'W'], 5], [40, 205, 'W']], [[12, 11, 3, 5, ['W', 'B', 'B', 'B'], 70], [170, 260, 'W']], [[12, 19, 1, 1, ['B'], 5], [140, 215, 'W']], [[26, 20, 1, 2, ['B', 'B', 'W'], 75], [280, 315, 'W']]], [[[18, 1, 5, 2, [], 0], [230, 30, 'B']], [[9, 21, 1, 1, ['B', 'W', 'W', 'W'], 70], [130, 300, 'W']], [[25, 22, 0, 4, ['B', 'B', 'B'], 70], [260, 360, 'W']], [[29, 1, 0, 1, ['B', 'W'], 5], [300, 35, 'B']], [[23, 0, 0, 3, ['W', 'W'], 70], [250, 100, 'B']], [[28, 1, 0, 2, ['B'], 5], [290, 45, 'B']], [[24, 22, 2, 4, ['W', 'B'], 70], [280, 340, 'W']], [[18, 7, 2, 3, ['W', 'B', 'W', 'B'], 70], [230, 190, 'B']]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"pass stones 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":"0c69ce6987872fe4fd85d03b1a2077f8878c9a2e525f8adfe96ef83033a6822d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    tb, tw, cb, cw, passes, komi = x\n    pb = cb + passes.count('W')\n    pw = cw + passes.count('B')\n    if passes and passes[-1] == 'B':\n        pb += 1\n    sb = (tb + pb) * 10\n    sw = (tw + pw) * 10 + komi\n    if sb > sw:\n        winner = 'B'\n    elif sw > sb:\n        winner = 'W'\n    else:\n        winner = 'tie'\n    return [sb, sw, winner]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[27, 1, 2, 3, ['B', 'B', 'W'], 75], [300, 135, 'B']], [[3, 12, 5, 1, ['W'], 5], [90, 135, 'W']], [[9, 19, 1, 1, ['W'], 5], [110, 205, 'W']], [[19, 16, 2, 4, ['B'], 75], [220, 285, 'W']], [[28, 11, 4, 3, ['B', 'W', 'W', 'B'], 0], [350, 160, 'B']], [[5, 17, 2, 2, [], 5], [70, 195, 'W']], [[16, 18, 1, 5, ['B'], 5], [180, 245, 'W']], [[24, 22, 2, 4, ['W', 'B'], 70], [280, 340, 'W']]], [[[22, 11, 2, 4, ['B', 'B'], 75], [250, 245, 'B']], [[7, 1, 1, 2, ['B', 'W', 'B'], 70], [100, 120, 'W']], [[28, 12, 2, 1, ['B', 'W'], 75], [310, 215, 'B']], [[9, 10, 4, 5, ['W', 'W', 'B', 'W'], 70], [160, 230, 'W']], [[19, 26, 4, 1, ['W'], 0], [240, 270, 'W']], [[25, 8, 5, 0, ['W', 'W', 'W', 'B'], 70], [340, 160, 'B']], [[15, 27, 0, 4, ['B', 'W'], 0], [160, 320, 'W']], [[9, 26, 2, 1, ['W', 'W', 'B', 'B'], 0], [140, 290, 'W']]], [[[15, 19, 1, 0, ['W', 'B'], 70], [180, 270, 'W']], [[24, 3, 3, 2, ['W', 'W'], 0], [290, 50, 'B']], [[23, 20, 1, 3, ['W', 'W'], 75], [260, 305, 'W']], [[9, 14, 1, 0, ['B', 'B', 'B', 'B'], 70], [110, 250, 'W']], [[27, 17, 0, 5, ['B'], 0], [280, 230, 'B']], [[18, 4, 0, 3, [], 5], [180, 75, 'B']], [[7, 19, 2, 1, ['W', 'B'], 70], [110, 280, 'W']], [[20, 13, 2, 0, ['B', 'B', 'W', 'W'], 70], [240, 220, 'B']]], [[[20, 13, 2, 0, ['B', 'B', 'W', 'W'], 70], [240, 220, 'B']], [[18, 21, 0, 1, ['B'], 5], [190, 235, 'W']], [[20, 18, 4, 4, ['B', 'W', 'B', 'B'], 75], [260, 325, 'W']], [[26, 10, 1, 0, ['W', 'W'], 5], [290, 105, 'B']], [[1, 17, 1, 2, ['B', 'W', 'W'], 5], [40, 205, 'W']], [[12, 11, 3, 5, ['W', 'B', 'B', 'B'], 70], [170, 260, 'W']], [[12, 19, 1, 1, ['B'], 5], [140, 215, 'W']], [[26, 20, 1, 2, ['B', 'B', 'W'], 75], [280, 315, 'W']]], [[[18, 1, 5, 2, [], 0], [230, 30, 'B']], [[9, 21, 1, 1, ['B', 'W', 'W', 'W'], 70], [130, 300, 'W']], [[25, 22, 0, 4, ['B', 'B', 'B'], 70], [260, 360, 'W']], [[29, 1, 0, 1, ['B', 'W'], 5], [300, 35, 'B']], [[23, 0, 0, 3, ['W', 'W'], 70], [250, 100, 'B']], [[28, 1, 0, 2, ['B'], 5], [290, 45, 'B']], [[24, 22, 2, 4, ['W', 'B'], 70], [280, 340, 'W']], [[18, 7, 2, 3, ['W', 'B', 'W', 'B'], 70], [230, 190, 'B']]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"pass stones 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-aga-pass-stones-white-last-rule","generated_at":"2026-09-29T14:50:18.069856+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":"Check the last pass only.","root_cause":"The rule inspects passes[0] instead of the final pass.","sha256":"2c29785d97d612ca680d306d32bf70d4cd0e0c92fbad8254917fd6fa9208df8b","title":"The extra stone depends on the first pass · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.895,"exit_code":1,"observations":[{"actual":[310,135,"B"],"check":"pass stones case 0","expected":[300,135,"B"],"passed":false},{"actual":[90,135,"W"],"check":"pass stones case 1","expected":[90,135,"W"],"passed":true},{"actual":[110,205,"W"],"check":"pass stones case 2","expected":[110,205,"W"],"passed":true},{"actual":[220,285,"W"],"check":"pass stones case 3","expected":[220,285,"W"],"passed":true},{"actual":[340,160,"B"],"check":"pass stones case 4","expected":[350,160,"B"],"passed":false},{"actual":[70,195,"W"],"check":"pass stones case 5","expected":[70,195,"W"],"passed":true},{"actual":[180,245,"W"],"check":"pass stones case 6","expected":[180,245,"W"],"passed":true},{"actual":[270,340,"W"],"check":"pass stones case 7","expected":[280,340,"W"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"pass stones case 0\", \"actual\": [310, 135, \"B\"], \"expected\": [300, 135, \"B\"], \"passed\": false}, {\"check\": \"pass stones case 1\", \"actual\": [90, 135, \"W\"], \"expected\": [90, 135, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 2\", \"actual\": [110, 205, \"W\"], \"expected\": [110, 205, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 3\", \"actual\": [220, 285, \"W\"], \"expected\": [220, 285, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 4\", \"actual\": [340, 160, \"B\"], \"expected\": [350, 160, \"B\"], \"passed\": false}, {\"check\": \"pass stones case 5\", \"actual\": [70, 195, \"W\"], \"expected\": [70, 195, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 6\", \"actual\": [180, 245, \"W\"], \"expected\": [180, 245, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 7\", \"actual\": [270, 340, \"W\"], \"expected\": [280, 340, \"W\"], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.42,"exit_code":1,"observations":[{"actual":[310,135,"B"],"check":"pass stones case 0","expected":[300,135,"B"],"passed":false},{"actual":[90,135,"W"],"check":"pass stones case 1","expected":[90,135,"W"],"passed":true},{"actual":[110,205,"W"],"check":"pass stones case 2","expected":[110,205,"W"],"passed":true},{"actual":[220,285,"W"],"check":"pass stones case 3","expected":[220,285,"W"],"passed":true},{"actual":[350,160,"B"],"check":"pass stones case 4","expected":[350,160,"B"],"passed":true},{"actual":[70,195,"W"],"check":"pass stones case 5","expected":[70,195,"W"],"passed":true},{"actual":[180,245,"W"],"check":"pass stones case 6","expected":[180,245,"W"],"passed":true},{"actual":[270,340,"W"],"check":"pass stones case 7","expected":[280,340,"W"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"pass stones case 0\", \"actual\": [310, 135, \"B\"], \"expected\": [300, 135, \"B\"], \"passed\": false}, {\"check\": \"pass stones case 1\", \"actual\": [90, 135, \"W\"], \"expected\": [90, 135, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 2\", \"actual\": [110, 205, \"W\"], \"expected\": [110, 205, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 3\", \"actual\": [220, 285, \"W\"], \"expected\": [220, 285, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 4\", \"actual\": [350, 160, \"B\"], \"expected\": [350, 160, \"B\"], \"passed\": true}, {\"check\": \"pass stones case 5\", \"actual\": [70, 195, \"W\"], \"expected\": [70, 195, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 6\", \"actual\": [180, 245, \"W\"], \"expected\": [180, 245, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 7\", \"actual\": [270, 340, \"W\"], \"expected\": [280, 340, \"W\"], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":66.634,"exit_code":0,"observations":[{"actual":[300,135,"B"],"check":"pass stones case 0","expected":[300,135,"B"],"passed":true},{"actual":[90,135,"W"],"check":"pass stones case 1","expected":[90,135,"W"],"passed":true},{"actual":[110,205,"W"],"check":"pass stones case 2","expected":[110,205,"W"],"passed":true},{"actual":[220,285,"W"],"check":"pass stones case 3","expected":[220,285,"W"],"passed":true},{"actual":[350,160,"B"],"check":"pass stones case 4","expected":[350,160,"B"],"passed":true},{"actual":[70,195,"W"],"check":"pass stones case 5","expected":[70,195,"W"],"passed":true},{"actual":[180,245,"W"],"check":"pass stones case 6","expected":[180,245,"W"],"passed":true},{"actual":[280,340,"W"],"check":"pass stones case 7","expected":[280,340,"W"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"pass stones case 0\", \"actual\": [300, 135, \"B\"], \"expected\": [300, 135, \"B\"], \"passed\": true}, {\"check\": \"pass stones case 1\", \"actual\": [90, 135, \"W\"], \"expected\": [90, 135, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 2\", \"actual\": [110, 205, \"W\"], \"expected\": [110, 205, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 3\", \"actual\": [220, 285, \"W\"], \"expected\": [220, 285, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 4\", \"actual\": [350, 160, \"B\"], \"expected\": [350, 160, \"B\"], \"passed\": true}, {\"check\": \"pass stones case 5\", \"actual\": [70, 195, \"W\"], \"expected\": [70, 195, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 6\", \"actual\": [180, 245, \"W\"], \"expected\": [180, 245, \"W\"], \"passed\": true}, {\"check\": \"pass stones case 7\", \"actual\": [280, 340, \"W\"], \"expected\": [280, 340, \"W\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}