FAILURE MAP
← Case archive

FA-45576 / Data systems / Open access

Default evaluation discards rules whose dependencies appear later · case 01

Default evaluation discards rules whose dependencies appear later.

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

ROOT CAUSE

default-column-dependencies: Default evaluation discards rules whose dependencies appear later.

VERIFIED REPAIR

Preserve the stated physical representation and operation order: Materialize missing columns using ordered default rules [target,source-or-None,constant]. A constant rule writes constant; a dependent rule writes source+constant, propagating explicit null. Existing columns including None and zero never change. Resolve forward dependencies to a fixed point; unresolved dependencies return DEFAULT_CYCLE.

Unsuccessful approach: Declaring a cycle before trying later rules rejects resolvable forward references.

Case contract

Materialize missing columns using ordered default rules [target,source-or-None,constant]. A constant rule writes constant; a dependent rule writes source+constant, propagating explicit null. Existing columns including None and zero never change. Resolve forward dependencies to a fixed point; unresolved dependencies return DEFAULT_CYCLE.

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:
        row,rules=d
        result=dict(row)
        pending=[rule for rule in rules if rule[0] not in result]
        while pending:
            progressed=False; later=[]
            for target,source,constant in pending:
                if source is not None and source not in result:
                    continue
                result[target]=constant if source is None else (None if result[source] is None else result[source]+constant)
                progressed=True
            if not progressed: return 'DEFAULT_CYCLE'
            pending=later
        return result
    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('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 1]]]), {'a': 1, 'b': 3})
    check('explicit null', solve([{'a': None}, [['a', None, 1], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 1], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 1}, [['a', None, 2]]]), {'x': 1, 'a': 2})
    check('source provided', solve([{'a': 1}, [['b', 'a', 3]]]), {'a': 1, 'b': 4})
    check('no defaults', solve([{'a': 1}, []]), {'a': 1})
elif N == 2:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 2]]]), {'a': 2, 'b': 4})
    check('explicit null', solve([{'a': None}, [['a', None, 2], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 2], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 2}, [['a', None, 3]]]), {'x': 2, 'a': 3})
    check('source provided', solve([{'a': 2}, [['b', 'a', 3]]]), {'a': 2, 'b': 5})
    check('no defaults', solve([{'a': 2}, []]), {'a': 2})
elif N == 3:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 3]]]), {'a': 3, 'b': 5})
    check('explicit null', solve([{'a': None}, [['a', None, 3], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 3], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 3}, [['a', None, 4]]]), {'x': 3, 'a': 4})
    check('source provided', solve([{'a': 3}, [['b', 'a', 3]]]), {'a': 3, 'b': 6})
    check('no defaults', solve([{'a': 3}, []]), {'a': 3})
elif N == 4:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 4]]]), {'a': 4, 'b': 6})
    check('explicit null', solve([{'a': None}, [['a', None, 4], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 4], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 4}, [['a', None, 5]]]), {'x': 4, 'a': 5})
    check('source provided', solve([{'a': 4}, [['b', 'a', 3]]]), {'a': 4, 'b': 7})
    check('no defaults', solve([{'a': 4}, []]), {'a': 4})
elif N == 5:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 5]]]), {'a': 5, 'b': 7})
    check('explicit null', solve([{'a': None}, [['a', None, 5], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 5], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 5}, [['a', None, 6]]]), {'x': 5, 'a': 6})
    check('source provided', solve([{'a': 5}, [['b', 'a', 3]]]), {'a': 5, 'b': 8})
    check('no defaults', solve([{'a': 5}, []]), {'a': 5})
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
forward dependency{'a': 1}{'a': 1, 'b': 3}Failed
explicit null{'a': None, 'b': None}{'a': None, 'b': None}Passed
explicit zero{'a': 0, 'b': 2}{'a': 0, 'b': 2}Passed
dependency cycleDEFAULT_CYCLEDEFAULT_CYCLEPassed
provided unrelated{'a': 2, 'x': 1}{'a': 2, 'x': 1}Passed
source provided{'a': 1, 'b': 4}{'a': 1, 'b': 4}Passed
no defaults{'a': 1}{'a': 1}Passed

SHA-256 / 1583b04f7f29f541fff1b4e325965480b0ea1f6b4fb1a67032d3703017445732

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(d):
    try:
        row,rules=d
        result=dict(row)
        pending=[rule for rule in rules if rule[0] not in result]
        while pending:
            progressed=False; later=[]
            for target,source,constant in pending:
                if source is not None and source not in result:
                    return 'DEFAULT_CYCLE'
                result[target]=constant if source is None else (None if result[source] is None else result[source]+constant)
                progressed=True
            if not progressed: return 'DEFAULT_CYCLE'
            pending=later
        return result
    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('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 1]]]), {'a': 1, 'b': 3})
    check('explicit null', solve([{'a': None}, [['a', None, 1], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 1], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 1}, [['a', None, 2]]]), {'x': 1, 'a': 2})
    check('source provided', solve([{'a': 1}, [['b', 'a', 3]]]), {'a': 1, 'b': 4})
    check('no defaults', solve([{'a': 1}, []]), {'a': 1})
elif N == 2:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 2]]]), {'a': 2, 'b': 4})
    check('explicit null', solve([{'a': None}, [['a', None, 2], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 2], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 2}, [['a', None, 3]]]), {'x': 2, 'a': 3})
    check('source provided', solve([{'a': 2}, [['b', 'a', 3]]]), {'a': 2, 'b': 5})
    check('no defaults', solve([{'a': 2}, []]), {'a': 2})
elif N == 3:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 3]]]), {'a': 3, 'b': 5})
    check('explicit null', solve([{'a': None}, [['a', None, 3], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 3], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 3}, [['a', None, 4]]]), {'x': 3, 'a': 4})
    check('source provided', solve([{'a': 3}, [['b', 'a', 3]]]), {'a': 3, 'b': 6})
    check('no defaults', solve([{'a': 3}, []]), {'a': 3})
elif N == 4:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 4]]]), {'a': 4, 'b': 6})
    check('explicit null', solve([{'a': None}, [['a', None, 4], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 4], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 4}, [['a', None, 5]]]), {'x': 4, 'a': 5})
    check('source provided', solve([{'a': 4}, [['b', 'a', 3]]]), {'a': 4, 'b': 7})
    check('no defaults', solve([{'a': 4}, []]), {'a': 4})
elif N == 5:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 5]]]), {'a': 5, 'b': 7})
    check('explicit null', solve([{'a': None}, [['a', None, 5], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 5], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 5}, [['a', None, 6]]]), {'x': 5, 'a': 6})
    check('source provided', solve([{'a': 5}, [['b', 'a', 3]]]), {'a': 5, 'b': 8})
    check('no defaults', solve([{'a': 5}, []]), {'a': 5})
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
forward dependencyDEFAULT_CYCLE{'a': 1, 'b': 3}Failed
explicit null{'a': None, 'b': None}{'a': None, 'b': None}Passed
explicit zero{'a': 0, 'b': 2}{'a': 0, 'b': 2}Passed
dependency cycleDEFAULT_CYCLEDEFAULT_CYCLEPassed
provided unrelated{'a': 2, 'x': 1}{'a': 2, 'x': 1}Passed
source provided{'a': 1, 'b': 4}{'a': 1, 'b': 4}Passed
no defaults{'a': 1}{'a': 1}Passed

SHA-256 / f1b6a83bb6a6181c6100879a956bdcae86a87d54e8432b03014b0e9fd21a447d

3 / The verified repair

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

N = 1
observations = []
def solve(d):
    try:
        row,rules=d
        result=dict(row)
        pending=[rule for rule in rules if rule[0] not in result]
        while pending:
            progressed=False; later=[]
            for target,source,constant in pending:
                if source is not None and source not in result:
                    later.append([target,source,constant]); continue
                result[target]=constant if source is None else (None if result[source] is None else result[source]+constant)
                progressed=True
            if not progressed: return 'DEFAULT_CYCLE'
            pending=later
        return result
    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('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 1]]]), {'a': 1, 'b': 3})
    check('explicit null', solve([{'a': None}, [['a', None, 1], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 1], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 1}, [['a', None, 2]]]), {'x': 1, 'a': 2})
    check('source provided', solve([{'a': 1}, [['b', 'a', 3]]]), {'a': 1, 'b': 4})
    check('no defaults', solve([{'a': 1}, []]), {'a': 1})
elif N == 2:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 2]]]), {'a': 2, 'b': 4})
    check('explicit null', solve([{'a': None}, [['a', None, 2], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 2], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 2}, [['a', None, 3]]]), {'x': 2, 'a': 3})
    check('source provided', solve([{'a': 2}, [['b', 'a', 3]]]), {'a': 2, 'b': 5})
    check('no defaults', solve([{'a': 2}, []]), {'a': 2})
elif N == 3:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 3]]]), {'a': 3, 'b': 5})
    check('explicit null', solve([{'a': None}, [['a', None, 3], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 3], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 3}, [['a', None, 4]]]), {'x': 3, 'a': 4})
    check('source provided', solve([{'a': 3}, [['b', 'a', 3]]]), {'a': 3, 'b': 6})
    check('no defaults', solve([{'a': 3}, []]), {'a': 3})
elif N == 4:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 4]]]), {'a': 4, 'b': 6})
    check('explicit null', solve([{'a': None}, [['a', None, 4], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 4], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 4}, [['a', None, 5]]]), {'x': 4, 'a': 5})
    check('source provided', solve([{'a': 4}, [['b', 'a', 3]]]), {'a': 4, 'b': 7})
    check('no defaults', solve([{'a': 4}, []]), {'a': 4})
elif N == 5:
    check('forward dependency', solve([{}, [['b', 'a', 2], ['a', None, 5]]]), {'a': 5, 'b': 7})
    check('explicit null', solve([{'a': None}, [['a', None, 5], ['b', 'a', 1]]]), {'a': None, 'b': None})
    check('explicit zero', solve([{'a': 0}, [['a', None, 5], ['b', 'a', 2]]]), {'a': 0, 'b': 2})
    check('dependency cycle', solve([{}, [['a', 'b', 1], ['b', 'a', 1]]]), 'DEFAULT_CYCLE')
    check('provided unrelated', solve([{'x': 5}, [['a', None, 6]]]), {'x': 5, 'a': 6})
    check('source provided', solve([{'a': 5}, [['b', 'a', 3]]]), {'a': 5, 'b': 8})
    check('no defaults', solve([{'a': 5}, []]), {'a': 5})
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
forward dependency{'a': 1, 'b': 3}{'a': 1, 'b': 3}Passed
explicit null{'a': None, 'b': None}{'a': None, 'b': None}Passed
explicit zero{'a': 0, 'b': 2}{'a': 0, 'b': 2}Passed
dependency cycleDEFAULT_CYCLEDEFAULT_CYCLEPassed
provided unrelated{'a': 2, 'x': 1}{'a': 2, 'x': 1}Passed
source provided{'a': 1, 'b': 4}{'a': 1, 'b': 4}Passed
no defaults{'a': 1}{'a': 1}Passed

SHA-256 / 138b8bca3f384e9751924b70f36f2a59c6e5b1fcb25fb0ec286710d4c91a291f

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

Case digest / feaec58298a94b31ecdf56b99ae9b397e65b9b3d8a4cd74413a7e5357352241d