FAILURE MAP
← Case archive

FA-45031 / Data systems / Open access

A resume cursor stops at an empty batch instead of normalizing · case 01

A resume cursor stops at an empty batch instead of normalizing.

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

ROOT CAUSE

batch-resume-cursor: A resume cursor stops at an empty batch instead of normalizing.

VERIFIED REPAIR

Preserve the stated physical representation and operation order: Fetch at most quota rows from a sequence of batches starting at [batch-index,row-offset]. Skip exhausted and empty batches, return the emitted rows and a canonical next cursor, and mark exhaustion as [number-of-batches,0]. Quota zero preserves a normalized cursor.

Unsuccessful approach: Strict comparison leaves cursors positioned exactly at exhausted batches.

Case contract

Fetch at most quota rows from a sequence of batches starting at [batch-index,row-offset]. Skip exhausted and empty batches, return the emitted rows and a canonical next cursor, and mark exhaustion as [number-of-batches,0]. Quota zero preserves a normalized cursor.

Why this case matters

A bounded deterministic data engine model makes representation and changelog faults reproducible.

1 / The failure

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

N = 1
observations = []
def solve(d):
    try:
        batches,batch,offset,quota=d
        out=[]
        if batch<len(batches) and offset>=len(batches[batch]):
            batch+=1; offset=0
        while quota>0 and batch<len(batches):
            out.append(batches[batch][offset])
            offset+=1; quota-=1
            while batch<len(batches) and offset>=len(batches[batch]):
                batch+=1; offset=0
        return [out,[batch,offset]]
    except (IndexError, KeyError, ValueError, StopIteration) as exc:
        return {"representation_error": type(exc).__name__}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('partial current batch', solve([[[1, 2, 3]], 0, 1, 1]), [[2], [0, 2]])
    check('cross empty batches', solve([[[1], [], [], [2, 3]], 0, 0, 2]), [[1, 2], [3, 1]])
    check('initial exhausted', solve([[[], [], [1, 2]], 0, 0, 1]), [[1], [2, 1]])
    check('resume past long batch', solve([[[1, 2], [3, 4]], 0, 0, 3]), [[1, 2, 3], [1, 1]])
    check('all exhausted', solve([[[1]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[1, 2]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[1, 2, 3, 4]], 0, 0, 2]), [[1, 2], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 2:
    check('partial current batch', solve([[[2, 3, 4]], 0, 1, 1]), [[3], [0, 2]])
    check('cross empty batches', solve([[[2], [], [], [3, 4]], 0, 0, 2]), [[2, 3], [3, 1]])
    check('initial exhausted', solve([[[], [], [2, 3]], 0, 0, 1]), [[2], [2, 1]])
    check('resume past long batch', solve([[[2, 3], [4, 5]], 0, 0, 3]), [[2, 3, 4], [1, 1]])
    check('all exhausted', solve([[[2]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[2, 3]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[2, 3, 4, 5]], 0, 0, 2]), [[2, 3], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 3:
    check('partial current batch', solve([[[3, 4, 5]], 0, 1, 1]), [[4], [0, 2]])
    check('cross empty batches', solve([[[3], [], [], [4, 5]], 0, 0, 2]), [[3, 4], [3, 1]])
    check('initial exhausted', solve([[[], [], [3, 4]], 0, 0, 1]), [[3], [2, 1]])
    check('resume past long batch', solve([[[3, 4], [5, 6]], 0, 0, 3]), [[3, 4, 5], [1, 1]])
    check('all exhausted', solve([[[3]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[3, 4]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[3, 4, 5, 6]], 0, 0, 2]), [[3, 4], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 4:
    check('partial current batch', solve([[[4, 5, 6]], 0, 1, 1]), [[5], [0, 2]])
    check('cross empty batches', solve([[[4], [], [], [5, 6]], 0, 0, 2]), [[4, 5], [3, 1]])
    check('initial exhausted', solve([[[], [], [4, 5]], 0, 0, 1]), [[4], [2, 1]])
    check('resume past long batch', solve([[[4, 5], [6, 7]], 0, 0, 3]), [[4, 5, 6], [1, 1]])
    check('all exhausted', solve([[[4]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[4, 5]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[4, 5, 6, 7]], 0, 0, 2]), [[4, 5], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 5:
    check('partial current batch', solve([[[5, 6, 7]], 0, 1, 1]), [[6], [0, 2]])
    check('cross empty batches', solve([[[5], [], [], [6, 7]], 0, 0, 2]), [[5, 6], [3, 1]])
    check('initial exhausted', solve([[[], [], [5, 6]], 0, 0, 1]), [[5], [2, 1]])
    check('resume past long batch', solve([[[5, 6], [7, 8]], 0, 0, 3]), [[5, 6, 7], [1, 1]])
    check('all exhausted', solve([[[5]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[5, 6]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[5, 6, 7, 8]], 0, 0, 2]), [[5, 6], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 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
partial current batch[[2], [0, 2]][[2], [0, 2]]Passed
cross empty batches[[1, 2], [3, 1]][[1, 2], [3, 1]]Passed
initial exhausted{'representation_error': 'IndexError'}[[1], [2, 1]]Failed
resume past long batch[[1, 2, 3], [1, 1]][[1, 2, 3], [1, 1]]Passed
all exhausted[[], [1, 0]][[], [1, 0]]Passed
zero quota[[], [0, 1]][[], [0, 1]]Passed
within long batch[[1, 2], [0, 2]][[1, 2], [0, 2]]Passed
empty stream[[], [0, 0]][[], [0, 0]]Passed

SHA-256 / 0b9924f06ccdb11d9551d7bc9772d479d274f3a180412aea268992866c249905

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(d):
    try:
        batches,batch,offset,quota=d
        out=[]
        while batch<len(batches) and offset>len(batches[batch]):
            batch+=1; offset=0
        while quota>0 and batch<len(batches):
            out.append(batches[batch][offset])
            offset+=1; quota-=1
            while batch<len(batches) and offset>=len(batches[batch]):
                batch+=1; offset=0
        return [out,[batch,offset]]
    except (IndexError, KeyError, ValueError, StopIteration) as exc:
        return {"representation_error": type(exc).__name__}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('partial current batch', solve([[[1, 2, 3]], 0, 1, 1]), [[2], [0, 2]])
    check('cross empty batches', solve([[[1], [], [], [2, 3]], 0, 0, 2]), [[1, 2], [3, 1]])
    check('initial exhausted', solve([[[], [], [1, 2]], 0, 0, 1]), [[1], [2, 1]])
    check('resume past long batch', solve([[[1, 2], [3, 4]], 0, 0, 3]), [[1, 2, 3], [1, 1]])
    check('all exhausted', solve([[[1]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[1, 2]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[1, 2, 3, 4]], 0, 0, 2]), [[1, 2], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 2:
    check('partial current batch', solve([[[2, 3, 4]], 0, 1, 1]), [[3], [0, 2]])
    check('cross empty batches', solve([[[2], [], [], [3, 4]], 0, 0, 2]), [[2, 3], [3, 1]])
    check('initial exhausted', solve([[[], [], [2, 3]], 0, 0, 1]), [[2], [2, 1]])
    check('resume past long batch', solve([[[2, 3], [4, 5]], 0, 0, 3]), [[2, 3, 4], [1, 1]])
    check('all exhausted', solve([[[2]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[2, 3]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[2, 3, 4, 5]], 0, 0, 2]), [[2, 3], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 3:
    check('partial current batch', solve([[[3, 4, 5]], 0, 1, 1]), [[4], [0, 2]])
    check('cross empty batches', solve([[[3], [], [], [4, 5]], 0, 0, 2]), [[3, 4], [3, 1]])
    check('initial exhausted', solve([[[], [], [3, 4]], 0, 0, 1]), [[3], [2, 1]])
    check('resume past long batch', solve([[[3, 4], [5, 6]], 0, 0, 3]), [[3, 4, 5], [1, 1]])
    check('all exhausted', solve([[[3]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[3, 4]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[3, 4, 5, 6]], 0, 0, 2]), [[3, 4], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 4:
    check('partial current batch', solve([[[4, 5, 6]], 0, 1, 1]), [[5], [0, 2]])
    check('cross empty batches', solve([[[4], [], [], [5, 6]], 0, 0, 2]), [[4, 5], [3, 1]])
    check('initial exhausted', solve([[[], [], [4, 5]], 0, 0, 1]), [[4], [2, 1]])
    check('resume past long batch', solve([[[4, 5], [6, 7]], 0, 0, 3]), [[4, 5, 6], [1, 1]])
    check('all exhausted', solve([[[4]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[4, 5]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[4, 5, 6, 7]], 0, 0, 2]), [[4, 5], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 5:
    check('partial current batch', solve([[[5, 6, 7]], 0, 1, 1]), [[6], [0, 2]])
    check('cross empty batches', solve([[[5], [], [], [6, 7]], 0, 0, 2]), [[5, 6], [3, 1]])
    check('initial exhausted', solve([[[], [], [5, 6]], 0, 0, 1]), [[5], [2, 1]])
    check('resume past long batch', solve([[[5, 6], [7, 8]], 0, 0, 3]), [[5, 6, 7], [1, 1]])
    check('all exhausted', solve([[[5]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[5, 6]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[5, 6, 7, 8]], 0, 0, 2]), [[5, 6], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 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
partial current batch[[2], [0, 2]][[2], [0, 2]]Passed
cross empty batches[[1, 2], [3, 1]][[1, 2], [3, 1]]Passed
initial exhausted{'representation_error': 'IndexError'}[[1], [2, 1]]Failed
resume past long batch[[1, 2, 3], [1, 1]][[1, 2, 3], [1, 1]]Passed
all exhausted{'representation_error': 'IndexError'}[[], [1, 0]]Failed
zero quota[[], [0, 1]][[], [0, 1]]Passed
within long batch[[1, 2], [0, 2]][[1, 2], [0, 2]]Passed
empty stream[[], [0, 0]][[], [0, 0]]Passed

SHA-256 / 426b164029a5e93411eb97282e39a42e457a0802ddbd65c155698f8e51c25de7

3 / The verified repair

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

N = 1
observations = []
def solve(d):
    try:
        batches,batch,offset,quota=d
        out=[]
        while batch<len(batches) and offset>=len(batches[batch]):
            batch+=1; offset=0
        while quota>0 and batch<len(batches):
            out.append(batches[batch][offset])
            offset+=1; quota-=1
            while batch<len(batches) and offset>=len(batches[batch]):
                batch+=1; offset=0
        return [out,[batch,offset]]
    except (IndexError, KeyError, ValueError, StopIteration) as exc:
        return {"representation_error": type(exc).__name__}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('partial current batch', solve([[[1, 2, 3]], 0, 1, 1]), [[2], [0, 2]])
    check('cross empty batches', solve([[[1], [], [], [2, 3]], 0, 0, 2]), [[1, 2], [3, 1]])
    check('initial exhausted', solve([[[], [], [1, 2]], 0, 0, 1]), [[1], [2, 1]])
    check('resume past long batch', solve([[[1, 2], [3, 4]], 0, 0, 3]), [[1, 2, 3], [1, 1]])
    check('all exhausted', solve([[[1]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[1, 2]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[1, 2, 3, 4]], 0, 0, 2]), [[1, 2], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 2:
    check('partial current batch', solve([[[2, 3, 4]], 0, 1, 1]), [[3], [0, 2]])
    check('cross empty batches', solve([[[2], [], [], [3, 4]], 0, 0, 2]), [[2, 3], [3, 1]])
    check('initial exhausted', solve([[[], [], [2, 3]], 0, 0, 1]), [[2], [2, 1]])
    check('resume past long batch', solve([[[2, 3], [4, 5]], 0, 0, 3]), [[2, 3, 4], [1, 1]])
    check('all exhausted', solve([[[2]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[2, 3]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[2, 3, 4, 5]], 0, 0, 2]), [[2, 3], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 3:
    check('partial current batch', solve([[[3, 4, 5]], 0, 1, 1]), [[4], [0, 2]])
    check('cross empty batches', solve([[[3], [], [], [4, 5]], 0, 0, 2]), [[3, 4], [3, 1]])
    check('initial exhausted', solve([[[], [], [3, 4]], 0, 0, 1]), [[3], [2, 1]])
    check('resume past long batch', solve([[[3, 4], [5, 6]], 0, 0, 3]), [[3, 4, 5], [1, 1]])
    check('all exhausted', solve([[[3]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[3, 4]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[3, 4, 5, 6]], 0, 0, 2]), [[3, 4], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 4:
    check('partial current batch', solve([[[4, 5, 6]], 0, 1, 1]), [[5], [0, 2]])
    check('cross empty batches', solve([[[4], [], [], [5, 6]], 0, 0, 2]), [[4, 5], [3, 1]])
    check('initial exhausted', solve([[[], [], [4, 5]], 0, 0, 1]), [[4], [2, 1]])
    check('resume past long batch', solve([[[4, 5], [6, 7]], 0, 0, 3]), [[4, 5, 6], [1, 1]])
    check('all exhausted', solve([[[4]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[4, 5]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[4, 5, 6, 7]], 0, 0, 2]), [[4, 5], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 0]])
elif N == 5:
    check('partial current batch', solve([[[5, 6, 7]], 0, 1, 1]), [[6], [0, 2]])
    check('cross empty batches', solve([[[5], [], [], [6, 7]], 0, 0, 2]), [[5, 6], [3, 1]])
    check('initial exhausted', solve([[[], [], [5, 6]], 0, 0, 1]), [[5], [2, 1]])
    check('resume past long batch', solve([[[5, 6], [7, 8]], 0, 0, 3]), [[5, 6, 7], [1, 1]])
    check('all exhausted', solve([[[5]], 0, 1, 3]), [[], [1, 0]])
    check('zero quota', solve([[[5, 6]], 0, 1, 0]), [[], [0, 1]])
    check('within long batch', solve([[[5, 6, 7, 8]], 0, 0, 2]), [[5, 6], [0, 2]])
    check('empty stream', solve([[], 0, 0, 2]), [[], [0, 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
partial current batch[[2], [0, 2]][[2], [0, 2]]Passed
cross empty batches[[1, 2], [3, 1]][[1, 2], [3, 1]]Passed
initial exhausted[[1], [2, 1]][[1], [2, 1]]Passed
resume past long batch[[1, 2, 3], [1, 1]][[1, 2, 3], [1, 1]]Passed
all exhausted[[], [1, 0]][[], [1, 0]]Passed
zero quota[[], [0, 1]][[], [0, 1]]Passed
within long batch[[1, 2], [0, 2]][[1, 2], [0, 2]]Passed
empty stream[[], [0, 0]][[], [0, 0]]Passed

SHA-256 / 34cfb8de043f357459ed127f3f4dc3f1e677c7651a54044fb299fa4adf6b3c23

Verification & scope

Offline stipulated semantics over valid small inputs; no performance, concurrency, or production-engine conformance claim. 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:44:18.011748+00:00.

Case digest / 9469b9110574b313651af52b0b395460263d72abe1f47087823e0c36954d350d