FA-12651 / Causal analysis data contracts / Open access
Post-assignment covariates enter a prespecified baseline adjustment set · case 01
Post-assignment covariates enter a prespecified baseline adjustment set.
ROOT CAUSE
Candidate columns are accepted without enforcing the design cutoff.
VERIFIED REPAIR
Require approved baseline role and measurement strictly before assignment.
Unsuccessful approach: Role filtering alone retains mislabeled late measurements.
Case contract
Candidates [name,role,time] have roles baseline, mediator, or outcome. Return sorted baseline names measured strictly before assignment time.
Why this case matters
A deterministic synthetic study model isolates this data-contract defect; outputs alone establish no real-world causal identification.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(candidates, assigned_at):
return sorted(r[0] for r in candidates)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('late baseline', solve([['x','baseline',N+1]], N), [])
check('proper baseline', solve([['x','baseline',N-1]], N), ['x'])
check('same instant', solve([['x','baseline',N]], N), [])
check('mediator', solve([['m','mediator',N-1]], N), [])
check('empty', solve([], N), [])
check('mixed', solve([['z','baseline',N-2],['a','baseline',N-1],['y','outcome',N+2]], N), ['a','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 |
|---|---|---|---|
| late baseline | ['x'] | [] | Failed |
| proper baseline | ['x'] | ['x'] | Passed |
| same instant | ['x'] | [] | Failed |
| mediator | ['m'] | [] | Failed |
| empty | [] | [] | Passed |
| mixed | ['a', 'y', 'z'] | ['a', 'z'] | Failed |
SHA-256 / 9a9fa62fe41070d3114c6f97046426a52bd38df28edf1cf4cfce5a8c537ee7c6
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(candidates, assigned_at):
return sorted(r[0] for r in candidates if r[1] == 'baseline')
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('late baseline', solve([['x','baseline',N+1]], N), [])
check('proper baseline', solve([['x','baseline',N-1]], N), ['x'])
check('same instant', solve([['x','baseline',N]], N), [])
check('mediator', solve([['m','mediator',N-1]], N), [])
check('empty', solve([], N), [])
check('mixed', solve([['z','baseline',N-2],['a','baseline',N-1],['y','outcome',N+2]], N), ['a','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 |
|---|---|---|---|
| late baseline | ['x'] | [] | Failed |
| proper baseline | ['x'] | ['x'] | Passed |
| same instant | ['x'] | [] | Failed |
| mediator | [] | [] | Passed |
| empty | [] | [] | Passed |
| mixed | ['a', 'z'] | ['a', 'z'] | Passed |
SHA-256 / e6553bc0e1dfc6138e9cba205d7c58ac575dd59594cdea384deb778a5a25b676
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(candidates, assigned_at):
return sorted(r[0] for r in candidates if r[1] == 'baseline' and r[2] < assigned_at)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('late baseline', solve([['x','baseline',N+1]], N), [])
check('proper baseline', solve([['x','baseline',N-1]], N), ['x'])
check('same instant', solve([['x','baseline',N]], N), [])
check('mediator', solve([['m','mediator',N-1]], N), [])
check('empty', solve([], N), [])
check('mixed', solve([['z','baseline',N-2],['a','baseline',N-1],['y','outcome',N+2]], N), ['a','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 |
|---|---|---|---|
| late baseline | [] | [] | Passed |
| proper baseline | ['x'] | ['x'] | Passed |
| same instant | [] | [] | Passed |
| mediator | [] | [] | Passed |
| empty | [] | [] | Passed |
| mixed | ['a', 'z'] | ['a', 'z'] | Passed |
SHA-256 / 511ca6c282559cabb9f06f944cc1d8d49d11478b40a9ef8107817e116bd34eb1
Verification & scope
Finite, fully specified synthetic data only; identification assumptions are supplied by the fixture design, not inferred from observations. 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:38:58.793953+00:00.
Case digest / 3402645a8e5db7b1b5d9c89d73c062fe6ae58b12c79f15d8baac9c920e21ea3a