FAILURE MAP
← Case archive

FA-83216 / Go territory scoring / Open access

A one-rank gap is given a one-stone handicap · case 01

Adjacent ranks receive a stone instead of a no-komi game.

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

ROOT CAUSE

The one-rank branch is missing.

VERIFIED REPAIR

One rank apart: weaker takes black with 0.5 komi and no stones.

Unsuccessful approach: Keeping full komi for the one-rank game gives no advantage to the weaker player.

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 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]
    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]], [['1k', '2k'], ['2k', 0, 5]], [['1k', '1d'], ['1k', 0, 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]], [['1d', '1k'], ['1k', 0, 5]], [['1d', '1k'], ['1k', 0, 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]], [['1k', '2k'], ['2k', 0, 5]], [['1k', '1d'], ['1k', 0, 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]], [['2d', '3d'], ['2d', 0, 5]], [['2d', '3d'], ['2d', 0, 5]]], [[['1k', '2k'], ['2k', 0, 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]], [['1k', '1d'], ['1k', 0, 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 fixtureActualExpectedOutcome
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 4invalidinvalidPassed
handicap case 5['10k', 5, 5]['10k', 5, 5]Passed
handicap case 6['2k', 1, 5]['2k', 0, 5]Failed
handicap case 7['1k', 1, 5]['1k', 0, 5]Failed

SHA-256 / 0ba35f98daea4403e2e9f9b60fc1c225f783d0ed0d905da5b9055334b12dfbb0

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
        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, 65]
    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]], [['1k', '2k'], ['2k', 0, 5]], [['1k', '1d'], ['1k', 0, 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]], [['1d', '1k'], ['1k', 0, 5]], [['1d', '1k'], ['1k', 0, 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]], [['1k', '2k'], ['2k', 0, 5]], [['1k', '1d'], ['1k', 0, 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]], [['2d', '3d'], ['2d', 0, 5]], [['2d', '3d'], ['2d', 0, 5]]], [[['1k', '2k'], ['2k', 0, 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]], [['1k', '1d'], ['1k', 0, 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 fixtureActualExpectedOutcome
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 4invalidinvalidPassed
handicap case 5['10k', 5, 5]['10k', 5, 5]Passed
handicap case 6['2k', 0, 65]['2k', 0, 5]Failed
handicap case 7['1k', 0, 65]['1k', 0, 5]Failed

SHA-256 / 59efd23227858eb95b5dc8a63c390ad6600e6f9870772520ecaa7a70683fd1ce

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]], [['1k', '2k'], ['2k', 0, 5]], [['1k', '1d'], ['1k', 0, 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]], [['1d', '1k'], ['1k', 0, 5]], [['1d', '1k'], ['1k', 0, 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]], [['1k', '2k'], ['2k', 0, 5]], [['1k', '1d'], ['1k', 0, 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]], [['2d', '3d'], ['2d', 0, 5]], [['2d', '3d'], ['2d', 0, 5]]], [[['1k', '2k'], ['2k', 0, 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]], [['1k', '1d'], ['1k', 0, 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 fixtureActualExpectedOutcome
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 4invalidinvalidPassed
handicap case 5['10k', 5, 5]['10k', 5, 5]Passed
handicap case 6['2k', 0, 5]['2k', 0, 5]Passed
handicap case 7['1k', 0, 5]['1k', 0, 5]Passed

SHA-256 / ef2baa8310e23680519c0ce005d7b933642d40fddce62277e3d55abe39e1b76d

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

Case digest / 0d626febd76c62c032f19ae24009ae20bd14361ceaf05400af2e4c9e94bbc213