FAILURE MAP
← Case archive

FA-44586 / Data systems / Open access

Zip unnest omits a parent with two empty lists · case 01

Zip unnest omits a parent with two empty lists.

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

ROOT CAUSE

zip-list-unnest: Zip unnest omits a parent with two empty lists.

VERIFIED REPAIR

Preserve the stated physical representation and operation order: Zip two optional lists within each parent row using longest-list semantics and zero-based ordinals. Missing positions become None; two empty or null lists yield one outer placeholder with ordinal None.

Unsuccessful approach: An outer placeholder has no element ordinal.

Case contract

Zip two optional lists within each parent row using longest-list semantics and zero-based ordinals. Missing positions become None; two empty or null lists yield one outer placeholder with ordinal None.

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:
        out=[]
        for ident,left,right in d:
            left=[] if left is None else left
            right=[] if right is None else right
            size=max(len(left),len(right))
            if size==0: pass
            for i in range(size):
                a=left[i] if i<len(left) else None
                b=right[i] if i<len(right) else None
                out.append([ident,i,a,b])
        return out
    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('longer left', solve([[1, [2, 3], [4]]]), [[1, 0, 2, 4], [1, 1, 3, None]])
    check('longer right', solve([[1, [2], [3, 4]]]), [[1, 0, 2, 3], [1, 1, None, 4]])
    check('empty both', solve([[1, [], None]]), [[1, None, None, None]])
    check('null left', solve([[1, None, [2]]]), [[1, 0, None, 2]])
    check('parent ordinal reset', solve([[1, [1], []], [2, [None], [3]]]), [[1, 0, 1, None], [2, 0, None, 3]])
    check('empty relation', solve([]), [])
    check('null right', solve([[1, [2], None]]), [[1, 0, 2, None]])
elif N == 2:
    check('longer left', solve([[2, [3, 4], [5]]]), [[2, 0, 3, 5], [2, 1, 4, None]])
    check('longer right', solve([[2, [3], [4, 5]]]), [[2, 0, 3, 4], [2, 1, None, 5]])
    check('empty both', solve([[2, [], None]]), [[2, None, None, None]])
    check('null left', solve([[2, None, [3]]]), [[2, 0, None, 3]])
    check('parent ordinal reset', solve([[2, [2], []], [3, [None], [4]]]), [[2, 0, 2, None], [3, 0, None, 4]])
    check('empty relation', solve([]), [])
    check('null right', solve([[2, [3], None]]), [[2, 0, 3, None]])
elif N == 3:
    check('longer left', solve([[3, [4, 5], [6]]]), [[3, 0, 4, 6], [3, 1, 5, None]])
    check('longer right', solve([[3, [4], [5, 6]]]), [[3, 0, 4, 5], [3, 1, None, 6]])
    check('empty both', solve([[3, [], None]]), [[3, None, None, None]])
    check('null left', solve([[3, None, [4]]]), [[3, 0, None, 4]])
    check('parent ordinal reset', solve([[3, [3], []], [4, [None], [5]]]), [[3, 0, 3, None], [4, 0, None, 5]])
    check('empty relation', solve([]), [])
    check('null right', solve([[3, [4], None]]), [[3, 0, 4, None]])
elif N == 4:
    check('longer left', solve([[4, [5, 6], [7]]]), [[4, 0, 5, 7], [4, 1, 6, None]])
    check('longer right', solve([[4, [5], [6, 7]]]), [[4, 0, 5, 6], [4, 1, None, 7]])
    check('empty both', solve([[4, [], None]]), [[4, None, None, None]])
    check('null left', solve([[4, None, [5]]]), [[4, 0, None, 5]])
    check('parent ordinal reset', solve([[4, [4], []], [5, [None], [6]]]), [[4, 0, 4, None], [5, 0, None, 6]])
    check('empty relation', solve([]), [])
    check('null right', solve([[4, [5], None]]), [[4, 0, 5, None]])
elif N == 5:
    check('longer left', solve([[5, [6, 7], [8]]]), [[5, 0, 6, 8], [5, 1, 7, None]])
    check('longer right', solve([[5, [6], [7, 8]]]), [[5, 0, 6, 7], [5, 1, None, 8]])
    check('empty both', solve([[5, [], None]]), [[5, None, None, None]])
    check('null left', solve([[5, None, [6]]]), [[5, 0, None, 6]])
    check('parent ordinal reset', solve([[5, [5], []], [6, [None], [7]]]), [[5, 0, 5, None], [6, 0, None, 7]])
    check('empty relation', solve([]), [])
    check('null right', solve([[5, [6], None]]), [[5, 0, 6, None]])
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
longer left[[1, 0, 2, 4], [1, 1, 3, None]][[1, 0, 2, 4], [1, 1, 3, None]]Passed
longer right[[1, 0, 2, 3], [1, 1, None, 4]][[1, 0, 2, 3], [1, 1, None, 4]]Passed
empty both[][[1, None, None, None]]Failed
null left[[1, 0, None, 2]][[1, 0, None, 2]]Passed
parent ordinal reset[[1, 0, 1, None], [2, 0, None, 3]][[1, 0, 1, None], [2, 0, None, 3]]Passed
empty relation[][]Passed
null right[[1, 0, 2, None]][[1, 0, 2, None]]Passed

SHA-256 / 4108fdd01d8d03f19add77182e5a7aff7a4764746e51f6b0136907f1efcbadce

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(d):
    try:
        out=[]
        for ident,left,right in d:
            left=[] if left is None else left
            right=[] if right is None else right
            size=max(len(left),len(right))
            if size==0: out.append([ident,0,None,None])
            for i in range(size):
                a=left[i] if i<len(left) else None
                b=right[i] if i<len(right) else None
                out.append([ident,i,a,b])
        return out
    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('longer left', solve([[1, [2, 3], [4]]]), [[1, 0, 2, 4], [1, 1, 3, None]])
    check('longer right', solve([[1, [2], [3, 4]]]), [[1, 0, 2, 3], [1, 1, None, 4]])
    check('empty both', solve([[1, [], None]]), [[1, None, None, None]])
    check('null left', solve([[1, None, [2]]]), [[1, 0, None, 2]])
    check('parent ordinal reset', solve([[1, [1], []], [2, [None], [3]]]), [[1, 0, 1, None], [2, 0, None, 3]])
    check('empty relation', solve([]), [])
    check('null right', solve([[1, [2], None]]), [[1, 0, 2, None]])
elif N == 2:
    check('longer left', solve([[2, [3, 4], [5]]]), [[2, 0, 3, 5], [2, 1, 4, None]])
    check('longer right', solve([[2, [3], [4, 5]]]), [[2, 0, 3, 4], [2, 1, None, 5]])
    check('empty both', solve([[2, [], None]]), [[2, None, None, None]])
    check('null left', solve([[2, None, [3]]]), [[2, 0, None, 3]])
    check('parent ordinal reset', solve([[2, [2], []], [3, [None], [4]]]), [[2, 0, 2, None], [3, 0, None, 4]])
    check('empty relation', solve([]), [])
    check('null right', solve([[2, [3], None]]), [[2, 0, 3, None]])
elif N == 3:
    check('longer left', solve([[3, [4, 5], [6]]]), [[3, 0, 4, 6], [3, 1, 5, None]])
    check('longer right', solve([[3, [4], [5, 6]]]), [[3, 0, 4, 5], [3, 1, None, 6]])
    check('empty both', solve([[3, [], None]]), [[3, None, None, None]])
    check('null left', solve([[3, None, [4]]]), [[3, 0, None, 4]])
    check('parent ordinal reset', solve([[3, [3], []], [4, [None], [5]]]), [[3, 0, 3, None], [4, 0, None, 5]])
    check('empty relation', solve([]), [])
    check('null right', solve([[3, [4], None]]), [[3, 0, 4, None]])
elif N == 4:
    check('longer left', solve([[4, [5, 6], [7]]]), [[4, 0, 5, 7], [4, 1, 6, None]])
    check('longer right', solve([[4, [5], [6, 7]]]), [[4, 0, 5, 6], [4, 1, None, 7]])
    check('empty both', solve([[4, [], None]]), [[4, None, None, None]])
    check('null left', solve([[4, None, [5]]]), [[4, 0, None, 5]])
    check('parent ordinal reset', solve([[4, [4], []], [5, [None], [6]]]), [[4, 0, 4, None], [5, 0, None, 6]])
    check('empty relation', solve([]), [])
    check('null right', solve([[4, [5], None]]), [[4, 0, 5, None]])
elif N == 5:
    check('longer left', solve([[5, [6, 7], [8]]]), [[5, 0, 6, 8], [5, 1, 7, None]])
    check('longer right', solve([[5, [6], [7, 8]]]), [[5, 0, 6, 7], [5, 1, None, 8]])
    check('empty both', solve([[5, [], None]]), [[5, None, None, None]])
    check('null left', solve([[5, None, [6]]]), [[5, 0, None, 6]])
    check('parent ordinal reset', solve([[5, [5], []], [6, [None], [7]]]), [[5, 0, 5, None], [6, 0, None, 7]])
    check('empty relation', solve([]), [])
    check('null right', solve([[5, [6], None]]), [[5, 0, 6, None]])
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
longer left[[1, 0, 2, 4], [1, 1, 3, None]][[1, 0, 2, 4], [1, 1, 3, None]]Passed
longer right[[1, 0, 2, 3], [1, 1, None, 4]][[1, 0, 2, 3], [1, 1, None, 4]]Passed
empty both[[1, 0, None, None]][[1, None, None, None]]Failed
null left[[1, 0, None, 2]][[1, 0, None, 2]]Passed
parent ordinal reset[[1, 0, 1, None], [2, 0, None, 3]][[1, 0, 1, None], [2, 0, None, 3]]Passed
empty relation[][]Passed
null right[[1, 0, 2, None]][[1, 0, 2, None]]Passed

SHA-256 / e235ae9a3079d92153026a43d2ba906f959e466628cc035b35d61b847f19ec9d

3 / The verified repair

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

N = 1
observations = []
def solve(d):
    try:
        out=[]
        for ident,left,right in d:
            left=[] if left is None else left
            right=[] if right is None else right
            size=max(len(left),len(right))
            if size==0: out.append([ident,None,None,None])
            for i in range(size):
                a=left[i] if i<len(left) else None
                b=right[i] if i<len(right) else None
                out.append([ident,i,a,b])
        return out
    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('longer left', solve([[1, [2, 3], [4]]]), [[1, 0, 2, 4], [1, 1, 3, None]])
    check('longer right', solve([[1, [2], [3, 4]]]), [[1, 0, 2, 3], [1, 1, None, 4]])
    check('empty both', solve([[1, [], None]]), [[1, None, None, None]])
    check('null left', solve([[1, None, [2]]]), [[1, 0, None, 2]])
    check('parent ordinal reset', solve([[1, [1], []], [2, [None], [3]]]), [[1, 0, 1, None], [2, 0, None, 3]])
    check('empty relation', solve([]), [])
    check('null right', solve([[1, [2], None]]), [[1, 0, 2, None]])
elif N == 2:
    check('longer left', solve([[2, [3, 4], [5]]]), [[2, 0, 3, 5], [2, 1, 4, None]])
    check('longer right', solve([[2, [3], [4, 5]]]), [[2, 0, 3, 4], [2, 1, None, 5]])
    check('empty both', solve([[2, [], None]]), [[2, None, None, None]])
    check('null left', solve([[2, None, [3]]]), [[2, 0, None, 3]])
    check('parent ordinal reset', solve([[2, [2], []], [3, [None], [4]]]), [[2, 0, 2, None], [3, 0, None, 4]])
    check('empty relation', solve([]), [])
    check('null right', solve([[2, [3], None]]), [[2, 0, 3, None]])
elif N == 3:
    check('longer left', solve([[3, [4, 5], [6]]]), [[3, 0, 4, 6], [3, 1, 5, None]])
    check('longer right', solve([[3, [4], [5, 6]]]), [[3, 0, 4, 5], [3, 1, None, 6]])
    check('empty both', solve([[3, [], None]]), [[3, None, None, None]])
    check('null left', solve([[3, None, [4]]]), [[3, 0, None, 4]])
    check('parent ordinal reset', solve([[3, [3], []], [4, [None], [5]]]), [[3, 0, 3, None], [4, 0, None, 5]])
    check('empty relation', solve([]), [])
    check('null right', solve([[3, [4], None]]), [[3, 0, 4, None]])
elif N == 4:
    check('longer left', solve([[4, [5, 6], [7]]]), [[4, 0, 5, 7], [4, 1, 6, None]])
    check('longer right', solve([[4, [5], [6, 7]]]), [[4, 0, 5, 6], [4, 1, None, 7]])
    check('empty both', solve([[4, [], None]]), [[4, None, None, None]])
    check('null left', solve([[4, None, [5]]]), [[4, 0, None, 5]])
    check('parent ordinal reset', solve([[4, [4], []], [5, [None], [6]]]), [[4, 0, 4, None], [5, 0, None, 6]])
    check('empty relation', solve([]), [])
    check('null right', solve([[4, [5], None]]), [[4, 0, 5, None]])
elif N == 5:
    check('longer left', solve([[5, [6, 7], [8]]]), [[5, 0, 6, 8], [5, 1, 7, None]])
    check('longer right', solve([[5, [6], [7, 8]]]), [[5, 0, 6, 7], [5, 1, None, 8]])
    check('empty both', solve([[5, [], None]]), [[5, None, None, None]])
    check('null left', solve([[5, None, [6]]]), [[5, 0, None, 6]])
    check('parent ordinal reset', solve([[5, [5], []], [6, [None], [7]]]), [[5, 0, 5, None], [6, 0, None, 7]])
    check('empty relation', solve([]), [])
    check('null right', solve([[5, [6], None]]), [[5, 0, 6, None]])
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
longer left[[1, 0, 2, 4], [1, 1, 3, None]][[1, 0, 2, 4], [1, 1, 3, None]]Passed
longer right[[1, 0, 2, 3], [1, 1, None, 4]][[1, 0, 2, 3], [1, 1, None, 4]]Passed
empty both[[1, None, None, None]][[1, None, None, None]]Passed
null left[[1, 0, None, 2]][[1, 0, None, 2]]Passed
parent ordinal reset[[1, 0, 1, None], [2, 0, None, 3]][[1, 0, 1, None], [2, 0, None, 3]]Passed
empty relation[][]Passed
null right[[1, 0, 2, None]][[1, 0, 2, None]]Passed

SHA-256 / 43c929ff7c3aefc2331910ce902bf7a10a94f21faa6ff8b70f441de35e7ea91d

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

Case digest / 5f18a273b869e3b4d01c83a5bdb9da617a1791df1fb6eac40fb74d35ca06ca3b