FA-83006 / Go territory scoring / Open access
An empty SGF move value is rejected · case 01
B[] passes become invalid moves.
ROOT CAUSE
Only tt is recognised as a pass.
VERIFIED REPAIR
An empty value is always a pass.
Unsuccessful approach: Tying the empty-value pass to the 19x19 limit rejects passes on larger boards.
Case contract
Input [size, text]. "" is a pass; "tt" is also a pass on boards up to 19x19. Otherwise exactly two lower-case letters: first = column, second = row, both from the top-left. Return [row, col], "pass" or "invalid".
Why this case matters
Go servers and scoring tools compute this value automatically; a wrong answer changes a game result.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
size, text = x
if text == 'tt' and size <= 19:
return 'pass'
if len(text) != 2:
return 'invalid'
col = ord(text[0]) - ord('a')
row = ord(text[1]) - ord('a')
if not (0 <= col < size and 0 <= row < size):
return 'invalid'
return [row, col]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[9, ''], 'pass'], [[9, 'Aa'], 'invalid'], [[9, 'aA'], 'invalid'], [[9, 'u'], 'invalid'], [[9, 'abc'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ai'], [8, 0]], [[21, ''], 'pass']], [[[9, 'ta'], 'invalid'], [[9, 'at'], 'invalid'], [[9, 'pd'], 'invalid'], [[9, 'dp'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ja'], 'invalid'], [[21, ''], 'pass'], [[25, ''], 'pass']], [[[13, 'dd'], [3, 3]], [[13, 'aa'], [0, 0]], [[13, 'ss'], 'invalid'], [[13, 'tt'], 'pass'], [[13, ''], 'pass'], [[13, 'ab'], [1, 0]], [[13, 'ba'], [0, 1]], [[21, ''], 'pass']], [[[13, 'jj'], [9, 9]], [[13, 'Aa'], 'invalid'], [[13, 'aA'], 'invalid'], [[13, 'u'], 'invalid'], [[13, 'abc'], 'invalid'], [[13, 'ia'], [0, 8]], [[25, ''], 'pass'], [[25, ''], 'pass']], [[[13, 'ta'], 'invalid'], [[13, 'at'], 'invalid'], [[13, 'pd'], 'invalid'], [[13, 'dp'], 'invalid'], [[13, 'ma'], [0, 12]], [[13, 'na'], 'invalid'], [[19, ''], 'pass'], [[21, ''], 'pass']]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("sgf point case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| sgf point case 0 | invalid | pass | Failed |
| sgf point case 1 | invalid | invalid | Passed |
| sgf point case 2 | invalid | invalid | Passed |
| sgf point case 3 | invalid | invalid | Passed |
| sgf point case 4 | invalid | invalid | Passed |
| sgf point case 5 | [0, 8] | [0, 8] | Passed |
| sgf point case 6 | [8, 0] | [8, 0] | Passed |
| sgf point case 7 | invalid | pass | Failed |
SHA-256 / c563782314f5ee7f7f5c98927c3f0e24ad0f496ed9eba98ee667ebdf369200db
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
size, text = x
if text == '' and size <= 19:
return 'pass'
if text == 'tt' and size <= 19:
return 'pass'
if len(text) != 2:
return 'invalid'
col = ord(text[0]) - ord('a')
row = ord(text[1]) - ord('a')
if not (0 <= col < size and 0 <= row < size):
return 'invalid'
return [row, col]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[9, ''], 'pass'], [[9, 'Aa'], 'invalid'], [[9, 'aA'], 'invalid'], [[9, 'u'], 'invalid'], [[9, 'abc'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ai'], [8, 0]], [[21, ''], 'pass']], [[[9, 'ta'], 'invalid'], [[9, 'at'], 'invalid'], [[9, 'pd'], 'invalid'], [[9, 'dp'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ja'], 'invalid'], [[21, ''], 'pass'], [[25, ''], 'pass']], [[[13, 'dd'], [3, 3]], [[13, 'aa'], [0, 0]], [[13, 'ss'], 'invalid'], [[13, 'tt'], 'pass'], [[13, ''], 'pass'], [[13, 'ab'], [1, 0]], [[13, 'ba'], [0, 1]], [[21, ''], 'pass']], [[[13, 'jj'], [9, 9]], [[13, 'Aa'], 'invalid'], [[13, 'aA'], 'invalid'], [[13, 'u'], 'invalid'], [[13, 'abc'], 'invalid'], [[13, 'ia'], [0, 8]], [[25, ''], 'pass'], [[25, ''], 'pass']], [[[13, 'ta'], 'invalid'], [[13, 'at'], 'invalid'], [[13, 'pd'], 'invalid'], [[13, 'dp'], 'invalid'], [[13, 'ma'], [0, 12]], [[13, 'na'], 'invalid'], [[19, ''], 'pass'], [[21, ''], 'pass']]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("sgf point case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| sgf point case 0 | pass | pass | Passed |
| sgf point case 1 | invalid | invalid | Passed |
| sgf point case 2 | invalid | invalid | Passed |
| sgf point case 3 | invalid | invalid | Passed |
| sgf point case 4 | invalid | invalid | Passed |
| sgf point case 5 | [0, 8] | [0, 8] | Passed |
| sgf point case 6 | [8, 0] | [8, 0] | Passed |
| sgf point case 7 | invalid | pass | Failed |
SHA-256 / 4f9e77d073ab2e48feb056030184d40f03a77098d33a1b434345abb97dc1110f
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
size, text = x
if text == '':
return 'pass'
if text == 'tt' and size <= 19:
return 'pass'
if len(text) != 2:
return 'invalid'
col = ord(text[0]) - ord('a')
row = ord(text[1]) - ord('a')
if not (0 <= col < size and 0 <= row < size):
return 'invalid'
return [row, col]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[9, ''], 'pass'], [[9, 'Aa'], 'invalid'], [[9, 'aA'], 'invalid'], [[9, 'u'], 'invalid'], [[9, 'abc'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ai'], [8, 0]], [[21, ''], 'pass']], [[[9, 'ta'], 'invalid'], [[9, 'at'], 'invalid'], [[9, 'pd'], 'invalid'], [[9, 'dp'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ja'], 'invalid'], [[21, ''], 'pass'], [[25, ''], 'pass']], [[[13, 'dd'], [3, 3]], [[13, 'aa'], [0, 0]], [[13, 'ss'], 'invalid'], [[13, 'tt'], 'pass'], [[13, ''], 'pass'], [[13, 'ab'], [1, 0]], [[13, 'ba'], [0, 1]], [[21, ''], 'pass']], [[[13, 'jj'], [9, 9]], [[13, 'Aa'], 'invalid'], [[13, 'aA'], 'invalid'], [[13, 'u'], 'invalid'], [[13, 'abc'], 'invalid'], [[13, 'ia'], [0, 8]], [[25, ''], 'pass'], [[25, ''], 'pass']], [[[13, 'ta'], 'invalid'], [[13, 'at'], 'invalid'], [[13, 'pd'], 'invalid'], [[13, 'dp'], 'invalid'], [[13, 'ma'], [0, 12]], [[13, 'na'], 'invalid'], [[19, ''], 'pass'], [[21, ''], 'pass']]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("sgf point case %d" % i, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| sgf point case 0 | pass | pass | Passed |
| sgf point case 1 | invalid | invalid | Passed |
| sgf point case 2 | invalid | invalid | Passed |
| sgf point case 3 | invalid | invalid | Passed |
| sgf point case 4 | invalid | invalid | Passed |
| sgf point case 5 | [0, 8] | [0, 8] | Passed |
| sgf point case 6 | [8, 0] | [8, 0] | Passed |
| sgf point case 7 | pass | pass | Passed |
SHA-256 / 7a44720becfe6f76e8611fd7ef83ede1031237510df34e321d71859a73135701
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:50:17.321613+00:00.
Case digest / 23554fefcad1359e03a49bf80487d4aca14ebed1bddae5029ecac6170fcf2833