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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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