FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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