FA-83841 / Sports scoring and tiebreakers / Open access
Tennis game ends on a one-point lead after deuce · case 01
After deuce the display jumps straight to a game instead of showing advantage.
ROOT CAUSE
The game-end test accepts any lead once a player has four points, so 4-3 closes the game.
VERIFIED REPAIR
Require a lead of at least two points together with the four-point minimum.
Unsuccessful approach: Requiring a lead greater than two points delays games that are won 4-2 or from advantage.
Case contract
points is a string of rally winners, each character A or B. A game ends at the first point where a player has at least 4 points and leads by at least 2; characters after that point are ignored. Return "game A"/"game B" when finished; otherwise "deuce" when both have at least 3 points and are level, "advantage A"/"advantage B" when both have at least 3 points and differ by one, else "S-R" using the labels 0, 15, 30, 40 in A-B order. A character other than A or B that is reached before the game ends returns "invalid point <c>".
Why this case matters
Live scoreboards and umpire tablets derive the displayed tennis game score from a raw rally log.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(points):
names = ['0', '15', '30', '40']
a = b = 0
for p in points:
if p == 'A':
a += 1
elif p == 'B':
b += 1
else:
return 'invalid point ' + p
if (a >= 4 or b >= 4) and abs(a - b) >= 1:
return 'game A' if a > b else 'game B'
if a >= 3 and b >= 3:
if a == b:
return 'deuce'
return 'advantage A' if a > b else 'advantage B'
return names[a] + '-' + names[b]
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 love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('ABABABB',), 'advantage B'),
('regression: game lead margin', ('AABBAA',), 'game A'),
('variant scenario 1', ('',), '0-0'),
('variant scenario 2', ('ABB',), '15-30')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('ABBABBAAA',), 'game B'),
('regression: game lead margin', ('ABAABBB',), 'advantage B'),
('variant scenario 1', ('BABAAAABB',), 'game A'),
('variant scenario 2', ('',), '0-0')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('BABABBAAA',), 'game B'),
('regression: game lead margin', ('BBAABAABABB',), 'advantage B'),
('variant scenario 1', ('ABABBBBAB',), 'game B'),
('variant scenario 2', ('BAAABB',), 'deuce')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('ABBBAABAAABBA',), 'game A'),
('variant scenario 1', ('AABBBBBABBABA',), 'game B'),
('variant scenario 2', ('AAABABABAAAAA',), 'game A')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('BBAAAABBBBBABAAC',), 'game A'),
('regression: game lead margin', ('BAAABBBAAAA',), 'game A'),
('variant scenario 1', ('BBABABBBBABx',), 'game B'),
('variant scenario 2', ('ABBAAABAABAAB',), 'game 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 love-thirty | 0-30 | 0-30 | Passed |
| boundary first deuce | deuce | deuce | Passed |
| boundary advantage after deuce | game B | advantage B | Failed |
| control straight game | game A | game A | Passed |
| boundary win from advantage | game A | game A | Passed |
| control empty log | 0-0 | 0-0 | Passed |
| regression: game lead margin | game B | advantage B | Failed |
| regression: game lead margin | game A | game A | Passed |
| variant scenario 1 | 0-0 | 0-0 | Passed |
| variant scenario 2 | 15-30 | 15-30 | Passed |
SHA-256 / 67a31406d3f02001a91148f2c6d132f48ef555bf2400be434722c50c1e51dc6d
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(points):
names = ['0', '15', '30', '40']
a = b = 0
for p in points:
if p == 'A':
a += 1
elif p == 'B':
b += 1
else:
return 'invalid point ' + p
if (a >= 4 or b >= 4) and abs(a - b) > 2:
return 'game A' if a > b else 'game B'
if a >= 3 and b >= 3:
if a == b:
return 'deuce'
return 'advantage A' if a > b else 'advantage B'
return names[a] + '-' + names[b]
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 love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('ABABABB',), 'advantage B'),
('regression: game lead margin', ('AABBAA',), 'game A'),
('variant scenario 1', ('',), '0-0'),
('variant scenario 2', ('ABB',), '15-30')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('ABBABBAAA',), 'game B'),
('regression: game lead margin', ('ABAABBB',), 'advantage B'),
('variant scenario 1', ('BABAAAABB',), 'game A'),
('variant scenario 2', ('',), '0-0')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('BABABBAAA',), 'game B'),
('regression: game lead margin', ('BBAABAABABB',), 'advantage B'),
('variant scenario 1', ('ABABBBBAB',), 'game B'),
('variant scenario 2', ('BAAABB',), 'deuce')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('ABBBAABAAABBA',), 'game A'),
('variant scenario 1', ('AABBBBBABBABA',), 'game B'),
('variant scenario 2', ('AAABABABAAAAA',), 'game A')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('BBAAAABBBBBABAAC',), 'game A'),
('regression: game lead margin', ('BAAABBBAAAA',), 'game A'),
('variant scenario 1', ('BBABABBBBABx',), 'game B'),
('variant scenario 2', ('ABBAAABAABAAB',), 'game 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 love-thirty | 0-30 | 0-30 | Passed |
| boundary first deuce | deuce | deuce | Passed |
| boundary advantage after deuce | advantage B | advantage B | Passed |
| control straight game | game A | game A | Passed |
| boundary win from advantage | advantage A | game A | Failed |
| control empty log | 0-0 | 0-0 | Passed |
| regression: game lead margin | advantage B | advantage B | Passed |
| regression: game lead margin | raised IndexError | game A | Failed |
| variant scenario 1 | 0-0 | 0-0 | Passed |
| variant scenario 2 | 15-30 | 15-30 | Passed |
SHA-256 / e87dce0590a639a957eb57645f4050634d4e21ff1bfde7535a8adcaaefa5b8c3
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(points):
names = ['0', '15', '30', '40']
a = b = 0
for p in points:
if p == 'A':
a += 1
elif p == 'B':
b += 1
else:
return 'invalid point ' + p
if (a >= 4 or b >= 4) and abs(a - b) >= 2:
return 'game A' if a > b else 'game B'
if a >= 3 and b >= 3:
if a == b:
return 'deuce'
return 'advantage A' if a > b else 'advantage B'
return names[a] + '-' + names[b]
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 love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('ABABABB',), 'advantage B'),
('regression: game lead margin', ('AABBAA',), 'game A'),
('variant scenario 1', ('',), '0-0'),
('variant scenario 2', ('ABB',), '15-30')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('ABBABBAAA',), 'game B'),
('regression: game lead margin', ('ABAABBB',), 'advantage B'),
('variant scenario 1', ('BABAAAABB',), 'game A'),
('variant scenario 2', ('',), '0-0')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('BABABBAAA',), 'game B'),
('regression: game lead margin', ('BBAABAABABB',), 'advantage B'),
('variant scenario 1', ('ABABBBBAB',), 'game B'),
('variant scenario 2', ('BAAABB',), 'deuce')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('ABBBAABAAABBA',), 'game A'),
('variant scenario 1', ('AABBBBBABBABA',), 'game B'),
('variant scenario 2', ('AAABABABAAAAA',), 'game A')],
[('control love-thirty', ('BB',), '0-30'),
('boundary first deuce', ('AABBAB',), 'deuce'),
('boundary advantage after deuce', ('AAABBBB',), 'advantage B'),
('control straight game', ('AAAA',), 'game A'),
('boundary win from advantage', ('ABABABAA',), 'game A'),
('control empty log', ('',), '0-0'),
('regression: game lead margin', ('BBAAAABBBBBABAAC',), 'game A'),
('regression: game lead margin', ('BAAABBBAAAA',), 'game A'),
('variant scenario 1', ('BBABABBBBABx',), 'game B'),
('variant scenario 2', ('ABBAAABAABAAB',), 'game 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 love-thirty | 0-30 | 0-30 | Passed |
| boundary first deuce | deuce | deuce | Passed |
| boundary advantage after deuce | advantage B | advantage B | Passed |
| control straight game | game A | game A | Passed |
| boundary win from advantage | game A | game A | Passed |
| control empty log | 0-0 | 0-0 | Passed |
| regression: game lead margin | advantage B | advantage B | Passed |
| regression: game lead margin | game A | game A | Passed |
| variant scenario 1 | 0-0 | 0-0 | Passed |
| variant scenario 2 | 15-30 | 15-30 | Passed |
SHA-256 / f017494eddaa2462880e12ec1d05b73e45d9b2baf708f7d9cd9eb030622365db
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:25.260564+00:00.
Case digest / c9faa15f4fbad8438d4f6c20a10bd50b2c8818d4e2e133fdc440f1ff55f45db7