FA-90556 / Garbage collector invariants / Open access
Ephemerons: values traced regardless of key liveness · case 01
Weak-keyed tables keep every value alive, leaking entries whose keys died.
ROOT CAUSE
The value is marked without checking that its key is reachable.
VERIFIED REPAIR
Trace the value only when the key is reachable.
Unsuccessful approach: Accepting only root keys drops values whose keys are reachable through the heap.
Case contract
Ephemeron entries [table, key, value]: the value is traced only when both the table and the key are reachable; values may make further keys reachable, so iterate to a fixpoint. Keys and tables are never retained by an entry. Return the sorted live set and the [table, key] entries of live tables whose key died (to be cleared).
Why this case matters
WeakMap-style tables need fixpoint ephemeron marking or they leak or lose entries.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(heap, roots, eph):
live = set()
def mark(starts):
stack = list(starts)
while stack:
o = stack.pop()
if o in live:
continue
live.add(o)
stack.extend(heap.get(o, []))
mark(roots)
changed = True
while changed:
changed = False
for table, k, v in eph:
if table in live and v not in live:
mark([v])
changed = True
cleared = sorted([t, k] for t, k, v in eph if t in live and k not in live)
return {'live': sorted(live), 'cleared': cleared}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression: ephemeron chain listed in reverse',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'V2_1', 'V3_1'], ['T1', 'V1_1', 'V2_1'], ['T1', 'K1_1', 'V1_1']]),
{'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']}),
('dead key does not retain its value',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'K2_1', 'V4_1']]),
{'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']}),
('dead table does not retain values',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['U1', 'K1_1', 'V5_1']]),
{'cleared': [], 'live': ['K1_1', 'T1', 'V7_1', 'root']}),
('dead key in a dead table is not reported',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['U1', 'K2_1', 'V6_1'], ['T1', 'K1_1', 'V1_1']]),
{'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']}),
('dead key whose value is live elsewhere',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'K3_1', 'V7_1'], ['T1', 'K1_1', 'V1_1']]),
{'cleared': [['T1', 'K3_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']}),
('value reached through a key held only by another value',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'V2_1', 'V3_1'], ['T1', 'V1_1', 'V2_1'], ['T1', 'K1_1', 'V1_1'], ['T1', 'K2_1', 'V4_1']]),
{'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']}),
('control: plain reachability',
({'a1': ['b1'], 'root': ['a1']}, ['root'], []),
{'cleared': [], 'live': ['a1', 'b1', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'V2_2', 'V3_2'], ['T2', 'V1_2', 'V2_2'], ['T2', 'K1_2', 'V1_2']]),
{'cleared': [], 'live': ['K1_2', 'T2', 'V1_2', 'V2_2', 'V3_2', 'V7_2', 'root']}),
('dead key does not retain its value',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'K2_2', 'V4_2']]),
{'cleared': [['T2', 'K2_2']], 'live': ['K1_2', 'T2', 'V7_2', 'root']}),
('dead table does not retain values',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['U2', 'K1_2', 'V5_2']]),
{'cleared': [], 'live': ['K1_2', 'T2', 'V7_2', 'root']}),
('dead key in a dead table is not reported',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['U2', 'K2_2', 'V6_2'], ['T2', 'K1_2', 'V1_2']]),
{'cleared': [], 'live': ['K1_2', 'T2', 'V1_2', 'V7_2', 'root']}),
('dead key whose value is live elsewhere',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'K3_2', 'V7_2'], ['T2', 'K1_2', 'V1_2']]),
{'cleared': [['T2', 'K3_2']], 'live': ['K1_2', 'T2', 'V1_2', 'V7_2', 'root']}),
('value reached through a key held only by another value',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'V2_2', 'V3_2'], ['T2', 'V1_2', 'V2_2'], ['T2', 'K1_2', 'V1_2'], ['T2', 'K2_2', 'V4_2']]),
{'cleared': [['T2', 'K2_2']], 'live': ['K1_2', 'T2', 'V1_2', 'V2_2', 'V3_2', 'V7_2', 'root']}),
('control: plain reachability',
({'a2': ['b2'], 'root': ['a2']}, ['root'], []),
{'cleared': [], 'live': ['a2', 'b2', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'V2_3', 'V3_3'], ['T3', 'V1_3', 'V2_3'], ['T3', 'K1_3', 'V1_3']]),
{'cleared': [], 'live': ['K1_3', 'T3', 'V1_3', 'V2_3', 'V3_3', 'V7_3', 'root']}),
('dead key does not retain its value',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'K2_3', 'V4_3']]),
{'cleared': [['T3', 'K2_3']], 'live': ['K1_3', 'T3', 'V7_3', 'root']}),
('dead table does not retain values',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['U3', 'K1_3', 'V5_3']]),
{'cleared': [], 'live': ['K1_3', 'T3', 'V7_3', 'root']}),
('dead key in a dead table is not reported',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['U3', 'K2_3', 'V6_3'], ['T3', 'K1_3', 'V1_3']]),
{'cleared': [], 'live': ['K1_3', 'T3', 'V1_3', 'V7_3', 'root']}),
('dead key whose value is live elsewhere',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'K3_3', 'V7_3'], ['T3', 'K1_3', 'V1_3']]),
{'cleared': [['T3', 'K3_3']], 'live': ['K1_3', 'T3', 'V1_3', 'V7_3', 'root']}),
('value reached through a key held only by another value',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'V2_3', 'V3_3'], ['T3', 'V1_3', 'V2_3'], ['T3', 'K1_3', 'V1_3'], ['T3', 'K2_3', 'V4_3']]),
{'cleared': [['T3', 'K2_3']], 'live': ['K1_3', 'T3', 'V1_3', 'V2_3', 'V3_3', 'V7_3', 'root']}),
('control: plain reachability',
({'a3': ['b3'], 'root': ['a3']}, ['root'], []),
{'cleared': [], 'live': ['a3', 'b3', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'V2_4', 'V3_4'], ['T4', 'V1_4', 'V2_4'], ['T4', 'K1_4', 'V1_4']]),
{'cleared': [], 'live': ['K1_4', 'T4', 'V1_4', 'V2_4', 'V3_4', 'V7_4', 'root']}),
('dead key does not retain its value',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'K2_4', 'V4_4']]),
{'cleared': [['T4', 'K2_4']], 'live': ['K1_4', 'T4', 'V7_4', 'root']}),
('dead table does not retain values',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['U4', 'K1_4', 'V5_4']]),
{'cleared': [], 'live': ['K1_4', 'T4', 'V7_4', 'root']}),
('dead key in a dead table is not reported',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['U4', 'K2_4', 'V6_4'], ['T4', 'K1_4', 'V1_4']]),
{'cleared': [], 'live': ['K1_4', 'T4', 'V1_4', 'V7_4', 'root']}),
('dead key whose value is live elsewhere',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'K3_4', 'V7_4'], ['T4', 'K1_4', 'V1_4']]),
{'cleared': [['T4', 'K3_4']], 'live': ['K1_4', 'T4', 'V1_4', 'V7_4', 'root']}),
('value reached through a key held only by another value',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'V2_4', 'V3_4'], ['T4', 'V1_4', 'V2_4'], ['T4', 'K1_4', 'V1_4'], ['T4', 'K2_4', 'V4_4']]),
{'cleared': [['T4', 'K2_4']], 'live': ['K1_4', 'T4', 'V1_4', 'V2_4', 'V3_4', 'V7_4', 'root']}),
('control: plain reachability',
({'a4': ['b4'], 'root': ['a4']}, ['root'], []),
{'cleared': [], 'live': ['a4', 'b4', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'V2_5', 'V3_5'], ['T5', 'V1_5', 'V2_5'], ['T5', 'K1_5', 'V1_5']]),
{'cleared': [], 'live': ['K1_5', 'T5', 'V1_5', 'V2_5', 'V3_5', 'V7_5', 'root']}),
('dead key does not retain its value',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'K2_5', 'V4_5']]),
{'cleared': [['T5', 'K2_5']], 'live': ['K1_5', 'T5', 'V7_5', 'root']}),
('dead table does not retain values',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['U5', 'K1_5', 'V5_5']]),
{'cleared': [], 'live': ['K1_5', 'T5', 'V7_5', 'root']}),
('dead key in a dead table is not reported',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['U5', 'K2_5', 'V6_5'], ['T5', 'K1_5', 'V1_5']]),
{'cleared': [], 'live': ['K1_5', 'T5', 'V1_5', 'V7_5', 'root']}),
('dead key whose value is live elsewhere',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'K3_5', 'V7_5'], ['T5', 'K1_5', 'V1_5']]),
{'cleared': [['T5', 'K3_5']], 'live': ['K1_5', 'T5', 'V1_5', 'V7_5', 'root']}),
('value reached through a key held only by another value',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'V2_5', 'V3_5'], ['T5', 'V1_5', 'V2_5'], ['T5', 'K1_5', 'V1_5'], ['T5', 'K2_5', 'V4_5']]),
{'cleared': [['T5', 'K2_5']], 'live': ['K1_5', 'T5', 'V1_5', 'V2_5', 'V3_5', 'V7_5', 'root']}),
('control: plain reachability',
({'a5': ['b5'], 'root': ['a5']}, ['root'], []),
{'cleared': [], 'live': ['a5', 'b5', 'root']})]]
for label, args, expected in cases[N - 1]:
check(label, solve(*args), expected)
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 |
|---|---|---|---|
| regression: ephemeron chain listed in reverse | {'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']} | {'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']} | Passed |
| dead key does not retain its value | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V4_1', 'V7_1', 'root']} | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | Failed |
| dead table does not retain values | {'cleared': [], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | {'cleared': [], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | Passed |
| dead key in a dead table is not reported | {'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']} | {'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']} | Passed |
| dead key whose value is live elsewhere | {'cleared': [['T1', 'K3_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']} | {'cleared': [['T1', 'K3_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']} | Passed |
| value reached through a key held only by another value | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V4_1', 'V7_1', 'root']} | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']} | Failed |
| control: plain reachability | {'cleared': [], 'live': ['a1', 'b1', 'root']} | {'cleared': [], 'live': ['a1', 'b1', 'root']} | Passed |
SHA-256 / 31abb515de7381a19e9fd9caaf8fdac16a3d3e7870122ed30b67e5b068677c22
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(heap, roots, eph):
live = set()
def mark(starts):
stack = list(starts)
while stack:
o = stack.pop()
if o in live:
continue
live.add(o)
stack.extend(heap.get(o, []))
mark(roots)
changed = True
while changed:
changed = False
for table, k, v in eph:
if table in live and k in roots and v not in live:
mark([v])
changed = True
cleared = sorted([t, k] for t, k, v in eph if t in live and k not in live)
return {'live': sorted(live), 'cleared': cleared}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression: ephemeron chain listed in reverse',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'V2_1', 'V3_1'], ['T1', 'V1_1', 'V2_1'], ['T1', 'K1_1', 'V1_1']]),
{'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']}),
('dead key does not retain its value',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'K2_1', 'V4_1']]),
{'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']}),
('dead table does not retain values',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['U1', 'K1_1', 'V5_1']]),
{'cleared': [], 'live': ['K1_1', 'T1', 'V7_1', 'root']}),
('dead key in a dead table is not reported',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['U1', 'K2_1', 'V6_1'], ['T1', 'K1_1', 'V1_1']]),
{'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']}),
('dead key whose value is live elsewhere',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'K3_1', 'V7_1'], ['T1', 'K1_1', 'V1_1']]),
{'cleared': [['T1', 'K3_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']}),
('value reached through a key held only by another value',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'V2_1', 'V3_1'], ['T1', 'V1_1', 'V2_1'], ['T1', 'K1_1', 'V1_1'], ['T1', 'K2_1', 'V4_1']]),
{'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']}),
('control: plain reachability',
({'a1': ['b1'], 'root': ['a1']}, ['root'], []),
{'cleared': [], 'live': ['a1', 'b1', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'V2_2', 'V3_2'], ['T2', 'V1_2', 'V2_2'], ['T2', 'K1_2', 'V1_2']]),
{'cleared': [], 'live': ['K1_2', 'T2', 'V1_2', 'V2_2', 'V3_2', 'V7_2', 'root']}),
('dead key does not retain its value',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'K2_2', 'V4_2']]),
{'cleared': [['T2', 'K2_2']], 'live': ['K1_2', 'T2', 'V7_2', 'root']}),
('dead table does not retain values',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['U2', 'K1_2', 'V5_2']]),
{'cleared': [], 'live': ['K1_2', 'T2', 'V7_2', 'root']}),
('dead key in a dead table is not reported',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['U2', 'K2_2', 'V6_2'], ['T2', 'K1_2', 'V1_2']]),
{'cleared': [], 'live': ['K1_2', 'T2', 'V1_2', 'V7_2', 'root']}),
('dead key whose value is live elsewhere',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'K3_2', 'V7_2'], ['T2', 'K1_2', 'V1_2']]),
{'cleared': [['T2', 'K3_2']], 'live': ['K1_2', 'T2', 'V1_2', 'V7_2', 'root']}),
('value reached through a key held only by another value',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'V2_2', 'V3_2'], ['T2', 'V1_2', 'V2_2'], ['T2', 'K1_2', 'V1_2'], ['T2', 'K2_2', 'V4_2']]),
{'cleared': [['T2', 'K2_2']], 'live': ['K1_2', 'T2', 'V1_2', 'V2_2', 'V3_2', 'V7_2', 'root']}),
('control: plain reachability',
({'a2': ['b2'], 'root': ['a2']}, ['root'], []),
{'cleared': [], 'live': ['a2', 'b2', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'V2_3', 'V3_3'], ['T3', 'V1_3', 'V2_3'], ['T3', 'K1_3', 'V1_3']]),
{'cleared': [], 'live': ['K1_3', 'T3', 'V1_3', 'V2_3', 'V3_3', 'V7_3', 'root']}),
('dead key does not retain its value',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'K2_3', 'V4_3']]),
{'cleared': [['T3', 'K2_3']], 'live': ['K1_3', 'T3', 'V7_3', 'root']}),
('dead table does not retain values',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['U3', 'K1_3', 'V5_3']]),
{'cleared': [], 'live': ['K1_3', 'T3', 'V7_3', 'root']}),
('dead key in a dead table is not reported',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['U3', 'K2_3', 'V6_3'], ['T3', 'K1_3', 'V1_3']]),
{'cleared': [], 'live': ['K1_3', 'T3', 'V1_3', 'V7_3', 'root']}),
('dead key whose value is live elsewhere',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'K3_3', 'V7_3'], ['T3', 'K1_3', 'V1_3']]),
{'cleared': [['T3', 'K3_3']], 'live': ['K1_3', 'T3', 'V1_3', 'V7_3', 'root']}),
('value reached through a key held only by another value',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'V2_3', 'V3_3'], ['T3', 'V1_3', 'V2_3'], ['T3', 'K1_3', 'V1_3'], ['T3', 'K2_3', 'V4_3']]),
{'cleared': [['T3', 'K2_3']], 'live': ['K1_3', 'T3', 'V1_3', 'V2_3', 'V3_3', 'V7_3', 'root']}),
('control: plain reachability',
({'a3': ['b3'], 'root': ['a3']}, ['root'], []),
{'cleared': [], 'live': ['a3', 'b3', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'V2_4', 'V3_4'], ['T4', 'V1_4', 'V2_4'], ['T4', 'K1_4', 'V1_4']]),
{'cleared': [], 'live': ['K1_4', 'T4', 'V1_4', 'V2_4', 'V3_4', 'V7_4', 'root']}),
('dead key does not retain its value',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'K2_4', 'V4_4']]),
{'cleared': [['T4', 'K2_4']], 'live': ['K1_4', 'T4', 'V7_4', 'root']}),
('dead table does not retain values',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['U4', 'K1_4', 'V5_4']]),
{'cleared': [], 'live': ['K1_4', 'T4', 'V7_4', 'root']}),
('dead key in a dead table is not reported',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['U4', 'K2_4', 'V6_4'], ['T4', 'K1_4', 'V1_4']]),
{'cleared': [], 'live': ['K1_4', 'T4', 'V1_4', 'V7_4', 'root']}),
('dead key whose value is live elsewhere',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'K3_4', 'V7_4'], ['T4', 'K1_4', 'V1_4']]),
{'cleared': [['T4', 'K3_4']], 'live': ['K1_4', 'T4', 'V1_4', 'V7_4', 'root']}),
('value reached through a key held only by another value',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'V2_4', 'V3_4'], ['T4', 'V1_4', 'V2_4'], ['T4', 'K1_4', 'V1_4'], ['T4', 'K2_4', 'V4_4']]),
{'cleared': [['T4', 'K2_4']], 'live': ['K1_4', 'T4', 'V1_4', 'V2_4', 'V3_4', 'V7_4', 'root']}),
('control: plain reachability',
({'a4': ['b4'], 'root': ['a4']}, ['root'], []),
{'cleared': [], 'live': ['a4', 'b4', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'V2_5', 'V3_5'], ['T5', 'V1_5', 'V2_5'], ['T5', 'K1_5', 'V1_5']]),
{'cleared': [], 'live': ['K1_5', 'T5', 'V1_5', 'V2_5', 'V3_5', 'V7_5', 'root']}),
('dead key does not retain its value',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'K2_5', 'V4_5']]),
{'cleared': [['T5', 'K2_5']], 'live': ['K1_5', 'T5', 'V7_5', 'root']}),
('dead table does not retain values',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['U5', 'K1_5', 'V5_5']]),
{'cleared': [], 'live': ['K1_5', 'T5', 'V7_5', 'root']}),
('dead key in a dead table is not reported',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['U5', 'K2_5', 'V6_5'], ['T5', 'K1_5', 'V1_5']]),
{'cleared': [], 'live': ['K1_5', 'T5', 'V1_5', 'V7_5', 'root']}),
('dead key whose value is live elsewhere',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'K3_5', 'V7_5'], ['T5', 'K1_5', 'V1_5']]),
{'cleared': [['T5', 'K3_5']], 'live': ['K1_5', 'T5', 'V1_5', 'V7_5', 'root']}),
('value reached through a key held only by another value',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'V2_5', 'V3_5'], ['T5', 'V1_5', 'V2_5'], ['T5', 'K1_5', 'V1_5'], ['T5', 'K2_5', 'V4_5']]),
{'cleared': [['T5', 'K2_5']], 'live': ['K1_5', 'T5', 'V1_5', 'V2_5', 'V3_5', 'V7_5', 'root']}),
('control: plain reachability',
({'a5': ['b5'], 'root': ['a5']}, ['root'], []),
{'cleared': [], 'live': ['a5', 'b5', 'root']})]]
for label, args, expected in cases[N - 1]:
check(label, solve(*args), expected)
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 |
|---|---|---|---|
| regression: ephemeron chain listed in reverse | {'cleared': [['T1', 'V1_1'], ['T1', 'V2_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | {'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']} | Failed |
| dead key does not retain its value | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | Passed |
| dead table does not retain values | {'cleared': [], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | {'cleared': [], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | Passed |
| dead key in a dead table is not reported | {'cleared': [], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | {'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']} | Failed |
| dead key whose value is live elsewhere | {'cleared': [['T1', 'K3_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | {'cleared': [['T1', 'K3_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']} | Failed |
| value reached through a key held only by another value | {'cleared': [['T1', 'K2_1'], ['T1', 'V1_1'], ['T1', 'V2_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']} | Failed |
| control: plain reachability | {'cleared': [], 'live': ['a1', 'b1', 'root']} | {'cleared': [], 'live': ['a1', 'b1', 'root']} | Passed |
SHA-256 / 93f822e439ee3c62b66d083483f4ed62f06bc735b8dd6317ad621c9d70367f72
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(heap, roots, eph):
live = set()
def mark(starts):
stack = list(starts)
while stack:
o = stack.pop()
if o in live:
continue
live.add(o)
stack.extend(heap.get(o, []))
mark(roots)
changed = True
while changed:
changed = False
for table, k, v in eph:
if table in live and k in live and v not in live:
mark([v])
changed = True
cleared = sorted([t, k] for t, k, v in eph if t in live and k not in live)
return {'live': sorted(live), 'cleared': cleared}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression: ephemeron chain listed in reverse',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'V2_1', 'V3_1'], ['T1', 'V1_1', 'V2_1'], ['T1', 'K1_1', 'V1_1']]),
{'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']}),
('dead key does not retain its value',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'K2_1', 'V4_1']]),
{'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']}),
('dead table does not retain values',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['U1', 'K1_1', 'V5_1']]),
{'cleared': [], 'live': ['K1_1', 'T1', 'V7_1', 'root']}),
('dead key in a dead table is not reported',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['U1', 'K2_1', 'V6_1'], ['T1', 'K1_1', 'V1_1']]),
{'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']}),
('dead key whose value is live elsewhere',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'K3_1', 'V7_1'], ['T1', 'K1_1', 'V1_1']]),
{'cleared': [['T1', 'K3_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']}),
('value reached through a key held only by another value',
({'K1_1': [], 'K2_1': [], 'K3_1': [], 'T1': [], 'U1': [], 'root': ['T1', 'K1_1', 'V7_1']},
['root'],
[['T1', 'V2_1', 'V3_1'], ['T1', 'V1_1', 'V2_1'], ['T1', 'K1_1', 'V1_1'], ['T1', 'K2_1', 'V4_1']]),
{'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']}),
('control: plain reachability',
({'a1': ['b1'], 'root': ['a1']}, ['root'], []),
{'cleared': [], 'live': ['a1', 'b1', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'V2_2', 'V3_2'], ['T2', 'V1_2', 'V2_2'], ['T2', 'K1_2', 'V1_2']]),
{'cleared': [], 'live': ['K1_2', 'T2', 'V1_2', 'V2_2', 'V3_2', 'V7_2', 'root']}),
('dead key does not retain its value',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'K2_2', 'V4_2']]),
{'cleared': [['T2', 'K2_2']], 'live': ['K1_2', 'T2', 'V7_2', 'root']}),
('dead table does not retain values',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['U2', 'K1_2', 'V5_2']]),
{'cleared': [], 'live': ['K1_2', 'T2', 'V7_2', 'root']}),
('dead key in a dead table is not reported',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['U2', 'K2_2', 'V6_2'], ['T2', 'K1_2', 'V1_2']]),
{'cleared': [], 'live': ['K1_2', 'T2', 'V1_2', 'V7_2', 'root']}),
('dead key whose value is live elsewhere',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'K3_2', 'V7_2'], ['T2', 'K1_2', 'V1_2']]),
{'cleared': [['T2', 'K3_2']], 'live': ['K1_2', 'T2', 'V1_2', 'V7_2', 'root']}),
('value reached through a key held only by another value',
({'K1_2': [], 'K2_2': [], 'K3_2': [], 'T2': [], 'U2': [], 'root': ['T2', 'K1_2', 'V7_2']},
['root'],
[['T2', 'V2_2', 'V3_2'], ['T2', 'V1_2', 'V2_2'], ['T2', 'K1_2', 'V1_2'], ['T2', 'K2_2', 'V4_2']]),
{'cleared': [['T2', 'K2_2']], 'live': ['K1_2', 'T2', 'V1_2', 'V2_2', 'V3_2', 'V7_2', 'root']}),
('control: plain reachability',
({'a2': ['b2'], 'root': ['a2']}, ['root'], []),
{'cleared': [], 'live': ['a2', 'b2', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'V2_3', 'V3_3'], ['T3', 'V1_3', 'V2_3'], ['T3', 'K1_3', 'V1_3']]),
{'cleared': [], 'live': ['K1_3', 'T3', 'V1_3', 'V2_3', 'V3_3', 'V7_3', 'root']}),
('dead key does not retain its value',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'K2_3', 'V4_3']]),
{'cleared': [['T3', 'K2_3']], 'live': ['K1_3', 'T3', 'V7_3', 'root']}),
('dead table does not retain values',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['U3', 'K1_3', 'V5_3']]),
{'cleared': [], 'live': ['K1_3', 'T3', 'V7_3', 'root']}),
('dead key in a dead table is not reported',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['U3', 'K2_3', 'V6_3'], ['T3', 'K1_3', 'V1_3']]),
{'cleared': [], 'live': ['K1_3', 'T3', 'V1_3', 'V7_3', 'root']}),
('dead key whose value is live elsewhere',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'K3_3', 'V7_3'], ['T3', 'K1_3', 'V1_3']]),
{'cleared': [['T3', 'K3_3']], 'live': ['K1_3', 'T3', 'V1_3', 'V7_3', 'root']}),
('value reached through a key held only by another value',
({'K1_3': [], 'K2_3': [], 'K3_3': [], 'T3': [], 'U3': [], 'root': ['T3', 'K1_3', 'V7_3']},
['root'],
[['T3', 'V2_3', 'V3_3'], ['T3', 'V1_3', 'V2_3'], ['T3', 'K1_3', 'V1_3'], ['T3', 'K2_3', 'V4_3']]),
{'cleared': [['T3', 'K2_3']], 'live': ['K1_3', 'T3', 'V1_3', 'V2_3', 'V3_3', 'V7_3', 'root']}),
('control: plain reachability',
({'a3': ['b3'], 'root': ['a3']}, ['root'], []),
{'cleared': [], 'live': ['a3', 'b3', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'V2_4', 'V3_4'], ['T4', 'V1_4', 'V2_4'], ['T4', 'K1_4', 'V1_4']]),
{'cleared': [], 'live': ['K1_4', 'T4', 'V1_4', 'V2_4', 'V3_4', 'V7_4', 'root']}),
('dead key does not retain its value',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'K2_4', 'V4_4']]),
{'cleared': [['T4', 'K2_4']], 'live': ['K1_4', 'T4', 'V7_4', 'root']}),
('dead table does not retain values',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['U4', 'K1_4', 'V5_4']]),
{'cleared': [], 'live': ['K1_4', 'T4', 'V7_4', 'root']}),
('dead key in a dead table is not reported',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['U4', 'K2_4', 'V6_4'], ['T4', 'K1_4', 'V1_4']]),
{'cleared': [], 'live': ['K1_4', 'T4', 'V1_4', 'V7_4', 'root']}),
('dead key whose value is live elsewhere',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'K3_4', 'V7_4'], ['T4', 'K1_4', 'V1_4']]),
{'cleared': [['T4', 'K3_4']], 'live': ['K1_4', 'T4', 'V1_4', 'V7_4', 'root']}),
('value reached through a key held only by another value',
({'K1_4': [], 'K2_4': [], 'K3_4': [], 'T4': [], 'U4': [], 'root': ['T4', 'K1_4', 'V7_4']},
['root'],
[['T4', 'V2_4', 'V3_4'], ['T4', 'V1_4', 'V2_4'], ['T4', 'K1_4', 'V1_4'], ['T4', 'K2_4', 'V4_4']]),
{'cleared': [['T4', 'K2_4']], 'live': ['K1_4', 'T4', 'V1_4', 'V2_4', 'V3_4', 'V7_4', 'root']}),
('control: plain reachability',
({'a4': ['b4'], 'root': ['a4']}, ['root'], []),
{'cleared': [], 'live': ['a4', 'b4', 'root']})],
[('regression: ephemeron chain listed in reverse',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'V2_5', 'V3_5'], ['T5', 'V1_5', 'V2_5'], ['T5', 'K1_5', 'V1_5']]),
{'cleared': [], 'live': ['K1_5', 'T5', 'V1_5', 'V2_5', 'V3_5', 'V7_5', 'root']}),
('dead key does not retain its value',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'K2_5', 'V4_5']]),
{'cleared': [['T5', 'K2_5']], 'live': ['K1_5', 'T5', 'V7_5', 'root']}),
('dead table does not retain values',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['U5', 'K1_5', 'V5_5']]),
{'cleared': [], 'live': ['K1_5', 'T5', 'V7_5', 'root']}),
('dead key in a dead table is not reported',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['U5', 'K2_5', 'V6_5'], ['T5', 'K1_5', 'V1_5']]),
{'cleared': [], 'live': ['K1_5', 'T5', 'V1_5', 'V7_5', 'root']}),
('dead key whose value is live elsewhere',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'K3_5', 'V7_5'], ['T5', 'K1_5', 'V1_5']]),
{'cleared': [['T5', 'K3_5']], 'live': ['K1_5', 'T5', 'V1_5', 'V7_5', 'root']}),
('value reached through a key held only by another value',
({'K1_5': [], 'K2_5': [], 'K3_5': [], 'T5': [], 'U5': [], 'root': ['T5', 'K1_5', 'V7_5']},
['root'],
[['T5', 'V2_5', 'V3_5'], ['T5', 'V1_5', 'V2_5'], ['T5', 'K1_5', 'V1_5'], ['T5', 'K2_5', 'V4_5']]),
{'cleared': [['T5', 'K2_5']], 'live': ['K1_5', 'T5', 'V1_5', 'V2_5', 'V3_5', 'V7_5', 'root']}),
('control: plain reachability',
({'a5': ['b5'], 'root': ['a5']}, ['root'], []),
{'cleared': [], 'live': ['a5', 'b5', 'root']})]]
for label, args, expected in cases[N - 1]:
check(label, solve(*args), expected)
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 |
|---|---|---|---|
| regression: ephemeron chain listed in reverse | {'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']} | {'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']} | Passed |
| dead key does not retain its value | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | Passed |
| dead table does not retain values | {'cleared': [], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | {'cleared': [], 'live': ['K1_1', 'T1', 'V7_1', 'root']} | Passed |
| dead key in a dead table is not reported | {'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']} | {'cleared': [], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']} | Passed |
| dead key whose value is live elsewhere | {'cleared': [['T1', 'K3_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']} | {'cleared': [['T1', 'K3_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V7_1', 'root']} | Passed |
| value reached through a key held only by another value | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']} | {'cleared': [['T1', 'K2_1']], 'live': ['K1_1', 'T1', 'V1_1', 'V2_1', 'V3_1', 'V7_1', 'root']} | Passed |
| control: plain reachability | {'cleared': [], 'live': ['a1', 'b1', 'root']} | {'cleared': [], 'live': ['a1', 'b1', 'root']} | Passed |
SHA-256 / 65af37c95a05baa7ec27a4ccac65ae988011beb8033f789f918761b7a8371ef9
Verification & scope
A deterministic, bounded teaching model of one garbage-collector mechanism with stipulated rules; it is not a production collector and claims no conformance to any particular runtime. 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:51:27.786678+00:00.
Case digest / 33c4d32528d3eec7e34c0210cfca81587158c7d16ce2b779bcfd32e0d15de0aa