FAILURE MAP
← Case archive

FA-82976 / Go territory scoring / Open access

GTP row numbers are read from the top edge · case 01

D4 lands on the fourth row from the top instead of the bottom.

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

ROOT CAUSE

The row index uses num-1 instead of size-num.

VERIFIED REPAIR

GTP counts rows from the bottom: row_from_top = size - num.

Unsuccessful approach: Subtracting one more from size-num shifts every move one row up.

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 = '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 [num - 1, col]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[9, 'D4'], [5, 3]], [[9, 'pass'], 'pass'], [[9, 'PASS'], 'pass'], [[9, ' Pass'], 'pass'], [[9, 'Z1'], 'invalid'], [[9, 'A0'], 'invalid'], [[9, 'A9'], [0, 0]], [[9, 'j9'], [0, 8]]], [[[9, 'A1'], [8, 0]], [[9, 'K1'], 'invalid'], [[9, 'O3'], 'invalid'], [[9, 'Q16'], 'invalid'], [[9, 'X'], 'invalid'], [[9, ''], 'invalid'], [[9, 'E'], 'invalid'], [[13, 'J10'], [3, 8]]], [[[9, 'j9'], [0, 8]], [[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, ' D4 '], [9, 3]], [[13, 'T19'], 'invalid'], [[13, 'J10'], [3, 8]], [[13, 'I5'], 'invalid'], [[13, 'H8'], [5, 7]], [[13, 'pass'], 'pass'], [[13, 'PASS'], 'pass'], [[19, 'A1'], [18, 0]]], [[[13, 'H8'], [5, 7]], [[13, 'Z1'], 'invalid'], [[13, 'A0'], 'invalid'], [[13, 'A13'], [0, 0]], [[13, 'A14'], 'invalid'], [[13, 'K1'], [12, 9]], [[13, 'O3'], 'invalid'], [[19, 'K1'], [18, 9]]]]
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[3, 3][5, 3]Failed
vertex case 1passpassPassed
vertex case 2passpassPassed
vertex case 3passpassPassed
vertex case 4invalidinvalidPassed
vertex case 5invalidinvalidPassed
vertex case 6[8, 0][0, 0]Failed
vertex case 7[8, 8][0, 8]Failed

SHA-256 / 2a6f3843e0d494425e0795791ff6e705da811bb713b88b8b48e7ad3be426e315

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] 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 - 1, col]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[9, 'D4'], [5, 3]], [[9, 'pass'], 'pass'], [[9, 'PASS'], 'pass'], [[9, ' Pass'], 'pass'], [[9, 'Z1'], 'invalid'], [[9, 'A0'], 'invalid'], [[9, 'A9'], [0, 0]], [[9, 'j9'], [0, 8]]], [[[9, 'A1'], [8, 0]], [[9, 'K1'], 'invalid'], [[9, 'O3'], 'invalid'], [[9, 'Q16'], 'invalid'], [[9, 'X'], 'invalid'], [[9, ''], 'invalid'], [[9, 'E'], 'invalid'], [[13, 'J10'], [3, 8]]], [[[9, 'j9'], [0, 8]], [[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, ' D4 '], [9, 3]], [[13, 'T19'], 'invalid'], [[13, 'J10'], [3, 8]], [[13, 'I5'], 'invalid'], [[13, 'H8'], [5, 7]], [[13, 'pass'], 'pass'], [[13, 'PASS'], 'pass'], [[19, 'A1'], [18, 0]]], [[[13, 'H8'], [5, 7]], [[13, 'Z1'], 'invalid'], [[13, 'A0'], 'invalid'], [[13, 'A13'], [0, 0]], [[13, 'A14'], 'invalid'], [[13, 'K1'], [12, 9]], [[13, 'O3'], 'invalid'], [[19, 'K1'], [18, 9]]]]
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, 3][5, 3]Failed
vertex case 1passpassPassed
vertex case 2passpassPassed
vertex case 3passpassPassed
vertex case 4invalidinvalidPassed
vertex case 5invalidinvalidPassed
vertex case 6[-1, 0][0, 0]Failed
vertex case 7[-1, 8][0, 8]Failed

SHA-256 / 29f367c45ae0768aad1a8d2405d7f445ae934fc08e55be6d5bd40837ed83d348

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, 'D4'], [5, 3]], [[9, 'pass'], 'pass'], [[9, 'PASS'], 'pass'], [[9, ' Pass'], 'pass'], [[9, 'Z1'], 'invalid'], [[9, 'A0'], 'invalid'], [[9, 'A9'], [0, 0]], [[9, 'j9'], [0, 8]]], [[[9, 'A1'], [8, 0]], [[9, 'K1'], 'invalid'], [[9, 'O3'], 'invalid'], [[9, 'Q16'], 'invalid'], [[9, 'X'], 'invalid'], [[9, ''], 'invalid'], [[9, 'E'], 'invalid'], [[13, 'J10'], [3, 8]]], [[[9, 'j9'], [0, 8]], [[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, ' D4 '], [9, 3]], [[13, 'T19'], 'invalid'], [[13, 'J10'], [3, 8]], [[13, 'I5'], 'invalid'], [[13, 'H8'], [5, 7]], [[13, 'pass'], 'pass'], [[13, 'PASS'], 'pass'], [[19, 'A1'], [18, 0]]], [[[13, 'H8'], [5, 7]], [[13, 'Z1'], 'invalid'], [[13, 'A0'], 'invalid'], [[13, 'A13'], [0, 0]], [[13, 'A14'], 'invalid'], [[13, 'K1'], [12, 9]], [[13, 'O3'], 'invalid'], [[19, 'K1'], [18, 9]]]]
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[5, 3][5, 3]Passed
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[0, 8][0, 8]Passed

SHA-256 / c25e1d57f976b02885d6c56ce066eb6e5361c092aa8cdc8acaf3c5844328d025

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

Case digest / 47ee3627af68e0fca93f86eb0c927b66466507d2089939ac35341ed17540d57c