FA-47961 / Delimited text / Open access
Header disambiguation computes a suffix but emits the raw name · case 01
A structured table violates the declared record or column contract.
ROOT CAUSE
The resolved name is discarded at emission.
VERIFIED REPAIR
Preserve the named invariant at the faulty decision: out.append(candidate)
Unsuccessful approach: Stripping suffixes after resolution recreates the collision.
Case contract
Assign unique output names to repeated raw column names. First occurrence keeps its name; later duplicates append _2, _3, etc, skipping names already present anywhere in the raw header and names already assigned. Empty raw names use column<one-based-position> before collision handling. Preserve order.
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):
raw = data.split(',')
base = [name if name else 'column' + str(i+1) for i,name in enumerate(raw)]
reserved, used, out = set(base), set(), []
for name in base:
candidate = name
suffix = 2
while candidate in used:
candidate = name + '_' + str(suffix)
suffix += 1
while candidate in reserved:
candidate = name + '_' + str(suffix)
suffix += 1
out.append(name)
used.add(candidate)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('duplicates', solve(_vary('@,@,@')), _vary(['@', '@_2', '@_3']))
check('reserved', solve(_vary('a,a,a_2')), _vary(['a', 'a_3', 'a_2']))
check('multiple reserves', solve(_vary('a,a,a_2,a_3')), _vary(['a', 'a_4', 'a_2', 'a_3']))
check('blanks', solve(_vary(',x,')), _vary(['column1', 'x', 'column3']))
check('ordinary', solve(_vary('a,b')), _vary(['a', 'b']))
check('nested base', solve(_vary('a,a,a_2,a_2')), _vary(['a', 'a_3', 'a_2', 'a_2_2']))
check('empty', solve(_vary('')), _vary(['column1']))
check('reserved generated', solve(_vary('column2,,column2')), _vary(['column2', 'column2_2', 'column2_3']))
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 |
|---|---|---|---|
| duplicates | ['cell', 'cell', 'cell'] | ['cell', 'cell_2', 'cell_3'] | Failed |
| reserved | ['a', 'a', 'a_2'] | ['a', 'a_3', 'a_2'] | Failed |
| multiple reserves | ['a', 'a', 'a_2', 'a_3'] | ['a', 'a_4', 'a_2', 'a_3'] | Failed |
| blanks | ['column1', 'x', 'column3'] | ['column1', 'x', 'column3'] | Passed |
| ordinary | ['a', 'b'] | ['a', 'b'] | Passed |
| nested base | ['a', 'a', 'a_2', 'a_2'] | ['a', 'a_3', 'a_2', 'a_2_2'] | Failed |
| empty | ['column1'] | ['column1'] | Passed |
| reserved generated | ['column2', 'column2', 'column2'] | ['column2', 'column2_2', 'column2_3'] | Failed |
SHA-256 / 11b18f19058c8d7261ac2e8550396b5bb48282da255c2e926fe9af7466db138f
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):
raw = data.split(',')
base = [name if name else 'column' + str(i+1) for i,name in enumerate(raw)]
reserved, used, out = set(base), set(), []
for name in base:
candidate = name
suffix = 2
while candidate in used:
candidate = name + '_' + str(suffix)
suffix += 1
while candidate in reserved:
candidate = name + '_' + str(suffix)
suffix += 1
out.append(candidate.split('_')[0])
used.add(candidate)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('duplicates', solve(_vary('@,@,@')), _vary(['@', '@_2', '@_3']))
check('reserved', solve(_vary('a,a,a_2')), _vary(['a', 'a_3', 'a_2']))
check('multiple reserves', solve(_vary('a,a,a_2,a_3')), _vary(['a', 'a_4', 'a_2', 'a_3']))
check('blanks', solve(_vary(',x,')), _vary(['column1', 'x', 'column3']))
check('ordinary', solve(_vary('a,b')), _vary(['a', 'b']))
check('nested base', solve(_vary('a,a,a_2,a_2')), _vary(['a', 'a_3', 'a_2', 'a_2_2']))
check('empty', solve(_vary('')), _vary(['column1']))
check('reserved generated', solve(_vary('column2,,column2')), _vary(['column2', 'column2_2', 'column2_3']))
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 |
|---|---|---|---|
| duplicates | ['cell', 'cell', 'cell'] | ['cell', 'cell_2', 'cell_3'] | Failed |
| reserved | ['a', 'a', 'a'] | ['a', 'a_3', 'a_2'] | Failed |
| multiple reserves | ['a', 'a', 'a', 'a'] | ['a', 'a_4', 'a_2', 'a_3'] | Failed |
| blanks | ['column1', 'x', 'column3'] | ['column1', 'x', 'column3'] | Passed |
| ordinary | ['a', 'b'] | ['a', 'b'] | Passed |
| nested base | ['a', 'a', 'a', 'a'] | ['a', 'a_3', 'a_2', 'a_2_2'] | Failed |
| empty | ['column1'] | ['column1'] | Passed |
| reserved generated | ['column2', 'column2', 'column2'] | ['column2', 'column2_2', 'column2_3'] | Failed |
SHA-256 / 35110d7c6b328b55a5559a737fa88c5bfa02f24948acd23433ad328ad26df5f7
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):
raw = data.split(',')
base = [name if name else 'column' + str(i+1) for i,name in enumerate(raw)]
reserved, used, out = set(base), set(), []
for name in base:
candidate = name
suffix = 2
while candidate in used:
candidate = name + '_' + str(suffix)
suffix += 1
while candidate in reserved:
candidate = name + '_' + str(suffix)
suffix += 1
out.append(candidate)
used.add(candidate)
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('duplicates', solve(_vary('@,@,@')), _vary(['@', '@_2', '@_3']))
check('reserved', solve(_vary('a,a,a_2')), _vary(['a', 'a_3', 'a_2']))
check('multiple reserves', solve(_vary('a,a,a_2,a_3')), _vary(['a', 'a_4', 'a_2', 'a_3']))
check('blanks', solve(_vary(',x,')), _vary(['column1', 'x', 'column3']))
check('ordinary', solve(_vary('a,b')), _vary(['a', 'b']))
check('nested base', solve(_vary('a,a,a_2,a_2')), _vary(['a', 'a_3', 'a_2', 'a_2_2']))
check('empty', solve(_vary('')), _vary(['column1']))
check('reserved generated', solve(_vary('column2,,column2')), _vary(['column2', 'column2_2', 'column2_3']))
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 |
|---|---|---|---|
| duplicates | ['cell', 'cell_2', 'cell_3'] | ['cell', 'cell_2', 'cell_3'] | Passed |
| reserved | ['a', 'a_3', 'a_2'] | ['a', 'a_3', 'a_2'] | Passed |
| multiple reserves | ['a', 'a_4', 'a_2', 'a_3'] | ['a', 'a_4', 'a_2', 'a_3'] | Passed |
| blanks | ['column1', 'x', 'column3'] | ['column1', 'x', 'column3'] | Passed |
| ordinary | ['a', 'b'] | ['a', 'b'] | Passed |
| nested base | ['a', 'a_3', 'a_2', 'a_2_2'] | ['a', 'a_3', 'a_2', 'a_2_2'] | Passed |
| empty | ['column1'] | ['column1'] | Passed |
| reserved generated | ['column2', 'column2_2', 'column2_3'] | ['column2', 'column2_2', 'column2_3'] | Passed |
SHA-256 / fb4f4c33c5e2de48d6932ee009ec47fcbfbb0b5994c9917f6343315548438bfe
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:46.393919+00:00.
Case digest / 850428df95bb9f2811cf649d7192e8e90d87d10ba0b0584801a4fe71344990a8