{"abstract":"B+R and W+Resign are reported as unknown results.","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":"Matching only the first letter accepts arbitrary words such as B+Rough as resignations.","family":"w2-go-territory-scoring-sgf-result-reason-word-case","id":"FA-83016","implementations":{"attempt":{"sha256":"8bafdfb46cabdd90d2330cf5b69c2b7b2cd9a6202cfd16ba7bdebe863cce8a57","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 ('0', '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()[:1]\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+R', ['B', None, 'resign']], ['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']], ['B+', ['B', None, 'unknown']], ['B+Rough', ['unknown', None, 'none']]], [['B+Time', ['B', None, 'time']], ['0', ['draw', 0, 'score']], ['Draw', ['draw', 0, 'score']], ['Jigo', ['draw', 0, 'score']], ['Void', ['void', None, 'none']], ['?', ['unknown', None, 'none']], [' B+R ', ['B', None, 'resign']], ['W+Timeout', ['unknown', None, 'none']]], [[' B+R ', ['B', None, 'resign']], [' 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']], ['B+Rough', ['unknown', None, 'none']]], [['W+T', ['W', None, 'time']], ['B+Rough', ['unknown', None, 'none']], ['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']], ['W+F', ['W', None, 'forfeit']], ['B+Forfeit', ['B', None, 'forfeit']], ['B+Rough', ['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":"4a7d527635ea747fee1d120ad7db2c042d6f29f7b47a6b3e84a32e3a2e5303fc","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 ('0', '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\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+R', ['B', None, 'resign']], ['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']], ['B+', ['B', None, 'unknown']], ['B+Rough', ['unknown', None, 'none']]], [['B+Time', ['B', None, 'time']], ['0', ['draw', 0, 'score']], ['Draw', ['draw', 0, 'score']], ['Jigo', ['draw', 0, 'score']], ['Void', ['void', None, 'none']], ['?', ['unknown', None, 'none']], [' B+R ', ['B', None, 'resign']], ['W+Timeout', ['unknown', None, 'none']]], [[' B+R ', ['B', None, 'resign']], [' 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']], ['B+Rough', ['unknown', None, 'none']]], [['W+T', ['W', None, 'time']], ['B+Rough', ['unknown', None, 'none']], ['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']], ['W+F', ['W', None, 'forfeit']], ['B+Forfeit', ['B', None, 'forfeit']], ['B+Rough', ['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-reason-word-case","generated_at":"2026-09-29T14:50:17.380877+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 reason word is compared without lower-casing.","sha256":"0ca188b1f1273e9f3223479ad3f5c6215a96871a3ab7e75152c7dea18c11457e","title":"Capitalised resign and time reasons are 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":47.686,"exit_code":1,"observations":[{"actual":["B",null,"resign"],"check":"result case 0","expected":["B",null,"resign"],"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":["B",null,"unknown"],"check":"result case 6","expected":["B",null,"unknown"],"passed":true},{"actual":["B",null,"resign"],"check":"result case 7","expected":["unknown",null,"none"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"result case 0\", \"actual\": [\"B\", null, \"resign\"], \"expected\": [\"B\", null, \"resign\"], \"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\": [\"B\", null, \"unknown\"], \"expected\": [\"B\", null, \"unknown\"], \"passed\": true}, {\"check\": \"result case 7\", \"actual\": [\"B\", null, \"resign\"], \"expected\": [\"unknown\", null, \"none\"], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.734,"exit_code":1,"observations":[{"actual":["unknown",null,"none"],"check":"result case 0","expected":["B",null,"resign"],"passed":false},{"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":["B",null,"unknown"],"check":"result case 6","expected":["B",null,"unknown"],"passed":true},{"actual":["unknown",null,"none"],"check":"result case 7","expected":["unknown",null,"none"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"result case 0\", \"actual\": [\"unknown\", null, \"none\"], \"expected\": [\"B\", null, \"resign\"], \"passed\": false}, {\"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\": [\"B\", null, \"unknown\"], \"expected\": [\"B\", null, \"unknown\"], \"passed\": true}, {\"check\": \"result case 7\", \"actual\": [\"unknown\", null, \"none\"], \"expected\": [\"unknown\", null, \"none\"], \"passed\": true}], \"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."}}