FAILURE MAP
← Case archive

FA-12836 / Tournament pairing rules / Open access

Disqualification shifts a bracket replacement into the wrong slot · case 01

Disqualification shifts a bracket replacement into the wrong slot.

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

ROOT CAUSE

Filtering disqualified qualifiers compacts the array and changes subsequent bracket paths.

VERIFIED REPAIR

Slots contain distinct qualified player ids in fixed bracket positions. Keep eligible occupants at their original index and replace every ineligible occupant with None; eligibility alone grants no new slot.

Unsuccessful approach: Replacing a vacant slot with the first eligible player duplicates entrants and invents qualification rights.

Case contract

Synthetic model: Slots contain distinct qualified player ids in fixed bracket positions. Keep eligible occupants at their original index and replace every ineligible occupant with None; eligibility alone grants no new slot.

Why this case matters

Makes the stated pairing or standings policy executable without assuming any real federation rulebook.

1 / The failure

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

N = 1
observations = []
def solve(slots, eligible):
    return [p for p in slots if p in eligible]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('left vacancy', solve([N,N+1], [N+1]), [None,N+1])
check('right vacancy', solve([N,N+1], [N]), [N,None])
check('both vacant', solve([N,N+1], []), [None,None])
check('both eligible', solve([N,N+1], [N,N+1]), [N,N+1])
check('outsider never fills slot', solve([N,N+1], [N+2]), [None,None])
check('empty bracket', solve([], [N]), [])
check('nonadjacent vacancies', solve([N,N+1,N+2,N+3], [N+1,N+3]), [None,N+1,None,N+3])
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
left vacancy[2][None, 2]Failed
right vacancy[1][1, None]Failed
both vacant[][None, None]Failed
both eligible[1, 2][1, 2]Passed
outsider never fills slot[][None, None]Failed
empty bracket[][]Passed
nonadjacent vacancies[2, 4][None, 2, None, 4]Failed

SHA-256 / b067fa9e3b64bfb35633067e40c71fe33d7c9f32c5c97bd951d793e8af72218d

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(slots, eligible):
    return [p if p in eligible else next(iter(sorted(eligible)), None) for p in slots]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('left vacancy', solve([N,N+1], [N+1]), [None,N+1])
check('right vacancy', solve([N,N+1], [N]), [N,None])
check('both vacant', solve([N,N+1], []), [None,None])
check('both eligible', solve([N,N+1], [N,N+1]), [N,N+1])
check('outsider never fills slot', solve([N,N+1], [N+2]), [None,None])
check('empty bracket', solve([], [N]), [])
check('nonadjacent vacancies', solve([N,N+1,N+2,N+3], [N+1,N+3]), [None,N+1,None,N+3])
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
left vacancy[2, 2][None, 2]Failed
right vacancy[1, 1][1, None]Failed
both vacant[None, None][None, None]Passed
both eligible[1, 2][1, 2]Passed
outsider never fills slot[3, 3][None, None]Failed
empty bracket[][]Passed
nonadjacent vacancies[2, 2, 2, 4][None, 2, None, 4]Failed

SHA-256 / 366b1667e8516155ca9634a9ca1bff401bdee1b4fe9072cf3a70048dd0ae656a

3 / The verified repair

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

N = 1
observations = []
def solve(slots, eligible):
    return [p if p in eligible else None for p in slots]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('left vacancy', solve([N,N+1], [N+1]), [None,N+1])
check('right vacancy', solve([N,N+1], [N]), [N,None])
check('both vacant', solve([N,N+1], []), [None,None])
check('both eligible', solve([N,N+1], [N,N+1]), [N,N+1])
check('outsider never fills slot', solve([N,N+1], [N+2]), [None,None])
check('empty bracket', solve([], [N]), [])
check('nonadjacent vacancies', solve([N,N+1,N+2,N+3], [N+1,N+3]), [None,N+1,None,N+3])
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
left vacancy[None, 2][None, 2]Passed
right vacancy[1, None][1, None]Passed
both vacant[None, None][None, None]Passed
both eligible[1, 2][1, 2]Passed
outsider never fills slot[None, None][None, None]Passed
empty bracket[][]Passed
nonadjacent vacancies[None, 2, None, 4][None, 2, None, 4]Passed

SHA-256 / b9f82cd0f3c6ceda63de26bf81985c5340a989f4741fb12515d177c1d127dc40

Verification & scope

Controlled synthetic policy; does not implement an entire tournament system. 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:39:00.737664+00:00.

Case digest / 3c3a6c7572995b902d4b8556afb7e4a4575757c7614986e29dfedc30e3a4b1ef