FAILURE MAP
← Case archive

FA-38141 / Table interactions / Open access

Asynchronous table cell save acknowledgement: ack request match · case 01

The table ack request match result violates the stipulated asynchronous table cell save acknowledgement contract.

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

ROOT CAUSE

The ack request match decision uses 'False' instead of "request['id']!=response['request']".

VERIFIED REPAIR

Apply the complete ack request match rule: request['id']!=response['request'].

Unsuccessful approach: The attempted repair "request['id']<response['request']" still loses a required part of the table contract.

Case contract

A save acknowledgement belongs to an exact pending request and row, clears only that pending cell, preserves errors and newer edits, rejects older server revisions, installs canonical server values/revisions, and clears a draft only when the original edit ID still owns it.

Why this case matters

An offline table UI model isolates asynchronous table cell save acknowledgement, including adversarial row/column relationships.

1 / The failure

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

N = 1
observations = []
def solve(row, pending, response, draft):
    key=(response['row'],response['column'])
    request=pending.get(key)
    if request is None or False: return {'row':row,'pending':sorted(pending.items()),'draft':sorted(draft.items()),'error':None}
    if row['id']!=response['row']: return {'row':row,'pending':sorted(pending.items()),'draft':sorted(draft.items()),'error':None}
    next_pending=dict(pending); next_pending.pop(key)
    if response.get('error') is not None: return {'row':row,'pending':sorted(next_pending.items()),'draft':sorted(draft.items()),'error':response['error']}
    out=dict(row)
    if response['revision']<row['revision']: return {'row':out,'pending':sorted(next_pending.items()),'draft':sorted(draft.items()),'error':'stale'}
    out[response['column']]=response['value']; out['revision']=response['revision']
    next_draft=dict(draft)
    if key in next_draft and next_draft[key]['edit_id']==request['edit_id']: next_draft.pop(key)
    return {'row':out,'pending':sorted(next_pending.items()),'draft':sorted(next_draft.items()),'error':None}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(1),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw1', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 2:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(2),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw2', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 3:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(3),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw3', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 4:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(4),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw4', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 5:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(5),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw5', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

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
canonical server response{'draft': [[['r', 'b'], {'edit_id': 10, 'value': 'B'}]], 'error': None, 'pending': [[['r', 'b'], {'edit_id': 10, 'id': 3, 'value': 'B'}]], 'row': {'a': 'raw1', 'id': 'r', 'revision': 8}}{'draft': [[['r', 'b'], {'edit_id': 10, 'value': 'B'}]], 'error': None, 'pending': [[['r', 'b'], {'edit_id': 10, 'id': 3, 'value': 'B'}]], 'row': {'a': 'raw1', 'id': 'r', 'revision': 8}}Passed
late old request{'draft': [], 'error': None, 'pending': [], 'row': {'a': 'old ack', 'id': 'r', 'revision': 4}}{'draft': [], 'error': None, 'pending': [[['r', 'a'], {'edit_id': 9, 'id': 2, 'value': 'v'}]], 'row': {'a': 'old', 'id': 'r', 'revision': 3}}Failed
different row{'draft': [], 'error': None, 'pending': [[['r', 'a'], {'edit_id': 9, 'id': 2, 'value': 'v'}]], 'row': {'a': 'old', 'id': 'other', 'revision': 3}}{'draft': [], 'error': None, 'pending': [[['r', 'a'], {'edit_id': 9, 'id': 2, 'value': 'v'}]], 'row': {'a': 'old', 'id': 'other', 'revision': 3}}Passed
empty error message{'draft': [[['r', 'a'], {'edit_id': 9, 'value': 'v'}]], 'error': '', 'pending': [], 'row': {'a': 'old', 'id': 'r', 'revision': 3}}{'draft': [[['r', 'a'], {'edit_id': 9, 'value': 'v'}]], 'error': '', 'pending': [], 'row': {'a': 'old', 'id': 'r', 'revision': 3}}Passed
stale revision{'draft': [], 'error': 'stale', 'pending': [], 'row': {'a': 'new', 'id': 'r', 'revision': 7}}{'draft': [], 'error': 'stale', 'pending': [], 'row': {'a': 'new', 'id': 'r', 'revision': 7}}Passed
equal revision allowed{'draft': [], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 3}}{'draft': [], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 3}}Passed
new edit same value{'draft': [[['r', 'a'], {'edit_id': 10, 'value': 'v'}]], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 4}}{'draft': [[['r', 'a'], {'edit_id': 10, 'value': 'v'}]], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 4}}Passed

SHA-256 / a84c2f9f9d9c188430235ce005987e5a6be596ed415612e5e874f0b53f3d19f4

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(row, pending, response, draft):
    key=(response['row'],response['column'])
    request=pending.get(key)
    if request is None or request['id']<response['request']: return {'row':row,'pending':sorted(pending.items()),'draft':sorted(draft.items()),'error':None}
    if row['id']!=response['row']: return {'row':row,'pending':sorted(pending.items()),'draft':sorted(draft.items()),'error':None}
    next_pending=dict(pending); next_pending.pop(key)
    if response.get('error') is not None: return {'row':row,'pending':sorted(next_pending.items()),'draft':sorted(draft.items()),'error':response['error']}
    out=dict(row)
    if response['revision']<row['revision']: return {'row':out,'pending':sorted(next_pending.items()),'draft':sorted(draft.items()),'error':'stale'}
    out[response['column']]=response['value']; out['revision']=response['revision']
    next_draft=dict(draft)
    if key in next_draft and next_draft[key]['edit_id']==request['edit_id']: next_draft.pop(key)
    return {'row':out,'pending':sorted(next_pending.items()),'draft':sorted(next_draft.items()),'error':None}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(1),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw1', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 2:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(2),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw2', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 3:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(3),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw3', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 4:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(4),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw4', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 5:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(5),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw5', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

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
canonical server response{'draft': [[['r', 'b'], {'edit_id': 10, 'value': 'B'}]], 'error': None, 'pending': [[['r', 'b'], {'edit_id': 10, 'id': 3, 'value': 'B'}]], 'row': {'a': 'raw1', 'id': 'r', 'revision': 8}}{'draft': [[['r', 'b'], {'edit_id': 10, 'value': 'B'}]], 'error': None, 'pending': [[['r', 'b'], {'edit_id': 10, 'id': 3, 'value': 'B'}]], 'row': {'a': 'raw1', 'id': 'r', 'revision': 8}}Passed
late old request{'draft': [], 'error': None, 'pending': [], 'row': {'a': 'old ack', 'id': 'r', 'revision': 4}}{'draft': [], 'error': None, 'pending': [[['r', 'a'], {'edit_id': 9, 'id': 2, 'value': 'v'}]], 'row': {'a': 'old', 'id': 'r', 'revision': 3}}Failed
different row{'draft': [], 'error': None, 'pending': [[['r', 'a'], {'edit_id': 9, 'id': 2, 'value': 'v'}]], 'row': {'a': 'old', 'id': 'other', 'revision': 3}}{'draft': [], 'error': None, 'pending': [[['r', 'a'], {'edit_id': 9, 'id': 2, 'value': 'v'}]], 'row': {'a': 'old', 'id': 'other', 'revision': 3}}Passed
empty error message{'draft': [[['r', 'a'], {'edit_id': 9, 'value': 'v'}]], 'error': '', 'pending': [], 'row': {'a': 'old', 'id': 'r', 'revision': 3}}{'draft': [[['r', 'a'], {'edit_id': 9, 'value': 'v'}]], 'error': '', 'pending': [], 'row': {'a': 'old', 'id': 'r', 'revision': 3}}Passed
stale revision{'draft': [], 'error': 'stale', 'pending': [], 'row': {'a': 'new', 'id': 'r', 'revision': 7}}{'draft': [], 'error': 'stale', 'pending': [], 'row': {'a': 'new', 'id': 'r', 'revision': 7}}Passed
equal revision allowed{'draft': [], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 3}}{'draft': [], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 3}}Passed
new edit same value{'draft': [[['r', 'a'], {'edit_id': 10, 'value': 'v'}]], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 4}}{'draft': [[['r', 'a'], {'edit_id': 10, 'value': 'v'}]], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 4}}Passed

SHA-256 / 0ebc58f461796f628e1dd8e13562f78ef574e9ef80811a5c2a5a552e5d8f80c0

3 / The verified repair

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

N = 1
observations = []
def solve(row, pending, response, draft):
    key=(response['row'],response['column'])
    request=pending.get(key)
    if request is None or request['id']!=response['request']: return {'row':row,'pending':sorted(pending.items()),'draft':sorted(draft.items()),'error':None}
    if row['id']!=response['row']: return {'row':row,'pending':sorted(pending.items()),'draft':sorted(draft.items()),'error':None}
    next_pending=dict(pending); next_pending.pop(key)
    if response.get('error') is not None: return {'row':row,'pending':sorted(next_pending.items()),'draft':sorted(draft.items()),'error':response['error']}
    out=dict(row)
    if response['revision']<row['revision']: return {'row':out,'pending':sorted(next_pending.items()),'draft':sorted(draft.items()),'error':'stale'}
    out[response['column']]=response['value']; out['revision']=response['revision']
    next_draft=dict(draft)
    if key in next_draft and next_draft[key]['edit_id']==request['edit_id']: next_draft.pop(key)
    return {'row':out,'pending':sorted(next_pending.items()),'draft':sorted(next_draft.items()),'error':None}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(1),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw1', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 2:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(2),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw2', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 3:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(3),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw3', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 4:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(4),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw4', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

if N == 5:
    check('canonical server response', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':' raw '},('r','b'):{'id':3,'edit_id':10,'value':'B'}}, {'row':'r','column':'a','request':2,'revision':8,'value':'raw'+str(5),'warning':'informational'}, {('r','a'):{'edit_id':9,'value':' raw '},('r','b'):{'edit_id':10,'value':'B'}}), {'row': {'id': 'r', 'a': 'raw5', 'revision': 8}, 'pending': [(('r', 'b'), {'id': 3, 'edit_id': 10, 'value': 'B'})], 'draft': [(('r', 'b'), {'edit_id': 10, 'value': 'B'})], 'error': None})
    check('late old request', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':1,'revision':4,'value':'old ack'}, {}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('different row', solve({'id':'other','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {}), {'row': {'id': 'other', 'a': 'old', 'revision': 3}, 'pending': [(('r', 'a'), {'id': 2, 'edit_id': 9, 'value': 'v'})], 'draft': [], 'error': None})
    check('empty error message', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack','error':''}, {('r','a'):{'edit_id':9,'value':'v'}}), {'row': {'id': 'r', 'a': 'old', 'revision': 3}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 9, 'value': 'v'})], 'error': ''})
    check('stale revision', solve({'id':'r','a':'new','revision':7}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':6,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'new', 'revision': 7}, 'pending': [], 'draft': [], 'error': 'stale'})
    check('equal revision allowed', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':3,'value':'ack'}, {}), {'row': {'id': 'r', 'a': 'ack', 'revision': 3}, 'pending': [], 'draft': [], 'error': None})
    check('new edit same value', solve({'id':'r','a':'old','revision':3}, {('r','a'):{'id':2,'edit_id':9,'value':'v'}}, {'row':'r','column':'a','request':2,'revision':4,'value':'ack'}, {('r','a'):{'edit_id':10,'value':'v'}}), {'row': {'id': 'r', 'a': 'ack', 'revision': 4}, 'pending': [], 'draft': [(('r', 'a'), {'edit_id': 10, 'value': 'v'})], 'error': None})

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
canonical server response{'draft': [[['r', 'b'], {'edit_id': 10, 'value': 'B'}]], 'error': None, 'pending': [[['r', 'b'], {'edit_id': 10, 'id': 3, 'value': 'B'}]], 'row': {'a': 'raw1', 'id': 'r', 'revision': 8}}{'draft': [[['r', 'b'], {'edit_id': 10, 'value': 'B'}]], 'error': None, 'pending': [[['r', 'b'], {'edit_id': 10, 'id': 3, 'value': 'B'}]], 'row': {'a': 'raw1', 'id': 'r', 'revision': 8}}Passed
late old request{'draft': [], 'error': None, 'pending': [[['r', 'a'], {'edit_id': 9, 'id': 2, 'value': 'v'}]], 'row': {'a': 'old', 'id': 'r', 'revision': 3}}{'draft': [], 'error': None, 'pending': [[['r', 'a'], {'edit_id': 9, 'id': 2, 'value': 'v'}]], 'row': {'a': 'old', 'id': 'r', 'revision': 3}}Passed
different row{'draft': [], 'error': None, 'pending': [[['r', 'a'], {'edit_id': 9, 'id': 2, 'value': 'v'}]], 'row': {'a': 'old', 'id': 'other', 'revision': 3}}{'draft': [], 'error': None, 'pending': [[['r', 'a'], {'edit_id': 9, 'id': 2, 'value': 'v'}]], 'row': {'a': 'old', 'id': 'other', 'revision': 3}}Passed
empty error message{'draft': [[['r', 'a'], {'edit_id': 9, 'value': 'v'}]], 'error': '', 'pending': [], 'row': {'a': 'old', 'id': 'r', 'revision': 3}}{'draft': [[['r', 'a'], {'edit_id': 9, 'value': 'v'}]], 'error': '', 'pending': [], 'row': {'a': 'old', 'id': 'r', 'revision': 3}}Passed
stale revision{'draft': [], 'error': 'stale', 'pending': [], 'row': {'a': 'new', 'id': 'r', 'revision': 7}}{'draft': [], 'error': 'stale', 'pending': [], 'row': {'a': 'new', 'id': 'r', 'revision': 7}}Passed
equal revision allowed{'draft': [], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 3}}{'draft': [], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 3}}Passed
new edit same value{'draft': [[['r', 'a'], {'edit_id': 10, 'value': 'v'}]], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 4}}{'draft': [[['r', 'a'], {'edit_id': 10, 'value': 'v'}]], 'error': None, 'pending': [], 'row': {'a': 'ack', 'id': 'r', 'revision': 4}}Passed

SHA-256 / 6abca38b7fcc658eece313d36360a0600cc1cbebc7f0467ae4a496fc7b71096b

Verification & scope

Pending entries and matching drafts are well-formed; revisions are integers. Pair-keyed maps serialize as sorted pairs. Deterministic offline table UI model; no browser, DOM, framework, or standards conformance is claimed. 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:08.190308+00:00.

Case digest / b4ace7f89bc7c89e5c37cb2801f04433ecd56147f1707f4b2dcc90f7368f07cb