FAILURE MAP
← Case archive

FA-82971 / Go territory scoring / Open access

Columns after H are shifted because I is not skipped · case 01

J10 is parsed one column too far right and I5 is accepted.

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

ROOT CAUSE

The column alphabet includes the letter I.

VERIFIED REPAIR

Use the Go column alphabet without I.

Unsuccessful approach: Mapping I to J accepts the invalid letter I as a J alias.

Case contract

Input [size, text]. Case-insensitive, surrounding blanks ignored; "pass" -> "pass". Column letters A..Z skipping I; row numbers count from 1 at the bottom. Return [row_from_top, col] 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
    t = text.strip().upper()
    if t == 'PASS':
        return 'pass'
    if len(t) < 2 or not t[1:].isdigit():
        return 'invalid'
    letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    if t[0] not in letters:
        return 'invalid'
    col = letters.index(t[0])
    num = int(t[1:])
    if col >= size or num < 1 or num > size:
        return 'invalid'
    return [size - num, col]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[9, 'I5'], 'invalid'], [[9, 'pass'], 'pass'], [[9, 'PASS'], 'pass'], [[9, ' Pass'], 'pass'], [[9, 'Z1'], 'invalid'], [[9, 'A0'], 'invalid'], [[9, 'A9'], [0, 0]], [[19, 'I5'], 'invalid']], [[[9, 'A10'], 'invalid'], [[9, 'K1'], 'invalid'], [[9, 'O3'], 'invalid'], [[9, 'Q16'], 'invalid'], [[9, 'X'], 'invalid'], [[9, ''], 'invalid'], [[13, 'I5'], 'invalid'], [[25, 'I5'], 'invalid']], [[[9, 'I5'], 'invalid'], [[9, 'Y25'], 'invalid'], [[9, 'N13'], 'invalid'], [[9, 'M9'], 'invalid'], [[13, 'D4'], [9, 3]], [[13, 'd4'], [9, 3]], [[13, ' D4 '], [9, 3]], [[13, 'N13'], [0, 12]]], [[[13, 'A1'], [12, 0]], [[13, 'T19'], 'invalid'], [[13, 'J10'], [3, 8]], [[13, 'I5'], 'invalid'], [[13, 'H8'], [5, 7]], [[13, 'pass'], 'pass'], [[13, 'PASS'], 'pass'], [[19, 'J10'], [9, 8]]], [[[13, ' Pass'], 'pass'], [[13, 'Z1'], 'invalid'], [[13, 'A0'], 'invalid'], [[13, 'A13'], [0, 0]], [[13, 'A14'], 'invalid'], [[13, 'K1'], [12, 9]], [[19, 'I5'], 'invalid'], [[19, 'O3'], [16, 13]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("vertex 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
vertex case 0[4, 8]invalidFailed
vertex case 1passpassPassed
vertex case 2passpassPassed
vertex case 3passpassPassed
vertex case 4invalidinvalidPassed
vertex case 5invalidinvalidPassed
vertex case 6[0, 0][0, 0]Passed
vertex case 7[14, 8]invalidFailed

SHA-256 / 34dbae451405ae149b88e82931ea3a4511cc667d65ac181c0425737c4a826ea5

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
    t = text.strip().upper()
    if t == 'PASS':
        return 'pass'
    if len(t) < 2 or not t[1:].isdigit():
        return 'invalid'
    letters = 'ABCDEFGHJKLMNOPQRSTUVWXYZ'
    if t[0] == 'I':
        t = 'J' + t[1:]
    if t[0] not in letters:
        return 'invalid'
    col = letters.index(t[0])
    num = int(t[1:])
    if col >= size or num < 1 or num > size:
        return 'invalid'
    return [size - num, col]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[9, 'I5'], 'invalid'], [[9, 'pass'], 'pass'], [[9, 'PASS'], 'pass'], [[9, ' Pass'], 'pass'], [[9, 'Z1'], 'invalid'], [[9, 'A0'], 'invalid'], [[9, 'A9'], [0, 0]], [[19, 'I5'], 'invalid']], [[[9, 'A10'], 'invalid'], [[9, 'K1'], 'invalid'], [[9, 'O3'], 'invalid'], [[9, 'Q16'], 'invalid'], [[9, 'X'], 'invalid'], [[9, ''], 'invalid'], [[13, 'I5'], 'invalid'], [[25, 'I5'], 'invalid']], [[[9, 'I5'], 'invalid'], [[9, 'Y25'], 'invalid'], [[9, 'N13'], 'invalid'], [[9, 'M9'], 'invalid'], [[13, 'D4'], [9, 3]], [[13, 'd4'], [9, 3]], [[13, ' D4 '], [9, 3]], [[13, 'N13'], [0, 12]]], [[[13, 'A1'], [12, 0]], [[13, 'T19'], 'invalid'], [[13, 'J10'], [3, 8]], [[13, 'I5'], 'invalid'], [[13, 'H8'], [5, 7]], [[13, 'pass'], 'pass'], [[13, 'PASS'], 'pass'], [[19, 'J10'], [9, 8]]], [[[13, ' Pass'], 'pass'], [[13, 'Z1'], 'invalid'], [[13, 'A0'], 'invalid'], [[13, 'A13'], [0, 0]], [[13, 'A14'], 'invalid'], [[13, 'K1'], [12, 9]], [[19, 'I5'], 'invalid'], [[19, 'O3'], [16, 13]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("vertex 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
vertex case 0[4, 8]invalidFailed
vertex case 1passpassPassed
vertex case 2passpassPassed
vertex case 3passpassPassed
vertex case 4invalidinvalidPassed
vertex case 5invalidinvalidPassed
vertex case 6[0, 0][0, 0]Passed
vertex case 7[14, 8]invalidFailed

SHA-256 / a2288d88bb312a47c1be6e72e1f4f1024b2c73e865b8ab415453d3695d12b737

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
    t = text.strip().upper()
    if t == 'PASS':
        return 'pass'
    if len(t) < 2 or not t[1:].isdigit():
        return 'invalid'
    letters = 'ABCDEFGHJKLMNOPQRSTUVWXYZ'
    if t[0] not in letters:
        return 'invalid'
    col = letters.index(t[0])
    num = int(t[1:])
    if col >= size or num < 1 or num > size:
        return 'invalid'
    return [size - num, col]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[9, 'I5'], 'invalid'], [[9, 'pass'], 'pass'], [[9, 'PASS'], 'pass'], [[9, ' Pass'], 'pass'], [[9, 'Z1'], 'invalid'], [[9, 'A0'], 'invalid'], [[9, 'A9'], [0, 0]], [[19, 'I5'], 'invalid']], [[[9, 'A10'], 'invalid'], [[9, 'K1'], 'invalid'], [[9, 'O3'], 'invalid'], [[9, 'Q16'], 'invalid'], [[9, 'X'], 'invalid'], [[9, ''], 'invalid'], [[13, 'I5'], 'invalid'], [[25, 'I5'], 'invalid']], [[[9, 'I5'], 'invalid'], [[9, 'Y25'], 'invalid'], [[9, 'N13'], 'invalid'], [[9, 'M9'], 'invalid'], [[13, 'D4'], [9, 3]], [[13, 'd4'], [9, 3]], [[13, ' D4 '], [9, 3]], [[13, 'N13'], [0, 12]]], [[[13, 'A1'], [12, 0]], [[13, 'T19'], 'invalid'], [[13, 'J10'], [3, 8]], [[13, 'I5'], 'invalid'], [[13, 'H8'], [5, 7]], [[13, 'pass'], 'pass'], [[13, 'PASS'], 'pass'], [[19, 'J10'], [9, 8]]], [[[13, ' Pass'], 'pass'], [[13, 'Z1'], 'invalid'], [[13, 'A0'], 'invalid'], [[13, 'A13'], [0, 0]], [[13, 'A14'], 'invalid'], [[13, 'K1'], [12, 9]], [[19, 'I5'], 'invalid'], [[19, 'O3'], [16, 13]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("vertex 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
vertex case 0invalidinvalidPassed
vertex case 1passpassPassed
vertex case 2passpassPassed
vertex case 3passpassPassed
vertex case 4invalidinvalidPassed
vertex case 5invalidinvalidPassed
vertex case 6[0, 0][0, 0]Passed
vertex case 7invalidinvalidPassed

SHA-256 / 0d281dc3dc8312afa2351908c2811c01644fb06f465737e2b99e9c977896f957

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.219001+00:00.

Case digest / 26efccf3215701aac0a4683eca1d241f031efd230cf4f13439cabb11a3e8fdf7