{"abstract":"Records with RE[0] or RE[Jigo] are classified as unknown.","category":"Go territory scoring","checks":8,"contract":"Input an SGF RE string. \"0\", \"Draw\", \"Jigo\" -> [\"draw\", 0, \"score\"]; \"Void\" -> [\"void\", None, \"none\"]; C+R/Resign, C+T/Time, C+F/Forfeit (case-insensitive) -> [C, None, reason]; \"C+\" -> [C, None, \"unknown\"]; C+digits with optional one-digit fraction -> [C, tenths, \"score\"]; else unknown.","contract_signature":"x","evaluation_group":"w2-go-territory-scoring-sgf-result","failed_approach":"Adding Jigo but not 0 still misses the most common SGF draw encoding.","family":"w2-go-territory-scoring-sgf-result-draw-tokens","id":"FA-83021","implementations":{"attempt":{"sha256":"fa55bdc75d080631a95a304451f62142f3360af26f9893fb1a6f7e51ccd9fe3a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    s = x.strip()\n    if s in ('Draw', 'Jigo'):\n        return ['draw', 0, 'score']\n    if s == 'Void':\n        return ['void', None, 'none']\n    if len(s) < 2 or s[0] not in 'BW' or s[1] != '+':\n        return ['unknown', None, 'none']\n    who = s[0]\n    rest = s[2:]\n    if rest == '':\n        return [who, None, 'unknown']\n    word = rest.lower()\n    for key, reason in (('r', 'resign'), ('t', 'time'), ('f', 'forfeit')):\n        if word in (key, reason):\n            return [who, None, reason]\n    if '.' in rest:\n        whole, _, frac = rest.partition('.')\n    else:\n        whole, frac = rest, '0'\n    if not whole.isdigit() or not frac.isdigit() or len(frac) != 1:\n        return ['unknown', None, 'none']\n    return [who, int(whole) * 10 + int(frac), 'score']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['B+3.5', ['B', 35, 'score']], ['W+0.5', ['W', 5, 'score']], ['W+12', ['W', 120, 'score']], ['B+2.3', ['B', 23, 'score']], ['W+8.2', ['W', 82, 'score']], ['B+1.1', ['B', 11, 'score']], ['0', ['draw', 0, 'score']], ['0', ['draw', 0, 'score']]], [['W+', ['W', None, 'unknown']], ['0', ['draw', 0, 'score']], ['Draw', ['draw', 0, 'score']], ['Jigo', ['draw', 0, 'score']], ['Void', ['void', None, 'none']], ['?', ['unknown', None, 'none']], [' B+R ', ['B', None, 'resign']], ['B+3.5 ', ['B', 35, 'score']]], [['0', ['draw', 0, 'score']], ['0', ['draw', 0, 'score']], [' W+7', ['W', 70, 'score']], ['X+3', ['unknown', None, 'none']], ['B-3', ['unknown', None, 'none']], ['B+3.25', ['unknown', None, 'none']], ['W+3.0', ['W', 30, 'score']], ['B+6.0', ['B', 60, 'score']]], [['0', ['draw', 0, 'score']], ['Jigo', ['draw', 0, 'score']], ['W+Timeout', ['unknown', None, 'none']], ['B+r', ['B', None, 'resign']], ['W+t', ['W', None, 'time']], ['B+100.5', ['B', 1005, 'score']], ['W+4.1', ['W', 41, 'score']], ['W+.5', ['unknown', None, 'none']]], [['B+R', ['B', None, 'resign']], ['W+Resign', ['W', None, 'resign']], ['B+resign', ['B', None, 'resign']], ['W+T', ['W', None, 'time']], ['B+Time', ['B', None, 'time']], ['0', ['draw', 0, 'score']], ['0', ['draw', 0, 'score']], ['B+7.', ['unknown', None, 'none']]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"result 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":"bd5b18d0d0d9ffefccf56e8608d9968115c0848242bc40e2bba074ee2ec52b11","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    s = x.strip()\n    if s == 'Draw':\n        return ['draw', 0, 'score']\n    if s == 'Void':\n        return ['void', None, 'none']\n    if len(s) < 2 or s[0] not in 'BW' or s[1] != '+':\n        return ['unknown', None, 'none']\n    who = s[0]\n    rest = s[2:]\n    if rest == '':\n        return [who, None, 'unknown']\n    word = rest.lower()\n    for key, reason in (('r', 'resign'), ('t', 'time'), ('f', 'forfeit')):\n        if word in (key, reason):\n            return [who, None, reason]\n    if '.' in rest:\n        whole, _, frac = rest.partition('.')\n    else:\n        whole, frac = rest, '0'\n    if not whole.isdigit() or not frac.isdigit() or len(frac) != 1:\n        return ['unknown', None, 'none']\n    return [who, int(whole) * 10 + int(frac), 'score']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['B+3.5', ['B', 35, 'score']], ['W+0.5', ['W', 5, 'score']], ['W+12', ['W', 120, 'score']], ['B+2.3', ['B', 23, 'score']], ['W+8.2', ['W', 82, 'score']], ['B+1.1', ['B', 11, 'score']], ['0', ['draw', 0, 'score']], ['0', ['draw', 0, 'score']]], [['W+', ['W', None, 'unknown']], ['0', ['draw', 0, 'score']], ['Draw', ['draw', 0, 'score']], ['Jigo', ['draw', 0, 'score']], ['Void', ['void', None, 'none']], ['?', ['unknown', None, 'none']], [' B+R ', ['B', None, 'resign']], ['B+3.5 ', ['B', 35, 'score']]], [['0', ['draw', 0, 'score']], ['0', ['draw', 0, 'score']], [' W+7', ['W', 70, 'score']], ['X+3', ['unknown', None, 'none']], ['B-3', ['unknown', None, 'none']], ['B+3.25', ['unknown', None, 'none']], ['W+3.0', ['W', 30, 'score']], ['B+6.0', ['B', 60, 'score']]], [['0', ['draw', 0, 'score']], ['Jigo', ['draw', 0, 'score']], ['W+Timeout', ['unknown', None, 'none']], ['B+r', ['B', None, 'resign']], ['W+t', ['W', None, 'time']], ['B+100.5', ['B', 1005, 'score']], ['W+4.1', ['W', 41, 'score']], ['W+.5', ['unknown', None, 'none']]], [['B+R', ['B', None, 'resign']], ['W+Resign', ['W', None, 'resign']], ['B+resign', ['B', None, 'resign']], ['W+T', ['W', None, 'time']], ['B+Time', ['B', None, 'time']], ['0', ['draw', 0, 'score']], ['0', ['draw', 0, 'score']], ['B+7.', ['unknown', None, 'none']]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"result 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-sgf-result-draw-tokens","generated_at":"2026-09-29T14:50:17.463049+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":"Only the literal word Draw is treated as a draw.","sha256":"37b0e16b566abe331200f894087ae04e76c446a54787e510127cf249fd84e19f","title":"SGF draw value 0 is not recognised · 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":41.147,"exit_code":1,"observations":[{"actual":["B",35,"score"],"check":"result case 0","expected":["B",35,"score"],"passed":true},{"actual":["W",5,"score"],"check":"result case 1","expected":["W",5,"score"],"passed":true},{"actual":["W",120,"score"],"check":"result case 2","expected":["W",120,"score"],"passed":true},{"actual":["B",23,"score"],"check":"result case 3","expected":["B",23,"score"],"passed":true},{"actual":["W",82,"score"],"check":"result case 4","expected":["W",82,"score"],"passed":true},{"actual":["B",11,"score"],"check":"result case 5","expected":["B",11,"score"],"passed":true},{"actual":["unknown",null,"none"],"check":"result case 6","expected":["draw",0,"score"],"passed":false},{"actual":["unknown",null,"none"],"check":"result case 7","expected":["draw",0,"score"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"result case 0\", \"actual\": [\"B\", 35, \"score\"], \"expected\": [\"B\", 35, \"score\"], \"passed\": true}, {\"check\": \"result case 1\", \"actual\": [\"W\", 5, \"score\"], \"expected\": [\"W\", 5, \"score\"], \"passed\": true}, {\"check\": \"result case 2\", \"actual\": [\"W\", 120, \"score\"], \"expected\": [\"W\", 120, \"score\"], \"passed\": true}, {\"check\": \"result case 3\", \"actual\": [\"B\", 23, \"score\"], \"expected\": [\"B\", 23, \"score\"], \"passed\": true}, {\"check\": \"result case 4\", \"actual\": [\"W\", 82, \"score\"], \"expected\": [\"W\", 82, \"score\"], \"passed\": true}, {\"check\": \"result case 5\", \"actual\": [\"B\", 11, \"score\"], \"expected\": [\"B\", 11, \"score\"], \"passed\": true}, {\"check\": \"result case 6\", \"actual\": [\"unknown\", null, \"none\"], \"expected\": [\"draw\", 0, \"score\"], \"passed\": false}, {\"check\": \"result case 7\", \"actual\": [\"unknown\", null, \"none\"], \"expected\": [\"draw\", 0, \"score\"], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":48.974,"exit_code":1,"observations":[{"actual":["B",35,"score"],"check":"result case 0","expected":["B",35,"score"],"passed":true},{"actual":["W",5,"score"],"check":"result case 1","expected":["W",5,"score"],"passed":true},{"actual":["W",120,"score"],"check":"result case 2","expected":["W",120,"score"],"passed":true},{"actual":["B",23,"score"],"check":"result case 3","expected":["B",23,"score"],"passed":true},{"actual":["W",82,"score"],"check":"result case 4","expected":["W",82,"score"],"passed":true},{"actual":["B",11,"score"],"check":"result case 5","expected":["B",11,"score"],"passed":true},{"actual":["unknown",null,"none"],"check":"result case 6","expected":["draw",0,"score"],"passed":false},{"actual":["unknown",null,"none"],"check":"result case 7","expected":["draw",0,"score"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"result case 0\", \"actual\": [\"B\", 35, \"score\"], \"expected\": [\"B\", 35, \"score\"], \"passed\": true}, {\"check\": \"result case 1\", \"actual\": [\"W\", 5, \"score\"], \"expected\": [\"W\", 5, \"score\"], \"passed\": true}, {\"check\": \"result case 2\", \"actual\": [\"W\", 120, \"score\"], \"expected\": [\"W\", 120, \"score\"], \"passed\": true}, {\"check\": \"result case 3\", \"actual\": [\"B\", 23, \"score\"], \"expected\": [\"B\", 23, \"score\"], \"passed\": true}, {\"check\": \"result case 4\", \"actual\": [\"W\", 82, \"score\"], \"expected\": [\"W\", 82, \"score\"], \"passed\": true}, {\"check\": \"result case 5\", \"actual\": [\"B\", 11, \"score\"], \"expected\": [\"B\", 11, \"score\"], \"passed\": true}, {\"check\": \"result case 6\", \"actual\": [\"unknown\", null, \"none\"], \"expected\": [\"draw\", 0, \"score\"], \"passed\": false}, {\"check\": \"result case 7\", \"actual\": [\"unknown\", null, \"none\"], \"expected\": [\"draw\", 0, \"score\"], \"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."}}