FAILURE MAP
← Case archive

FA-82926 / Go territory scoring / Open access

Situational superko ignores whose turn it is · case 01

Repeating a position with a different player to move is rejected in situational mode.

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

ROOT CAUSE

The player-to-move filter is attached to the positional branch.

THE FAILURE

The player-to-move filter is attached to the positional branch.

Unsuccessful approach: Applying the mover filter in both modes breaks positional superko instead.

Case contract

Input [history, candidate_board, player_to_move_after, mode]; history is a list of [board, player_to_move]. Positional mode forbids any earlier board equal to the candidate; situational mode additionally requires the same player to move. Return the earliest matching history index or "legal".

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):
    history, cand, mover, mode = x
    key = tuple(cand)
    for idx, (past, to_move) in enumerate(history):
        if tuple(past) != key:
            continue
        if mode == 'positional' and to_move != mover:
            continue
        return idx
    return 'legal'
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[['.B', '..'], 'W'], [['.B', 'WW'], 'W']], ['.B', 'WW'], 'B', 'positional'], 1], [[[[['B.', '..'], 'W'], [['.B', 'WB'], 'W'], [['WW', 'BW'], 'W']], ['.B', 'WB'], 'B', 'situational'], 'legal'], [[[[['.W', 'W.'], 'W'], [['BW', 'W.'], 'B'], [['.B', '..'], 'B'], [['.B', '.B'], 'B'], [['B.', 'WB'], 'W'], [['.B', '..'], 'W']], ['.B', '..'], 'W', 'situational'], 5], [[[[['W.', '.B'], 'B'], [['WB', 'WB'], 'W'], [['WB', 'WB'], 'W'], [['.B', 'BB'], 'B']], ['WB', 'WB'], 'W', 'situational'], 1], [[[[['BW', 'W.'], 'B'], [['W.', 'BB'], 'B']], ['BW', 'W.'], 'B', 'positional'], 0], [[[[['..', 'W.'], 'B'], [['.W', '..'], 'B'], [['B.', 'BW'], 'W']], ['..', 'W.'], 'B', 'positional'], 0], [[[[['...', '...', '.B.'], 'B'], [['.B.', '.BW', 'B.W'], 'B'], [['BW.', 'W.W', '.W.'], 'B']], ['B.W', '..B', 'W.W'], 'W', 'positional'], 'legal'], [[[[['B.', '..'], 'B'], [['.W', 'B.'], 'B'], [['WW', 'BB'], 'B'], [['..', '..'], 'B'], [['.W', '.W'], 'W'], [['WW', 'BB'], 'W'], [['..', '..'], 'B']], ['WW', 'BB'], 'W', 'positional'], 2]], [[[[[['BW.', 'B..', '..B'], 'B'], [['WW.', 'W.B', '...'], 'B'], [['B.W', 'W.B', '...'], 'B'], [['B.W', 'W.B', '...'], 'W'], [['..B', 'B..', 'BBB'], 'B']], ['B.W', 'W.B', '...'], 'W', 'positional'], 2], [[[[['.BW', '.BB', '..B'], 'B']], ['.BW', '.BB', '..B'], 'W', 'situational'], 'legal'], [[[[['B.', 'W.'], 'W'], [['..', '.B'], 'B'], [['W.', 'BW'], 'B'], [['BB', 'B.'], 'B']], ['..', '.B'], 'B', 'positional'], 1], [[[[['WB.', 'WB.', '.BB'], 'B'], [['BW.', 'B..', '.WB'], 'B'], [['..B', '..W', '...'], 'W'], [['..B', '..B', 'W..'], 'W']], ['BW.', 'B..', '.WB'], 'W', 'situational'], 'legal'], [[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['WW', 'W.'], 'W'], [['.W', '.W'], 'W'], [['..', 'B.'], 'B'], [['.W', '.W'], 'B'], [['W.', '..'], 'W'], [['..', 'WB'], 'W']], ['.W', '.W'], 'W', 'situational'], 1], [[[[['B.B', '.W.', 'WWB'], 'B'], [['..B', 'WB.', '.B.'], 'W'], [['.B.', 'W..', '.W.'], 'B'], [['.WW', '..B', 'BWW'], 'B'], [['.B.', '.B.', 'W.W'], 'B'], [['..B', 'WB.', '.B.'], 'W'], [['B.B', '.B.', '.BB'], 'B']], ['..B', 'WB.', '.B.'], 'W', 'situational'], 1], [[[[['BW', '.B'], 'B'], [['BW', 'BB'], 'B'], [['..', 'B.'], 'B'], [['.B', 'B.'], 'W'], [['..', '.B'], 'W'], [['W.', '.B'], 'B'], [['..', '.B'], 'B'], [['.B', '.B'], 'B']], ['..', '.B'], 'B', 'positional'], 4]], [[[[[['.W', 'WB'], 'B'], [['.W', '.W'], 'W'], [['.W', '.W'], 'B'], [['BB', '.B'], 'B'], [['.W', '.W'], 'B'], [['..', '..'], 'B']], ['.W', '.W'], 'B', 'situational'], 2], [[[[['WW.', '...', '..B'], 'B']], ['WW.', '...', '..B'], 'W', 'positional'], 0], [[[[['.BW', '...', '.W.'], 'B'], [['W..', '.B.', 'BBB'], 'B'], [['WWW', 'WBB', '.WW'], 'B'], [['BW.', '.W.', '.B.'], 'W'], [['BBW', 'WW.', '...'], 'B'], [['WWW', 'WBB', '.WW'], 'B'], [['B..', '...', 'B.B'], 'B']], ['WWW', 'WBB', '.WW'], 'B', 'positional'], 2], [[[[['..W', '.BW', 'W.W'], 'W'], [['W..', '.W.', '.W.'], 'W'], [['WWW', 'W.W', '...'], 'B'], [['WBB', 'WWB', 'B..'], 'W'], [['BB.', '.WB', '..B'], 'W'], [['W.W', 'B.B', '.B.'], 'B']], ['BBW', 'B..', 'B.W'], 'W', 'situational'], 'legal'], [[[[['B.B', 'WB.', '...'], 'W'], [['.W.', 'BWW', 'W..'], 'B']], ['B.B', 'WB.', '...'], 'B', 'situational'], 'legal'], [[[[['..', 'B.'], 'W'], [['.B', 'WB'], 'B'], [['..', '.W'], 'B'], [['..', '.W'], 'W'], [['.B', 'B.'], 'B']], ['..', '.W'], 'W', 'situational'], 3], [[[[['B..', '..B', 'W.B'], 'W']], ['B..', '..B', 'W.B'], 'W', 'positional'], 0], [[[[['...', '.W.', 'BWW'], 'B'], [['BWB', 'W.W', 'WBW'], 'B'], [['...', '...', '...'], 'B'], [['..W', '.WB', 'B..'], 'B'], [['WBW', 'WWB', 'WB.'], 'W']], ['...', '.W.', 'BWW'], 'W', 'positional'], 0]], [[[[[['WW.', '...', '..B'], 'B']], ['WW.', '...', '..B'], 'W', 'positional'], 0], [[[[['W.', '..'], 'B'], [['..', 'B.'], 'W'], [['.B', '.B'], 'B'], [['B.', 'BW'], 'W'], [['BB', '..'], 'W']], ['..', 'WW'], 'B', 'situational'], 'legal'], [[[[['WWW', '..B', 'B..'], 'B'], [['..W', 'W.B', '.B.'], 'B'], [['..B', '...', '.B.'], 'W']], ['..W', '..W', 'B.W'], 'W', 'positional'], 'legal'], [[[[['.B', 'B.'], 'B'], [['.B', 'B.'], 'B'], [['BW', '..'], 'B'], [['.B', 'B.'], 'B'], [['.B', 'BB'], 'B']], ['.B', 'B.'], 'B', 'situational'], 0], [[[[['W.', '.W'], 'B'], [['B.', '..'], 'B'], [['WB', '..'], 'B'], [['BW', '.W'], 'W']], ['BW', '.W'], 'B', 'positional'], 3], [[[[['B.W', 'W.W', 'B.W'], 'W'], [['BWB', '.BW', 'B..'], 'W'], [['..W', 'B..', 'B..'], 'B'], [['WWW', 'B.B', 'WW.'], 'W'], [['.BB', '.WB', '..B'], 'B']], ['BBB', '.W.', 'W.W'], 'B', 'positional'], 'legal'], [[[[['...', '.W.', 'BWW'], 'B'], [['BWB', 'W.W', 'WBW'], 'B'], [['...', '...', '...'], 'B'], [['..W', '.WB', 'B..'], 'B'], [['WBW', 'WWB', 'WB.'], 'W']], ['...', '.W.', 'BWW'], 'W', 'positional'], 0], [[[[['B.', '..'], 'W']], ['B.', '..'], 'B', 'positional'], 0]], [[[[[['WW.', '...', '..B'], 'B']], ['WW.', '...', '..B'], 'W', 'positional'], 0], [[[[['W.B', 'B..', '.BB'], 'W'], [['.BB', 'WB.', 'BB.'], 'W']], ['.BB', 'WB.', 'BB.'], 'B', 'situational'], 'legal'], [[[[['.B', 'B.'], 'W'], [['B.', 'W.'], 'W']], ['.B', 'B.'], 'B', 'situational'], 'legal'], [[[[['.W.', 'W..', 'B.W'], 'W'], [['WW.', '.W.', '...'], 'B'], [['.BB', '..W', 'WBW'], 'B'], [['.W.', 'BW.', 'BB.'], 'W']], ['WWW', '..W', 'WW.'], 'B', 'positional'], 'legal'], [[[[['..W', 'BBW', '.W.'], 'B'], [['..B', 'WBW', 'BW.'], 'W'], [['.B.', '..B', 'B..'], 'W']], ['..W', 'BBW', '.W.'], 'B', 'situational'], 0], [[[[['BW.', 'W.B', '...'], 'B'], [['W.B', '.B.', 'WWB'], 'W'], [['W..', '.BB', '..W'], 'W'], [['.W.', 'BWW', '...'], 'B'], [['...', '.B.', 'B..'], 'W']], ['BW.', 'W.B', '...'], 'B', 'situational'], 0], [[[[['BB.', 'BB.', 'WBB'], 'B'], [['..B', 'BW.', 'BBB'], 'W']], ['..B', 'BW.', 'BBB'], 'B', 'situational'], 'legal'], [[[[['.W', '.B'], 'B'], [['.B', '..'], 'W'], [['.B', '..'], 'W'], [['BB', '.B'], 'B']], ['.B', '..'], 'W', 'positional'], 1]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("superko 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
superko case 0legal1Failed
superko case 11legalFailed
superko case 225Failed
superko case 311Passed
superko case 400Passed
superko case 500Passed
superko case 6legallegalPassed
superko case 752Failed

SHA-256 / ff163223ddadd611cd3fe60f6dfcec30ec9551650d851e8c06ff046461896fd2

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    history, cand, mover, mode = x
    key = tuple(cand)
    for idx, (past, to_move) in enumerate(history):
        if tuple(past) != key:
            continue
        if to_move != mover:
            continue
        return idx
    return 'legal'
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[['.B', '..'], 'W'], [['.B', 'WW'], 'W']], ['.B', 'WW'], 'B', 'positional'], 1], [[[[['B.', '..'], 'W'], [['.B', 'WB'], 'W'], [['WW', 'BW'], 'W']], ['.B', 'WB'], 'B', 'situational'], 'legal'], [[[[['.W', 'W.'], 'W'], [['BW', 'W.'], 'B'], [['.B', '..'], 'B'], [['.B', '.B'], 'B'], [['B.', 'WB'], 'W'], [['.B', '..'], 'W']], ['.B', '..'], 'W', 'situational'], 5], [[[[['W.', '.B'], 'B'], [['WB', 'WB'], 'W'], [['WB', 'WB'], 'W'], [['.B', 'BB'], 'B']], ['WB', 'WB'], 'W', 'situational'], 1], [[[[['BW', 'W.'], 'B'], [['W.', 'BB'], 'B']], ['BW', 'W.'], 'B', 'positional'], 0], [[[[['..', 'W.'], 'B'], [['.W', '..'], 'B'], [['B.', 'BW'], 'W']], ['..', 'W.'], 'B', 'positional'], 0], [[[[['...', '...', '.B.'], 'B'], [['.B.', '.BW', 'B.W'], 'B'], [['BW.', 'W.W', '.W.'], 'B']], ['B.W', '..B', 'W.W'], 'W', 'positional'], 'legal'], [[[[['B.', '..'], 'B'], [['.W', 'B.'], 'B'], [['WW', 'BB'], 'B'], [['..', '..'], 'B'], [['.W', '.W'], 'W'], [['WW', 'BB'], 'W'], [['..', '..'], 'B']], ['WW', 'BB'], 'W', 'positional'], 2]], [[[[[['BW.', 'B..', '..B'], 'B'], [['WW.', 'W.B', '...'], 'B'], [['B.W', 'W.B', '...'], 'B'], [['B.W', 'W.B', '...'], 'W'], [['..B', 'B..', 'BBB'], 'B']], ['B.W', 'W.B', '...'], 'W', 'positional'], 2], [[[[['.BW', '.BB', '..B'], 'B']], ['.BW', '.BB', '..B'], 'W', 'situational'], 'legal'], [[[[['B.', 'W.'], 'W'], [['..', '.B'], 'B'], [['W.', 'BW'], 'B'], [['BB', 'B.'], 'B']], ['..', '.B'], 'B', 'positional'], 1], [[[[['WB.', 'WB.', '.BB'], 'B'], [['BW.', 'B..', '.WB'], 'B'], [['..B', '..W', '...'], 'W'], [['..B', '..B', 'W..'], 'W']], ['BW.', 'B..', '.WB'], 'W', 'situational'], 'legal'], [[[[['...', 'BW.', 'BBW'], 'B'], [['.W.', '..B', 'BBW'], 'B'], [['W.B', '.W.', '...'], 'B'], [['.WB', '.BW', '..W'], 'W'], [['...', 'W.B', 'W.B'], 'B']], ['.WW', '.W.', 'BW.'], 'B', 'positional'], 'legal'], [[[[['WW', 'W.'], 'W'], [['.W', '.W'], 'W'], [['..', 'B.'], 'B'], [['.W', '.W'], 'B'], [['W.', '..'], 'W'], [['..', 'WB'], 'W']], ['.W', '.W'], 'W', 'situational'], 1], [[[[['B.B', '.W.', 'WWB'], 'B'], [['..B', 'WB.', '.B.'], 'W'], [['.B.', 'W..', '.W.'], 'B'], [['.WW', '..B', 'BWW'], 'B'], [['.B.', '.B.', 'W.W'], 'B'], [['..B', 'WB.', '.B.'], 'W'], [['B.B', '.B.', '.BB'], 'B']], ['..B', 'WB.', '.B.'], 'W', 'situational'], 1], [[[[['BW', '.B'], 'B'], [['BW', 'BB'], 'B'], [['..', 'B.'], 'B'], [['.B', 'B.'], 'W'], [['..', '.B'], 'W'], [['W.', '.B'], 'B'], [['..', '.B'], 'B'], [['.B', '.B'], 'B']], ['..', '.B'], 'B', 'positional'], 4]], [[[[[['.W', 'WB'], 'B'], [['.W', '.W'], 'W'], [['.W', '.W'], 'B'], [['BB', '.B'], 'B'], [['.W', '.W'], 'B'], [['..', '..'], 'B']], ['.W', '.W'], 'B', 'situational'], 2], [[[[['WW.', '...', '..B'], 'B']], ['WW.', '...', '..B'], 'W', 'positional'], 0], [[[[['.BW', '...', '.W.'], 'B'], [['W..', '.B.', 'BBB'], 'B'], [['WWW', 'WBB', '.WW'], 'B'], [['BW.', '.W.', '.B.'], 'W'], [['BBW', 'WW.', '...'], 'B'], [['WWW', 'WBB', '.WW'], 'B'], [['B..', '...', 'B.B'], 'B']], ['WWW', 'WBB', '.WW'], 'B', 'positional'], 2], [[[[['..W', '.BW', 'W.W'], 'W'], [['W..', '.W.', '.W.'], 'W'], [['WWW', 'W.W', '...'], 'B'], [['WBB', 'WWB', 'B..'], 'W'], [['BB.', '.WB', '..B'], 'W'], [['W.W', 'B.B', '.B.'], 'B']], ['BBW', 'B..', 'B.W'], 'W', 'situational'], 'legal'], [[[[['B.B', 'WB.', '...'], 'W'], [['.W.', 'BWW', 'W..'], 'B']], ['B.B', 'WB.', '...'], 'B', 'situational'], 'legal'], [[[[['..', 'B.'], 'W'], [['.B', 'WB'], 'B'], [['..', '.W'], 'B'], [['..', '.W'], 'W'], [['.B', 'B.'], 'B']], ['..', '.W'], 'W', 'situational'], 3], [[[[['B..', '..B', 'W.B'], 'W']], ['B..', '..B', 'W.B'], 'W', 'positional'], 0], [[[[['...', '.W.', 'BWW'], 'B'], [['BWB', 'W.W', 'WBW'], 'B'], [['...', '...', '...'], 'B'], [['..W', '.WB', 'B..'], 'B'], [['WBW', 'WWB', 'WB.'], 'W']], ['...', '.W.', 'BWW'], 'W', 'positional'], 0]], [[[[[['WW.', '...', '..B'], 'B']], ['WW.', '...', '..B'], 'W', 'positional'], 0], [[[[['W.', '..'], 'B'], [['..', 'B.'], 'W'], [['.B', '.B'], 'B'], [['B.', 'BW'], 'W'], [['BB', '..'], 'W']], ['..', 'WW'], 'B', 'situational'], 'legal'], [[[[['WWW', '..B', 'B..'], 'B'], [['..W', 'W.B', '.B.'], 'B'], [['..B', '...', '.B.'], 'W']], ['..W', '..W', 'B.W'], 'W', 'positional'], 'legal'], [[[[['.B', 'B.'], 'B'], [['.B', 'B.'], 'B'], [['BW', '..'], 'B'], [['.B', 'B.'], 'B'], [['.B', 'BB'], 'B']], ['.B', 'B.'], 'B', 'situational'], 0], [[[[['W.', '.W'], 'B'], [['B.', '..'], 'B'], [['WB', '..'], 'B'], [['BW', '.W'], 'W']], ['BW', '.W'], 'B', 'positional'], 3], [[[[['B.W', 'W.W', 'B.W'], 'W'], [['BWB', '.BW', 'B..'], 'W'], [['..W', 'B..', 'B..'], 'B'], [['WWW', 'B.B', 'WW.'], 'W'], [['.BB', '.WB', '..B'], 'B']], ['BBB', '.W.', 'W.W'], 'B', 'positional'], 'legal'], [[[[['...', '.W.', 'BWW'], 'B'], [['BWB', 'W.W', 'WBW'], 'B'], [['...', '...', '...'], 'B'], [['..W', '.WB', 'B..'], 'B'], [['WBW', 'WWB', 'WB.'], 'W']], ['...', '.W.', 'BWW'], 'W', 'positional'], 0], [[[[['B.', '..'], 'W']], ['B.', '..'], 'B', 'positional'], 0]], [[[[[['WW.', '...', '..B'], 'B']], ['WW.', '...', '..B'], 'W', 'positional'], 0], [[[[['W.B', 'B..', '.BB'], 'W'], [['.BB', 'WB.', 'BB.'], 'W']], ['.BB', 'WB.', 'BB.'], 'B', 'situational'], 'legal'], [[[[['.B', 'B.'], 'W'], [['B.', 'W.'], 'W']], ['.B', 'B.'], 'B', 'situational'], 'legal'], [[[[['.W.', 'W..', 'B.W'], 'W'], [['WW.', '.W.', '...'], 'B'], [['.BB', '..W', 'WBW'], 'B'], [['.W.', 'BW.', 'BB.'], 'W']], ['WWW', '..W', 'WW.'], 'B', 'positional'], 'legal'], [[[[['..W', 'BBW', '.W.'], 'B'], [['..B', 'WBW', 'BW.'], 'W'], [['.B.', '..B', 'B..'], 'W']], ['..W', 'BBW', '.W.'], 'B', 'situational'], 0], [[[[['BW.', 'W.B', '...'], 'B'], [['W.B', '.B.', 'WWB'], 'W'], [['W..', '.BB', '..W'], 'W'], [['.W.', 'BWW', '...'], 'B'], [['...', '.B.', 'B..'], 'W']], ['BW.', 'W.B', '...'], 'B', 'situational'], 0], [[[[['BB.', 'BB.', 'WBB'], 'B'], [['..B', 'BW.', 'BBB'], 'W']], ['..B', 'BW.', 'BBB'], 'B', 'situational'], 'legal'], [[[[['.W', '.B'], 'B'], [['.B', '..'], 'W'], [['.B', '..'], 'W'], [['BB', '.B'], 'B']], ['.B', '..'], 'W', 'positional'], 1]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("superko 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
superko case 0legal1Failed
superko case 1legallegalPassed
superko case 255Passed
superko case 311Passed
superko case 400Passed
superko case 500Passed
superko case 6legallegalPassed
superko case 752Failed

SHA-256 / 26ca32af37727be77ed3c0f83c8455024d6b1060f1b7a7d1eb488051af785bca

HELD IN THE MEMBER ARCHIVE

The verified repair and its recorded checks are member-only.

This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.

Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.

Member access is invitation-based. Sign in with your invited account to inspect the repair.

Sign in to the archive ↗

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

Case digest / 3c4502c8817377c0b0517271756aa022b350d756006a837fd2ad41b9be27d36e