FAILURE MAP
← Case archive

FA-84231 / Sports scoring and tiebreakers / Open access

Blank end passes the hammer · case 01

After a blank end the other team is given the hammer.

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

ROOT CAUSE

The blank-end branch toggles the hammer.

VERIFIED REPAIR

Keep the hammer after a blank end.

Unsuccessful approach: Keeping the hammer only for an empty house still toggles it after a measured tie.

Case contract

Curling end result. stones rows are [team, distance_mm] from the button to the stone centre; a stone counts only if it touches the house: distance <= 1830 + 145 (house radius plus stone radius). The team with the closest counting stone scores one point for each of its counting stones strictly closer than the opponent's closest counting stone (all its counting stones if the opponent has none). If no stone counts, or the two closest counting stones of different teams are at the same distance, the end is blank and the hammer stays. After a score the hammer goes to the team that did not score. Return [scoring team or None, points, hammer for next end].

Why this case matters

Curling scoreboards compute end scores and hammer possession from measured stone positions.

1 / The failure

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

N = 1
observations = []
def solve(stones, hammer):
    inside = sorted((d, t) for t, d in stones if d <= 1830 + 145)
    tie = bool(inside) and any(d == inside[0][0] and t != inside[0][1] for d, t in inside)
    if not inside or tie:
        return [None, 0, 'B' if hammer == 'A' else 'A']
    best_d, team = inside[0]
    opp = [d for d, t in inside if t != team]
    limit = min(opp) if opp else None
    points = sum(1 for d, t in inside if t == team and (limit is None or d < limit))
    nxt = 'B' if team == 'A' else 'A'
    return [team, points, nxt]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
def run(args):
    try:
        return solve(*args)
    except Exception as exc:
        return 'raised ' + type(exc).__name__
cases = [[('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'B'), [None, 0, 'B']),
  ('regression: blank end hammer',
   ([['B', 692], ['B', 1576], ['A', 1452], ['B', 1818], ['A', 1841], ['A', 692]], 'A'),
   [None, 0, 'A']),
  ('variant scenario 1',
   ([['B', 343],
     ['A', 945],
     ['B', 1884],
     ['B', 851],
     ['B', 495],
     ['A', 267],
     ['B', 1922],
     ['B', 577]],
    'A'),
   ['A', 1, 'B']),
  ('variant scenario 2',
   ([['B', 99], ['A', 1540], ['B', 717], ['B', 1757], ['B', 384], ['A', 1770]], 'A'),
   ['B', 3, 'A'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'B'), [None, 0, 'B']),
  ('regression: blank end hammer', ([['B', 1623], ['A', 1623]], 'B'), [None, 0, 'B']),
  ('variant scenario 1',
   ([['A', 309],
     ['B', 1239],
     ['A', 1835],
     ['B', 1945],
     ['A', 1934],
     ['B', 1837],
     ['B', 58],
     ['A', 1212]],
    'B'),
   ['B', 1, 'A']),
  ('variant scenario 2',
   ([['A', 457], ['B', 1891], ['A', 1820], ['B', 245], ['A', 8], ['B', 2374], ['A', 1284]], 'B'),
   ['A', 1, 'B'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'B'), [None, 0, 'B']),
  ('regression: blank end hammer', ([['A', 313], ['B', 313]], 'B'), [None, 0, 'B']),
  ('variant scenario 1', ([['B', 554], ['A', 1888]], 'B'), ['B', 1, 'A']),
  ('variant scenario 2',
   ([['A', 330],
     ['B', 236],
     ['B', 2134],
     ['A', 231],
     ['A', 462],
     ['A', 339],
     ['A', 435],
     ['A', 56]],
    'A'),
   ['A', 2, 'B'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([['A', 443], ['A', 2079], ['B', 443]], 'A'), [None, 0, 'A']),
  ('variant scenario 1',
   ([['B', 2009], ['B', 1963], ['A', 1721], ['A', 1920], ['B', 1762], ['A', 1743]], 'A'),
   ['A', 2, 'B']),
  ('variant scenario 2',
   ([['B', 1886], ['B', 713], ['A', 2079], ['A', 545], ['A', 1886]], 'A'),
   ['A', 1, 'B'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([['A', 276], ['A', 1891], ['B', 276]], 'B'), [None, 0, 'B']),
  ('variant scenario 1', ([['B', 348], ['B', 1990]], 'B'), ['B', 1, 'A']),
  ('variant scenario 2',
   ([['A', 1789],
     ['B', 1136],
     ['B', 932],
     ['A', 1719],
     ['B', 2013],
     ['B', 543],
     ['A', 1850],
     ['B', 364]],
    'A'),
   ['B', 4, 'A'])]]
for label, args, expected in cases[N - 1]:
    check(label, run(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
control single shot['A', 1, 'B']['A', 1, 'B']Passed
boundary stone biting house edge['B', 1, 'A']['B', 1, 'A']Passed
boundary stone just outside[None, 0, 'B'][None, 0, 'A']Failed
control steal of two['B', 2, 'A']['B', 2, 'A']Passed
boundary measured tie[None, 0, 'A'][None, 0, 'B']Failed
control empty house[None, 0, 'B'][None, 0, 'A']Failed
regression: blank end hammer[None, 0, 'A'][None, 0, 'B']Failed
regression: blank end hammer[None, 0, 'B'][None, 0, 'A']Failed
variant scenario 1['A', 1, 'B']['A', 1, 'B']Passed
variant scenario 2['B', 3, 'A']['B', 3, 'A']Passed

SHA-256 / de4957e0983654704e35f454325b556a82f0632ee11c314628cbc571cb8d1cda

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(stones, hammer):
    inside = sorted((d, t) for t, d in stones if d <= 1830 + 145)
    tie = bool(inside) and any(d == inside[0][0] and t != inside[0][1] for d, t in inside)
    if not inside or tie:
        return [None, 0, hammer if not inside else ('B' if hammer == 'A' else 'A')]
    best_d, team = inside[0]
    opp = [d for d, t in inside if t != team]
    limit = min(opp) if opp else None
    points = sum(1 for d, t in inside if t == team and (limit is None or d < limit))
    nxt = 'B' if team == 'A' else 'A'
    return [team, points, nxt]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
def run(args):
    try:
        return solve(*args)
    except Exception as exc:
        return 'raised ' + type(exc).__name__
cases = [[('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'B'), [None, 0, 'B']),
  ('regression: blank end hammer',
   ([['B', 692], ['B', 1576], ['A', 1452], ['B', 1818], ['A', 1841], ['A', 692]], 'A'),
   [None, 0, 'A']),
  ('variant scenario 1',
   ([['B', 343],
     ['A', 945],
     ['B', 1884],
     ['B', 851],
     ['B', 495],
     ['A', 267],
     ['B', 1922],
     ['B', 577]],
    'A'),
   ['A', 1, 'B']),
  ('variant scenario 2',
   ([['B', 99], ['A', 1540], ['B', 717], ['B', 1757], ['B', 384], ['A', 1770]], 'A'),
   ['B', 3, 'A'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'B'), [None, 0, 'B']),
  ('regression: blank end hammer', ([['B', 1623], ['A', 1623]], 'B'), [None, 0, 'B']),
  ('variant scenario 1',
   ([['A', 309],
     ['B', 1239],
     ['A', 1835],
     ['B', 1945],
     ['A', 1934],
     ['B', 1837],
     ['B', 58],
     ['A', 1212]],
    'B'),
   ['B', 1, 'A']),
  ('variant scenario 2',
   ([['A', 457], ['B', 1891], ['A', 1820], ['B', 245], ['A', 8], ['B', 2374], ['A', 1284]], 'B'),
   ['A', 1, 'B'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'B'), [None, 0, 'B']),
  ('regression: blank end hammer', ([['A', 313], ['B', 313]], 'B'), [None, 0, 'B']),
  ('variant scenario 1', ([['B', 554], ['A', 1888]], 'B'), ['B', 1, 'A']),
  ('variant scenario 2',
   ([['A', 330],
     ['B', 236],
     ['B', 2134],
     ['A', 231],
     ['A', 462],
     ['A', 339],
     ['A', 435],
     ['A', 56]],
    'A'),
   ['A', 2, 'B'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([['A', 443], ['A', 2079], ['B', 443]], 'A'), [None, 0, 'A']),
  ('variant scenario 1',
   ([['B', 2009], ['B', 1963], ['A', 1721], ['A', 1920], ['B', 1762], ['A', 1743]], 'A'),
   ['A', 2, 'B']),
  ('variant scenario 2',
   ([['B', 1886], ['B', 713], ['A', 2079], ['A', 545], ['A', 1886]], 'A'),
   ['A', 1, 'B'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([['A', 276], ['A', 1891], ['B', 276]], 'B'), [None, 0, 'B']),
  ('variant scenario 1', ([['B', 348], ['B', 1990]], 'B'), ['B', 1, 'A']),
  ('variant scenario 2',
   ([['A', 1789],
     ['B', 1136],
     ['B', 932],
     ['A', 1719],
     ['B', 2013],
     ['B', 543],
     ['A', 1850],
     ['B', 364]],
    'A'),
   ['B', 4, 'A'])]]
for label, args, expected in cases[N - 1]:
    check(label, run(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
control single shot['A', 1, 'B']['A', 1, 'B']Passed
boundary stone biting house edge['B', 1, 'A']['B', 1, 'A']Passed
boundary stone just outside[None, 0, 'A'][None, 0, 'A']Passed
control steal of two['B', 2, 'A']['B', 2, 'A']Passed
boundary measured tie[None, 0, 'A'][None, 0, 'B']Failed
control empty house[None, 0, 'A'][None, 0, 'A']Passed
regression: blank end hammer[None, 0, 'B'][None, 0, 'B']Passed
regression: blank end hammer[None, 0, 'B'][None, 0, 'A']Failed
variant scenario 1['A', 1, 'B']['A', 1, 'B']Passed
variant scenario 2['B', 3, 'A']['B', 3, 'A']Passed

SHA-256 / fb64d0cdc938dd9c0c52568c29a0d2a64e9d795d806fdd09204d92c058a37693

3 / The verified repair

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

N = 1
observations = []
def solve(stones, hammer):
    inside = sorted((d, t) for t, d in stones if d <= 1830 + 145)
    tie = bool(inside) and any(d == inside[0][0] and t != inside[0][1] for d, t in inside)
    if not inside or tie:
        return [None, 0, hammer]
    best_d, team = inside[0]
    opp = [d for d, t in inside if t != team]
    limit = min(opp) if opp else None
    points = sum(1 for d, t in inside if t == team and (limit is None or d < limit))
    nxt = 'B' if team == 'A' else 'A'
    return [team, points, nxt]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
def run(args):
    try:
        return solve(*args)
    except Exception as exc:
        return 'raised ' + type(exc).__name__
cases = [[('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'B'), [None, 0, 'B']),
  ('regression: blank end hammer',
   ([['B', 692], ['B', 1576], ['A', 1452], ['B', 1818], ['A', 1841], ['A', 692]], 'A'),
   [None, 0, 'A']),
  ('variant scenario 1',
   ([['B', 343],
     ['A', 945],
     ['B', 1884],
     ['B', 851],
     ['B', 495],
     ['A', 267],
     ['B', 1922],
     ['B', 577]],
    'A'),
   ['A', 1, 'B']),
  ('variant scenario 2',
   ([['B', 99], ['A', 1540], ['B', 717], ['B', 1757], ['B', 384], ['A', 1770]], 'A'),
   ['B', 3, 'A'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'B'), [None, 0, 'B']),
  ('regression: blank end hammer', ([['B', 1623], ['A', 1623]], 'B'), [None, 0, 'B']),
  ('variant scenario 1',
   ([['A', 309],
     ['B', 1239],
     ['A', 1835],
     ['B', 1945],
     ['A', 1934],
     ['B', 1837],
     ['B', 58],
     ['A', 1212]],
    'B'),
   ['B', 1, 'A']),
  ('variant scenario 2',
   ([['A', 457], ['B', 1891], ['A', 1820], ['B', 245], ['A', 8], ['B', 2374], ['A', 1284]], 'B'),
   ['A', 1, 'B'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'B'), [None, 0, 'B']),
  ('regression: blank end hammer', ([['A', 313], ['B', 313]], 'B'), [None, 0, 'B']),
  ('variant scenario 1', ([['B', 554], ['A', 1888]], 'B'), ['B', 1, 'A']),
  ('variant scenario 2',
   ([['A', 330],
     ['B', 236],
     ['B', 2134],
     ['A', 231],
     ['A', 462],
     ['A', 339],
     ['A', 435],
     ['A', 56]],
    'A'),
   ['A', 2, 'B'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([['A', 443], ['A', 2079], ['B', 443]], 'A'), [None, 0, 'A']),
  ('variant scenario 1',
   ([['B', 2009], ['B', 1963], ['A', 1721], ['A', 1920], ['B', 1762], ['A', 1743]], 'A'),
   ['A', 2, 'B']),
  ('variant scenario 2',
   ([['B', 1886], ['B', 713], ['A', 2079], ['A', 545], ['A', 1886]], 'A'),
   ['A', 1, 'B'])],
 [('control single shot', ([['A', 100], ['B', 400]], 'A'), ['A', 1, 'B']),
  ('boundary stone biting house edge', ([['B', 1975]], 'A'), ['B', 1, 'A']),
  ('boundary stone just outside', ([['B', 1976]], 'A'), [None, 0, 'A']),
  ('control steal of two', ([['B', 50], ['B', 300], ['A', 500]], 'A'), ['B', 2, 'A']),
  ('boundary measured tie', ([['A', 200], ['B', 200]], 'B'), [None, 0, 'B']),
  ('control empty house', ([], 'A'), [None, 0, 'A']),
  ('regression: blank end hammer', ([['A', 276], ['A', 1891], ['B', 276]], 'B'), [None, 0, 'B']),
  ('variant scenario 1', ([['B', 348], ['B', 1990]], 'B'), ['B', 1, 'A']),
  ('variant scenario 2',
   ([['A', 1789],
     ['B', 1136],
     ['B', 932],
     ['A', 1719],
     ['B', 2013],
     ['B', 543],
     ['A', 1850],
     ['B', 364]],
    'A'),
   ['B', 4, 'A'])]]
for label, args, expected in cases[N - 1]:
    check(label, run(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
control single shot['A', 1, 'B']['A', 1, 'B']Passed
boundary stone biting house edge['B', 1, 'A']['B', 1, 'A']Passed
boundary stone just outside[None, 0, 'A'][None, 0, 'A']Passed
control steal of two['B', 2, 'A']['B', 2, 'A']Passed
boundary measured tie[None, 0, 'B'][None, 0, 'B']Passed
control empty house[None, 0, 'A'][None, 0, 'A']Passed
regression: blank end hammer[None, 0, 'B'][None, 0, 'B']Passed
regression: blank end hammer[None, 0, 'A'][None, 0, 'A']Passed
variant scenario 1['A', 1, 'B']['A', 1, 'B']Passed
variant scenario 2['B', 3, 'A']['B', 3, 'A']Passed

SHA-256 / b0ae3118336bd6f5b9c5c590ae775d280312407209f47a09ab4f349f0210ce7a

Verification & scope

Stipulated, bounded toy contract stated in the contract field; not a claim of conformance with any governing body rulebook or operator house rules. 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:29.043896+00:00.

Case digest / b532fcb7920c2db462d7b96502ddfdac3928e1740a091daad60a620184c66e93