FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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