FAILURE MAP
← Case archive

FA-39556 / Tree accessibility / Open access

Expanded tree viewport anchor stabilization: Anchor pixel position includes anchor height or uses old order · case 01

Anchor pixel position includes anchor height or uses old order produces the wrong hierarchical widget state in a regression fixture.

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

ROOT CAUSE

The viewport-anchor contract is violated at `new[:new.index(anchor)]` by replacing it with `new[:new.index(anchor)+1]`.

VERIFIED REPAIR

Restore `new[:new.index(anchor)]` at this fault site while retaining the other tree state decisions.

Unsuccessful approach: The partial repair `(old[:old.index(anchor)] if anchor in old else [])` still violates a boundary or preservation case.

Case contract

After branch expansion changes row heights/order, preserve the first visible surviving anchor and its pixel offset. If that row is removed, use the next surviving old row, then previous row. Clamp scroll to content extent, include fractional row offsets, and keep active-row identity independent from viewport anchoring.

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):
    old=d['old']; new=d['new']
    index=old.index(d['anchor']) if d['anchor'] in old else 0
    candidates=[d['anchor']]+old[index+1:]+list(reversed(old[:index]))
    anchor=next((x for x in candidates if x in new),(new[0] if new else None))
    position=sum(d['heights'][x] for x in new[:new.index(anchor)+1]) if anchor is not None else 0
    inside=min(d['offset'],d['heights'][anchor]-1) if anchor==d['anchor'] else 0
    requested=position+max(0,inside)
    content=sum(d['heights'][x] for x in new)
    scroll=max(0,min(requested,content-d['viewport']))
    active=d['active']
    return [anchor,scroll,content,active]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 64.5, 100, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 40, 100, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 76, 100, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 69, 'a'])], 2: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 65.5, 102, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 42, 102, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 78, 102, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 70, 'a'])], 3: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 66.5, 104, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 44, 104, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 80, 104, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 71, 'a'])], 4: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 67.5, 106, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 46, 106, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 82, 106, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 72, 'a'])], 5: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 68.5, 108, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 48, 108, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 84, 108, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 73, 'a'])]}
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 fixtureActualExpectedOutcome
insert before anchor['b', 80, 100, 'a']['b', 64.5, 100, 'a']Failed
deleted anchor['c', 33, 53, 'a']['c', 30, 53, 'a']Failed
previous fallback['a', 10, 30, 'a']['a', 10, 30, 'a']Passed
new-only tree['q', 0, 5, 'a']['q', 0, 5, 'a']Passed
empty tree[None, 0, 0, 'a'][None, 0, 0, 'a']Passed
bottom clamp['b', 40, 100, 'a']['b', 40, 100, 'a']Passed
oversized offset['b', 80, 100, 'a']['b', 76, 100, 'a']Failed
reordered['b', 42.5, 69, 'a']['b', 26.5, 69, 'a']Failed

SHA-256 / 854cda98969cd7dc81efc254a3c7a7436d25d33645d587402c20d2228ae15f03

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(d):
    old=d['old']; new=d['new']
    index=old.index(d['anchor']) if d['anchor'] in old else 0
    candidates=[d['anchor']]+old[index+1:]+list(reversed(old[:index]))
    anchor=next((x for x in candidates if x in new),(new[0] if new else None))
    position=sum(d['heights'][x] for x in (old[:old.index(anchor)] if anchor in old else [])) if anchor is not None else 0
    inside=min(d['offset'],d['heights'][anchor]-1) if anchor==d['anchor'] else 0
    requested=position+max(0,inside)
    content=sum(d['heights'][x] for x in new)
    scroll=max(0,min(requested,content-d['viewport']))
    active=d['active']
    return [anchor,scroll,content,active]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 64.5, 100, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 40, 100, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 76, 100, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 69, 'a'])], 2: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 65.5, 102, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 42, 102, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 78, 102, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 70, 'a'])], 3: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 66.5, 104, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 44, 104, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 80, 104, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 71, 'a'])], 4: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 67.5, 106, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 46, 106, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 82, 106, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 72, 'a'])], 5: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 68.5, 108, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 48, 108, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 84, 108, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 73, 'a'])]}
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 fixtureActualExpectedOutcome
insert before anchor['b', 33.5, 100, 'a']['b', 64.5, 100, 'a']Failed
deleted anchor['c', 33, 53, 'a']['c', 30, 53, 'a']Failed
previous fallback['a', 10, 30, 'a']['a', 10, 30, 'a']Passed
new-only tree['q', 0, 5, 'a']['q', 0, 5, 'a']Passed
empty tree[None, 0, 0, 'a'][None, 0, 0, 'a']Passed
bottom clamp['b', 33.5, 100, 'a']['b', 40, 100, 'a']Failed
oversized offset['b', 45, 100, 'a']['b', 76, 100, 'a']Failed
reordered['b', 33.5, 69, 'a']['b', 26.5, 69, 'a']Failed

SHA-256 / 8eb34b63ec71ceb84070fa023b86cb2b615b72491eea50e65698a5899cb66772

3 / The verified repair

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

N = 1
observations = []
def solve(d):
    old=d['old']; new=d['new']
    index=old.index(d['anchor']) if d['anchor'] in old else 0
    candidates=[d['anchor']]+old[index+1:]+list(reversed(old[:index]))
    anchor=next((x for x in candidates if x in new),(new[0] if new else None))
    position=sum(d['heights'][x] for x in new[:new.index(anchor)]) if anchor is not None else 0
    inside=min(d['offset'],d['heights'][anchor]-1) if anchor==d['anchor'] else 0
    requested=position+max(0,inside)
    content=sum(d['heights'][x] for x in new)
    scroll=max(0,min(requested,content-d['viewport']))
    active=d['active']
    return [anchor,scroll,content,active]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 64.5, 100, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 40, 100, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 76, 100, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 16, 'c': 11, 'z': 12, 'x': 31, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 69, 'a'])], 2: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 65.5, 102, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 42, 102, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 78, 102, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 17, 'c': 11, 'z': 12, 'x': 32, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 70, 'a'])], 3: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 66.5, 104, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 44, 104, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 80, 104, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 18, 'c': 11, 'z': 12, 'x': 33, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 71, 'a'])], 4: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 67.5, 106, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 46, 106, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 82, 106, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 19, 'c': 11, 'z': 12, 'x': 34, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 72, 'a'])], 5: [('insert before anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 68.5, 108, 'a']), ('deleted anchor', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['c', 30, 53, 'a']), ('previous fallback', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'a'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['a', 10, 30, 'a']), ('new-only tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['q'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['q', 0, 5, 'a']), ('empty tree', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': [], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, [None, 0, 0, 'a']), ('bottom clamp', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 60, 'active': 'a'}, ['b', 48, 108, 'a']), ('oversized offset', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['r', 'x', 'a', 'b', 'c', 'z'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 100, 'viewport': 20, 'active': 'a'}, ['b', 84, 108, 'a']), ('reordered', {'old': ['r', 'a', 'b', 'c', 'z'], 'new': ['z', 'c', 'b', 'a', 'r'], 'anchor': 'b', 'heights': {'r': 10, 'a': 20, 'b': 20, 'c': 11, 'z': 12, 'x': 35, 'q': 5}, 'offset': 3.5, 'viewport': 20, 'active': 'a'}, ['b', 26.5, 73, 'a'])]}
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 fixtureActualExpectedOutcome
insert before anchor['b', 64.5, 100, 'a']['b', 64.5, 100, 'a']Passed
deleted anchor['c', 30, 53, 'a']['c', 30, 53, 'a']Passed
previous fallback['a', 10, 30, 'a']['a', 10, 30, 'a']Passed
new-only tree['q', 0, 5, 'a']['q', 0, 5, 'a']Passed
empty tree[None, 0, 0, 'a'][None, 0, 0, 'a']Passed
bottom clamp['b', 40, 100, 'a']['b', 40, 100, 'a']Passed
oversized offset['b', 76, 100, 'a']['b', 76, 100, 'a']Passed
reordered['b', 26.5, 69, 'a']['b', 26.5, 69, 'a']Passed

SHA-256 / 31833c367fd964568637daa88f5075860dde80070967f9d8351262ab7d437a54

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

Case digest / b19d8bb96f24267d5a8302c4ca24247b9fb4575ea524ac378eedf88871c5b320