FA-39021 / Tree accessibility / Open access
Inline branch rename transaction: Rejected rename leaks draft text into accessible label · case 01
Rejected rename leaks draft text into accessible label produces the wrong hierarchical widget state in a regression fixture.
ROOT CAUSE
The rename-branch contract is violated at `if accepted: labels[d['row']]=label` by replacing it with `if current: labels[d['row']]=label`.
VERIFIED REPAIR
Restore `if accepted: labels[d['row']]=label` at this fault site while retaining the other tree state decisions.
Unsuccessful approach: The partial repair `if accepted: labels[d['row']]=d['text']` still violates a boundary or preservation case.
Case contract
Rename completion is applied only to the same row incarnation and edit session. Empty trimmed labels are rejected, duplicate sibling labels are rejected case-insensitively, and failure leaves editing active. Successful rename preserves expansion/selection and restores focus to the renamed row only when editing owned focus.
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):
current=d['session']==d['reply_session'] and d['incarnation']==d['reply_incarnation']
label=d['text'].strip()
nonempty=bool(label)
duplicate=any(x!=d['row'] and name.casefold()==label.casefold() for x,name in d['siblings'])
accepted=current and nonempty and not duplicate and d['server_ok']
labels=dict(d['labels'])
if current: labels[d['row']]=label
editing=None if accepted else d['editing']
error=None if accepted else ('invalid' if current and (not nonempty or duplicate) else d['error'])
focus=d['row'] if accepted and d['focus']==d['editor'] else d['focus']
return [labels,editing,error,focus,d['expanded'],d['selected']]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('rename', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 1, 'reply_session': 0, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 3, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 2: [('rename', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 2', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 2, 'reply_session': 1, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 4, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 2', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 3: [('rename', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 3', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 3, 'reply_session': 2, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 5, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 3', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 4: [('rename', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 4', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 4, 'reply_session': 3, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 6, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 4', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 5: [('rename', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 5', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 5, 'reply_session': 4, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 7, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 5', 'q': 'Other'}, None, None, 'q', ['b'], ['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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| rename | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | Passed |
| stale session | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | Passed |
| recycled row | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | Passed |
| empty draft | [{'a': 'Taken', 'b': '', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | Failed |
| collision | [{'a': 'Taken', 'b': 'taken', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | Failed |
| unchanged label | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | Passed |
| server failure | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | Failed |
| outside focus | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'q', ['b'], ['a']] | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'q', ['b'], ['a']] | Passed |
SHA-256 / 481eca2a17cab188d780bf898534f0cd4f21acf350dae344d4d184813af46874
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
current=d['session']==d['reply_session'] and d['incarnation']==d['reply_incarnation']
label=d['text'].strip()
nonempty=bool(label)
duplicate=any(x!=d['row'] and name.casefold()==label.casefold() for x,name in d['siblings'])
accepted=current and nonempty and not duplicate and d['server_ok']
labels=dict(d['labels'])
if accepted: labels[d['row']]=d['text']
editing=None if accepted else d['editing']
error=None if accepted else ('invalid' if current and (not nonempty or duplicate) else d['error'])
focus=d['row'] if accepted and d['focus']==d['editor'] else d['focus']
return [labels,editing,error,focus,d['expanded'],d['selected']]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('rename', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 1, 'reply_session': 0, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 3, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 2: [('rename', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 2', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 2, 'reply_session': 1, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 4, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 2', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 3: [('rename', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 3', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 3, 'reply_session': 2, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 5, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 3', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 4: [('rename', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 4', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 4, 'reply_session': 3, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 6, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 4', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 5: [('rename', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 5', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 5, 'reply_session': 4, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 7, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 5', 'q': 'Other'}, None, None, 'q', ['b'], ['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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| rename | [{'a': 'Taken', 'b': ' New 1 ', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | Failed |
| stale session | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | Passed |
| recycled row | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | Passed |
| empty draft | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | Passed |
| collision | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | Passed |
| unchanged label | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | Passed |
| server failure | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | Passed |
| outside focus | [{'a': 'Taken', 'b': ' New 1 ', 'q': 'Other'}, None, None, 'q', ['b'], ['a']] | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'q', ['b'], ['a']] | Failed |
SHA-256 / 8e74e41472a178b58d269513fdb585a532d67695cc5af0ad3ec6a332d1ccd832
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(d):
current=d['session']==d['reply_session'] and d['incarnation']==d['reply_incarnation']
label=d['text'].strip()
nonempty=bool(label)
duplicate=any(x!=d['row'] and name.casefold()==label.casefold() for x,name in d['siblings'])
accepted=current and nonempty and not duplicate and d['server_ok']
labels=dict(d['labels'])
if accepted: labels[d['row']]=label
editing=None if accepted else d['editing']
error=None if accepted else ('invalid' if current and (not nonempty or duplicate) else d['error'])
focus=d['row'] if accepted and d['focus']==d['editor'] else d['focus']
return [labels,editing,error,focus,d['expanded'],d['selected']]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('rename', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 1, 'reply_session': 0, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 3, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 1, 'reply_session': 1, 'incarnation': 4, 'reply_incarnation': 4, 'text': ' New 1 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 2: [('rename', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 2', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 2, 'reply_session': 1, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 4, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 2, 'reply_session': 2, 'incarnation': 5, 'reply_incarnation': 5, 'text': ' New 2 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 2', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 3: [('rename', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 3', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 3, 'reply_session': 2, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 5, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 3, 'reply_session': 3, 'incarnation': 6, 'reply_incarnation': 6, 'text': ' New 3 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 3', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 4: [('rename', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 4', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 4, 'reply_session': 3, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 6, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 4, 'reply_session': 4, 'incarnation': 7, 'reply_incarnation': 7, 'text': ' New 4 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 4', 'q': 'Other'}, None, None, 'q', ['b'], ['a']])], 5: [('rename', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 5', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('stale session', {'session': 5, 'reply_session': 4, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('recycled row', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 7, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('empty draft', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('collision', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' taken ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']]), ('unchanged label', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': 'Old', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']]), ('server failure', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': False, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'editor:b', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']]), ('outside focus', {'session': 5, 'reply_session': 5, 'incarnation': 8, 'reply_incarnation': 8, 'text': ' New 5 ', 'row': 'b', 'siblings': [['b', 'Old'], ['a', 'Taken']], 'server_ok': True, 'labels': {'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'editing': 'b', 'error': 'old', 'focus': 'q', 'editor': 'editor:b', 'expanded': ['b'], 'selected': ['a']}, [{'a': 'Taken', 'b': 'New 5', 'q': 'Other'}, None, None, 'q', ['b'], ['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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| rename | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | Passed |
| stale session | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | Passed |
| recycled row | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | Passed |
| empty draft | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | Passed |
| collision | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'invalid', 'editor:b', ['b'], ['a']] | Passed |
| unchanged label | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, None, None, 'b', ['b'], ['a']] | Passed |
| server failure | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | [{'a': 'Taken', 'b': 'Old', 'q': 'Other'}, 'b', 'old', 'editor:b', ['b'], ['a']] | Passed |
| outside focus | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'q', ['b'], ['a']] | [{'a': 'Taken', 'b': 'New 1', 'q': 'Other'}, None, None, 'q', ['b'], ['a']] | Passed |
SHA-256 / 0661e439fff3a505d8c077cc26cad98eba13fbdf91f2b43bb19a154d2968b832
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:17.113784+00:00.
Case digest / 94e218a6f92785d78f6092efe51d3be3ab55dd11ec986caa7955a9db7264d457