FA-50421 / Raster clipping / Open access
Transactional clip edit: commit open · case 01
Commit leaves a transaction active and later unstaged edits unexpectedly commit.
ROOT CAUSE
Commit leaves a transaction active and later unstaged edits unexpectedly commit.
VERIFIED REPAIR
Apply the documented state transition at commit open. Begin stages clip edits against a copy. Commit publishes pending coverage atomically; abort discards it. Draw sees committed coverage. Beginning while already editing is ignored; edit outside a transaction is ignored. Resize clips both committed and pending regions.
Unsuccessful approach: Clearing the staged set without resetting the transaction sentinel leaves later edits eligible for commit.
Case contract
Begin stages clip edits against a copy. Commit publishes pending coverage atomically; abort discards it. Draw sees committed coverage. Beginning while already editing is ignored; edit outside a transaction is ignored. Resize clips both committed and pending regions.
Why this case matters
Raster clip state can leak coverage across draws even when every individual region is valid.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(commands, size):
full=set(range(size))
current=set(full)
pending=None
out=[]
for cmd in commands:
op=cmd[0]
if op=='begin' and pending is None: pending=set(current)
elif op=='subtract' and pending is not None: pending-=set(cmd[1])
elif op=='add' and pending is not None: pending |= set(cmd[1]) & full
elif op=='replace' and pending is not None: pending=set(cmd[1]) & full
elif op=='commit' and pending is not None:
current=set(pending)
pending=set(current)
elif op=='abort': pending=None
elif op=='resize':
full=set(range(cmd[1]))
current &= full
if pending is not None: pending &= full
elif op=='draw': out.append(sorted(current))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 4), [[0, 1, 2, 3], [1, 2, 3]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 4), [[2, 3]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 4), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 4), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 4), [[0, 1, 2, 3]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 4), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 4), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 4), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 4), [[0, 1, 2, 3]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 4), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 4), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 4), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 4), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 4), [[0]])
if N == 2:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 5), [[0, 1, 2, 3, 4], [1, 2, 3, 4]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 5), [[2, 3, 4]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 5), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 5), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 5), [[0, 1, 2, 3, 4]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 5), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 5), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 5), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 5), [[0, 1, 2, 3, 4]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 5), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 5), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 5), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 5), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 5), [[0]])
if N == 3:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 6), [[0, 1, 2, 3, 4, 5], [1, 2, 3, 4, 5]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 6), [[2, 3, 4, 5]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 6), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 6), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 6), [[0, 1, 2, 3, 4, 5]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 6), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 6), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 6), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 6), [[0, 1, 2, 3, 4, 5]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 6), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 6), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 6), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 6), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 6), [[0]])
if N == 4:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 7), [[0, 1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 7), [[2, 3, 4, 5, 6]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 7), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 7), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 7), [[0, 1, 2, 3, 4, 5, 6]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 7), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 7), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 7), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 7), [[0, 1, 2, 3, 4, 5, 6]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 7), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 7), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 7), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 7), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 7), [[0]])
if N == 5:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 8), [[0, 1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 8), [[2, 3, 4, 5, 6, 7]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 8), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 8), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 8), [[0, 1, 2, 3, 4, 5, 6, 7]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 8), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 8), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 8), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 8), [[0, 1, 2, 3, 4, 5, 6, 7]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 8), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 8), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 8), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 8), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 8), [[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 |
|---|---|---|---|
| explicit sequence 0 | [[0, 1, 2, 3], [1, 2, 3]] | [[0, 1, 2, 3], [1, 2, 3]] | Passed |
| explicit sequence 1 | [[2, 3]] | [[2, 3]] | Passed |
| explicit sequence 2 | [[0, 1]] | [[0, 1]] | Passed |
| explicit sequence 3 | [[2]] | [[2]] | Passed |
| explicit sequence 4 | [[0, 1, 2, 3]] | [[0, 1, 2, 3]] | Passed |
| explicit sequence 5 | [[]] | [[1]] | Failed |
| explicit sequence 6 | [[1]] | [[1]] | Passed |
| explicit sequence 7 | [[1]] | [[1]] | Passed |
| explicit sequence 8 | [[0, 1, 2, 3]] | [[0, 1, 2, 3]] | Passed |
| explicit sequence 9 | [[]] | [[]] | Passed |
| explicit sequence 10 | [[0]] | [[0]] | Passed |
| explicit sequence 11 | [[0]] | [[0]] | Passed |
| explicit sequence 12 | [[0, 1]] | [[0, 1]] | Passed |
| explicit sequence 13 | [[0]] | [[0]] | Passed |
SHA-256 / 0a469bd6047101abb0f01309485148c85f915102c94dead7eb9249e32e1c2055
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(commands, size):
full=set(range(size))
current=set(full)
pending=None
out=[]
for cmd in commands:
op=cmd[0]
if op=='begin' and pending is None: pending=set(current)
elif op=='subtract' and pending is not None: pending-=set(cmd[1])
elif op=='add' and pending is not None: pending |= set(cmd[1]) & full
elif op=='replace' and pending is not None: pending=set(cmd[1]) & full
elif op=='commit' and pending is not None:
current=set(pending)
pending=set()
elif op=='abort': pending=None
elif op=='resize':
full=set(range(cmd[1]))
current &= full
if pending is not None: pending &= full
elif op=='draw': out.append(sorted(current))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 4), [[0, 1, 2, 3], [1, 2, 3]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 4), [[2, 3]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 4), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 4), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 4), [[0, 1, 2, 3]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 4), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 4), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 4), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 4), [[0, 1, 2, 3]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 4), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 4), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 4), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 4), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 4), [[0]])
if N == 2:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 5), [[0, 1, 2, 3, 4], [1, 2, 3, 4]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 5), [[2, 3, 4]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 5), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 5), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 5), [[0, 1, 2, 3, 4]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 5), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 5), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 5), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 5), [[0, 1, 2, 3, 4]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 5), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 5), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 5), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 5), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 5), [[0]])
if N == 3:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 6), [[0, 1, 2, 3, 4, 5], [1, 2, 3, 4, 5]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 6), [[2, 3, 4, 5]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 6), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 6), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 6), [[0, 1, 2, 3, 4, 5]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 6), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 6), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 6), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 6), [[0, 1, 2, 3, 4, 5]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 6), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 6), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 6), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 6), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 6), [[0]])
if N == 4:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 7), [[0, 1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 7), [[2, 3, 4, 5, 6]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 7), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 7), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 7), [[0, 1, 2, 3, 4, 5, 6]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 7), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 7), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 7), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 7), [[0, 1, 2, 3, 4, 5, 6]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 7), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 7), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 7), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 7), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 7), [[0]])
if N == 5:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 8), [[0, 1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 8), [[2, 3, 4, 5, 6, 7]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 8), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 8), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 8), [[0, 1, 2, 3, 4, 5, 6, 7]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 8), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 8), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 8), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 8), [[0, 1, 2, 3, 4, 5, 6, 7]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 8), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 8), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 8), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 8), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 8), [[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 |
|---|---|---|---|
| explicit sequence 0 | [[0, 1, 2, 3], [1, 2, 3]] | [[0, 1, 2, 3], [1, 2, 3]] | Passed |
| explicit sequence 1 | [[2, 3]] | [[2, 3]] | Passed |
| explicit sequence 2 | [[0, 1]] | [[0, 1]] | Passed |
| explicit sequence 3 | [[2]] | [[2]] | Passed |
| explicit sequence 4 | [[0, 1, 2, 3]] | [[0, 1, 2, 3]] | Passed |
| explicit sequence 5 | [[]] | [[1]] | Failed |
| explicit sequence 6 | [[1]] | [[1]] | Passed |
| explicit sequence 7 | [[1]] | [[1]] | Passed |
| explicit sequence 8 | [[0, 1, 2, 3]] | [[0, 1, 2, 3]] | Passed |
| explicit sequence 9 | [[]] | [[]] | Passed |
| explicit sequence 10 | [[0]] | [[0]] | Passed |
| explicit sequence 11 | [[0]] | [[0]] | Passed |
| explicit sequence 12 | [[1]] | [[0, 1]] | Failed |
| explicit sequence 13 | [[0]] | [[0]] | Passed |
SHA-256 / de13c2ced5a0c42642262c6c40b4311d2d5f918dca165be01dd1c9ca3b3857db
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(commands, size):
full=set(range(size))
current=set(full)
pending=None
out=[]
for cmd in commands:
op=cmd[0]
if op=='begin' and pending is None: pending=set(current)
elif op=='subtract' and pending is not None: pending-=set(cmd[1])
elif op=='add' and pending is not None: pending |= set(cmd[1]) & full
elif op=='replace' and pending is not None: pending=set(cmd[1]) & full
elif op=='commit' and pending is not None:
current=set(pending)
pending=None
elif op=='abort': pending=None
elif op=='resize':
full=set(range(cmd[1]))
current &= full
if pending is not None: pending &= full
elif op=='draw': out.append(sorted(current))
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 4), [[0, 1, 2, 3], [1, 2, 3]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 4), [[2, 3]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 4), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 4), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 4), [[0, 1, 2, 3]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 4), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 4), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 4), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 4), [[0, 1, 2, 3]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 4), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 4), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 4), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 4), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 4), [[0]])
if N == 2:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 5), [[0, 1, 2, 3, 4], [1, 2, 3, 4]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 5), [[2, 3, 4]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 5), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 5), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 5), [[0, 1, 2, 3, 4]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 5), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 5), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 5), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 5), [[0, 1, 2, 3, 4]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 5), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 5), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 5), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 5), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 5), [[0]])
if N == 3:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 6), [[0, 1, 2, 3, 4, 5], [1, 2, 3, 4, 5]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 6), [[2, 3, 4, 5]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 6), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 6), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 6), [[0, 1, 2, 3, 4, 5]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 6), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 6), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 6), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 6), [[0, 1, 2, 3, 4, 5]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 6), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 6), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 6), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 6), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 6), [[0]])
if N == 4:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 7), [[0, 1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 7), [[2, 3, 4, 5, 6]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 7), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 7), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 7), [[0, 1, 2, 3, 4, 5, 6]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 7), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 7), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 7), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 7), [[0, 1, 2, 3, 4, 5, 6]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 7), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 7), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 7), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 7), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 7), [[0]])
if N == 5:
check('explicit sequence 0', solve([['begin'], ['subtract', [0]], ['draw'], ['commit'], ['draw']], 8), [[0, 1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 7]])
check('explicit sequence 1', solve([['begin'], ['subtract', [0]], ['begin'], ['subtract', [1]], ['commit'], ['draw']], 8), [[2, 3, 4, 5, 6, 7]])
check('explicit sequence 2', solve([['begin'], ['replace', [0]], ['add', [1, 99, -1]], ['commit'], ['draw']], 8), [[0, 1]])
check('explicit sequence 3', solve([['begin'], ['replace', [0]], ['replace', [2]], ['commit'], ['draw']], 8), [[2]])
check('explicit sequence 4', solve([['begin'], ['replace', [0]], ['abort'], ['draw']], 8), [[0, 1, 2, 3, 4, 5, 6, 7]])
check('explicit sequence 5', solve([['begin'], ['replace', [1]], ['commit'], ['subtract', [1]], ['commit'], ['draw']], 8), [[1]])
check('explicit sequence 6', solve([['begin'], ['replace', [1, 2]], ['resize', 2], ['commit'], ['draw']], 8), [[1]])
check('explicit sequence 7', solve([['begin'], ['replace', [1]], ['commit'], ['resize', 3], ['draw']], 8), [[1]])
check('explicit sequence 8', solve([['commit'], ['abort'], ['draw']], 8), [[0, 1, 2, 3, 4, 5, 6, 7]])
check('explicit sequence 9', solve([['begin'], ['replace', []], ['commit'], ['draw']], 8), [[]])
check('explicit sequence 10', solve([['begin'], ['replace', []], ['commit'], ['begin'], ['add', [0]], ['commit'], ['draw']], 8), [[0]])
check('explicit sequence 11', solve([['begin'], ['replace', []], ['begin'], ['add', [0]], ['commit'], ['draw']], 8), [[0]])
check('explicit sequence 12', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['add', [1]], ['commit'], ['draw']], 8), [[0, 1]])
check('explicit sequence 13', solve([['begin'], ['replace', [0]], ['commit'], ['begin'], ['subtract', [0]], ['abort'], ['draw']], 8), [[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 |
|---|---|---|---|
| explicit sequence 0 | [[0, 1, 2, 3], [1, 2, 3]] | [[0, 1, 2, 3], [1, 2, 3]] | Passed |
| explicit sequence 1 | [[2, 3]] | [[2, 3]] | Passed |
| explicit sequence 2 | [[0, 1]] | [[0, 1]] | Passed |
| explicit sequence 3 | [[2]] | [[2]] | Passed |
| explicit sequence 4 | [[0, 1, 2, 3]] | [[0, 1, 2, 3]] | Passed |
| explicit sequence 5 | [[1]] | [[1]] | Passed |
| explicit sequence 6 | [[1]] | [[1]] | Passed |
| explicit sequence 7 | [[1]] | [[1]] | Passed |
| explicit sequence 8 | [[0, 1, 2, 3]] | [[0, 1, 2, 3]] | Passed |
| explicit sequence 9 | [[]] | [[]] | Passed |
| explicit sequence 10 | [[0]] | [[0]] | Passed |
| explicit sequence 11 | [[0]] | [[0]] | Passed |
| explicit sequence 12 | [[0, 1]] | [[0, 1]] | Passed |
| explicit sequence 13 | [[0]] | [[0]] | Passed |
SHA-256 / a8f9fd09227f0749d5f7ce8618350e394e9a072c1b631bb7b363cdfa6d844b5d
Verification & scope
Finite one-dimensional integer sample sets model coverage state only; no geometric intersection, memory layout, GPU or graphics-standard conformance is claimed. 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:45:08.829211+00:00.
Case digest / 9f401f0a16c90813ca7e9f2394c7b3e5d15716347d8a5adcf3eabb9b1dc6f47b