FAILURE MAP
← Case archive

FA-83956 / Sports scoring and tiebreakers / Open access

Table tennis game target is wrong · case 01

An 11-9 game is not recognized as finished.

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

ROOT CAUSE

The target comparison requires more than 11 points.

VERIFIED REPAIR

Use max(a, b) >= 11 with a two-point lead.

Unsuccessful approach: Using the legacy 21-point target is still wrong for this contract.

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 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: game target', ('ABABABABABABABABABABABABBB', 'B'), [12, 14, 'B', None]),
  ('regression: game target', ('ABBBBAABBBABBAAABBBBA', 'A'), [7, 11, 'B', None]),
  ('variant scenario 1', ('AAABABBABABBAB', 'A'), [7, 7, None, 'B']),
  ('variant scenario 2', ('ABABABABABABABABAB', 'A'), [9, 9, 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: game target', ('ABABAABABBAABBBABABBAA', 'B'), [9, 11, 'B', None]),
  ('variant scenario 1', ('ABBBB', 'B'), [1, 4, None, 'B']),
  ('variant scenario 2', ('BBBBBBBBBBA', 'B'), [1, 10, 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: game target', ('AABAABBABBBBBBBAAABA', 'B'), [8, 11, 'B', None]),
  ('variant scenario 1', ('AAAABAA', 'B'), [6, 1, None, 'A']),
  ('variant scenario 2', ('BAABABAABBABB', 'B'), [6, 7, 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: game target', ('ABABABABABABABABABABABBB', 'B'), [11, 13, 'B', None]),
  ('regression: game target', ('ABABABBBBBBBBABBBAABBBBAA', 'B'), [4, 11, 'B', None]),
  ('variant scenario 1', ('ABABABABABABABABABABA', 'B'), [11, 10, None, 'A']),
  ('variant scenario 2', ('ABABABABABABABABABAB', 'B'), [10, 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: game target', ('BABABBAABBBBBAAAABABAABAA', 'B'), [9, 11, 'B', None]),
  ('variant scenario 1', ('ABABABABABABABABABABB', 'B'), [10, 11, None, 'A']),
  ('variant scenario 2', ('ABABABABABABABABABAB', 'A'), [10, 10, 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, None, 'B'][11, 9, 'A', None]Failed
regression: game target[12, 14, 'B', None][12, 14, 'B', None]Passed
regression: game target[7, 12, 'B', None][7, 11, 'B', None]Failed
variant scenario 1[7, 7, None, 'B'][7, 7, None, 'B']Passed
variant scenario 2[9, 9, None, 'B'][9, 9, None, 'B']Passed

SHA-256 / 0c02426d4f556cd0315d69d148ce10fb2d5936782af5778f8684687b7016941f

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) >= 21 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: game target', ('ABABABABABABABABABABABABBB', 'B'), [12, 14, 'B', None]),
  ('regression: game target', ('ABBBBAABBBABBAAABBBBA', 'A'), [7, 11, 'B', None]),
  ('variant scenario 1', ('AAABABBABABBAB', 'A'), [7, 7, None, 'B']),
  ('variant scenario 2', ('ABABABABABABABABAB', 'A'), [9, 9, 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: game target', ('ABABAABABBAABBBABABBAA', 'B'), [9, 11, 'B', None]),
  ('variant scenario 1', ('ABBBB', 'B'), [1, 4, None, 'B']),
  ('variant scenario 2', ('BBBBBBBBBBA', 'B'), [1, 10, 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: game target', ('AABAABBABBBBBBBAAABA', 'B'), [8, 11, 'B', None]),
  ('variant scenario 1', ('AAAABAA', 'B'), [6, 1, None, 'A']),
  ('variant scenario 2', ('BAABABAABBABB', 'B'), [6, 7, 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: game target', ('ABABABABABABABABABABABBB', 'B'), [11, 13, 'B', None]),
  ('regression: game target', ('ABABABBBBBBBBABBBAABBBBAA', 'B'), [4, 11, 'B', None]),
  ('variant scenario 1', ('ABABABABABABABABABABA', 'B'), [11, 10, None, 'A']),
  ('variant scenario 2', ('ABABABABABABABABABAB', 'B'), [10, 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: game target', ('BABABBAABBBBBAAAABABAABAA', 'B'), [9, 11, 'B', None]),
  ('variant scenario 1', ('ABABABABABABABABABABB', 'B'), [10, 11, None, 'A']),
  ('variant scenario 2', ('ABABABABABABABABABAB', 'A'), [10, 10, 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, None, 'B'][11, 9, 'A', None]Failed
regression: game target[12, 14, None, 'B'][12, 14, 'B', None]Failed
regression: game target[8, 13, None, 'A'][7, 11, 'B', None]Failed
variant scenario 1[7, 7, None, 'B'][7, 7, None, 'B']Passed
variant scenario 2[9, 9, None, 'B'][9, 9, None, 'B']Passed

SHA-256 / 843f4c266402f544b89adc2f164dd3e597da1f705e091a5e666c05f1675424f1

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: game target', ('ABABABABABABABABABABABABBB', 'B'), [12, 14, 'B', None]),
  ('regression: game target', ('ABBBBAABBBABBAAABBBBA', 'A'), [7, 11, 'B', None]),
  ('variant scenario 1', ('AAABABBABABBAB', 'A'), [7, 7, None, 'B']),
  ('variant scenario 2', ('ABABABABABABABABAB', 'A'), [9, 9, 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: game target', ('ABABAABABBAABBBABABBAA', 'B'), [9, 11, 'B', None]),
  ('variant scenario 1', ('ABBBB', 'B'), [1, 4, None, 'B']),
  ('variant scenario 2', ('BBBBBBBBBBA', 'B'), [1, 10, 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: game target', ('AABAABBABBBBBBBAAABA', 'B'), [8, 11, 'B', None]),
  ('variant scenario 1', ('AAAABAA', 'B'), [6, 1, None, 'A']),
  ('variant scenario 2', ('BAABABAABBABB', 'B'), [6, 7, 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: game target', ('ABABABABABABABABABABABBB', 'B'), [11, 13, 'B', None]),
  ('regression: game target', ('ABABABBBBBBBBABBBAABBBBAA', 'B'), [4, 11, 'B', None]),
  ('variant scenario 1', ('ABABABABABABABABABABA', 'B'), [11, 10, None, 'A']),
  ('variant scenario 2', ('ABABABABABABABABABAB', 'B'), [10, 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: game target', ('BABABBAABBBBBAAAABABAABAA', 'B'), [9, 11, 'B', None]),
  ('variant scenario 1', ('ABABABABABABABABABABB', 'B'), [10, 11, None, 'A']),
  ('variant scenario 2', ('ABABABABABABABABABAB', 'A'), [10, 10, 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: game target[12, 14, 'B', None][12, 14, 'B', None]Passed
regression: game target[7, 11, 'B', None][7, 11, 'B', None]Passed
variant scenario 1[7, 7, None, 'B'][7, 7, None, 'B']Passed
variant scenario 2[9, 9, None, 'B'][9, 9, None, 'B']Passed

SHA-256 / ae047be6d682d3a858545e2eef419303f276cffe4097cfdf94c4d56430e1a0c1

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

Case digest / 3e48a6a1a559deb927d188307600c75ee192173a7aeffce49bd92420cdaffe80