FA-90551 / Garbage collector invariants / Open access
Ephemerons: single pass over the ephemeron list · case 01
Values whose keys become reachable only through later-listed ephemerons are dropped.
ROOT CAUSE
The ephemeron list is processed once instead of until no new value is marked.
VERIFIED REPAIR
Repeat passes while any value was newly marked.
Unsuccessful approach: Two passes still lose values at the end of longer key chains.
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
if 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': [['T1', 'V2_1']], 'live': ['K1_1', 'T1', 'V1_1', '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', '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'], ['T1', 'V2_1']], 'live': ['K1_1', 'T1', 'V1_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 / 73350098afde136ceeaed9461a82250cf4be287bedbda48398ec88a4d92fdb0b
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
for _ in range(2):
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', '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', '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', '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 / 986a0559c247432c7d47e3dbbc110ae24b43e1d3633475303c6bca770516c0bf
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.786652+00:00.
Case digest / 9c9fd19ec6d8c5debe0c664085d9777425eef2c0ab2ad43f552d7f7586b6a953