FAILURE MAP
← Case archive

FA-83006 / Go territory scoring / Open access

An empty SGF move value is rejected · case 01

B[] passes become invalid moves.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

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 fixtureActualExpectedOutcome
sgf point case 0invalidpassFailed
sgf point case 1invalidinvalidPassed
sgf point case 2invalidinvalidPassed
sgf point case 3invalidinvalidPassed
sgf point case 4invalidinvalidPassed
sgf point case 5[0, 8][0, 8]Passed
sgf point case 6[8, 0][8, 0]Passed
sgf point case 7invalidpassFailed

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 fixtureActualExpectedOutcome
sgf point case 0passpassPassed
sgf point case 1invalidinvalidPassed
sgf point case 2invalidinvalidPassed
sgf point case 3invalidinvalidPassed
sgf point case 4invalidinvalidPassed
sgf point case 5[0, 8][0, 8]Passed
sgf point case 6[8, 0][8, 0]Passed
sgf point case 7invalidpassFailed

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 fixtureActualExpectedOutcome
sgf point case 0passpassPassed
sgf point case 1invalidinvalidPassed
sgf point case 2invalidinvalidPassed
sgf point case 3invalidinvalidPassed
sgf point case 4invalidinvalidPassed
sgf point case 5[0, 8][0, 8]Passed
sgf point case 6[8, 0][8, 0]Passed
sgf point case 7passpassPassed

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