FA-83946 / Sports scoring and tiebreakers / Open access
Point-by-point service starts when only one player reaches ten · case 01
At 10-6 the server changes every point instead of every two points.
ROOT CAUSE
The deuce service rule is entered when either player has 10 points.
VERIFIED REPAIR
Only switch to point-by-point service when both players have at least 10 points.
Unsuccessful approach: Using a combined score of 18 points still switches service early at 10-8.
Case contract
One table tennis game to 11 with a two-point lead; later rallies are ignored. Service changes after every two points; once both players have at least 10 points it changes after every point. Return [a, b, winner, None] when finished, else [a, b, None, next server].
Why this case matters
Match software must show who serves next, especially after 10-10.
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
for r in rallies:
if r == 'A':
a += 1
else:
b += 1
if max(a, b) >= 11 and abs(a - b) >= 2:
return [a, b, r, None]
k = a + b
other = 'B' if first_server == 'A' else 'A'
if a >= 10 or b >= 10:
block = k - 10
else:
block = k // 2
return [a, b, None, first_server if block % 2 == 0 else other]
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 server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'B'), [9, 9, None, 'A']),
('regression: expedited deuce condition', ('ABBAAABABAABAABABB', 'A'), [10, 8, None, 'B']),
('variant scenario 1', ('BBBBAABBBBABBBBBBBAA', 'B'), [3, 11, 'B', None]),
('variant scenario 2', ('ABABABABABABABABABABABAB', 'A'), [12, 12, None, 'A'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'B'), [9, 9, None, 'A']),
('regression: expedited deuce condition', ('BAABABAAAAAAA', 'B'), [10, 3, None, 'B']),
('variant scenario 1', ('ABABABABABABABABABABAA', 'A'), [12, 10, 'A', None]),
('variant scenario 2', ('BABABAAA', 'B'), [5, 3, None, 'B'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'B'), [9, 9, None, 'A']),
('regression: expedited deuce condition', ('BBBBAAABBBBBB', 'B'), [3, 10, None, 'B']),
('variant scenario 1', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('variant scenario 2', ('BAB', 'A'), [1, 2, None, 'B'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABBAAABBAAAABBAB', 'A'), [10, 8, None, 'B']),
('variant scenario 1', ('ABBAAAAAAAABBBAAB', 'B'), [11, 5, 'A', None]),
('variant scenario 2', ('ABABABABABABABABABABA', 'A'), [11, 10, None, 'B'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'A'), [9, 9, None, 'B']),
('regression: expedited deuce condition', ('BABAAABBBBAAAABBAA', 'A'), [10, 8, None, 'B']),
('variant scenario 1', ('ABBAAAAABABABBABAABAAABBAABBAAAB', 'A'), [11, 7, 'A', None]),
('variant scenario 2', ('BBBBABAAABABA', 'A'), [6, 7, None, '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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| control opening server | [0, 0, None, 'A'] | [0, 0, None, 'A'] | Passed |
| boundary second point same server | [0, 1, None, 'A'] | [0, 1, None, 'A'] | Passed |
| boundary change after two points | [1, 1, None, 'B'] | [1, 1, None, 'B'] | Passed |
| boundary ten-all | [10, 10, None, 'A'] | [10, 10, None, 'A'] | Passed |
| boundary eleven-ten alternates each point | [11, 10, None, 'B'] | [11, 10, None, 'B'] | Passed |
| control eleven-nine | [11, 9, 'A', None] | [11, 9, 'A', None] | Passed |
| regression: expedited deuce condition | [9, 9, None, 'A'] | [9, 9, None, 'A'] | Passed |
| regression: expedited deuce condition | [10, 8, None, 'A'] | [10, 8, None, 'B'] | Failed |
| variant scenario 1 | [3, 11, 'B', None] | [3, 11, 'B', None] | Passed |
| variant scenario 2 | [12, 12, None, 'A'] | [12, 12, None, 'A'] | Passed |
SHA-256 / 6eac4f741e1852a91b59d98ac54d7b2b9e81e0267f1a94adcd58e9e87d15be38
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
for r in rallies:
if r == 'A':
a += 1
else:
b += 1
if max(a, b) >= 11 and abs(a - b) >= 2:
return [a, b, r, None]
k = a + b
other = 'B' if first_server == 'A' else 'A'
if a + b >= 18:
block = k - 10
else:
block = k // 2
return [a, b, None, first_server if block % 2 == 0 else other]
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 server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'B'), [9, 9, None, 'A']),
('regression: expedited deuce condition', ('ABBAAABABAABAABABB', 'A'), [10, 8, None, 'B']),
('variant scenario 1', ('BBBBAABBBBABBBBBBBAA', 'B'), [3, 11, 'B', None]),
('variant scenario 2', ('ABABABABABABABABABABABAB', 'A'), [12, 12, None, 'A'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'B'), [9, 9, None, 'A']),
('regression: expedited deuce condition', ('BAABABAAAAAAA', 'B'), [10, 3, None, 'B']),
('variant scenario 1', ('ABABABABABABABABABABAA', 'A'), [12, 10, 'A', None]),
('variant scenario 2', ('BABABAAA', 'B'), [5, 3, None, 'B'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'B'), [9, 9, None, 'A']),
('regression: expedited deuce condition', ('BBBBAAABBBBBB', 'B'), [3, 10, None, 'B']),
('variant scenario 1', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('variant scenario 2', ('BAB', 'A'), [1, 2, None, 'B'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABBAAABBAAAABBAB', 'A'), [10, 8, None, 'B']),
('variant scenario 1', ('ABBAAAAAAAABBBAAB', 'B'), [11, 5, 'A', None]),
('variant scenario 2', ('ABABABABABABABABABABA', 'A'), [11, 10, None, 'B'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'A'), [9, 9, None, 'B']),
('regression: expedited deuce condition', ('BABAAABBBBAAAABBAA', 'A'), [10, 8, None, 'B']),
('variant scenario 1', ('ABBAAAAABABABBABAABAAABBAABBAAAB', 'A'), [11, 7, 'A', None]),
('variant scenario 2', ('BBBBABAAABABA', 'A'), [6, 7, None, '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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| control opening server | [0, 0, None, 'A'] | [0, 0, None, 'A'] | Passed |
| boundary second point same server | [0, 1, None, 'A'] | [0, 1, None, 'A'] | Passed |
| boundary change after two points | [1, 1, None, 'B'] | [1, 1, None, 'B'] | Passed |
| boundary ten-all | [10, 10, None, 'A'] | [10, 10, None, 'A'] | Passed |
| boundary eleven-ten alternates each point | [11, 10, None, 'B'] | [11, 10, None, 'B'] | Passed |
| control eleven-nine | [11, 9, 'A', None] | [11, 9, 'A', None] | Passed |
| regression: expedited deuce condition | [9, 9, None, 'B'] | [9, 9, None, 'A'] | Failed |
| regression: expedited deuce condition | [10, 8, None, 'A'] | [10, 8, None, 'B'] | Failed |
| variant scenario 1 | [3, 11, 'B', None] | [3, 11, 'B', None] | Passed |
| variant scenario 2 | [12, 12, None, 'A'] | [12, 12, None, 'A'] | Passed |
SHA-256 / 6348ca464c3843056941505cc1cfb0f70c6d97dddf5ca37861531425d8779b99
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
for r in rallies:
if r == 'A':
a += 1
else:
b += 1
if max(a, b) >= 11 and abs(a - b) >= 2:
return [a, b, r, None]
k = a + b
other = 'B' if first_server == 'A' else 'A'
if a >= 10 and b >= 10:
block = k - 10
else:
block = k // 2
return [a, b, None, first_server if block % 2 == 0 else other]
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 server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'B'), [9, 9, None, 'A']),
('regression: expedited deuce condition', ('ABBAAABABAABAABABB', 'A'), [10, 8, None, 'B']),
('variant scenario 1', ('BBBBAABBBBABBBBBBBAA', 'B'), [3, 11, 'B', None]),
('variant scenario 2', ('ABABABABABABABABABABABAB', 'A'), [12, 12, None, 'A'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'B'), [9, 9, None, 'A']),
('regression: expedited deuce condition', ('BAABABAAAAAAA', 'B'), [10, 3, None, 'B']),
('variant scenario 1', ('ABABABABABABABABABABAA', 'A'), [12, 10, 'A', None]),
('variant scenario 2', ('BABABAAA', 'B'), [5, 3, None, 'B'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'B'), [9, 9, None, 'A']),
('regression: expedited deuce condition', ('BBBBAAABBBBBB', 'B'), [3, 10, None, 'B']),
('variant scenario 1', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('variant scenario 2', ('BAB', 'A'), [1, 2, None, 'B'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABBAAABBAAAABBAB', 'A'), [10, 8, None, 'B']),
('variant scenario 1', ('ABBAAAAAAAABBBAAB', 'B'), [11, 5, 'A', None]),
('variant scenario 2', ('ABABABABABABABABABABA', 'A'), [11, 10, None, 'B'])],
[('control opening server', ('', 'A'), [0, 0, None, 'A']),
('boundary second point same server', ('B', 'A'), [0, 1, None, 'A']),
('boundary change after two points', ('BA', 'A'), [1, 1, None, 'B']),
('boundary ten-all', ('ABABABABABABABABABAB', 'A'), [10, 10, None, 'A']),
('boundary eleven-ten alternates each point',
('ABABABABABABABABABABA', 'A'),
[11, 10, None, 'B']),
('control eleven-nine', ('AAAAAAAAABBBBBBBBBAA', 'B'), [11, 9, 'A', None]),
('regression: expedited deuce condition', ('ABABABABABABABABAB', 'A'), [9, 9, None, 'B']),
('regression: expedited deuce condition', ('BABAAABBBBAAAABBAA', 'A'), [10, 8, None, 'B']),
('variant scenario 1', ('ABBAAAAABABABBABAABAAABBAABBAAAB', 'A'), [11, 7, 'A', None]),
('variant scenario 2', ('BBBBABAAABABA', 'A'), [6, 7, None, '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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| control opening server | [0, 0, None, 'A'] | [0, 0, None, 'A'] | Passed |
| boundary second point same server | [0, 1, None, 'A'] | [0, 1, None, 'A'] | Passed |
| boundary change after two points | [1, 1, None, 'B'] | [1, 1, None, 'B'] | Passed |
| boundary ten-all | [10, 10, None, 'A'] | [10, 10, None, 'A'] | Passed |
| boundary eleven-ten alternates each point | [11, 10, None, 'B'] | [11, 10, None, 'B'] | Passed |
| control eleven-nine | [11, 9, 'A', None] | [11, 9, 'A', None] | Passed |
| regression: expedited deuce condition | [9, 9, None, 'A'] | [9, 9, None, 'A'] | Passed |
| regression: expedited deuce condition | [10, 8, None, 'B'] | [10, 8, None, 'B'] | Passed |
| variant scenario 1 | [3, 11, 'B', None] | [3, 11, 'B', None] | Passed |
| variant scenario 2 | [12, 12, None, 'A'] | [12, 12, None, 'A'] | Passed |
SHA-256 / 165f7d1397f2af9c1ca7b7e842efda7798b8b1b94b3dbd04d72971ee6192d247
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.377729+00:00.
Case digest / 125a01723e9596a13aa77f263a5de9c774dec65e26958e298c499b6f9f8b25a8