FA-82991 / Go territory scoring / Open access
tt is treated as a pass on boards larger than 19x19 · case 01
A real move at column 20 row 20 on a 21x21 board is dropped as a pass.
ROOT CAUSE
The legacy tt pass is recognised without the board-size guard.
VERIFIED REPAIR
Accept tt as pass only when size <= 19.
Unsuccessful approach: Using size < 19 stops recognising tt as pass on the standard 19x19 board.
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 == '':
return 'pass'
if text == 'tt':
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, 'jj'], 'invalid'], [[9, 'Aa'], 'invalid'], [[9, 'aA'], 'invalid'], [[9, 'u'], 'invalid'], [[9, 'abc'], 'invalid'], [[9, 'ia'], [0, 8]], [[19, 'tt'], 'pass'], [[21, 'tt'], [19, 19]]], [[[9, 'ta'], 'invalid'], [[9, 'at'], 'invalid'], [[9, 'pd'], 'invalid'], [[9, 'dp'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ja'], 'invalid'], [[19, 'tt'], 'pass'], [[25, 'tt'], [19, 19]]], [[[13, 'dd'], [3, 3]], [[13, 'aa'], [0, 0]], [[13, 'ss'], 'invalid'], [[13, 'tt'], 'pass'], [[13, ''], 'pass'], [[13, 'ab'], [1, 0]], [[19, 'tt'], 'pass'], [[21, 'tt'], [19, 19]]], [[[13, 'jj'], [9, 9]], [[13, 'Aa'], 'invalid'], [[13, 'aA'], 'invalid'], [[13, 'u'], 'invalid'], [[13, 'abc'], 'invalid'], [[13, 'ia'], [0, 8]], [[19, 'tt'], 'pass'], [[25, 'tt'], [19, 19]]], [[[13, 'ta'], 'invalid'], [[13, 'at'], 'invalid'], [[13, 'pd'], 'invalid'], [[13, 'dp'], 'invalid'], [[13, 'ma'], [0, 12]], [[13, 'na'], 'invalid'], [[19, 'tt'], 'pass'], [[21, 'tt'], [19, 19]]]]
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 | invalid | 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 | pass | pass | Passed |
| sgf point case 7 | pass | [19, 19] | Failed |
SHA-256 / 642aea975275a16150459b29872dac5999430b23eaaab9f4c26b7d7d196f6963
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 == '':
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, 'jj'], 'invalid'], [[9, 'Aa'], 'invalid'], [[9, 'aA'], 'invalid'], [[9, 'u'], 'invalid'], [[9, 'abc'], 'invalid'], [[9, 'ia'], [0, 8]], [[19, 'tt'], 'pass'], [[21, 'tt'], [19, 19]]], [[[9, 'ta'], 'invalid'], [[9, 'at'], 'invalid'], [[9, 'pd'], 'invalid'], [[9, 'dp'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ja'], 'invalid'], [[19, 'tt'], 'pass'], [[25, 'tt'], [19, 19]]], [[[13, 'dd'], [3, 3]], [[13, 'aa'], [0, 0]], [[13, 'ss'], 'invalid'], [[13, 'tt'], 'pass'], [[13, ''], 'pass'], [[13, 'ab'], [1, 0]], [[19, 'tt'], 'pass'], [[21, 'tt'], [19, 19]]], [[[13, 'jj'], [9, 9]], [[13, 'Aa'], 'invalid'], [[13, 'aA'], 'invalid'], [[13, 'u'], 'invalid'], [[13, 'abc'], 'invalid'], [[13, 'ia'], [0, 8]], [[19, 'tt'], 'pass'], [[25, 'tt'], [19, 19]]], [[[13, 'ta'], 'invalid'], [[13, 'at'], 'invalid'], [[13, 'pd'], 'invalid'], [[13, 'dp'], 'invalid'], [[13, 'ma'], [0, 12]], [[13, 'na'], 'invalid'], [[19, 'tt'], 'pass'], [[21, 'tt'], [19, 19]]]]
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 | invalid | 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 | invalid | pass | Failed |
| sgf point case 7 | [19, 19] | [19, 19] | Passed |
SHA-256 / 1e1d8ec973cc1fd52d8f8faba1428a2b9590e2087c272ea5cab2959e811c4d31
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, 'jj'], 'invalid'], [[9, 'Aa'], 'invalid'], [[9, 'aA'], 'invalid'], [[9, 'u'], 'invalid'], [[9, 'abc'], 'invalid'], [[9, 'ia'], [0, 8]], [[19, 'tt'], 'pass'], [[21, 'tt'], [19, 19]]], [[[9, 'ta'], 'invalid'], [[9, 'at'], 'invalid'], [[9, 'pd'], 'invalid'], [[9, 'dp'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ja'], 'invalid'], [[19, 'tt'], 'pass'], [[25, 'tt'], [19, 19]]], [[[13, 'dd'], [3, 3]], [[13, 'aa'], [0, 0]], [[13, 'ss'], 'invalid'], [[13, 'tt'], 'pass'], [[13, ''], 'pass'], [[13, 'ab'], [1, 0]], [[19, 'tt'], 'pass'], [[21, 'tt'], [19, 19]]], [[[13, 'jj'], [9, 9]], [[13, 'Aa'], 'invalid'], [[13, 'aA'], 'invalid'], [[13, 'u'], 'invalid'], [[13, 'abc'], 'invalid'], [[13, 'ia'], [0, 8]], [[19, 'tt'], 'pass'], [[25, 'tt'], [19, 19]]], [[[13, 'ta'], 'invalid'], [[13, 'at'], 'invalid'], [[13, 'pd'], 'invalid'], [[13, 'dp'], 'invalid'], [[13, 'ma'], [0, 12]], [[13, 'na'], 'invalid'], [[19, 'tt'], 'pass'], [[21, 'tt'], [19, 19]]]]
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 | invalid | 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 | pass | pass | Passed |
| sgf point case 7 | [19, 19] | [19, 19] | Passed |
SHA-256 / a7a2bb831c2fdb4a302bd3fd256ddb142aa3cbe7d5d2d868d5ebae1f82655f2e
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.262414+00:00.
Case digest / 133917fde0f5ac7227817327e7b5545d80832456418360060e43e6a34391e707