FA-11661 / Game simulation rules / Open access
A queued bonus turn schedules an eliminated player · case 01
A queued bonus turn schedules an eliminated player.
ROOT CAUSE
Bonus-turn priority bypasses eligibility checks.
VERIFIED REPAIR
Give the current player a bonus only if alive; otherwise scan the circular order for the next alive player.
Unsuccessful approach: Ignoring all bonus turns fixes elimination but loses valid earned turns.
Case contract
Alive is a nonempty bool list, current a valid index, bonus bool. Return current for an eligible bonus, otherwise next alive index circularly, or None if no survivors.
Why this case matters
A deterministic game-rule model isolates this rule interaction for regression testing.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(alive, current, bonus):
return current if bonus else next((i for i in [(current+d)%len(alive) for d in range(1,len(alive)+1)] if alive[i]),None)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('dead bonus owner',solve([False]+[True]*N,0,True),1)
check('live bonus owner',solve([True,True],0,True),0)
check('normal next',solve([True,True],0,False),1)
check('skip dead players',solve([True]+[False]*N+[True],0,False),N+1)
check('wrap',solve([True,False,True],2,False),0)
check('no survivors',solve([False]*N,0,True),None)
check('sole survivor',solve([True],0,False),0)
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 |
|---|---|---|---|
| dead bonus owner | 0 | 1 | Failed |
| live bonus owner | 0 | 0 | Passed |
| normal next | 1 | 1 | Passed |
| skip dead players | 2 | 2 | Passed |
| wrap | 0 | 0 | Passed |
| no survivors | 0 | None | Failed |
| sole survivor | 0 | 0 | Passed |
SHA-256 / 0587a4902b97cd0d9b5edd5ab79ea55ead93765edf27c98e917d56628632c84f
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(alive, current, bonus):
return next((i for i in [(current+d)%len(alive) for d in range(1,len(alive)+1)] if alive[i]),None)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('dead bonus owner',solve([False]+[True]*N,0,True),1)
check('live bonus owner',solve([True,True],0,True),0)
check('normal next',solve([True,True],0,False),1)
check('skip dead players',solve([True]+[False]*N+[True],0,False),N+1)
check('wrap',solve([True,False,True],2,False),0)
check('no survivors',solve([False]*N,0,True),None)
check('sole survivor',solve([True],0,False),0)
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 |
|---|---|---|---|
| dead bonus owner | 1 | 1 | Passed |
| live bonus owner | 1 | 0 | Failed |
| normal next | 1 | 1 | Passed |
| skip dead players | 2 | 2 | Passed |
| wrap | 0 | 0 | Passed |
| no survivors | None | None | Passed |
| sole survivor | 0 | 0 | Passed |
SHA-256 / b2848bbc813094889adfbc5fa24424459198bb42bb87f901ddd16f6cce68483a
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(alive, current, bonus):
return current if bonus and alive[current] else next((i for i in [(current+d)%len(alive) for d in range(1,len(alive)+1)] if alive[i]),None)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('dead bonus owner',solve([False]+[True]*N,0,True),1)
check('live bonus owner',solve([True,True],0,True),0)
check('normal next',solve([True,True],0,False),1)
check('skip dead players',solve([True]+[False]*N+[True],0,False),N+1)
check('wrap',solve([True,False,True],2,False),0)
check('no survivors',solve([False]*N,0,True),None)
check('sole survivor',solve([True],0,False),0)
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 |
|---|---|---|---|
| dead bonus owner | 1 | 1 | Passed |
| live bonus owner | 0 | 0 | Passed |
| normal next | 1 | 1 | Passed |
| skip dead players | 2 | 2 | Passed |
| wrap | 0 | 0 | Passed |
| no survivors | None | None | Passed |
| sole survivor | 0 | 0 | Passed |
SHA-256 / 77c98e55fe4bc1c0b2f0ddbed56ffa3bc3d00685bc181a3559e8d5e2f40565ae
Verification & scope
Controlled rules-only simulation; not a complete game engine. 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:38:49.906998+00:00.
Case digest / fdf0340910399325dcea2ad329bf370c888ce9ca75bd22c7d2c2596a0d968f35