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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| superko case 0 | legal | 1 | Failed |
| superko case 1 | 1 | legal | Failed |
| superko case 2 | 2 | 5 | Failed |
| superko case 3 | 1 | 1 | Passed |
| superko case 4 | 0 | 0 | Passed |
| superko case 5 | 0 | 0 | Passed |
| superko case 6 | legal | legal | Passed |
| superko case 7 | 5 | 2 | Failed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| superko case 0 | legal | 1 | Failed |
| superko case 1 | legal | legal | Passed |
| superko case 2 | 5 | 5 | Passed |
| superko case 3 | 1 | 1 | Passed |
| superko case 4 | 0 | 0 | Passed |
| superko case 5 | 0 | 0 | Passed |
| superko case 6 | legal | legal | Passed |
| superko case 7 | 5 | 2 | Failed |
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