{"abstract":"The table commit editability result violates the stipulated table cell draft lifecycle contract.","category":"Table interactions","checks":11,"contract":"Cell drafts belong to a stable row-column pair and snapshot the original value and revision. Readonly cells cannot start/input/commit edits, cancellation discards the draft, commits validate required empty strings, reject stale revisions, and suppress unchanged writes.","evaluation_group":"s3-table-interactions-cell-draft","failed_approach":"The attempted repair \"if not editable and state['value']==state['base']:\" still loses a required part of the table contract.","family":"s3-table-interactions-cell-draft-commit-editability","id":"FA-37171","implementations":{"attempt":{"sha256":"7d2cb72a7c470bb19fca32991a44de3b1d350809eedb797ff1b3ee04a40a6b29","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(row, column, draft, event, value, editable, validator, revision):\n    key=(row['id'],column)\n    state=dict(draft)\n    if event=='begin' and editable: state={'key':key,'base':row[column],'value':row[column],'revision':revision,'error':None}\n    if state.get('key')!=key: return {'draft':state,'write':None}\n    if event=='input' and editable: state['value']=value\n    if event=='cancel': return {'draft':{},'write':None}\n    if event!='commit': return {'draft':state,'write':None}\n    if not editable and state['value']==state['base']: return {'draft':state,'write':None}\n    if state['revision']!=revision: state['error']='conflict'; return {'draft':state,'write':None}\n    if validator=='required' and state['value']=='': state['error']='required'; return {'draft':state,'write':None}\n    if state['value']==state['base']: return {'draft':{},'write':None}\n    return {'draft':{},'write':{'row':row['id'],'column':column,'value':state['value'],'expected_revision':revision}}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('begin snapshot', solve({'id':'r','x':1}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 1, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 2:\n    check('begin snapshot', solve({'id':'r','x':2}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 2, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 3:\n    check('begin snapshot', solve({'id':'r','x':3}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 3, 'value': 3, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 4:\n    check('begin snapshot', solve({'id':'r','x':4}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 4, 'value': 4, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 5:\n    check('begin snapshot', solve({'id':'r','x':5}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 5, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"25929f06feb2294cdb5895da0ad31e73ef3993025ab34d1197c4aaf6cef67930","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(row, column, draft, event, value, editable, validator, revision):\n    key=(row['id'],column)\n    state=dict(draft)\n    if event=='begin' and editable: state={'key':key,'base':row[column],'value':row[column],'revision':revision,'error':None}\n    if state.get('key')!=key: return {'draft':state,'write':None}\n    if event=='input' and editable: state['value']=value\n    if event=='cancel': return {'draft':{},'write':None}\n    if event!='commit': return {'draft':state,'write':None}\n    if False: return {'draft':state,'write':None}\n    if state['revision']!=revision: state['error']='conflict'; return {'draft':state,'write':None}\n    if validator=='required' and state['value']=='': state['error']='required'; return {'draft':state,'write':None}\n    if state['value']==state['base']: return {'draft':{},'write':None}\n    return {'draft':{},'write':{'row':row['id'],'column':column,'value':state['value'],'expected_revision':revision}}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('begin snapshot', solve({'id':'r','x':1}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 1, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 2:\n    check('begin snapshot', solve({'id':'r','x':2}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 2, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 3:\n    check('begin snapshot', solve({'id':'r','x':3}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 3, 'value': 3, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 4:\n    check('begin snapshot', solve({'id':'r','x':4}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 4, 'value': 4, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 5:\n    check('begin snapshot', solve({'id':'r','x':5}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 5, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"62e2482d3474b215c9479f83ee8555bbf90ff2e4df0a28a942c5e3bcd0a605c8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(row, column, draft, event, value, editable, validator, revision):\n    key=(row['id'],column)\n    state=dict(draft)\n    if event=='begin' and editable: state={'key':key,'base':row[column],'value':row[column],'revision':revision,'error':None}\n    if state.get('key')!=key: return {'draft':state,'write':None}\n    if event=='input' and editable: state['value']=value\n    if event=='cancel': return {'draft':{},'write':None}\n    if event!='commit': return {'draft':state,'write':None}\n    if not editable: return {'draft':state,'write':None}\n    if state['revision']!=revision: state['error']='conflict'; return {'draft':state,'write':None}\n    if validator=='required' and state['value']=='': state['error']='required'; return {'draft':state,'write':None}\n    if state['value']==state['base']: return {'draft':{},'write':None}\n    return {'draft':{},'write':{'row':row['id'],'column':column,'value':state['value'],'expected_revision':revision}}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('begin snapshot', solve({'id':'r','x':1}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 1, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 2:\n    check('begin snapshot', solve({'id':'r','x':2}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 2, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 3:\n    check('begin snapshot', solve({'id':'r','x':3}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 3, 'value': 3, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 4:\n    check('begin snapshot', solve({'id':'r','x':4}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 4, 'value': 4, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nif N == 5:\n    check('begin snapshot', solve({'id':'r','x':5}, 'x', {}, 'begin', 'placeholder', True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 5, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('cancel draft', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'cancel', None, True, '', 3), {'draft': {}, 'write': None})\n    check('wrong column', solve({'id':'r','x':1}, 'x', {'key':('r','y'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'y'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 4, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('stale revision', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':2,'error':None}, 'commit', None, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 2, 'error': 'conflict'}, 'write': None})\n    check('required empty', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':'','revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': '', 'revision': 3, 'error': 'required'}, 'write': None})\n    check('zero valid', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':0,'revision':3,'error':None}, 'commit', None, True, 'required', 3), {'draft': {}, 'write': {'row': 'r', 'column': 'x', 'value': 0, 'expected_revision': 3}})\n    check('unchanged', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':1,'revision':3,'error':None}, 'commit', None, True, '', 3), {'draft': {}, 'write': None})\n    check('readonly commit', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'commit', None, False, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 2, 'revision': 3, 'error': None}, 'write': None})\n    check('normal input', solve({'id':'r','x':1}, 'x', {'key':('r','x'),'base':1,'value':2,'revision':3,'error':None}, 'input', 5, True, '', 3), {'draft': {'key': ('r', 'x'), 'base': 1, 'value': 5, 'revision': 3, 'error': None}, 'write': None})\n    check('readonly begin', solve({'id':'r','x':1}, 'x', {}, 'begin', None, False, '', 3), {'draft': {}, 'write': None})\n\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"Existing owned drafts contain base, value, revision, and error fields; the column exists in the row. 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"s3-table-interactions-cell-draft-commit-editability","generated_at":"2026-09-29T14:42:58.613736+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline table UI model isolates table cell draft lifecycle, including adversarial row/column relationships.","repair":"Apply the complete commit editability rule: if not editable:.","root_cause":"The commit editability decision uses 'if False:' instead of 'if not editable:'.","sha256":"421b899b7cbac1abc41757b49588cf22a1eca6b705035bda35370dd5b3abef7e","title":"Table cell draft lifecycle: commit editability · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.789,"exit_code":1,"observations":[{"actual":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":1},"write":null},"check":"begin snapshot","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":1},"write":null},"passed":true},{"actual":{"draft":{},"write":null},"check":"cancel draft","expected":{"draft":{},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":null,"key":["r","y"],"revision":3,"value":2},"write":null},"check":"wrong column","expected":{"draft":{"base":1,"error":null,"key":["r","y"],"revision":3,"value":2},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":2},"write":null},"check":"readonly input","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":2},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":"conflict","key":["r","x"],"revision":2,"value":2},"write":null},"check":"stale revision","expected":{"draft":{"base":1,"error":"conflict","key":["r","x"],"revision":2,"value":2},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":"required","key":["r","x"],"revision":3,"value":""},"write":null},"check":"required empty","expected":{"draft":{"base":1,"error":"required","key":["r","x"],"revision":3,"value":""},"write":null},"passed":true},{"actual":{"draft":{},"write":{"column":"x","expected_revision":3,"row":"r","value":0}},"check":"zero valid","expected":{"draft":{},"write":{"column":"x","expected_revision":3,"row":"r","value":0}},"passed":true},{"actual":{"draft":{},"write":null},"check":"unchanged","expected":{"draft":{},"write":null},"passed":true},{"actual":{"draft":{},"write":{"column":"x","expected_revision":3,"row":"r","value":2}},"check":"readonly commit","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":2},"write":null},"passed":false},{"actual":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":5},"write":null},"check":"normal input","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":5},"write":null},"passed":true},{"actual":{"draft":{},"write":null},"check":"readonly begin","expected":{"draft":{},"write":null},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"begin snapshot\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 1, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 1, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"cancel draft\", \"actual\": {\"draft\": {}, \"write\": null}, \"expected\": {\"draft\": {}, \"write\": null}, \"passed\": true}, {\"check\": \"wrong column\", \"actual\": {\"draft\": {\"key\": [\"r\", \"y\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"y\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"readonly input\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"stale revision\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 2, \"error\": \"conflict\"}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 2, \"error\": \"conflict\"}, \"write\": null}, \"passed\": true}, {\"check\": \"required empty\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": \"\", \"revision\": 3, \"error\": \"required\"}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": \"\", \"revision\": 3, \"error\": \"required\"}, \"write\": null}, \"passed\": true}, {\"check\": \"zero valid\", \"actual\": {\"draft\": {}, \"write\": {\"row\": \"r\", \"column\": \"x\", \"value\": 0, \"expected_revision\": 3}}, \"expected\": {\"draft\": {}, \"write\": {\"row\": \"r\", \"column\": \"x\", \"value\": 0, \"expected_revision\": 3}}, \"passed\": true}, {\"check\": \"unchanged\", \"actual\": {\"draft\": {}, \"write\": null}, \"expected\": {\"draft\": {}, \"write\": null}, \"passed\": true}, {\"check\": \"readonly commit\", \"actual\": {\"draft\": {}, \"write\": {\"row\": \"r\", \"column\": \"x\", \"value\": 2, \"expected_revision\": 3}}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": false}, {\"check\": \"normal input\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 5, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 5, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"readonly begin\", \"actual\": {\"draft\": {}, \"write\": null}, \"expected\": {\"draft\": {}, \"write\": null}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.299,"exit_code":1,"observations":[{"actual":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":1},"write":null},"check":"begin snapshot","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":1},"write":null},"passed":true},{"actual":{"draft":{},"write":null},"check":"cancel draft","expected":{"draft":{},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":null,"key":["r","y"],"revision":3,"value":2},"write":null},"check":"wrong column","expected":{"draft":{"base":1,"error":null,"key":["r","y"],"revision":3,"value":2},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":2},"write":null},"check":"readonly input","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":2},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":"conflict","key":["r","x"],"revision":2,"value":2},"write":null},"check":"stale revision","expected":{"draft":{"base":1,"error":"conflict","key":["r","x"],"revision":2,"value":2},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":"required","key":["r","x"],"revision":3,"value":""},"write":null},"check":"required empty","expected":{"draft":{"base":1,"error":"required","key":["r","x"],"revision":3,"value":""},"write":null},"passed":true},{"actual":{"draft":{},"write":{"column":"x","expected_revision":3,"row":"r","value":0}},"check":"zero valid","expected":{"draft":{},"write":{"column":"x","expected_revision":3,"row":"r","value":0}},"passed":true},{"actual":{"draft":{},"write":null},"check":"unchanged","expected":{"draft":{},"write":null},"passed":true},{"actual":{"draft":{},"write":{"column":"x","expected_revision":3,"row":"r","value":2}},"check":"readonly commit","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":2},"write":null},"passed":false},{"actual":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":5},"write":null},"check":"normal input","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":5},"write":null},"passed":true},{"actual":{"draft":{},"write":null},"check":"readonly begin","expected":{"draft":{},"write":null},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"begin snapshot\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 1, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 1, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"cancel draft\", \"actual\": {\"draft\": {}, \"write\": null}, \"expected\": {\"draft\": {}, \"write\": null}, \"passed\": true}, {\"check\": \"wrong column\", \"actual\": {\"draft\": {\"key\": [\"r\", \"y\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"y\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"readonly input\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"stale revision\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 2, \"error\": \"conflict\"}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 2, \"error\": \"conflict\"}, \"write\": null}, \"passed\": true}, {\"check\": \"required empty\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": \"\", \"revision\": 3, \"error\": \"required\"}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": \"\", \"revision\": 3, \"error\": \"required\"}, \"write\": null}, \"passed\": true}, {\"check\": \"zero valid\", \"actual\": {\"draft\": {}, \"write\": {\"row\": \"r\", \"column\": \"x\", \"value\": 0, \"expected_revision\": 3}}, \"expected\": {\"draft\": {}, \"write\": {\"row\": \"r\", \"column\": \"x\", \"value\": 0, \"expected_revision\": 3}}, \"passed\": true}, {\"check\": \"unchanged\", \"actual\": {\"draft\": {}, \"write\": null}, \"expected\": {\"draft\": {}, \"write\": null}, \"passed\": true}, {\"check\": \"readonly commit\", \"actual\": {\"draft\": {}, \"write\": {\"row\": \"r\", \"column\": \"x\", \"value\": 2, \"expected_revision\": 3}}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": false}, {\"check\": \"normal input\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 5, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 5, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"readonly begin\", \"actual\": {\"draft\": {}, \"write\": null}, \"expected\": {\"draft\": {}, \"write\": null}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.027,"exit_code":0,"observations":[{"actual":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":1},"write":null},"check":"begin snapshot","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":1},"write":null},"passed":true},{"actual":{"draft":{},"write":null},"check":"cancel draft","expected":{"draft":{},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":null,"key":["r","y"],"revision":3,"value":2},"write":null},"check":"wrong column","expected":{"draft":{"base":1,"error":null,"key":["r","y"],"revision":3,"value":2},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":2},"write":null},"check":"readonly input","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":2},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":"conflict","key":["r","x"],"revision":2,"value":2},"write":null},"check":"stale revision","expected":{"draft":{"base":1,"error":"conflict","key":["r","x"],"revision":2,"value":2},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":"required","key":["r","x"],"revision":3,"value":""},"write":null},"check":"required empty","expected":{"draft":{"base":1,"error":"required","key":["r","x"],"revision":3,"value":""},"write":null},"passed":true},{"actual":{"draft":{},"write":{"column":"x","expected_revision":3,"row":"r","value":0}},"check":"zero valid","expected":{"draft":{},"write":{"column":"x","expected_revision":3,"row":"r","value":0}},"passed":true},{"actual":{"draft":{},"write":null},"check":"unchanged","expected":{"draft":{},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":2},"write":null},"check":"readonly commit","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":2},"write":null},"passed":true},{"actual":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":5},"write":null},"check":"normal input","expected":{"draft":{"base":1,"error":null,"key":["r","x"],"revision":3,"value":5},"write":null},"passed":true},{"actual":{"draft":{},"write":null},"check":"readonly begin","expected":{"draft":{},"write":null},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"begin snapshot\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 1, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 1, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"cancel draft\", \"actual\": {\"draft\": {}, \"write\": null}, \"expected\": {\"draft\": {}, \"write\": null}, \"passed\": true}, {\"check\": \"wrong column\", \"actual\": {\"draft\": {\"key\": [\"r\", \"y\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"y\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"readonly input\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"stale revision\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 2, \"error\": \"conflict\"}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 2, \"error\": \"conflict\"}, \"write\": null}, \"passed\": true}, {\"check\": \"required empty\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": \"\", \"revision\": 3, \"error\": \"required\"}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": \"\", \"revision\": 3, \"error\": \"required\"}, \"write\": null}, \"passed\": true}, {\"check\": \"zero valid\", \"actual\": {\"draft\": {}, \"write\": {\"row\": \"r\", \"column\": \"x\", \"value\": 0, \"expected_revision\": 3}}, \"expected\": {\"draft\": {}, \"write\": {\"row\": \"r\", \"column\": \"x\", \"value\": 0, \"expected_revision\": 3}}, \"passed\": true}, {\"check\": \"unchanged\", \"actual\": {\"draft\": {}, \"write\": null}, \"expected\": {\"draft\": {}, \"write\": null}, \"passed\": true}, {\"check\": \"readonly commit\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 2, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"normal input\", \"actual\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 5, \"revision\": 3, \"error\": null}, \"write\": null}, \"expected\": {\"draft\": {\"key\": [\"r\", \"x\"], \"base\": 1, \"value\": 5, \"revision\": 3, \"error\": null}, \"write\": null}, \"passed\": true}, {\"check\": \"readonly begin\", \"actual\": {\"draft\": {}, \"write\": null}, \"expected\": {\"draft\": {}, \"write\": null}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}