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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| vertex case 0 | [3, 3] | [5, 3] | Failed |
| vertex case 1 | pass | pass | Passed |
| vertex case 2 | pass | pass | Passed |
| vertex case 3 | pass | pass | Passed |
| vertex case 4 | invalid | invalid | Passed |
| vertex case 5 | invalid | invalid | Passed |
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| vertex case 0 | [4, 3] | [5, 3] | Failed |
| vertex case 1 | pass | pass | Passed |
| vertex case 2 | pass | pass | Passed |
| vertex case 3 | pass | pass | Passed |
| vertex case 4 | invalid | invalid | Passed |
| vertex case 5 | invalid | invalid | Passed |
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| vertex case 0 | [5, 3] | [5, 3] | Passed |
| vertex case 1 | pass | pass | Passed |
| vertex case 2 | pass | pass | Passed |
| vertex case 3 | pass | pass | Passed |
| vertex case 4 | invalid | invalid | Passed |
| vertex case 5 | invalid | invalid | Passed |
| 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