{"abstract":"The table editable schema result violates the stipulated atomic table row editing contract.","category":"Table interactions","checks":7,"contract":"Row commits validate the merged draft atomically, reject unknown schema fields, ignore readonly fields, preserve untouched cells and stable identity, reject revision conflicts, suppress no-ops, and increment the revision only after actual changes.","evaluation_group":"s3-table-interactions-row-commit","failed_approach":"The attempted repair \"if c.get('editable',False)\" still loses a required part of the table contract.","family":"s3-table-interactions-row-commit-editable-schema","id":"FA-37191","implementations":{"attempt":{"sha256":"69de6164a0d52aef3fd822e4de3b4791f542f558a64273ca4f3239a08494c5c7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(row, draft, schema, revision, base_revision):\n    allowed={c['id'] for c in schema if c.get('editable',False)}\n    unknown=sorted(set(draft)-{c['id'] for c in schema})\n    changes={k:v for k,v in draft.items() if k in allowed and row.get(k)!=v}\n    errors={c['id']:'required' for c in schema if c.get('required') and draft.get(c['id'],row.get(c['id'])) in ('',None)}\n    if unknown: return {'status':'unknown','fields':unknown,'row':row}\n    if errors: return {'status':'invalid','fields':errors,'row':row}\n    if base_revision!=revision: return {'status':'conflict','fields':[],'row':row}\n    if not changes: return {'status':'unchanged','fields':[],'row':row}\n    updated=dict(row); updated.update(changes)\n    return {'status':'saved','fields':sorted(changes),'row':updated,'revision':revision+1}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':1+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 4, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 2:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':2+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 5, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 3:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':3+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 6, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 4:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':4+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 7, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 5:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':5+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 8, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\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":"cbe8f0bf81417f6b1b5c05c2692244093ae6ad45acbcf3123dc32438d4baab55","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(row, draft, schema, revision, base_revision):\n    allowed={c['id'] for c in schema if True}\n    unknown=sorted(set(draft)-{c['id'] for c in schema})\n    changes={k:v for k,v in draft.items() if k in allowed and row.get(k)!=v}\n    errors={c['id']:'required' for c in schema if c.get('required') and draft.get(c['id'],row.get(c['id'])) in ('',None)}\n    if unknown: return {'status':'unknown','fields':unknown,'row':row}\n    if errors: return {'status':'invalid','fields':errors,'row':row}\n    if base_revision!=revision: return {'status':'conflict','fields':[],'row':row}\n    if not changes: return {'status':'unchanged','fields':[],'row':row}\n    updated=dict(row); updated.update(changes)\n    return {'status':'saved','fields':sorted(changes),'row':updated,'revision':revision+1}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':1+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 4, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 2:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':2+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 5, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 3:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':3+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 6, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 4:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':4+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 7, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 5:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':5+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 8, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\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":"78c3b45fabae211ccd7d70b8d1d0f12fb803c906e5517e6cc603863397e25c7a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(row, draft, schema, revision, base_revision):\n    allowed={c['id'] for c in schema if c.get('editable',True)}\n    unknown=sorted(set(draft)-{c['id'] for c in schema})\n    changes={k:v for k,v in draft.items() if k in allowed and row.get(k)!=v}\n    errors={c['id']:'required' for c in schema if c.get('required') and draft.get(c['id'],row.get(c['id'])) in ('',None)}\n    if unknown: return {'status':'unknown','fields':unknown,'row':row}\n    if errors: return {'status':'invalid','fields':errors,'row':row}\n    if base_revision!=revision: return {'status':'conflict','fields':[],'row':row}\n    if not changes: return {'status':'unchanged','fields':[],'row':row}\n    updated=dict(row); updated.update(changes)\n    return {'status':'saved','fields':sorted(changes),'row':updated,'revision':revision+1}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':1+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 4, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 2:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':2+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 5, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 3:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':3+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 6, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 4:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':4+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 7, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n\nif N == 5:\n    check('partial draft', solve({'id':'r','a':1,'b':2}, {'a':5+3}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'saved', 'fields': ['a'], 'row': {'id': 'r', 'a': 8, 'b': 2}, 'revision': 5})\n    check('readonly draft', solve({'id':'r','a':1,'b':2}, {'b':9}, [{'id':'a'},{'id':'b','editable':False}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1, 'b': 2}})\n    check('unknown draft', solve({'id':'r','a':1}, {'missing':2}, [{'id':'a'}], 4, 4), {'status': 'unknown', 'fields': ['missing'], 'row': {'id': 'r', 'a': 1}})\n    check('required clear', solve({'id':'r','a':'ok','b':2}, {'a':''}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'invalid', 'fields': {'a': 'required'}, 'row': {'id': 'r', 'a': 'ok', 'b': 2}})\n    check('required untouched', solve({'id':'r','a':'ok','b':2}, {'b':0}, [{'id':'a','required':True},{'id':'b'}], 4, 4), {'status': 'saved', 'fields': ['b'], 'row': {'id': 'r', 'a': 'ok', 'b': 0}, 'revision': 5})\n    check('stale row', solve({'id':'r','a':1}, {'a':2}, [{'id':'a'}], 4, 3), {'status': 'conflict', 'fields': [], 'row': {'id': 'r', 'a': 1}})\n    check('same value', solve({'id':'r','a':1}, {'a':1}, [{'id':'a'}], 4, 4), {'status': 'unchanged', 'fields': [], 'row': {'id': 'r', 'a': 1}})\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":"Schema IDs are unique, revisions are integers, and required validation means only None or empty string. 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-row-commit-editable-schema","generated_at":"2026-09-29T14:42:58.797322+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline table UI model isolates atomic table row editing, including adversarial row/column relationships.","repair":"Apply the complete editable schema rule: if c.get('editable',True).","root_cause":"The editable schema decision uses 'if True' instead of \"if c.get('editable',True)\".","sha256":"6281a6d53475d3e9b9b4c59ea8feec3f997b05bff890fcdd720401b5ae506bb6","title":"Atomic table row editing: editable schema · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":45.327,"exit_code":1,"observations":[{"actual":{"fields":[],"row":{"a":1,"b":2,"id":"r"},"status":"unchanged"},"check":"partial draft","expected":{"fields":["a"],"revision":5,"row":{"a":4,"b":2,"id":"r"},"status":"saved"},"passed":false},{"actual":{"fields":[],"row":{"a":1,"b":2,"id":"r"},"status":"unchanged"},"check":"readonly draft","expected":{"fields":[],"row":{"a":1,"b":2,"id":"r"},"status":"unchanged"},"passed":true},{"actual":{"fields":["missing"],"row":{"a":1,"id":"r"},"status":"unknown"},"check":"unknown draft","expected":{"fields":["missing"],"row":{"a":1,"id":"r"},"status":"unknown"},"passed":true},{"actual":{"fields":{"a":"required"},"row":{"a":"ok","b":2,"id":"r"},"status":"invalid"},"check":"required clear","expected":{"fields":{"a":"required"},"row":{"a":"ok","b":2,"id":"r"},"status":"invalid"},"passed":true},{"actual":{"fields":[],"row":{"a":"ok","b":2,"id":"r"},"status":"unchanged"},"check":"required untouched","expected":{"fields":["b"],"revision":5,"row":{"a":"ok","b":0,"id":"r"},"status":"saved"},"passed":false},{"actual":{"fields":[],"row":{"a":1,"id":"r"},"status":"conflict"},"check":"stale row","expected":{"fields":[],"row":{"a":1,"id":"r"},"status":"conflict"},"passed":true},{"actual":{"fields":[],"row":{"a":1,"id":"r"},"status":"unchanged"},"check":"same value","expected":{"fields":[],"row":{"a":1,"id":"r"},"status":"unchanged"},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"partial draft\", \"actual\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1, \"b\": 2}}, \"expected\": {\"status\": \"saved\", \"fields\": [\"a\"], \"row\": {\"id\": \"r\", \"a\": 4, \"b\": 2}, \"revision\": 5}, \"passed\": false}, {\"check\": \"readonly draft\", \"actual\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1, \"b\": 2}}, \"expected\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1, \"b\": 2}}, \"passed\": true}, {\"check\": \"unknown draft\", \"actual\": {\"status\": \"unknown\", \"fields\": [\"missing\"], \"row\": {\"id\": \"r\", \"a\": 1}}, \"expected\": {\"status\": \"unknown\", \"fields\": [\"missing\"], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": true}, {\"check\": \"required clear\", \"actual\": {\"status\": \"invalid\", \"fields\": {\"a\": \"required\"}, \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 2}}, \"expected\": {\"status\": \"invalid\", \"fields\": {\"a\": \"required\"}, \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 2}}, \"passed\": true}, {\"check\": \"required untouched\", \"actual\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 2}}, \"expected\": {\"status\": \"saved\", \"fields\": [\"b\"], \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 0}, \"revision\": 5}, \"passed\": false}, {\"check\": \"stale row\", \"actual\": {\"status\": \"conflict\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"expected\": {\"status\": \"conflict\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": true}, {\"check\": \"same value\", \"actual\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"expected\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.669,"exit_code":1,"observations":[{"actual":{"fields":["a"],"revision":5,"row":{"a":4,"b":2,"id":"r"},"status":"saved"},"check":"partial draft","expected":{"fields":["a"],"revision":5,"row":{"a":4,"b":2,"id":"r"},"status":"saved"},"passed":true},{"actual":{"fields":["b"],"revision":5,"row":{"a":1,"b":9,"id":"r"},"status":"saved"},"check":"readonly draft","expected":{"fields":[],"row":{"a":1,"b":2,"id":"r"},"status":"unchanged"},"passed":false},{"actual":{"fields":["missing"],"row":{"a":1,"id":"r"},"status":"unknown"},"check":"unknown draft","expected":{"fields":["missing"],"row":{"a":1,"id":"r"},"status":"unknown"},"passed":true},{"actual":{"fields":{"a":"required"},"row":{"a":"ok","b":2,"id":"r"},"status":"invalid"},"check":"required clear","expected":{"fields":{"a":"required"},"row":{"a":"ok","b":2,"id":"r"},"status":"invalid"},"passed":true},{"actual":{"fields":["b"],"revision":5,"row":{"a":"ok","b":0,"id":"r"},"status":"saved"},"check":"required untouched","expected":{"fields":["b"],"revision":5,"row":{"a":"ok","b":0,"id":"r"},"status":"saved"},"passed":true},{"actual":{"fields":[],"row":{"a":1,"id":"r"},"status":"conflict"},"check":"stale row","expected":{"fields":[],"row":{"a":1,"id":"r"},"status":"conflict"},"passed":true},{"actual":{"fields":[],"row":{"a":1,"id":"r"},"status":"unchanged"},"check":"same value","expected":{"fields":[],"row":{"a":1,"id":"r"},"status":"unchanged"},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"partial draft\", \"actual\": {\"status\": \"saved\", \"fields\": [\"a\"], \"row\": {\"id\": \"r\", \"a\": 4, \"b\": 2}, \"revision\": 5}, \"expected\": {\"status\": \"saved\", \"fields\": [\"a\"], \"row\": {\"id\": \"r\", \"a\": 4, \"b\": 2}, \"revision\": 5}, \"passed\": true}, {\"check\": \"readonly draft\", \"actual\": {\"status\": \"saved\", \"fields\": [\"b\"], \"row\": {\"id\": \"r\", \"a\": 1, \"b\": 9}, \"revision\": 5}, \"expected\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1, \"b\": 2}}, \"passed\": false}, {\"check\": \"unknown draft\", \"actual\": {\"status\": \"unknown\", \"fields\": [\"missing\"], \"row\": {\"id\": \"r\", \"a\": 1}}, \"expected\": {\"status\": \"unknown\", \"fields\": [\"missing\"], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": true}, {\"check\": \"required clear\", \"actual\": {\"status\": \"invalid\", \"fields\": {\"a\": \"required\"}, \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 2}}, \"expected\": {\"status\": \"invalid\", \"fields\": {\"a\": \"required\"}, \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 2}}, \"passed\": true}, {\"check\": \"required untouched\", \"actual\": {\"status\": \"saved\", \"fields\": [\"b\"], \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 0}, \"revision\": 5}, \"expected\": {\"status\": \"saved\", \"fields\": [\"b\"], \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 0}, \"revision\": 5}, \"passed\": true}, {\"check\": \"stale row\", \"actual\": {\"status\": \"conflict\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"expected\": {\"status\": \"conflict\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": true}, {\"check\": \"same value\", \"actual\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"expected\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.976,"exit_code":0,"observations":[{"actual":{"fields":["a"],"revision":5,"row":{"a":4,"b":2,"id":"r"},"status":"saved"},"check":"partial draft","expected":{"fields":["a"],"revision":5,"row":{"a":4,"b":2,"id":"r"},"status":"saved"},"passed":true},{"actual":{"fields":[],"row":{"a":1,"b":2,"id":"r"},"status":"unchanged"},"check":"readonly draft","expected":{"fields":[],"row":{"a":1,"b":2,"id":"r"},"status":"unchanged"},"passed":true},{"actual":{"fields":["missing"],"row":{"a":1,"id":"r"},"status":"unknown"},"check":"unknown draft","expected":{"fields":["missing"],"row":{"a":1,"id":"r"},"status":"unknown"},"passed":true},{"actual":{"fields":{"a":"required"},"row":{"a":"ok","b":2,"id":"r"},"status":"invalid"},"check":"required clear","expected":{"fields":{"a":"required"},"row":{"a":"ok","b":2,"id":"r"},"status":"invalid"},"passed":true},{"actual":{"fields":["b"],"revision":5,"row":{"a":"ok","b":0,"id":"r"},"status":"saved"},"check":"required untouched","expected":{"fields":["b"],"revision":5,"row":{"a":"ok","b":0,"id":"r"},"status":"saved"},"passed":true},{"actual":{"fields":[],"row":{"a":1,"id":"r"},"status":"conflict"},"check":"stale row","expected":{"fields":[],"row":{"a":1,"id":"r"},"status":"conflict"},"passed":true},{"actual":{"fields":[],"row":{"a":1,"id":"r"},"status":"unchanged"},"check":"same value","expected":{"fields":[],"row":{"a":1,"id":"r"},"status":"unchanged"},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"partial draft\", \"actual\": {\"status\": \"saved\", \"fields\": [\"a\"], \"row\": {\"id\": \"r\", \"a\": 4, \"b\": 2}, \"revision\": 5}, \"expected\": {\"status\": \"saved\", \"fields\": [\"a\"], \"row\": {\"id\": \"r\", \"a\": 4, \"b\": 2}, \"revision\": 5}, \"passed\": true}, {\"check\": \"readonly draft\", \"actual\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1, \"b\": 2}}, \"expected\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1, \"b\": 2}}, \"passed\": true}, {\"check\": \"unknown draft\", \"actual\": {\"status\": \"unknown\", \"fields\": [\"missing\"], \"row\": {\"id\": \"r\", \"a\": 1}}, \"expected\": {\"status\": \"unknown\", \"fields\": [\"missing\"], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": true}, {\"check\": \"required clear\", \"actual\": {\"status\": \"invalid\", \"fields\": {\"a\": \"required\"}, \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 2}}, \"expected\": {\"status\": \"invalid\", \"fields\": {\"a\": \"required\"}, \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 2}}, \"passed\": true}, {\"check\": \"required untouched\", \"actual\": {\"status\": \"saved\", \"fields\": [\"b\"], \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 0}, \"revision\": 5}, \"expected\": {\"status\": \"saved\", \"fields\": [\"b\"], \"row\": {\"id\": \"r\", \"a\": \"ok\", \"b\": 0}, \"revision\": 5}, \"passed\": true}, {\"check\": \"stale row\", \"actual\": {\"status\": \"conflict\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"expected\": {\"status\": \"conflict\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": true}, {\"check\": \"same value\", \"actual\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"expected\": {\"status\": \"unchanged\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}