FA-38611 / Tree accessibility / Open access
Subtree deletion state cleanup: Focus recovery chooses removed or distant next sibling · case 01
Focus recovery chooses removed or distant next sibling produces the wrong hierarchical widget state in a regression fixture.
ROOT CAUSE
The delete-subtree contract is violated at `next((x for x in d['next'] if x in rows),None)` by replacing it with `next(iter(d['next']),None)`.
VERIFIED REPAIR
Restore `next((x for x in d['next'] if x in rows),None)` at this fault site while retaining the other tree state decisions.
Unsuccessful approach: The partial repair `next((x for x in reversed(d['next']) if x in rows),None)` still violates a boundary or preservation case.
Case contract
Remove a supplied subtree closure atomically. Focus inside the deleted subtree recovers to surviving next sibling, previous sibling, then parent, then first root. Preserve unrelated state; clear only removed anchor, edits, expansion, selection and pending loads.
Why this case matters
Offline executable model of a hierarchical accessibility interaction; inputs are bounded and valid as stipulated. No browser, assistive technology, or normative ARIA conformance is claimed.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
removed=set(d['removed'])
rows=[x for x in d['rows'] if x not in removed]
selected=[x for x in d['selected'] if x not in removed]
expanded=[x for x in d['expanded'] if x not in removed]
pending={x:v for x,v in d['pending'].items() if x not in removed}
nextrow=next(iter(d['next']),None)
prevrow=next((x for x in reversed(d['previous']) if x in rows),None)
fallback=next((x for x in [nextrow,prevrow,d['parent']]+d['roots'] if x in rows),None)
focus=fallback if d['focus'] in removed else d['focus']
anchor=None if d['anchor'] in removed else d['anchor']
edit=None if d['edit'] in removed else d['edit']
return [rows,selected,expanded,pending,focus,anchor,edit]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 2: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 3: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 4: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 5: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'x', None, None])]}
for label, data, expected in cases[N]:
check(label, solve(data), 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 |
|---|---|---|---|
| next recovery | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'z', None, None] | Failed |
| previous recovery | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | Passed |
| parent recovery | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'r', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'r', None, None] | Passed |
| unrelated focus | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a'] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a'] | Passed |
| last root | [[], ['a'], ['r'], {'a': 1}, None, None, None] | [[], ['a'], ['r'], {'a': 1}, None, None, None] | Passed |
| stale neighbors | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | Passed |
SHA-256 / 014c076051b5c4ae068d6a5bce58838bbf99512443fe16a91ca19ba1e623239f
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
removed=set(d['removed'])
rows=[x for x in d['rows'] if x not in removed]
selected=[x for x in d['selected'] if x not in removed]
expanded=[x for x in d['expanded'] if x not in removed]
pending={x:v for x,v in d['pending'].items() if x not in removed}
nextrow=next((x for x in reversed(d['next']) if x in rows),None)
prevrow=next((x for x in reversed(d['previous']) if x in rows),None)
fallback=next((x for x in [nextrow,prevrow,d['parent']]+d['roots'] if x in rows),None)
focus=fallback if d['focus'] in removed else d['focus']
anchor=None if d['anchor'] in removed else d['anchor']
edit=None if d['edit'] in removed else d['edit']
return [rows,selected,expanded,pending,focus,anchor,edit]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 2: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 3: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 4: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 5: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'x', None, None])]}
for label, data, expected in cases[N]:
check(label, solve(data), 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 |
|---|---|---|---|
| next recovery | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'q0', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'z', None, None] | Failed |
| previous recovery | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | Passed |
| parent recovery | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'r', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'r', None, None] | Passed |
| unrelated focus | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a'] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a'] | Passed |
| last root | [[], ['a'], ['r'], {'a': 1}, None, None, None] | [[], ['a'], ['r'], {'a': 1}, None, None, None] | Passed |
| stale neighbors | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | Passed |
SHA-256 / 36ddd9441777fedbbd2d94ef969a22158d211d04496cb0b61120d4fedb479742
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
removed=set(d['removed'])
rows=[x for x in d['rows'] if x not in removed]
selected=[x for x in d['selected'] if x not in removed]
expanded=[x for x in d['expanded'] if x not in removed]
pending={x:v for x,v in d['pending'].items() if x not in removed}
nextrow=next((x for x in d['next'] if x in rows),None)
prevrow=next((x for x in reversed(d['previous']) if x in rows),None)
fallback=next((x for x in [nextrow,prevrow,d['parent']]+d['roots'] if x in rows),None)
focus=fallback if d['focus'] in removed else d['focus']
anchor=None if d['anchor'] in removed else d['anchor']
edit=None if d['edit'] in removed else d['edit']
return [rows,selected,expanded,pending,focus,anchor,edit]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 2: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 3: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 4: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3'], ['a'], ['r'], {'a': 1}, 'x', None, None])], 5: [('next recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'z', None, None]), ('previous recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'x', None, None]), ('parent recovery', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['a'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'r', None, None]), ('unrelated focus', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'previous': ['a', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'a', 'anchor': 'a', 'edit': 'a'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a']), ('last root', {'removed': ['b', 'c'], 'rows': ['b', 'c'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': [], 'previous': [], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [[], ['a'], ['r'], {'a': 1}, None, None, None]), ('stale neighbors', {'removed': ['b', 'c'], 'rows': ['r', 'a', 'x', 'b', 'c', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], 'selected': ['a', 'c'], 'expanded': ['r', 'b'], 'pending': {'a': 1, 'c': 2}, 'next': ['c'], 'previous': ['a', 'c', 'x'], 'parent': 'r', 'roots': ['r'], 'focus': 'c', 'anchor': 'c', 'edit': 'c'}, [['r', 'a', 'x', 'z', 'q0', 'q1', 'q2', 'q3', 'q4'], ['a'], ['r'], {'a': 1}, 'x', None, None])]}
for label, data, expected in cases[N]:
check(label, solve(data), 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 |
|---|---|---|---|
| next recovery | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'z', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'z', None, None] | Passed |
| previous recovery | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | Passed |
| parent recovery | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'r', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'r', None, None] | Passed |
| unrelated focus | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a'] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'a', 'a', 'a'] | Passed |
| last root | [[], ['a'], ['r'], {'a': 1}, None, None, None] | [[], ['a'], ['r'], {'a': 1}, None, None, None] | Passed |
| stale neighbors | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | [['r', 'a', 'x', 'z', 'q0'], ['a'], ['r'], {'a': 1}, 'x', None, None] | Passed |
SHA-256 / 82498f6a70cf985a6fa199d162acf3231f8dfbc239a2ad301f824a695d227202
Verification & scope
Synthetic deterministic hierarchical-widget data contract; not an implementation of a browser accessibility tree. 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:43:12.967647+00:00.
Case digest / 0c885fe10ad8fdf677ccae7a235e29659f484429b2974d4174c40827f4c84b07