FA-83286 / Go territory scoring / Open access
Proposals listing the same stones in a different order disagree · case 01
Players who marked the same stones in a different order are sent back to dispute.
ROOT CAUSE
The raw lists are compared instead of point sets.
VERIFIED REPAIR
Compare distinct point sets.
Unsuccessful approach: Sorting the lists still treats duplicate marks as a difference.
Case contract
Input [black_proposal, white_proposal] as lists of points (any order, duplicates allowed). Equal point sets -> ["agree", sorted points]; otherwise ["dispute", sorted symmetric difference].
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):
pb, pw = x
sb = {tuple(p) for p in pb}
sw = {tuple(p) for p in pw}
if pb == pw:
return ['agree', sorted(list(p) for p in sb)]
return ['dispute', sorted(list(p) for p in sb ^ sw)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[2, 0]], [[2, 0], [2, 0]]], ['agree', [[2, 0]]]], [[[], []], ['agree', []]], [[[], [[0, 3]]], ['dispute', [[0, 3]]]], [[[[2, 2], [0, 0], [3, 3]], [[0, 0], [3, 3], [2, 2]]], ['agree', [[0, 0], [2, 2], [3, 3]]]], [[[[2, 3], [1, 1], [3, 3], [2, 2]], [[2, 3], [1, 1], [3, 3], [2, 2], [2, 3]]], ['agree', [[1, 1], [2, 2], [2, 3], [3, 3]]]], [[[[1, 3], [3, 1], [1, 3], [1, 1]], [[2, 3], [2, 0], [1, 2]]], ['dispute', [[1, 1], [1, 2], [1, 3], [2, 0], [2, 3], [3, 1]]]], [[[[3, 0]], [[3, 0]]], ['agree', [[3, 0]]]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]]], [[[[[2, 3], [1, 1], [1, 3]], [[2, 3], [1, 1], [1, 3], [2, 3]]], ['agree', [[1, 1], [1, 3], [2, 3]]]], [[[[3, 2], [3, 2], [3, 3], [1, 0]], [[3, 2], [0, 1]]], ['dispute', [[0, 1], [1, 0], [3, 3]]]], [[[[3, 3], [1, 3], [0, 3], [0, 0]], [[3, 3], [1, 3], [0, 3], [0, 0]]], ['agree', [[0, 0], [0, 3], [1, 3], [3, 3]]]], [[[[3, 2], [3, 3]], []], ['dispute', [[3, 2], [3, 3]]]], [[[[2, 2], [1, 3], [2, 2], [0, 0]], [[1, 0], [2, 1], [2, 2]]], ['dispute', [[0, 0], [1, 0], [1, 3], [2, 1]]]], [[[[2, 1], [0, 3]], [[0, 3], [2, 1]]], ['agree', [[0, 3], [2, 1]]]], [[[[2, 1], [2, 3], [0, 2], [3, 1]], [[2, 1], [2, 3], [0, 2], [3, 1], [2, 1]]], ['agree', [[0, 2], [2, 1], [2, 3], [3, 1]]]], [[[[3, 2], [2, 0], [3, 0], [1, 1]], [[3, 0], [2, 0], [3, 2], [1, 1], [3, 2]]], ['agree', [[1, 1], [2, 0], [3, 0], [3, 2]]]]], [[[[[2, 3], [1, 1], [3, 3], [2, 2]], [[2, 3], [1, 1], [3, 3], [2, 2], [2, 3]]], ['agree', [[1, 1], [2, 2], [2, 3], [3, 3]]]], [[[[0, 2], [1, 3], [1, 1], [2, 1]], [[1, 1]]], ['dispute', [[0, 2], [1, 3], [2, 1]]]], [[[], []], ['agree', []]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]], [[[[1, 0], [0, 1]], [[1, 3]]], ['dispute', [[0, 1], [1, 0], [1, 3]]]], [[[[1, 1], [3, 0]], [[1, 1], [3, 0]]], ['agree', [[1, 1], [3, 0]]]], [[[], []], ['agree', []]], [[[[0, 2], [2, 3], [0, 1], [3, 1]], [[0, 2], [3, 1], [2, 3], [0, 1], [0, 2]]], ['agree', [[0, 1], [0, 2], [2, 3], [3, 1]]]]], [[[[[2, 3], [1, 1], [1, 3]], [[2, 3], [1, 1], [1, 3], [2, 3]]], ['agree', [[1, 1], [1, 3], [2, 3]]]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]], [[[[0, 2], [2, 1], [1, 0]], []], ['dispute', [[0, 2], [1, 0], [2, 1]]]], [[[], [[1, 0], [0, 0]]], ['dispute', [[0, 0], [1, 0]]]], [[[], [[3, 3], [0, 2]]], ['dispute', [[0, 2], [3, 3]]]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]], [[[[1, 1], [1, 3]], [[1, 1], [1, 3]]], ['agree', [[1, 1], [1, 3]]]], [[[[3, 3], [3, 1], [0, 2], [2, 0]], [[2, 2], [0, 1], [3, 3]]], ['dispute', [[0, 1], [0, 2], [2, 0], [2, 2], [3, 1]]]]], [[[[[3, 3], [3, 1], [0, 2], [2, 0]], [[2, 2], [0, 1], [3, 3]]], ['dispute', [[0, 1], [0, 2], [2, 0], [2, 2], [3, 1]]]], [[[[0, 2], [0, 1]], [[2, 0]]], ['dispute', [[0, 1], [0, 2], [2, 0]]]], [[[[0, 0], [3, 2]], [[3, 2], [0, 0], [0, 0]]], ['agree', [[0, 0], [3, 2]]]], [[[], []], ['agree', []]], [[[[1, 1], [3, 3], [0, 2]], [[3, 3], [0, 2], [1, 1]]], ['agree', [[0, 2], [1, 1], [3, 3]]]], [[[[0, 1]], [[0, 1]]], ['agree', [[0, 1]]]], [[[[2, 3], [2, 0], [2, 2]], [[2, 3], [1, 3], [1, 1], [2, 3]]], ['dispute', [[1, 1], [1, 3], [2, 0], [2, 2]]]], [[[[3, 1]], [[3, 1], [0, 3], [3, 0]]], ['dispute', [[0, 3], [3, 0]]]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("agreement 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 |
|---|---|---|---|
| agreement case 0 | ['dispute', []] | ['agree', [[2, 0]]] | Failed |
| agreement case 1 | ['agree', []] | ['agree', []] | Passed |
| agreement case 2 | ['dispute', [[0, 3]]] | ['dispute', [[0, 3]]] | Passed |
| agreement case 3 | ['dispute', []] | ['agree', [[0, 0], [2, 2], [3, 3]]] | Failed |
| agreement case 4 | ['dispute', []] | ['agree', [[1, 1], [2, 2], [2, 3], [3, 3]]] | Failed |
| agreement case 5 | ['dispute', [[1, 1], [1, 2], [1, 3], [2, 0], [2, 3], [3, 1]]] | ['dispute', [[1, 1], [1, 2], [1, 3], [2, 0], [2, 3], [3, 1]]] | Passed |
| agreement case 6 | ['agree', [[3, 0]]] | ['agree', [[3, 0]]] | Passed |
| agreement case 7 | ['dispute', []] | ['agree', [[3, 0]]] | Failed |
SHA-256 / 260e72ce0d94cc95e8d0ffe1f8d336a3f4a44e61bbd76ae9b964c9e19c652cc3
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
pb, pw = x
sb = {tuple(p) for p in pb}
sw = {tuple(p) for p in pw}
if sorted(pb) == sorted(pw):
return ['agree', sorted(list(p) for p in sb)]
return ['dispute', sorted(list(p) for p in sb ^ sw)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[2, 0]], [[2, 0], [2, 0]]], ['agree', [[2, 0]]]], [[[], []], ['agree', []]], [[[], [[0, 3]]], ['dispute', [[0, 3]]]], [[[[2, 2], [0, 0], [3, 3]], [[0, 0], [3, 3], [2, 2]]], ['agree', [[0, 0], [2, 2], [3, 3]]]], [[[[2, 3], [1, 1], [3, 3], [2, 2]], [[2, 3], [1, 1], [3, 3], [2, 2], [2, 3]]], ['agree', [[1, 1], [2, 2], [2, 3], [3, 3]]]], [[[[1, 3], [3, 1], [1, 3], [1, 1]], [[2, 3], [2, 0], [1, 2]]], ['dispute', [[1, 1], [1, 2], [1, 3], [2, 0], [2, 3], [3, 1]]]], [[[[3, 0]], [[3, 0]]], ['agree', [[3, 0]]]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]]], [[[[[2, 3], [1, 1], [1, 3]], [[2, 3], [1, 1], [1, 3], [2, 3]]], ['agree', [[1, 1], [1, 3], [2, 3]]]], [[[[3, 2], [3, 2], [3, 3], [1, 0]], [[3, 2], [0, 1]]], ['dispute', [[0, 1], [1, 0], [3, 3]]]], [[[[3, 3], [1, 3], [0, 3], [0, 0]], [[3, 3], [1, 3], [0, 3], [0, 0]]], ['agree', [[0, 0], [0, 3], [1, 3], [3, 3]]]], [[[[3, 2], [3, 3]], []], ['dispute', [[3, 2], [3, 3]]]], [[[[2, 2], [1, 3], [2, 2], [0, 0]], [[1, 0], [2, 1], [2, 2]]], ['dispute', [[0, 0], [1, 0], [1, 3], [2, 1]]]], [[[[2, 1], [0, 3]], [[0, 3], [2, 1]]], ['agree', [[0, 3], [2, 1]]]], [[[[2, 1], [2, 3], [0, 2], [3, 1]], [[2, 1], [2, 3], [0, 2], [3, 1], [2, 1]]], ['agree', [[0, 2], [2, 1], [2, 3], [3, 1]]]], [[[[3, 2], [2, 0], [3, 0], [1, 1]], [[3, 0], [2, 0], [3, 2], [1, 1], [3, 2]]], ['agree', [[1, 1], [2, 0], [3, 0], [3, 2]]]]], [[[[[2, 3], [1, 1], [3, 3], [2, 2]], [[2, 3], [1, 1], [3, 3], [2, 2], [2, 3]]], ['agree', [[1, 1], [2, 2], [2, 3], [3, 3]]]], [[[[0, 2], [1, 3], [1, 1], [2, 1]], [[1, 1]]], ['dispute', [[0, 2], [1, 3], [2, 1]]]], [[[], []], ['agree', []]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]], [[[[1, 0], [0, 1]], [[1, 3]]], ['dispute', [[0, 1], [1, 0], [1, 3]]]], [[[[1, 1], [3, 0]], [[1, 1], [3, 0]]], ['agree', [[1, 1], [3, 0]]]], [[[], []], ['agree', []]], [[[[0, 2], [2, 3], [0, 1], [3, 1]], [[0, 2], [3, 1], [2, 3], [0, 1], [0, 2]]], ['agree', [[0, 1], [0, 2], [2, 3], [3, 1]]]]], [[[[[2, 3], [1, 1], [1, 3]], [[2, 3], [1, 1], [1, 3], [2, 3]]], ['agree', [[1, 1], [1, 3], [2, 3]]]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]], [[[[0, 2], [2, 1], [1, 0]], []], ['dispute', [[0, 2], [1, 0], [2, 1]]]], [[[], [[1, 0], [0, 0]]], ['dispute', [[0, 0], [1, 0]]]], [[[], [[3, 3], [0, 2]]], ['dispute', [[0, 2], [3, 3]]]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]], [[[[1, 1], [1, 3]], [[1, 1], [1, 3]]], ['agree', [[1, 1], [1, 3]]]], [[[[3, 3], [3, 1], [0, 2], [2, 0]], [[2, 2], [0, 1], [3, 3]]], ['dispute', [[0, 1], [0, 2], [2, 0], [2, 2], [3, 1]]]]], [[[[[3, 3], [3, 1], [0, 2], [2, 0]], [[2, 2], [0, 1], [3, 3]]], ['dispute', [[0, 1], [0, 2], [2, 0], [2, 2], [3, 1]]]], [[[[0, 2], [0, 1]], [[2, 0]]], ['dispute', [[0, 1], [0, 2], [2, 0]]]], [[[[0, 0], [3, 2]], [[3, 2], [0, 0], [0, 0]]], ['agree', [[0, 0], [3, 2]]]], [[[], []], ['agree', []]], [[[[1, 1], [3, 3], [0, 2]], [[3, 3], [0, 2], [1, 1]]], ['agree', [[0, 2], [1, 1], [3, 3]]]], [[[[0, 1]], [[0, 1]]], ['agree', [[0, 1]]]], [[[[2, 3], [2, 0], [2, 2]], [[2, 3], [1, 3], [1, 1], [2, 3]]], ['dispute', [[1, 1], [1, 3], [2, 0], [2, 2]]]], [[[[3, 1]], [[3, 1], [0, 3], [3, 0]]], ['dispute', [[0, 3], [3, 0]]]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("agreement 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 |
|---|---|---|---|
| agreement case 0 | ['dispute', []] | ['agree', [[2, 0]]] | Failed |
| agreement case 1 | ['agree', []] | ['agree', []] | Passed |
| agreement case 2 | ['dispute', [[0, 3]]] | ['dispute', [[0, 3]]] | Passed |
| agreement case 3 | ['agree', [[0, 0], [2, 2], [3, 3]]] | ['agree', [[0, 0], [2, 2], [3, 3]]] | Passed |
| agreement case 4 | ['dispute', []] | ['agree', [[1, 1], [2, 2], [2, 3], [3, 3]]] | Failed |
| agreement case 5 | ['dispute', [[1, 1], [1, 2], [1, 3], [2, 0], [2, 3], [3, 1]]] | ['dispute', [[1, 1], [1, 2], [1, 3], [2, 0], [2, 3], [3, 1]]] | Passed |
| agreement case 6 | ['agree', [[3, 0]]] | ['agree', [[3, 0]]] | Passed |
| agreement case 7 | ['dispute', []] | ['agree', [[3, 0]]] | Failed |
SHA-256 / 675a86646c88810ed803fd547a17195b0eb0bede0f18bcf6b5fbb6bbc1ce852e
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
pb, pw = x
sb = {tuple(p) for p in pb}
sw = {tuple(p) for p in pw}
if sb == sw:
return ['agree', sorted(list(p) for p in sb)]
return ['dispute', sorted(list(p) for p in sb ^ sw)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[[2, 0]], [[2, 0], [2, 0]]], ['agree', [[2, 0]]]], [[[], []], ['agree', []]], [[[], [[0, 3]]], ['dispute', [[0, 3]]]], [[[[2, 2], [0, 0], [3, 3]], [[0, 0], [3, 3], [2, 2]]], ['agree', [[0, 0], [2, 2], [3, 3]]]], [[[[2, 3], [1, 1], [3, 3], [2, 2]], [[2, 3], [1, 1], [3, 3], [2, 2], [2, 3]]], ['agree', [[1, 1], [2, 2], [2, 3], [3, 3]]]], [[[[1, 3], [3, 1], [1, 3], [1, 1]], [[2, 3], [2, 0], [1, 2]]], ['dispute', [[1, 1], [1, 2], [1, 3], [2, 0], [2, 3], [3, 1]]]], [[[[3, 0]], [[3, 0]]], ['agree', [[3, 0]]]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]]], [[[[[2, 3], [1, 1], [1, 3]], [[2, 3], [1, 1], [1, 3], [2, 3]]], ['agree', [[1, 1], [1, 3], [2, 3]]]], [[[[3, 2], [3, 2], [3, 3], [1, 0]], [[3, 2], [0, 1]]], ['dispute', [[0, 1], [1, 0], [3, 3]]]], [[[[3, 3], [1, 3], [0, 3], [0, 0]], [[3, 3], [1, 3], [0, 3], [0, 0]]], ['agree', [[0, 0], [0, 3], [1, 3], [3, 3]]]], [[[[3, 2], [3, 3]], []], ['dispute', [[3, 2], [3, 3]]]], [[[[2, 2], [1, 3], [2, 2], [0, 0]], [[1, 0], [2, 1], [2, 2]]], ['dispute', [[0, 0], [1, 0], [1, 3], [2, 1]]]], [[[[2, 1], [0, 3]], [[0, 3], [2, 1]]], ['agree', [[0, 3], [2, 1]]]], [[[[2, 1], [2, 3], [0, 2], [3, 1]], [[2, 1], [2, 3], [0, 2], [3, 1], [2, 1]]], ['agree', [[0, 2], [2, 1], [2, 3], [3, 1]]]], [[[[3, 2], [2, 0], [3, 0], [1, 1]], [[3, 0], [2, 0], [3, 2], [1, 1], [3, 2]]], ['agree', [[1, 1], [2, 0], [3, 0], [3, 2]]]]], [[[[[2, 3], [1, 1], [3, 3], [2, 2]], [[2, 3], [1, 1], [3, 3], [2, 2], [2, 3]]], ['agree', [[1, 1], [2, 2], [2, 3], [3, 3]]]], [[[[0, 2], [1, 3], [1, 1], [2, 1]], [[1, 1]]], ['dispute', [[0, 2], [1, 3], [2, 1]]]], [[[], []], ['agree', []]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]], [[[[1, 0], [0, 1]], [[1, 3]]], ['dispute', [[0, 1], [1, 0], [1, 3]]]], [[[[1, 1], [3, 0]], [[1, 1], [3, 0]]], ['agree', [[1, 1], [3, 0]]]], [[[], []], ['agree', []]], [[[[0, 2], [2, 3], [0, 1], [3, 1]], [[0, 2], [3, 1], [2, 3], [0, 1], [0, 2]]], ['agree', [[0, 1], [0, 2], [2, 3], [3, 1]]]]], [[[[[2, 3], [1, 1], [1, 3]], [[2, 3], [1, 1], [1, 3], [2, 3]]], ['agree', [[1, 1], [1, 3], [2, 3]]]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]], [[[[0, 2], [2, 1], [1, 0]], []], ['dispute', [[0, 2], [1, 0], [2, 1]]]], [[[], [[1, 0], [0, 0]]], ['dispute', [[0, 0], [1, 0]]]], [[[], [[3, 3], [0, 2]]], ['dispute', [[0, 2], [3, 3]]]], [[[[3, 0]], [[3, 0], [3, 0]]], ['agree', [[3, 0]]]], [[[[1, 1], [1, 3]], [[1, 1], [1, 3]]], ['agree', [[1, 1], [1, 3]]]], [[[[3, 3], [3, 1], [0, 2], [2, 0]], [[2, 2], [0, 1], [3, 3]]], ['dispute', [[0, 1], [0, 2], [2, 0], [2, 2], [3, 1]]]]], [[[[[3, 3], [3, 1], [0, 2], [2, 0]], [[2, 2], [0, 1], [3, 3]]], ['dispute', [[0, 1], [0, 2], [2, 0], [2, 2], [3, 1]]]], [[[[0, 2], [0, 1]], [[2, 0]]], ['dispute', [[0, 1], [0, 2], [2, 0]]]], [[[[0, 0], [3, 2]], [[3, 2], [0, 0], [0, 0]]], ['agree', [[0, 0], [3, 2]]]], [[[], []], ['agree', []]], [[[[1, 1], [3, 3], [0, 2]], [[3, 3], [0, 2], [1, 1]]], ['agree', [[0, 2], [1, 1], [3, 3]]]], [[[[0, 1]], [[0, 1]]], ['agree', [[0, 1]]]], [[[[2, 3], [2, 0], [2, 2]], [[2, 3], [1, 3], [1, 1], [2, 3]]], ['dispute', [[1, 1], [1, 3], [2, 0], [2, 2]]]], [[[[3, 1]], [[3, 1], [0, 3], [3, 0]]], ['dispute', [[0, 3], [3, 0]]]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("agreement 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 |
|---|---|---|---|
| agreement case 0 | ['agree', [[2, 0]]] | ['agree', [[2, 0]]] | Passed |
| agreement case 1 | ['agree', []] | ['agree', []] | Passed |
| agreement case 2 | ['dispute', [[0, 3]]] | ['dispute', [[0, 3]]] | Passed |
| agreement case 3 | ['agree', [[0, 0], [2, 2], [3, 3]]] | ['agree', [[0, 0], [2, 2], [3, 3]]] | Passed |
| agreement case 4 | ['agree', [[1, 1], [2, 2], [2, 3], [3, 3]]] | ['agree', [[1, 1], [2, 2], [2, 3], [3, 3]]] | Passed |
| agreement case 5 | ['dispute', [[1, 1], [1, 2], [1, 3], [2, 0], [2, 3], [3, 1]]] | ['dispute', [[1, 1], [1, 2], [1, 3], [2, 0], [2, 3], [3, 1]]] | Passed |
| agreement case 6 | ['agree', [[3, 0]]] | ['agree', [[3, 0]]] | Passed |
| agreement case 7 | ['agree', [[3, 0]]] | ['agree', [[3, 0]]] | Passed |
SHA-256 / 2105952185f30c9bf07c205bcdbf29c9a3fb5d48f95103336b7cf4730ffd95e0
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:20.092311+00:00.
Case digest / f9ed8ba3b8b41ab71e141c9f1c8ca83338f977765d7d17b0c98526926639ce61