FAILURE MAP
← Case archive

FA-83936 / Sports scoring and tiebreakers / Open access

Service court chosen from the combined score · case 01

The server is sent to the wrong court when the scores have different parity.

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

ROOT CAUSE

The court parity uses the total of both scores instead of the server's own score.

VERIFIED REPAIR

Use the server's own score to pick the court.

Unsuccessful approach: Using the original first server's score is wrong once the serve changes hands.

Case contract

One badminton singles game. rallies is a string of rally winners (A/B). A game is won at 21 points with a two-point lead, or by the first player to 30 points (29-29 next point wins). The rally winner serves next. The server serves from the right court when the server's own score is even and from the left court when odd. Return [a, b, winner, None, None] when finished (later rallies ignored) or [a, b, None, next server, "right"/"left"].

Why this case matters

Umpire scoring pads show the service court and server after each rally.

1 / The failure

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

N = 1
observations = []
def solve(rallies, first_server):
    a = b = 0
    server = first_server
    for r in rallies:
        if r == 'A':
            a += 1
        else:
            b += 1
        server = r
        if (max(a, b) >= 21 and abs(a - b) >= 2) or max(a, b) == 30:
            return [a, b, r, None, None]
    own = a + b
    return [a, b, None, server, 'right' if own % 2 == 0 else 'left']
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 opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity', ('BABBAABBB', 'B'), [3, 6, None, 'B', 'right']),
  ('regression: service court parity',
   ('BABABABABBAAABABABAABBBAA', 'B'),
   [13, 12, None, 'A', 'left']),
  ('variant scenario 1',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABBB', 'A'),
   [26, 28, 'B', None, None]),
  ('variant scenario 2', ('AAABBBBBABBBAAABABABBBBBBABBBBBAAAB', 'A'), [10, 21, 'B', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity', ('AAABBBABAAA', 'B'), [7, 4, None, 'A', 'left']),
  ('regression: service court parity', ('BBAAABABABBB', 'A'), [5, 7, None, 'B', 'left']),
  ('variant scenario 1',
   ('ABABABABABABABABABABABABABABABABABABABABABABAA', 'A'),
   [24, 22, 'A', None, None]),
  ('variant scenario 2',
   ('AAABBBBAAAAABBBABBAAAAAABABBBABABBABBBBBABBAABA', 'B'),
   [19, 21, 'B', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity',
   ('BBBAAAAAAAAABAABBBBAABBBABBAAA', 'B'),
   [17, 13, None, 'A', 'left']),
  ('regression: service court parity',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABBAB', 'A'),
   [27, 28, None, 'B', 'right']),
  ('variant scenario 1', ('BBAABAABABABBAAAABAABBBB', 'A'), [12, 12, None, 'B', 'right']),
  ('variant scenario 2', ('BBABABAAAAAABAAAAAABABAAAABAABAA', 'A'), [21, 8, 'A', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity',
   ('ABAAABAAABBAABBAAABBABBAA', 'B'),
   [15, 10, None, 'A', 'left']),
  ('regression: service court parity',
   ('ABABABABABABABABABABABABABABABABABABABB', 'B'),
   [19, 20, None, 'B', 'right']),
  ('variant scenario 1',
   ('ABAAABABBAABBBBABAAABAABABBBAAAABBAABBBBAAABBAA', 'A'),
   [22, 20, 'A', None, None]),
  ('variant scenario 2',
   ('ABBABBBAABABBBBBBBBAABABABAAABBBBAABABBABABBAB', 'A'),
   [12, 21, 'B', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity', ('AAABABBBBBABAABAAB', 'B'), [9, 9, None, 'B', 'left']),
  ('regression: service court parity',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [26, 27, None, 'B', 'left']),
  ('variant scenario 1',
   ('BABBBAABBAABBAABAAAAABBBBBABBBBBABAABBABABBBABBBBABAABAABAABAABAAAAAAAABABBBAB', 'B'),
   [16, 21, 'B', None, None]),
  ('variant scenario 2',
   ('BAAABABBAAABABAAABABABABAABABABBABBAABABABBBBAAAABBB', 'B'),
   [21, 16, 'A', None, None])]]
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 opening serve[0, 0, None, 'B', 'right'][0, 0, None, 'B', 'right']Passed
control server wins odd point[1, 0, None, 'A', 'left'][1, 0, None, 'A', 'left']Passed
boundary receiver wins rally[1, 1, None, 'B', 'right'][1, 1, None, 'B', 'left']Failed
boundary game at 21-19[21, 19, 'A', None, None][21, 19, 'A', None, None]Passed
boundary cap at 30[29, 30, 'B', None, None][29, 30, 'B', None, None]Passed
control 20-all continues[20, 20, None, 'B', 'right'][20, 20, None, 'B', 'right']Passed
regression: service court parity[3, 6, None, 'B', 'left'][3, 6, None, 'B', 'right']Failed
regression: service court parity[13, 12, None, 'A', 'left'][13, 12, None, 'A', 'left']Passed
variant scenario 1[26, 28, 'B', None, None][26, 28, 'B', None, None]Passed
variant scenario 2[10, 21, 'B', None, None][10, 21, 'B', None, None]Passed

SHA-256 / 486888d4aafccc997429ddbdb3e75b1e4e66f990e01a3672b47eb05be72e119f

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(rallies, first_server):
    a = b = 0
    server = first_server
    for r in rallies:
        if r == 'A':
            a += 1
        else:
            b += 1
        server = r
        if (max(a, b) >= 21 and abs(a - b) >= 2) or max(a, b) == 30:
            return [a, b, r, None, None]
    own = a if first_server == 'A' else b
    return [a, b, None, server, 'right' if own % 2 == 0 else 'left']
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 opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity', ('BABBAABBB', 'B'), [3, 6, None, 'B', 'right']),
  ('regression: service court parity',
   ('BABABABABBAAABABABAABBBAA', 'B'),
   [13, 12, None, 'A', 'left']),
  ('variant scenario 1',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABBB', 'A'),
   [26, 28, 'B', None, None]),
  ('variant scenario 2', ('AAABBBBBABBBAAABABABBBBBBABBBBBAAAB', 'A'), [10, 21, 'B', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity', ('AAABBBABAAA', 'B'), [7, 4, None, 'A', 'left']),
  ('regression: service court parity', ('BBAAABABABBB', 'A'), [5, 7, None, 'B', 'left']),
  ('variant scenario 1',
   ('ABABABABABABABABABABABABABABABABABABABABABABAA', 'A'),
   [24, 22, 'A', None, None]),
  ('variant scenario 2',
   ('AAABBBBAAAAABBBABBAAAAAABABBBABABBABBBBBABBAABA', 'B'),
   [19, 21, 'B', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity',
   ('BBBAAAAAAAAABAABBBBAABBBABBAAA', 'B'),
   [17, 13, None, 'A', 'left']),
  ('regression: service court parity',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABBAB', 'A'),
   [27, 28, None, 'B', 'right']),
  ('variant scenario 1', ('BBAABAABABABBAAAABAABBBB', 'A'), [12, 12, None, 'B', 'right']),
  ('variant scenario 2', ('BBABABAAAAAABAAAAAABABAAAABAABAA', 'A'), [21, 8, 'A', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity',
   ('ABAAABAAABBAABBAAABBABBAA', 'B'),
   [15, 10, None, 'A', 'left']),
  ('regression: service court parity',
   ('ABABABABABABABABABABABABABABABABABABABB', 'B'),
   [19, 20, None, 'B', 'right']),
  ('variant scenario 1',
   ('ABAAABABBAABBBBABAAABAABABBBAAAABBAABBBBAAABBAA', 'A'),
   [22, 20, 'A', None, None]),
  ('variant scenario 2',
   ('ABBABBBAABABBBBBBBBAABABABAAABBBBAABABBABABBAB', 'A'),
   [12, 21, 'B', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity', ('AAABABBBBBABAABAAB', 'B'), [9, 9, None, 'B', 'left']),
  ('regression: service court parity',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [26, 27, None, 'B', 'left']),
  ('variant scenario 1',
   ('BABBBAABBAABBAABAAAAABBBBBABBBBBABAABBABABBBABBBBABAABAABAABAABAAAAAAAABABBBAB', 'B'),
   [16, 21, 'B', None, None]),
  ('variant scenario 2',
   ('BAAABABBAAABABAAABABABABAABABABBABBAABABABBBBAAAABBB', 'B'),
   [21, 16, 'A', None, None])]]
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 opening serve[0, 0, None, 'B', 'right'][0, 0, None, 'B', 'right']Passed
control server wins odd point[1, 0, None, 'A', 'left'][1, 0, None, 'A', 'left']Passed
boundary receiver wins rally[1, 1, None, 'B', 'left'][1, 1, None, 'B', 'left']Passed
boundary game at 21-19[21, 19, 'A', None, None][21, 19, 'A', None, None]Passed
boundary cap at 30[29, 30, 'B', None, None][29, 30, 'B', None, None]Passed
control 20-all continues[20, 20, None, 'B', 'right'][20, 20, None, 'B', 'right']Passed
regression: service court parity[3, 6, None, 'B', 'right'][3, 6, None, 'B', 'right']Passed
regression: service court parity[13, 12, None, 'A', 'right'][13, 12, None, 'A', 'left']Failed
variant scenario 1[26, 28, 'B', None, None][26, 28, 'B', None, None]Passed
variant scenario 2[10, 21, 'B', None, None][10, 21, 'B', None, None]Passed

SHA-256 / 6172fc3953b7d4a5a3fb00d3272821da98d97f9aaaadab3508e547ffac697ac2

3 / The verified repair

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

N = 1
observations = []
def solve(rallies, first_server):
    a = b = 0
    server = first_server
    for r in rallies:
        if r == 'A':
            a += 1
        else:
            b += 1
        server = r
        if (max(a, b) >= 21 and abs(a - b) >= 2) or max(a, b) == 30:
            return [a, b, r, None, None]
    own = a if server == 'A' else b
    return [a, b, None, server, 'right' if own % 2 == 0 else 'left']
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 opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity', ('BABBAABBB', 'B'), [3, 6, None, 'B', 'right']),
  ('regression: service court parity',
   ('BABABABABBAAABABABAABBBAA', 'B'),
   [13, 12, None, 'A', 'left']),
  ('variant scenario 1',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABBB', 'A'),
   [26, 28, 'B', None, None]),
  ('variant scenario 2', ('AAABBBBBABBBAAABABABBBBBBABBBBBAAAB', 'A'), [10, 21, 'B', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity', ('AAABBBABAAA', 'B'), [7, 4, None, 'A', 'left']),
  ('regression: service court parity', ('BBAAABABABBB', 'A'), [5, 7, None, 'B', 'left']),
  ('variant scenario 1',
   ('ABABABABABABABABABABABABABABABABABABABABABABAA', 'A'),
   [24, 22, 'A', None, None]),
  ('variant scenario 2',
   ('AAABBBBAAAAABBBABBAAAAAABABBBABABBABBBBBABBAABA', 'B'),
   [19, 21, 'B', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity',
   ('BBBAAAAAAAAABAABBBBAABBBABBAAA', 'B'),
   [17, 13, None, 'A', 'left']),
  ('regression: service court parity',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABBAB', 'A'),
   [27, 28, None, 'B', 'right']),
  ('variant scenario 1', ('BBAABAABABABBAAAABAABBBB', 'A'), [12, 12, None, 'B', 'right']),
  ('variant scenario 2', ('BBABABAAAAAABAAAAAABABAAAABAABAA', 'A'), [21, 8, 'A', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity',
   ('ABAAABAAABBAABBAAABBABBAA', 'B'),
   [15, 10, None, 'A', 'left']),
  ('regression: service court parity',
   ('ABABABABABABABABABABABABABABABABABABABB', 'B'),
   [19, 20, None, 'B', 'right']),
  ('variant scenario 1',
   ('ABAAABABBAABBBBABAAABAABABBBAAAABBAABBBBAAABBAA', 'A'),
   [22, 20, 'A', None, None]),
  ('variant scenario 2',
   ('ABBABBBAABABBBBBBBBAABABABAAABBBBAABABBABABBAB', 'A'),
   [12, 21, 'B', None, None])],
 [('control opening serve', ('', 'B'), [0, 0, None, 'B', 'right']),
  ('control server wins odd point', ('A', 'A'), [1, 0, None, 'A', 'left']),
  ('boundary receiver wins rally', ('AB', 'A'), [1, 1, None, 'B', 'left']),
  ('boundary game at 21-19',
   ('AAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBAA', 'A'),
   [21, 19, 'A', None, None]),
  ('boundary cap at 30',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [29, 30, 'B', None, None]),
  ('control 20-all continues',
   ('ABABABABABABABABABABABABABABABABABABABAB', 'A'),
   [20, 20, None, 'B', 'right']),
  ('regression: service court parity', ('AAABABBBBBABAABAAB', 'B'), [9, 9, None, 'B', 'left']),
  ('regression: service court parity',
   ('ABABABABABABABABABABABABABABABABABABABABABABABABABABB', 'A'),
   [26, 27, None, 'B', 'left']),
  ('variant scenario 1',
   ('BABBBAABBAABBAABAAAAABBBBBABBBBBABAABBABABBBABBBBABAABAABAABAABAAAAAAAABABBBAB', 'B'),
   [16, 21, 'B', None, None]),
  ('variant scenario 2',
   ('BAAABABBAAABABAAABABABABAABABABBABBAABABABBBBAAAABBB', 'B'),
   [21, 16, 'A', None, None])]]
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 opening serve[0, 0, None, 'B', 'right'][0, 0, None, 'B', 'right']Passed
control server wins odd point[1, 0, None, 'A', 'left'][1, 0, None, 'A', 'left']Passed
boundary receiver wins rally[1, 1, None, 'B', 'left'][1, 1, None, 'B', 'left']Passed
boundary game at 21-19[21, 19, 'A', None, None][21, 19, 'A', None, None]Passed
boundary cap at 30[29, 30, 'B', None, None][29, 30, 'B', None, None]Passed
control 20-all continues[20, 20, None, 'B', 'right'][20, 20, None, 'B', 'right']Passed
regression: service court parity[3, 6, None, 'B', 'right'][3, 6, None, 'B', 'right']Passed
regression: service court parity[13, 12, None, 'A', 'left'][13, 12, None, 'A', 'left']Passed
variant scenario 1[26, 28, 'B', None, None][26, 28, 'B', None, None]Passed
variant scenario 2[10, 21, 'B', None, None][10, 21, 'B', None, None]Passed

SHA-256 / 1df6b40fd3ee8ac4a59ffdf180f1ecaa27143c2e0356da1a236b2e06cb7fc54f

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

Case digest / d029dd4985a68c64dce4e7976865249eb4e289481984c0564e7831a29171c81f