FA-48111 / Delimited text / Open access
Default filling silently discards unexpected source columns · case 01
A structured table violates the declared record or column contract.
ROOT CAUSE
The binding step truncates an overwide record instead of reporting schema mismatch.
VERIFIED REPAIR
Preserve the named invariant at the faulty decision: if len(values) > 2: return None
Unsuccessful approach: Keeping the final columns drops different source data.
Case contract
Bind a two-column comma row to [a,b] with per-column defaults. An absent cell uses its default only if its required flag is false; a present empty cell stays empty. Surplus cells reject. Return ordered values. Defaults may be null or lists and must remain typed.
Why this case matters
Delimited interchange needs explicit framing, schema and field semantics at ingestion and emission boundaries.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
def _vary(value):
if value == '@END': return 3 + 4*N
if isinstance(value, str): return value.replace('@', 'cell' * N)
if isinstance(value, list): return [_vary(x) for x in value]
if isinstance(value, dict): return {_vary(k): _vary(v) for k,v in value.items()}
return value
N = 1
observations = []
def solve(data):
values = data['row'].split(',')
if len(values) > 2: values = values[:2]
out = []
for i in range(2):
if i < len(values): out.append(values[i])
elif data['required'][i]: return None
else: out.append(data['defaults'][i])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('missing optional', solve(_vary({'row': '@', 'required': [True, False], 'defaults': ['x', 'y']})), _vary(['@', 'y']))
check('present empty', solve(_vary({'row': '@,', 'required': [True, False], 'defaults': ['x', 'y']})), _vary(['@', '']))
check('missing required', solve(_vary({'row': '@', 'required': [False, True], 'defaults': ['x', 'y']})), _vary(None))
check('typed default', solve(_vary({'row': '@', 'required': [False, False], 'defaults': [0, [1, 2]]})), _vary(['@', [1, 2]]))
check('null default', solve(_vary({'row': '@', 'required': [False, False], 'defaults': [0, None]})), _vary(['@', None]))
check('extra', solve(_vary({'row': 'a,b,c', 'required': [False, False], 'defaults': [0, 1]})), _vary(None))
check('both present', solve(_vary({'row': '@,z', 'required': [True, True], 'defaults': [0, 1]})), _vary(['@', 'z']))
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 |
|---|---|---|---|
| missing optional | ['cell', 'y'] | ['cell', 'y'] | Passed |
| present empty | ['cell', ''] | ['cell', ''] | Passed |
| missing required | None | None | Passed |
| typed default | ['cell', [1, 2]] | ['cell', [1, 2]] | Passed |
| null default | ['cell', None] | ['cell', None] | Passed |
| extra | ['a', 'b'] | None | Failed |
| both present | ['cell', 'z'] | ['cell', 'z'] | Passed |
SHA-256 / 435eacc475a897dced6d80315071955b64fb6b15b7ca9071eb1e828a16907a3c
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
def _vary(value):
if value == '@END': return 3 + 4*N
if isinstance(value, str): return value.replace('@', 'cell' * N)
if isinstance(value, list): return [_vary(x) for x in value]
if isinstance(value, dict): return {_vary(k): _vary(v) for k,v in value.items()}
return value
N = 1
observations = []
def solve(data):
values = data['row'].split(',')
if len(values) > 2: values = values[-2:]
out = []
for i in range(2):
if i < len(values): out.append(values[i])
elif data['required'][i]: return None
else: out.append(data['defaults'][i])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('missing optional', solve(_vary({'row': '@', 'required': [True, False], 'defaults': ['x', 'y']})), _vary(['@', 'y']))
check('present empty', solve(_vary({'row': '@,', 'required': [True, False], 'defaults': ['x', 'y']})), _vary(['@', '']))
check('missing required', solve(_vary({'row': '@', 'required': [False, True], 'defaults': ['x', 'y']})), _vary(None))
check('typed default', solve(_vary({'row': '@', 'required': [False, False], 'defaults': [0, [1, 2]]})), _vary(['@', [1, 2]]))
check('null default', solve(_vary({'row': '@', 'required': [False, False], 'defaults': [0, None]})), _vary(['@', None]))
check('extra', solve(_vary({'row': 'a,b,c', 'required': [False, False], 'defaults': [0, 1]})), _vary(None))
check('both present', solve(_vary({'row': '@,z', 'required': [True, True], 'defaults': [0, 1]})), _vary(['@', 'z']))
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 |
|---|---|---|---|
| missing optional | ['cell', 'y'] | ['cell', 'y'] | Passed |
| present empty | ['cell', ''] | ['cell', ''] | Passed |
| missing required | None | None | Passed |
| typed default | ['cell', [1, 2]] | ['cell', [1, 2]] | Passed |
| null default | ['cell', None] | ['cell', None] | Passed |
| extra | ['b', 'c'] | None | Failed |
| both present | ['cell', 'z'] | ['cell', 'z'] | Passed |
SHA-256 / 054bbd9d971bf0b190e5f8c9113c1255f202a8eee6f8f077d2c980d8640b5068
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
def _vary(value):
if value == '@END': return 3 + 4*N
if isinstance(value, str): return value.replace('@', 'cell' * N)
if isinstance(value, list): return [_vary(x) for x in value]
if isinstance(value, dict): return {_vary(k): _vary(v) for k,v in value.items()}
return value
N = 1
observations = []
def solve(data):
values = data['row'].split(',')
if len(values) > 2: return None
out = []
for i in range(2):
if i < len(values): out.append(values[i])
elif data['required'][i]: return None
else: out.append(data['defaults'][i])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('missing optional', solve(_vary({'row': '@', 'required': [True, False], 'defaults': ['x', 'y']})), _vary(['@', 'y']))
check('present empty', solve(_vary({'row': '@,', 'required': [True, False], 'defaults': ['x', 'y']})), _vary(['@', '']))
check('missing required', solve(_vary({'row': '@', 'required': [False, True], 'defaults': ['x', 'y']})), _vary(None))
check('typed default', solve(_vary({'row': '@', 'required': [False, False], 'defaults': [0, [1, 2]]})), _vary(['@', [1, 2]]))
check('null default', solve(_vary({'row': '@', 'required': [False, False], 'defaults': [0, None]})), _vary(['@', None]))
check('extra', solve(_vary({'row': 'a,b,c', 'required': [False, False], 'defaults': [0, 1]})), _vary(None))
check('both present', solve(_vary({'row': '@,z', 'required': [True, True], 'defaults': [0, 1]})), _vary(['@', 'z']))
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 |
|---|---|---|---|
| missing optional | ['cell', 'y'] | ['cell', 'y'] | Passed |
| present empty | ['cell', ''] | ['cell', ''] | Passed |
| missing required | None | None | Passed |
| typed default | ['cell', [1, 2]] | ['cell', [1, 2]] | Passed |
| null default | ['cell', None] | ['cell', None] | Passed |
| extra | None | None | Passed |
| both present | ['cell', 'z'] | ['cell', 'z'] | Passed |
SHA-256 / f801dbaa204d403ef7cce6a57d5ee283120fddf28c218c32fcb182f32d2c5088
Verification & scope
Deterministic bounded in-memory model. No claim of complete CSV or external format conformance. 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:47.714077+00:00.
Case digest / a88a1ee38f53443b7bed2ee46aea6b4d50b6b7ae7f6b5e74b0592e45b327b17e