FAILURE MAP
← Case archive

FA-84186 / Sports scoring and tiebreakers / Open access

Closure notation reports the wrong holes figure · case 01

A 3&2 win is printed as "3&16" or "3&3".

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

ROOT CAUSE

The second number is the holes played instead of the holes remaining.

VERIFIED REPAIR

Print the holes remaining after the closing hole.

Unsuccessful approach: Counting the closing hole as still remaining is off by one.

Case contract

Eighteen-hole match play. holes is a string of hole results: A, B or H (halved). The match closes as soon as the lead exceeds the holes remaining: "X wins L&R" (L lead, R remaining), or "X wins L up" if it closes on the 18th. Later characters are ignored. After 18 holes level: "halved". Unfinished: "all square", "X dormie R" when the lead equals the holes remaining, otherwise "X L up".

Why this case matters

Ryder-Cup style boards and match-play brackets display closure notation like 3&2 and dormie.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(holes):
    lead = 0
    played = 0
    for h in holes:
        played += 1
        if h == 'A':
            lead += 1
        elif h == 'B':
            lead -= 1
        remaining = 18 - played
        if abs(lead) > remaining:
            side = 'A' if lead > 0 else 'B'
            if remaining == 0:
                return '%s wins %d up' % (side, abs(lead))
            return '%s wins %d&%d' % (side, abs(lead), played)
    if played == 18:
        return 'halved'
    remaining = 18 - played
    if lead == 0:
        return 'all square'
    side = 'A' if lead > 0 else 'B'
    if abs(lead) == remaining:
        return '%s dormie %d' % (side, remaining)
    return '%s %d up' % (side, abs(lead))
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 early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('ABHHAHBBAAABAABAAAH',), 'A wins 3&2'),
  ('variant scenario 1', ('AHAAAAAAB',), 'A 6 up'),
  ('variant scenario 2', ('AABBBHHBBBBABAA',), 'B dormie 3')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('BBAHHHHBHHABAHBHAAA',), 'A wins 1&-1'),
  ('variant scenario 1', ('HAAHHBBH',), 'all square'),
  ('variant scenario 2', ('BAABABHB',), 'B 1 up')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('AHAHHABAAHHAHBAAABAABB',), 'A wins 5&3'),
  ('variant scenario 1', ('ABABHAHA',), 'A 2 up'),
  ('variant scenario 2', ('HAHAHAAAAAAAAHAHHA',), 'A wins 8&7')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('HAAAABHBBAAAHBBHAHB',), 'A wins 3&1'),
  ('variant scenario 1', ('ABAHBHBAA',), 'A 1 up'),
  ('variant scenario 2', ('BBBAAHAAABBBABH',), 'B 1 up')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('ABHBHAAAAHAAA',), 'A wins 6&5'),
  ('variant scenario 1', ('BABHHBHAAAABAAABBHHB',), 'A wins 4&3'),
  ('variant scenario 2', ('AHBAAHBAHAAAABABAABAB',), 'A wins 6&5')]]
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 early leadA 2 upA 2 upPassed
boundary dormieA dormie 3A dormie 3Passed
boundary closure three and twoB wins 3&16B wins 3&2Failed
boundary one up at eighteenA wins 1 upA wins 1 upPassed
control halved matchhalvedhalvedPassed
control all squareall squareall squarePassed
regression: closure notationA wins 3&16A wins 3&2Failed
variant scenario 1A 6 upA 6 upPassed
variant scenario 2B dormie 3B dormie 3Passed

SHA-256 / 4450adaf7015ee5210747f6c975bc4e4011cdb57e3a69e13d311b0083927de7b

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(holes):
    lead = 0
    played = 0
    for h in holes:
        played += 1
        if h == 'A':
            lead += 1
        elif h == 'B':
            lead -= 1
        remaining = 18 - played
        if abs(lead) > remaining:
            side = 'A' if lead > 0 else 'B'
            if remaining == 0:
                return '%s wins %d up' % (side, abs(lead))
            return '%s wins %d&%d' % (side, abs(lead), remaining + 1)
    if played == 18:
        return 'halved'
    remaining = 18 - played
    if lead == 0:
        return 'all square'
    side = 'A' if lead > 0 else 'B'
    if abs(lead) == remaining:
        return '%s dormie %d' % (side, remaining)
    return '%s %d up' % (side, abs(lead))
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 early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('ABHHAHBBAAABAABAAAH',), 'A wins 3&2'),
  ('variant scenario 1', ('AHAAAAAAB',), 'A 6 up'),
  ('variant scenario 2', ('AABBBHHBBBBABAA',), 'B dormie 3')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('BBAHHHHBHHABAHBHAAA',), 'A wins 1&-1'),
  ('variant scenario 1', ('HAAHHBBH',), 'all square'),
  ('variant scenario 2', ('BAABABHB',), 'B 1 up')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('AHAHHABAAHHAHBAAABAABB',), 'A wins 5&3'),
  ('variant scenario 1', ('ABABHAHA',), 'A 2 up'),
  ('variant scenario 2', ('HAHAHAAAAAAAAHAHHA',), 'A wins 8&7')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('HAAAABHBBAAAHBBHAHB',), 'A wins 3&1'),
  ('variant scenario 1', ('ABAHBHBAA',), 'A 1 up'),
  ('variant scenario 2', ('BBBAAHAAABBBABH',), 'B 1 up')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('ABHBHAAAAHAAA',), 'A wins 6&5'),
  ('variant scenario 1', ('BABHHBHAAAABAAABBHHB',), 'A wins 4&3'),
  ('variant scenario 2', ('AHBAAHBAHAAAABABAABAB',), 'A wins 6&5')]]
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 early leadA 2 upA 2 upPassed
boundary dormieA dormie 3A dormie 3Passed
boundary closure three and twoB wins 3&3B wins 3&2Failed
boundary one up at eighteenA wins 1 upA wins 1 upPassed
control halved matchhalvedhalvedPassed
control all squareall squareall squarePassed
regression: closure notationA wins 3&3A wins 3&2Failed
variant scenario 1A 6 upA 6 upPassed
variant scenario 2B dormie 3B dormie 3Passed

SHA-256 / 60ef7a2d60167e37b550418c2fe8a391c08e669b2d3326fba4d8a0a8fa6d25cd

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(holes):
    lead = 0
    played = 0
    for h in holes:
        played += 1
        if h == 'A':
            lead += 1
        elif h == 'B':
            lead -= 1
        remaining = 18 - played
        if abs(lead) > remaining:
            side = 'A' if lead > 0 else 'B'
            if remaining == 0:
                return '%s wins %d up' % (side, abs(lead))
            return '%s wins %d&%d' % (side, abs(lead), remaining)
    if played == 18:
        return 'halved'
    remaining = 18 - played
    if lead == 0:
        return 'all square'
    side = 'A' if lead > 0 else 'B'
    if abs(lead) == remaining:
        return '%s dormie %d' % (side, remaining)
    return '%s %d up' % (side, abs(lead))
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 early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('ABHHAHBBAAABAABAAAH',), 'A wins 3&2'),
  ('variant scenario 1', ('AHAAAAAAB',), 'A 6 up'),
  ('variant scenario 2', ('AABBBHHBBBBABAA',), 'B dormie 3')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('BBAHHHHBHHABAHBHAAA',), 'A wins 1&-1'),
  ('variant scenario 1', ('HAAHHBBH',), 'all square'),
  ('variant scenario 2', ('BAABABHB',), 'B 1 up')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('AHAHHABAAHHAHBAAABAABB',), 'A wins 5&3'),
  ('variant scenario 1', ('ABABHAHA',), 'A 2 up'),
  ('variant scenario 2', ('HAHAHAAAAAAAAHAHHA',), 'A wins 8&7')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('HAAAABHBBAAAHBBHAHB',), 'A wins 3&1'),
  ('variant scenario 1', ('ABAHBHBAA',), 'A 1 up'),
  ('variant scenario 2', ('BBBAAHAAABBBABH',), 'B 1 up')],
 [('control early lead', ('AAH',), 'A 2 up'),
  ('boundary dormie', ('AAAHHHHHHHHHHHH',), 'A dormie 3'),
  ('boundary closure three and two', ('BBBHHHHHHHHHHHHH',), 'B wins 3&2'),
  ('boundary one up at eighteen', ('AHHHHHHHHHHHHHHHHH',), 'A wins 1 up'),
  ('control halved match', ('ABABABABABABABABAB',), 'halved'),
  ('control all square', ('HAB',), 'all square'),
  ('regression: closure notation', ('ABHBHAAAAHAAA',), 'A wins 6&5'),
  ('variant scenario 1', ('BABHHBHAAAABAAABBHHB',), 'A wins 4&3'),
  ('variant scenario 2', ('AHBAAHBAHAAAABABAABAB',), 'A wins 6&5')]]
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 early leadA 2 upA 2 upPassed
boundary dormieA dormie 3A dormie 3Passed
boundary closure three and twoB wins 3&2B wins 3&2Passed
boundary one up at eighteenA wins 1 upA wins 1 upPassed
control halved matchhalvedhalvedPassed
control all squareall squareall squarePassed
regression: closure notationA wins 3&2A wins 3&2Passed
variant scenario 1A 6 upA 6 upPassed
variant scenario 2B dormie 3B dormie 3Passed

SHA-256 / 0e0b121aae099453f11bcfd83cb994721f95319d632bd78ef605b6f263c1d099

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

Case digest / c152ae86179347e89ff22f407efe61192d870b4d0e03444a12369e92cd916efd