FA-83001 / Go territory scoring / Open access
Upper-case or out-of-range letters decode to negative coordinates · case 01
Points like "Aa" produce negative rows or columns.
ROOT CAUSE
The range check omits the lower bound.
VERIFIED REPAIR
Require 0 <= col < size and 0 <= row < size.
Unsuccessful approach: Using <= size admits a coordinate one past the board edge.
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' 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 (col < size and 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]], [[9, 'ai'], [8, 0]], [[21, 'va'], 'invalid']], [[[9, 'ta'], 'invalid'], [[9, 'at'], 'invalid'], [[9, 'pd'], 'invalid'], [[9, 'dp'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ja'], 'invalid'], [[13, 'aA'], 'invalid'], [[19, 'ta'], 'invalid']], [[[9, 'jj'], 'invalid'], [[13, 'aa'], [0, 0]], [[13, 'ss'], 'invalid'], [[13, 'tt'], 'pass'], [[13, ''], 'pass'], [[13, 'ab'], [1, 0]], [[13, 'ba'], [0, 1]], [[21, 'Aa'], 'invalid']], [[[13, 'jj'], [9, 9]], [[13, 'Aa'], 'invalid'], [[13, 'aA'], 'invalid'], [[13, 'u'], 'invalid'], [[13, 'abc'], 'invalid'], [[13, 'ia'], [0, 8]], [[19, 'ta'], 'invalid'], [[25, 'aA'], 'invalid']], [[[13, 'Aa'], 'invalid'], [[13, 'at'], 'invalid'], [[13, 'pd'], 'invalid'], [[13, 'dp'], 'invalid'], [[13, 'ma'], [0, 12]], [[13, 'na'], 'invalid'], [[13, 'am'], [12, 0]], [[19, 'dd'], [3, 3]]]]
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 | [0, -32] | invalid | Failed |
| sgf point case 2 | [-32, 0] | invalid | Failed |
| 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 | invalid | Passed |
SHA-256 / 813b069a608a55ccdee057e022bfb64d48ef6ba0809e345ca0060cf45d3437fd
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]], [[9, 'ai'], [8, 0]], [[21, 'va'], 'invalid']], [[[9, 'ta'], 'invalid'], [[9, 'at'], 'invalid'], [[9, 'pd'], 'invalid'], [[9, 'dp'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ja'], 'invalid'], [[13, 'aA'], 'invalid'], [[19, 'ta'], 'invalid']], [[[9, 'jj'], 'invalid'], [[13, 'aa'], [0, 0]], [[13, 'ss'], 'invalid'], [[13, 'tt'], 'pass'], [[13, ''], 'pass'], [[13, 'ab'], [1, 0]], [[13, 'ba'], [0, 1]], [[21, 'Aa'], 'invalid']], [[[13, 'jj'], [9, 9]], [[13, 'Aa'], 'invalid'], [[13, 'aA'], 'invalid'], [[13, 'u'], 'invalid'], [[13, 'abc'], 'invalid'], [[13, 'ia'], [0, 8]], [[19, 'ta'], 'invalid'], [[25, 'aA'], 'invalid']], [[[13, 'Aa'], 'invalid'], [[13, 'at'], 'invalid'], [[13, 'pd'], 'invalid'], [[13, 'dp'], 'invalid'], [[13, 'ma'], [0, 12]], [[13, 'na'], 'invalid'], [[13, 'am'], [12, 0]], [[19, 'dd'], [3, 3]]]]
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 | [9, 9] | invalid | 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 | [0, 21] | invalid | Failed |
SHA-256 / 4dd52f8393fa88ec7907d46dbf9a3d1de644604b30ed51f745bd29c4071b8227
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]], [[9, 'ai'], [8, 0]], [[21, 'va'], 'invalid']], [[[9, 'ta'], 'invalid'], [[9, 'at'], 'invalid'], [[9, 'pd'], 'invalid'], [[9, 'dp'], 'invalid'], [[9, 'ia'], [0, 8]], [[9, 'ja'], 'invalid'], [[13, 'aA'], 'invalid'], [[19, 'ta'], 'invalid']], [[[9, 'jj'], 'invalid'], [[13, 'aa'], [0, 0]], [[13, 'ss'], 'invalid'], [[13, 'tt'], 'pass'], [[13, ''], 'pass'], [[13, 'ab'], [1, 0]], [[13, 'ba'], [0, 1]], [[21, 'Aa'], 'invalid']], [[[13, 'jj'], [9, 9]], [[13, 'Aa'], 'invalid'], [[13, 'aA'], 'invalid'], [[13, 'u'], 'invalid'], [[13, 'abc'], 'invalid'], [[13, 'ia'], [0, 8]], [[19, 'ta'], 'invalid'], [[25, 'aA'], 'invalid']], [[[13, 'Aa'], 'invalid'], [[13, 'at'], 'invalid'], [[13, 'pd'], 'invalid'], [[13, 'dp'], 'invalid'], [[13, 'ma'], [0, 12]], [[13, 'na'], 'invalid'], [[13, 'am'], [12, 0]], [[19, 'dd'], [3, 3]]]]
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 | [8, 0] | [8, 0] | Passed |
| sgf point case 7 | invalid | invalid | Passed |
SHA-256 / 7e22ff78ac8de477fc51352892c22bcf6aab6f14c0607b12b5c3f8ff6d44edab
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.273437+00:00.
Case digest / a84fd2a338ee2b712b4e74bc8e6f208348f2b2c5567ea461df05e05ffb45b159