{"abstract":"The table row version gate 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.","contract_signature":"row, draft, schema, revision, base_revision","evaluation_group":"s3-table-interactions-row-commit","failed_approach":"The attempted repair 'base_revision>revision' still loses a required part of the table contract.","family":"s3-table-interactions-row-commit-row-version-gate","id":"FA-37221","implementations":{"attempt":{"sha256":"ebc4ae3b7fbdcf67fa0821531db0426419d5cbdff3d3b0211eec99bf2bfa6077","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"},"broken":{"sha256":"dd7abdca90e2e1ceee87b0a3f763f77c55bb6eeeec4a4f1772d9fc9a2b573a18","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 False: 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-row-version-gate","generated_at":"2026-09-29T14:42:59.279204+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.","root_cause":"The row version gate decision uses 'False' instead of 'base_revision!=revision'.","sha256":"83efaacec9e985d9d9dbde21cfdd1369d5d0c7471c26eba8227b890e3321ef02","title":"Atomic table row editing: row version gate · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":42.311,"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":[],"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":["a"],"revision":5,"row":{"a":2,"id":"r"},"status":"saved"},"check":"stale row","expected":{"fields":[],"row":{"a":1,"id":"r"},"status":"conflict"},"passed":false},{"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\": \"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\": \"saved\", \"fields\": [\"a\"], \"row\": {\"id\": \"r\", \"a\": 2}, \"revision\": 5}, \"expected\": {\"status\": \"conflict\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": false}, {\"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.503,"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":[],"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":["a"],"revision":5,"row":{"a":2,"id":"r"},"status":"saved"},"check":"stale row","expected":{"fields":[],"row":{"a":1,"id":"r"},"status":"conflict"},"passed":false},{"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\": \"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\": \"saved\", \"fields\": [\"a\"], \"row\": {\"id\": \"r\", \"a\": 2}, \"revision\": 5}, \"expected\": {\"status\": \"conflict\", \"fields\": [], \"row\": {\"id\": \"r\", \"a\": 1}}, \"passed\": false}, {\"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"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}