FA-83201 / Go territory scoring / Open access
The 1k to 1d step is counted as two ranks · case 01
Games across the kyu/dan boundary get an extra handicap stone.
ROOT CAUSE
Kyu ranks map to -k, leaving a phantom rank zero.
VERIFIED REPAIR
Map Nk to 1-N and Nd to N.
Unsuccessful approach: Shifting dan ranks down by one maps 1k and 1d to the same value.
Case contract
Input [rank_a, rank_b] as Nk (1..30) or Nd (1..9); 1k and 1d are one rank apart. Equal ranks -> [rank_a, 0, 65]; one rank apart -> [weaker, 0, 5]; otherwise [weaker, min(diff, 9), 5]. Invalid ranks -> "invalid". The first element is the player taking black.
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):
def val(s):
if len(s) < 2 or not s[:-1].isdigit():
return None
k = int(s[:-1])
if s[-1] == 'k' and 1 <= k <= 30:
return -k
if s[-1] == 'd' and 1 <= k <= 9:
return k
return None
a, b = x
va, vb = val(a), val(b)
if va is None or vb is None:
return 'invalid'
diff = abs(va - vb)
weaker = a if va < vb else b
if diff == 0:
return [a, 0, 65]
if diff == 1:
return [weaker, 0, 5]
return [weaker, min(diff, 9), 5]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[['20k', '1d'], ['20k', 9, 5]], [['20k', '2d'], ['20k', 9, 5]], [['20k', '5d'], ['20k', 9, 5]], [['20k', '9d'], ['20k', 9, 5]], [['20k', '3p'], 'invalid'], [['10k', '5k'], ['10k', 5, 5]], [['3k', '2d'], ['3k', 4, 5]], [['1k', '9d'], ['1k', 9, 5]]], [[['10k', '8k'], ['10k', 2, 5]], [['10k', '6d'], ['10k', 9, 5]], [['5k', '1k'], ['5k', 4, 5]], [['5k', '0k'], 'invalid'], [['5k', 'k'], 'invalid'], [['3k', '2d'], ['3k', 4, 5]], [['2k', '1d'], ['2k', 2, 5]], [['5d', '3k'], ['3k', 7, 5]]], [[['3k', '5d'], ['3k', 7, 5]], [['3k', '9d'], ['3k', 9, 5]], [['3k', '0k'], 'invalid'], [['2k', '30k'], ['30k', 9, 5]], [['2k', '10k'], ['10k', 8, 5]], [['2k', '1d'], ['2k', 2, 5]], [['1d', '2k'], ['2k', 2, 5]], [['6d', '1k'], ['1k', 6, 5]]], [[['2k', '4k'], ['4k', 2, 5]], [['1k', '3k'], ['3k', 2, 5]], [['1k', '2k'], ['2k', 0, 5]], [['1k', '1k'], ['1k', 0, 65]], [['1k', '5d'], ['1k', 5, 5]], [['1k', '9d'], ['1k', 9, 5]], [['3d', '4k'], ['4k', 6, 5]], [['2k', '1d'], ['2k', 2, 5]]], [[['2k', '3d'], ['2k', 4, 5]], [['1d', '30k'], ['30k', 9, 5]], [['1d', '20k'], ['20k', 9, 5]], [['1d', '2k'], ['2k', 2, 5]], [['1d', '8k'], ['8k', 8, 5]], [['1d', '6d'], ['1d', 5, 5]], [['1d', '4k'], ['4k', 4, 5]], [['6d', '3k'], ['3k', 8, 5]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("handicap 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 |
|---|---|---|---|
| handicap case 0 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 1 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 2 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 3 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 4 | invalid | invalid | Passed |
| handicap case 5 | ['10k', 5, 5] | ['10k', 5, 5] | Passed |
| handicap case 6 | ['3k', 5, 5] | ['3k', 4, 5] | Failed |
| handicap case 7 | ['1k', 9, 5] | ['1k', 9, 5] | Passed |
SHA-256 / b1dd415bc300b6f53f8698853f75a4b9592b2175c89b3c6d69421600f9823cf2
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
def val(s):
if len(s) < 2 or not s[:-1].isdigit():
return None
k = int(s[:-1])
if s[-1] == 'k' and 1 <= k <= 30:
return 1 - k
if s[-1] == 'd' and 1 <= k <= 9:
return k - 1
return None
a, b = x
va, vb = val(a), val(b)
if va is None or vb is None:
return 'invalid'
diff = abs(va - vb)
weaker = a if va < vb else b
if diff == 0:
return [a, 0, 65]
if diff == 1:
return [weaker, 0, 5]
return [weaker, min(diff, 9), 5]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[['20k', '1d'], ['20k', 9, 5]], [['20k', '2d'], ['20k', 9, 5]], [['20k', '5d'], ['20k', 9, 5]], [['20k', '9d'], ['20k', 9, 5]], [['20k', '3p'], 'invalid'], [['10k', '5k'], ['10k', 5, 5]], [['3k', '2d'], ['3k', 4, 5]], [['1k', '9d'], ['1k', 9, 5]]], [[['10k', '8k'], ['10k', 2, 5]], [['10k', '6d'], ['10k', 9, 5]], [['5k', '1k'], ['5k', 4, 5]], [['5k', '0k'], 'invalid'], [['5k', 'k'], 'invalid'], [['3k', '2d'], ['3k', 4, 5]], [['2k', '1d'], ['2k', 2, 5]], [['5d', '3k'], ['3k', 7, 5]]], [[['3k', '5d'], ['3k', 7, 5]], [['3k', '9d'], ['3k', 9, 5]], [['3k', '0k'], 'invalid'], [['2k', '30k'], ['30k', 9, 5]], [['2k', '10k'], ['10k', 8, 5]], [['2k', '1d'], ['2k', 2, 5]], [['1d', '2k'], ['2k', 2, 5]], [['6d', '1k'], ['1k', 6, 5]]], [[['2k', '4k'], ['4k', 2, 5]], [['1k', '3k'], ['3k', 2, 5]], [['1k', '2k'], ['2k', 0, 5]], [['1k', '1k'], ['1k', 0, 65]], [['1k', '5d'], ['1k', 5, 5]], [['1k', '9d'], ['1k', 9, 5]], [['3d', '4k'], ['4k', 6, 5]], [['2k', '1d'], ['2k', 2, 5]]], [[['2k', '3d'], ['2k', 4, 5]], [['1d', '30k'], ['30k', 9, 5]], [['1d', '20k'], ['20k', 9, 5]], [['1d', '2k'], ['2k', 2, 5]], [['1d', '8k'], ['8k', 8, 5]], [['1d', '6d'], ['1d', 5, 5]], [['1d', '4k'], ['4k', 4, 5]], [['6d', '3k'], ['3k', 8, 5]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("handicap 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 |
|---|---|---|---|
| handicap case 0 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 1 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 2 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 3 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 4 | invalid | invalid | Passed |
| handicap case 5 | ['10k', 5, 5] | ['10k', 5, 5] | Passed |
| handicap case 6 | ['3k', 3, 5] | ['3k', 4, 5] | Failed |
| handicap case 7 | ['1k', 8, 5] | ['1k', 9, 5] | Failed |
SHA-256 / cfa666152fa0d7fe8179ff5828dd3d28a108ed8a76ef6ff6f28e8621a8865a2c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
def val(s):
if len(s) < 2 or not s[:-1].isdigit():
return None
k = int(s[:-1])
if s[-1] == 'k' and 1 <= k <= 30:
return 1 - k
if s[-1] == 'd' and 1 <= k <= 9:
return k
return None
a, b = x
va, vb = val(a), val(b)
if va is None or vb is None:
return 'invalid'
diff = abs(va - vb)
weaker = a if va < vb else b
if diff == 0:
return [a, 0, 65]
if diff == 1:
return [weaker, 0, 5]
return [weaker, min(diff, 9), 5]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[['20k', '1d'], ['20k', 9, 5]], [['20k', '2d'], ['20k', 9, 5]], [['20k', '5d'], ['20k', 9, 5]], [['20k', '9d'], ['20k', 9, 5]], [['20k', '3p'], 'invalid'], [['10k', '5k'], ['10k', 5, 5]], [['3k', '2d'], ['3k', 4, 5]], [['1k', '9d'], ['1k', 9, 5]]], [[['10k', '8k'], ['10k', 2, 5]], [['10k', '6d'], ['10k', 9, 5]], [['5k', '1k'], ['5k', 4, 5]], [['5k', '0k'], 'invalid'], [['5k', 'k'], 'invalid'], [['3k', '2d'], ['3k', 4, 5]], [['2k', '1d'], ['2k', 2, 5]], [['5d', '3k'], ['3k', 7, 5]]], [[['3k', '5d'], ['3k', 7, 5]], [['3k', '9d'], ['3k', 9, 5]], [['3k', '0k'], 'invalid'], [['2k', '30k'], ['30k', 9, 5]], [['2k', '10k'], ['10k', 8, 5]], [['2k', '1d'], ['2k', 2, 5]], [['1d', '2k'], ['2k', 2, 5]], [['6d', '1k'], ['1k', 6, 5]]], [[['2k', '4k'], ['4k', 2, 5]], [['1k', '3k'], ['3k', 2, 5]], [['1k', '2k'], ['2k', 0, 5]], [['1k', '1k'], ['1k', 0, 65]], [['1k', '5d'], ['1k', 5, 5]], [['1k', '9d'], ['1k', 9, 5]], [['3d', '4k'], ['4k', 6, 5]], [['2k', '1d'], ['2k', 2, 5]]], [[['2k', '3d'], ['2k', 4, 5]], [['1d', '30k'], ['30k', 9, 5]], [['1d', '20k'], ['20k', 9, 5]], [['1d', '2k'], ['2k', 2, 5]], [['1d', '8k'], ['8k', 8, 5]], [['1d', '6d'], ['1d', 5, 5]], [['1d', '4k'], ['4k', 4, 5]], [['6d', '3k'], ['3k', 8, 5]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("handicap 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 |
|---|---|---|---|
| handicap case 0 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 1 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 2 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 3 | ['20k', 9, 5] | ['20k', 9, 5] | Passed |
| handicap case 4 | invalid | invalid | Passed |
| handicap case 5 | ['10k', 5, 5] | ['10k', 5, 5] | Passed |
| handicap case 6 | ['3k', 4, 5] | ['3k', 4, 5] | Passed |
| handicap case 7 | ['1k', 9, 5] | ['1k', 9, 5] | Passed |
SHA-256 / 63470d326d5ee49489460180b14614178510be6c58a6b82702d701b6de09df2f
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:19.371561+00:00.
Case digest / ba158ab9d6a122ddb11147565c228f0944c803b12613cdb640d143eb793d3545