FAILURE MAP
← Case archive

FA-50416 / Raster clipping / Open access

Transactional clip edit: commit union · case 01

Commit unions old and pending coverage instead of replacing committed coverage.

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

ROOT CAUSE

Commit unions old and pending coverage instead of replacing committed coverage.

VERIFIED REPAIR

Apply the documented state transition at commit union. 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: Intersection removes old samples but cannot publish newly added coverage.

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 |= 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 fixtureActualExpectedOutcome
explicit sequence 0[[0, 1, 2, 3], [0, 1, 2, 3]][[0, 1, 2, 3], [1, 2, 3]]Failed
explicit sequence 1[[0, 1, 2, 3]][[2, 3]]Failed
explicit sequence 2[[0, 1, 2, 3]][[0, 1]]Failed
explicit sequence 3[[0, 1, 2, 3]][[2]]Failed
explicit sequence 4[[0, 1, 2, 3]][[0, 1, 2, 3]]Passed
explicit sequence 5[[0, 1, 2, 3]][[1]]Failed
explicit sequence 6[[0, 1]][[1]]Failed
explicit sequence 7[[0, 1, 2]][[1]]Failed
explicit sequence 8[[0, 1, 2, 3]][[0, 1, 2, 3]]Passed
explicit sequence 9[[0, 1, 2, 3]][[]]Failed
explicit sequence 10[[0, 1, 2, 3]][[0]]Failed
explicit sequence 11[[0, 1, 2, 3]][[0]]Failed
explicit sequence 12[[0, 1, 2, 3]][[0, 1]]Failed
explicit sequence 13[[0, 1, 2, 3]][[0]]Failed

SHA-256 / 9bcb57b69ac5beafbd9ec16b5bba2d5dd6a37e1c424484e01dffe88ef36ec660

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 &= 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 fixtureActualExpectedOutcome
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]]Failed
explicit sequence 11[[0]][[0]]Passed
explicit sequence 12[[0]][[0, 1]]Failed
explicit sequence 13[[0]][[0]]Passed

SHA-256 / 4f064d748eccce44849203b69e98a016f7ca88d8405964dd1b0801aa018bd8b6

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

Case digest / c75e790979b7193212564cb7f60fa2eaec03ac81261ac777d1ce8fa16e372067