FAILURE MAP
← Case archive

FA-44581 / Data systems / Open access

Zip unnest truncates to the shorter list · case 01

Zip unnest truncates to the shorter list.

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

ROOT CAUSE

zip-list-unnest: Zip unnest truncates to the shorter list.

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: Using only the left size still truncates longer right lists.

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=min(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, 0, 2, 4], [1, 1, 3, None]]Failed
longer right[[1, 0, 2, 3]][[1, 0, 2, 3], [1, 1, None, 4]]Failed
empty both[[1, None, None, None]][[1, None, None, None]]Passed
null left[[1, None, None, None]][[1, 0, None, 2]]Failed
parent ordinal reset[[1, None, None, None], [2, 0, None, 3]][[1, 0, 1, None], [2, 0, None, 3]]Failed
empty relation[][]Passed
null right[[1, None, None, None]][[1, 0, 2, None]]Failed

SHA-256 / 8b3a6ff7b75503259e8dff9dddedd9590819240eadfa2866bf0a407e6f4594bb

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=len(left)
            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, 0, 2, 3], [1, 1, None, 4]]Failed
empty both[[1, None, None, None]][[1, None, None, None]]Passed
null left[[1, None, None, None]][[1, 0, None, 2]]Failed
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 / a10e3305f09e3b22c40e46c0d56f1492802aea657960cb7df4f8dea99683c95c

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

Case digest / ab0529f3cc577c1c54dafa3f9a520531d7f65aafc6ee39d303ce75427979e386