{"abstract":"Composition defers save.","category":"Client state","checks":70,"contract":"Autosave snapshots both revision and field set. A successful old save acknowledges its sent revision without clearing newer edits. Offline and composition defer new saves, and conflicts preserve local edits for explicit resolution. Operation composition-defers-save has the six explicit input/output oracles below.","evaluation_group":"s3-client-state-autosave-revision","failed_approach":"The partial repair `not composing and bool(dirty_fields)` still violates the explicit fixture contract.","family":"s3-client-state-autosave-revision-composition-defers-save","id":"FA-24351","implementations":{"attempt":{"sha256":"a92abbd7aa5a6c2cd30c5a0b1f28a000368e0d637e03c27606604719ff6c368c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(operation, s):\n    current, sent, acknowledged, dirty_fields, sent_fields, response, online, composing = s\n    if operation == 'acknowledge-sent-revision':\n        return sent if response=='ok' else acknowledged\n    if operation == 'newer-edit-retains-dirty':\n        return dirty_fields if current!=sent or response!='ok' else [f for f in dirty_fields if f not in sent_fields]\n    if operation == 'composition-defers-save':\n        return not composing and bool(dirty_fields)\n    if operation == 'save-completion-status':\n        return 'conflict' if response=='conflict' else ('error' if response=='failed' else ('saved' if current==sent else 'unsaved'))\n    if operation == 'next-save-revision':\n        return current if current>sent else None\n    if operation == 'unsent-field-difference':\n        return [f for f in dirty_fields if f not in sent_fields]\n    if operation == 'conflict-preserves-local-fields':\n        return dirty_fields if response=='conflict' else []\n    if operation == 'save-payload-field-snapshot':\n        return list(sent_fields)\n    if operation == 'unacknowledged-edit-distance':\n        return max(0,current-acknowledged)\n    if operation == 'resave-after-ack':\n        return response=='ok' and current>sent and online and not composing\n    raise ValueError('unknown modeled operation')\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('acknowledge-sent-revision scenario 1', solve('acknowledge-sent-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+1)\ncheck('acknowledge-sent-revision scenario 2', solve('acknowledge-sent-revision', (1,1,0,['a'],['a'],'ok',True,False)), 1)\ncheck('acknowledge-sent-revision scenario 3', solve('acknowledge-sent-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 0)\ncheck('acknowledge-sent-revision scenario 4', solve('acknowledge-sent-revision', (0,0,0,[],[],'ok',True,True)), 0)\ncheck('acknowledge-sent-revision scenario 5', solve('acknowledge-sent-revision', (3,2,1,['b'],['a'],'ok',False,False)), 2)\ncheck('acknowledge-sent-revision scenario 6', solve('acknowledge-sent-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 3)\ncheck('newer-edit-retains-dirty scenario 1', solve('newer-edit-retains-dirty', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a','b'])\ncheck('newer-edit-retains-dirty scenario 2', solve('newer-edit-retains-dirty', (1,1,0,['a'],['a'],'ok',True,False)), [])\ncheck('newer-edit-retains-dirty scenario 3', solve('newer-edit-retains-dirty', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a','b'])\ncheck('newer-edit-retains-dirty scenario 4', solve('newer-edit-retains-dirty', (0,0,0,[],[],'ok',True,True)), [])\ncheck('newer-edit-retains-dirty scenario 5', solve('newer-edit-retains-dirty', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])\ncheck('newer-edit-retains-dirty scenario 6', solve('newer-edit-retains-dirty', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])\ncheck('composition-defers-save scenario 1', solve('composition-defers-save', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)\ncheck('composition-defers-save scenario 2', solve('composition-defers-save', (1,1,0,['a'],['a'],'ok',True,False)), True)\ncheck('composition-defers-save scenario 3', solve('composition-defers-save', (2,1,0,['a','b'],['a'],'failed',True,False)), True)\ncheck('composition-defers-save scenario 4', solve('composition-defers-save', (0,0,0,[],[],'ok',True,True)), False)\ncheck('composition-defers-save scenario 5', solve('composition-defers-save', (3,2,1,['b'],['a'],'ok',False,False)), False)\ncheck('composition-defers-save scenario 6', solve('composition-defers-save', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)\ncheck('save-completion-status scenario 1', solve('save-completion-status', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 'unsaved')\ncheck('save-completion-status scenario 2', solve('save-completion-status', (1,1,0,['a'],['a'],'ok',True,False)), 'saved')\ncheck('save-completion-status scenario 3', solve('save-completion-status', (2,1,0,['a','b'],['a'],'failed',True,False)), 'error')\ncheck('save-completion-status scenario 4', solve('save-completion-status', (0,0,0,[],[],'ok',True,True)), 'saved')\ncheck('save-completion-status scenario 5', solve('save-completion-status', (3,2,1,['b'],['a'],'ok',False,False)), 'unsaved')\ncheck('save-completion-status scenario 6', solve('save-completion-status', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 'conflict')\ncheck('next-save-revision scenario 1', solve('next-save-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+2)\ncheck('next-save-revision scenario 2', solve('next-save-revision', (1,1,0,['a'],['a'],'ok',True,False)), None)\ncheck('next-save-revision scenario 3', solve('next-save-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)\ncheck('next-save-revision scenario 4', solve('next-save-revision', (0,0,0,[],[],'ok',True,True)), None)\ncheck('next-save-revision scenario 5', solve('next-save-revision', (3,2,1,['b'],['a'],'ok',False,False)), 3)\ncheck('next-save-revision scenario 6', solve('next-save-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), None)\ncheck('unsent-field-difference scenario 1', solve('unsent-field-difference', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['b'])\ncheck('unsent-field-difference scenario 2', solve('unsent-field-difference', (1,1,0,['a'],['a'],'ok',True,False)), [])\ncheck('unsent-field-difference scenario 3', solve('unsent-field-difference', (2,1,0,['a','b'],['a'],'failed',True,False)), ['b'])\ncheck('unsent-field-difference scenario 4', solve('unsent-field-difference', (0,0,0,[],[],'ok',True,True)), [])\ncheck('unsent-field-difference scenario 5', solve('unsent-field-difference', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])\ncheck('unsent-field-difference scenario 6', solve('unsent-field-difference', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), [])\ncheck('conflict-preserves-local-fields scenario 1', solve('conflict-preserves-local-fields', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), [])\ncheck('conflict-preserves-local-fields scenario 2', solve('conflict-preserves-local-fields', (1,1,0,['a'],['a'],'ok',True,False)), [])\ncheck('conflict-preserves-local-fields scenario 3', solve('conflict-preserves-local-fields', (2,1,0,['a','b'],['a'],'failed',True,False)), [])\ncheck('conflict-preserves-local-fields scenario 4', solve('conflict-preserves-local-fields', (0,0,0,[],[],'ok',True,True)), [])\ncheck('conflict-preserves-local-fields scenario 5', solve('conflict-preserves-local-fields', (3,2,1,['b'],['a'],'ok',False,False)), [])\ncheck('conflict-preserves-local-fields scenario 6', solve('conflict-preserves-local-fields', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])\ncheck('save-payload-field-snapshot scenario 1', solve('save-payload-field-snapshot', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 2', solve('save-payload-field-snapshot', (1,1,0,['a'],['a'],'ok',True,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 3', solve('save-payload-field-snapshot', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 4', solve('save-payload-field-snapshot', (0,0,0,[],[],'ok',True,True)), [])\ncheck('save-payload-field-snapshot scenario 5', solve('save-payload-field-snapshot', (3,2,1,['b'],['a'],'ok',False,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 6', solve('save-payload-field-snapshot', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])\ncheck('unacknowledged-edit-distance scenario 1', solve('unacknowledged-edit-distance', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 2)\ncheck('unacknowledged-edit-distance scenario 2', solve('unacknowledged-edit-distance', (1,1,0,['a'],['a'],'ok',True,False)), 1)\ncheck('unacknowledged-edit-distance scenario 3', solve('unacknowledged-edit-distance', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)\ncheck('unacknowledged-edit-distance scenario 4', solve('unacknowledged-edit-distance', (0,0,0,[],[],'ok',True,True)), 0)\ncheck('unacknowledged-edit-distance scenario 5', solve('unacknowledged-edit-distance', (3,2,1,['b'],['a'],'ok',False,False)), 2)\ncheck('unacknowledged-edit-distance scenario 6', solve('unacknowledged-edit-distance', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 1)\ncheck('resave-after-ack scenario 1', solve('resave-after-ack', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)\ncheck('resave-after-ack scenario 2', solve('resave-after-ack', (1,1,0,['a'],['a'],'ok',True,False)), False)\ncheck('resave-after-ack scenario 3', solve('resave-after-ack', (2,1,0,['a','b'],['a'],'failed',True,False)), False)\ncheck('resave-after-ack scenario 4', solve('resave-after-ack', (0,0,0,[],[],'ok',True,True)), False)\ncheck('resave-after-ack scenario 5', solve('resave-after-ack', (3,2,1,['b'],['a'],'ok',False,False)), False)\ncheck('resave-after-ack scenario 6', solve('resave-after-ack', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)\ncheck('many edits during conflicting save: acknowledge-sent-revision', solve('acknowledge-sent-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 1)\ncheck('many edits during conflicting save: newer-edit-retains-dirty', solve('newer-edit-retains-dirty', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])\ncheck('many edits during conflicting save: composition-defers-save', solve('composition-defers-save', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), True)\ncheck('many edits during conflicting save: save-completion-status', solve('save-completion-status', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 'conflict')\ncheck('many edits during conflicting save: next-save-revision', solve('next-save-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+5)\ncheck('many edits during conflicting save: unsent-field-difference', solve('unsent-field-difference', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['b'])\ncheck('many edits during conflicting save: conflict-preserves-local-fields', solve('conflict-preserves-local-fields', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])\ncheck('many edits during conflicting save: save-payload-field-snapshot', solve('save-payload-field-snapshot', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a'])\ncheck('many edits during conflicting save: unacknowledged-edit-distance', solve('unacknowledged-edit-distance', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+4)\ncheck('many edits during conflicting save: resave-after-ack', solve('resave-after-ack', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), False)\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":"b6d51b25b5d177734c5eb948dc585fdb73ef5a043cfc14fef374105521e5ef78","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(operation, s):\n    current, sent, acknowledged, dirty_fields, sent_fields, response, online, composing = s\n    if operation == 'acknowledge-sent-revision':\n        return sent if response=='ok' else acknowledged\n    if operation == 'newer-edit-retains-dirty':\n        return dirty_fields if current!=sent or response!='ok' else [f for f in dirty_fields if f not in sent_fields]\n    if operation == 'composition-defers-save':\n        return online and bool(dirty_fields)\n    if operation == 'save-completion-status':\n        return 'conflict' if response=='conflict' else ('error' if response=='failed' else ('saved' if current==sent else 'unsaved'))\n    if operation == 'next-save-revision':\n        return current if current>sent else None\n    if operation == 'unsent-field-difference':\n        return [f for f in dirty_fields if f not in sent_fields]\n    if operation == 'conflict-preserves-local-fields':\n        return dirty_fields if response=='conflict' else []\n    if operation == 'save-payload-field-snapshot':\n        return list(sent_fields)\n    if operation == 'unacknowledged-edit-distance':\n        return max(0,current-acknowledged)\n    if operation == 'resave-after-ack':\n        return response=='ok' and current>sent and online and not composing\n    raise ValueError('unknown modeled operation')\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('acknowledge-sent-revision scenario 1', solve('acknowledge-sent-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+1)\ncheck('acknowledge-sent-revision scenario 2', solve('acknowledge-sent-revision', (1,1,0,['a'],['a'],'ok',True,False)), 1)\ncheck('acknowledge-sent-revision scenario 3', solve('acknowledge-sent-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 0)\ncheck('acknowledge-sent-revision scenario 4', solve('acknowledge-sent-revision', (0,0,0,[],[],'ok',True,True)), 0)\ncheck('acknowledge-sent-revision scenario 5', solve('acknowledge-sent-revision', (3,2,1,['b'],['a'],'ok',False,False)), 2)\ncheck('acknowledge-sent-revision scenario 6', solve('acknowledge-sent-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 3)\ncheck('newer-edit-retains-dirty scenario 1', solve('newer-edit-retains-dirty', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a','b'])\ncheck('newer-edit-retains-dirty scenario 2', solve('newer-edit-retains-dirty', (1,1,0,['a'],['a'],'ok',True,False)), [])\ncheck('newer-edit-retains-dirty scenario 3', solve('newer-edit-retains-dirty', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a','b'])\ncheck('newer-edit-retains-dirty scenario 4', solve('newer-edit-retains-dirty', (0,0,0,[],[],'ok',True,True)), [])\ncheck('newer-edit-retains-dirty scenario 5', solve('newer-edit-retains-dirty', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])\ncheck('newer-edit-retains-dirty scenario 6', solve('newer-edit-retains-dirty', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])\ncheck('composition-defers-save scenario 1', solve('composition-defers-save', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)\ncheck('composition-defers-save scenario 2', solve('composition-defers-save', (1,1,0,['a'],['a'],'ok',True,False)), True)\ncheck('composition-defers-save scenario 3', solve('composition-defers-save', (2,1,0,['a','b'],['a'],'failed',True,False)), True)\ncheck('composition-defers-save scenario 4', solve('composition-defers-save', (0,0,0,[],[],'ok',True,True)), False)\ncheck('composition-defers-save scenario 5', solve('composition-defers-save', (3,2,1,['b'],['a'],'ok',False,False)), False)\ncheck('composition-defers-save scenario 6', solve('composition-defers-save', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)\ncheck('save-completion-status scenario 1', solve('save-completion-status', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 'unsaved')\ncheck('save-completion-status scenario 2', solve('save-completion-status', (1,1,0,['a'],['a'],'ok',True,False)), 'saved')\ncheck('save-completion-status scenario 3', solve('save-completion-status', (2,1,0,['a','b'],['a'],'failed',True,False)), 'error')\ncheck('save-completion-status scenario 4', solve('save-completion-status', (0,0,0,[],[],'ok',True,True)), 'saved')\ncheck('save-completion-status scenario 5', solve('save-completion-status', (3,2,1,['b'],['a'],'ok',False,False)), 'unsaved')\ncheck('save-completion-status scenario 6', solve('save-completion-status', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 'conflict')\ncheck('next-save-revision scenario 1', solve('next-save-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+2)\ncheck('next-save-revision scenario 2', solve('next-save-revision', (1,1,0,['a'],['a'],'ok',True,False)), None)\ncheck('next-save-revision scenario 3', solve('next-save-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)\ncheck('next-save-revision scenario 4', solve('next-save-revision', (0,0,0,[],[],'ok',True,True)), None)\ncheck('next-save-revision scenario 5', solve('next-save-revision', (3,2,1,['b'],['a'],'ok',False,False)), 3)\ncheck('next-save-revision scenario 6', solve('next-save-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), None)\ncheck('unsent-field-difference scenario 1', solve('unsent-field-difference', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['b'])\ncheck('unsent-field-difference scenario 2', solve('unsent-field-difference', (1,1,0,['a'],['a'],'ok',True,False)), [])\ncheck('unsent-field-difference scenario 3', solve('unsent-field-difference', (2,1,0,['a','b'],['a'],'failed',True,False)), ['b'])\ncheck('unsent-field-difference scenario 4', solve('unsent-field-difference', (0,0,0,[],[],'ok',True,True)), [])\ncheck('unsent-field-difference scenario 5', solve('unsent-field-difference', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])\ncheck('unsent-field-difference scenario 6', solve('unsent-field-difference', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), [])\ncheck('conflict-preserves-local-fields scenario 1', solve('conflict-preserves-local-fields', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), [])\ncheck('conflict-preserves-local-fields scenario 2', solve('conflict-preserves-local-fields', (1,1,0,['a'],['a'],'ok',True,False)), [])\ncheck('conflict-preserves-local-fields scenario 3', solve('conflict-preserves-local-fields', (2,1,0,['a','b'],['a'],'failed',True,False)), [])\ncheck('conflict-preserves-local-fields scenario 4', solve('conflict-preserves-local-fields', (0,0,0,[],[],'ok',True,True)), [])\ncheck('conflict-preserves-local-fields scenario 5', solve('conflict-preserves-local-fields', (3,2,1,['b'],['a'],'ok',False,False)), [])\ncheck('conflict-preserves-local-fields scenario 6', solve('conflict-preserves-local-fields', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])\ncheck('save-payload-field-snapshot scenario 1', solve('save-payload-field-snapshot', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 2', solve('save-payload-field-snapshot', (1,1,0,['a'],['a'],'ok',True,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 3', solve('save-payload-field-snapshot', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 4', solve('save-payload-field-snapshot', (0,0,0,[],[],'ok',True,True)), [])\ncheck('save-payload-field-snapshot scenario 5', solve('save-payload-field-snapshot', (3,2,1,['b'],['a'],'ok',False,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 6', solve('save-payload-field-snapshot', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])\ncheck('unacknowledged-edit-distance scenario 1', solve('unacknowledged-edit-distance', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 2)\ncheck('unacknowledged-edit-distance scenario 2', solve('unacknowledged-edit-distance', (1,1,0,['a'],['a'],'ok',True,False)), 1)\ncheck('unacknowledged-edit-distance scenario 3', solve('unacknowledged-edit-distance', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)\ncheck('unacknowledged-edit-distance scenario 4', solve('unacknowledged-edit-distance', (0,0,0,[],[],'ok',True,True)), 0)\ncheck('unacknowledged-edit-distance scenario 5', solve('unacknowledged-edit-distance', (3,2,1,['b'],['a'],'ok',False,False)), 2)\ncheck('unacknowledged-edit-distance scenario 6', solve('unacknowledged-edit-distance', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 1)\ncheck('resave-after-ack scenario 1', solve('resave-after-ack', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)\ncheck('resave-after-ack scenario 2', solve('resave-after-ack', (1,1,0,['a'],['a'],'ok',True,False)), False)\ncheck('resave-after-ack scenario 3', solve('resave-after-ack', (2,1,0,['a','b'],['a'],'failed',True,False)), False)\ncheck('resave-after-ack scenario 4', solve('resave-after-ack', (0,0,0,[],[],'ok',True,True)), False)\ncheck('resave-after-ack scenario 5', solve('resave-after-ack', (3,2,1,['b'],['a'],'ok',False,False)), False)\ncheck('resave-after-ack scenario 6', solve('resave-after-ack', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)\ncheck('many edits during conflicting save: acknowledge-sent-revision', solve('acknowledge-sent-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 1)\ncheck('many edits during conflicting save: newer-edit-retains-dirty', solve('newer-edit-retains-dirty', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])\ncheck('many edits during conflicting save: composition-defers-save', solve('composition-defers-save', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), True)\ncheck('many edits during conflicting save: save-completion-status', solve('save-completion-status', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 'conflict')\ncheck('many edits during conflicting save: next-save-revision', solve('next-save-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+5)\ncheck('many edits during conflicting save: unsent-field-difference', solve('unsent-field-difference', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['b'])\ncheck('many edits during conflicting save: conflict-preserves-local-fields', solve('conflict-preserves-local-fields', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])\ncheck('many edits during conflicting save: save-payload-field-snapshot', solve('save-payload-field-snapshot', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a'])\ncheck('many edits during conflicting save: unacknowledged-edit-distance', solve('unacknowledged-edit-distance', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+4)\ncheck('many edits during conflicting save: resave-after-ack', solve('resave-after-ack', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), False)\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":"08a8a8ddde8f114e5e3dc0e5bc7412bd59cf88cb35bc079dd634b8df7c76b591","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(operation, s):\n    current, sent, acknowledged, dirty_fields, sent_fields, response, online, composing = s\n    if operation == 'acknowledge-sent-revision':\n        return sent if response=='ok' else acknowledged\n    if operation == 'newer-edit-retains-dirty':\n        return dirty_fields if current!=sent or response!='ok' else [f for f in dirty_fields if f not in sent_fields]\n    if operation == 'composition-defers-save':\n        return online and bool(dirty_fields) and not composing\n    if operation == 'save-completion-status':\n        return 'conflict' if response=='conflict' else ('error' if response=='failed' else ('saved' if current==sent else 'unsaved'))\n    if operation == 'next-save-revision':\n        return current if current>sent else None\n    if operation == 'unsent-field-difference':\n        return [f for f in dirty_fields if f not in sent_fields]\n    if operation == 'conflict-preserves-local-fields':\n        return dirty_fields if response=='conflict' else []\n    if operation == 'save-payload-field-snapshot':\n        return list(sent_fields)\n    if operation == 'unacknowledged-edit-distance':\n        return max(0,current-acknowledged)\n    if operation == 'resave-after-ack':\n        return response=='ok' and current>sent and online and not composing\n    raise ValueError('unknown modeled operation')\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('acknowledge-sent-revision scenario 1', solve('acknowledge-sent-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+1)\ncheck('acknowledge-sent-revision scenario 2', solve('acknowledge-sent-revision', (1,1,0,['a'],['a'],'ok',True,False)), 1)\ncheck('acknowledge-sent-revision scenario 3', solve('acknowledge-sent-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 0)\ncheck('acknowledge-sent-revision scenario 4', solve('acknowledge-sent-revision', (0,0,0,[],[],'ok',True,True)), 0)\ncheck('acknowledge-sent-revision scenario 5', solve('acknowledge-sent-revision', (3,2,1,['b'],['a'],'ok',False,False)), 2)\ncheck('acknowledge-sent-revision scenario 6', solve('acknowledge-sent-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 3)\ncheck('newer-edit-retains-dirty scenario 1', solve('newer-edit-retains-dirty', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a','b'])\ncheck('newer-edit-retains-dirty scenario 2', solve('newer-edit-retains-dirty', (1,1,0,['a'],['a'],'ok',True,False)), [])\ncheck('newer-edit-retains-dirty scenario 3', solve('newer-edit-retains-dirty', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a','b'])\ncheck('newer-edit-retains-dirty scenario 4', solve('newer-edit-retains-dirty', (0,0,0,[],[],'ok',True,True)), [])\ncheck('newer-edit-retains-dirty scenario 5', solve('newer-edit-retains-dirty', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])\ncheck('newer-edit-retains-dirty scenario 6', solve('newer-edit-retains-dirty', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])\ncheck('composition-defers-save scenario 1', solve('composition-defers-save', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)\ncheck('composition-defers-save scenario 2', solve('composition-defers-save', (1,1,0,['a'],['a'],'ok',True,False)), True)\ncheck('composition-defers-save scenario 3', solve('composition-defers-save', (2,1,0,['a','b'],['a'],'failed',True,False)), True)\ncheck('composition-defers-save scenario 4', solve('composition-defers-save', (0,0,0,[],[],'ok',True,True)), False)\ncheck('composition-defers-save scenario 5', solve('composition-defers-save', (3,2,1,['b'],['a'],'ok',False,False)), False)\ncheck('composition-defers-save scenario 6', solve('composition-defers-save', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)\ncheck('save-completion-status scenario 1', solve('save-completion-status', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 'unsaved')\ncheck('save-completion-status scenario 2', solve('save-completion-status', (1,1,0,['a'],['a'],'ok',True,False)), 'saved')\ncheck('save-completion-status scenario 3', solve('save-completion-status', (2,1,0,['a','b'],['a'],'failed',True,False)), 'error')\ncheck('save-completion-status scenario 4', solve('save-completion-status', (0,0,0,[],[],'ok',True,True)), 'saved')\ncheck('save-completion-status scenario 5', solve('save-completion-status', (3,2,1,['b'],['a'],'ok',False,False)), 'unsaved')\ncheck('save-completion-status scenario 6', solve('save-completion-status', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 'conflict')\ncheck('next-save-revision scenario 1', solve('next-save-revision', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), N+2)\ncheck('next-save-revision scenario 2', solve('next-save-revision', (1,1,0,['a'],['a'],'ok',True,False)), None)\ncheck('next-save-revision scenario 3', solve('next-save-revision', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)\ncheck('next-save-revision scenario 4', solve('next-save-revision', (0,0,0,[],[],'ok',True,True)), None)\ncheck('next-save-revision scenario 5', solve('next-save-revision', (3,2,1,['b'],['a'],'ok',False,False)), 3)\ncheck('next-save-revision scenario 6', solve('next-save-revision', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), None)\ncheck('unsent-field-difference scenario 1', solve('unsent-field-difference', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['b'])\ncheck('unsent-field-difference scenario 2', solve('unsent-field-difference', (1,1,0,['a'],['a'],'ok',True,False)), [])\ncheck('unsent-field-difference scenario 3', solve('unsent-field-difference', (2,1,0,['a','b'],['a'],'failed',True,False)), ['b'])\ncheck('unsent-field-difference scenario 4', solve('unsent-field-difference', (0,0,0,[],[],'ok',True,True)), [])\ncheck('unsent-field-difference scenario 5', solve('unsent-field-difference', (3,2,1,['b'],['a'],'ok',False,False)), ['b'])\ncheck('unsent-field-difference scenario 6', solve('unsent-field-difference', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), [])\ncheck('conflict-preserves-local-fields scenario 1', solve('conflict-preserves-local-fields', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), [])\ncheck('conflict-preserves-local-fields scenario 2', solve('conflict-preserves-local-fields', (1,1,0,['a'],['a'],'ok',True,False)), [])\ncheck('conflict-preserves-local-fields scenario 3', solve('conflict-preserves-local-fields', (2,1,0,['a','b'],['a'],'failed',True,False)), [])\ncheck('conflict-preserves-local-fields scenario 4', solve('conflict-preserves-local-fields', (0,0,0,[],[],'ok',True,True)), [])\ncheck('conflict-preserves-local-fields scenario 5', solve('conflict-preserves-local-fields', (3,2,1,['b'],['a'],'ok',False,False)), [])\ncheck('conflict-preserves-local-fields scenario 6', solve('conflict-preserves-local-fields', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])\ncheck('save-payload-field-snapshot scenario 1', solve('save-payload-field-snapshot', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 2', solve('save-payload-field-snapshot', (1,1,0,['a'],['a'],'ok',True,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 3', solve('save-payload-field-snapshot', (2,1,0,['a','b'],['a'],'failed',True,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 4', solve('save-payload-field-snapshot', (0,0,0,[],[],'ok',True,True)), [])\ncheck('save-payload-field-snapshot scenario 5', solve('save-payload-field-snapshot', (3,2,1,['b'],['a'],'ok',False,False)), ['a'])\ncheck('save-payload-field-snapshot scenario 6', solve('save-payload-field-snapshot', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), ['a','b'])\ncheck('unacknowledged-edit-distance scenario 1', solve('unacknowledged-edit-distance', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), 2)\ncheck('unacknowledged-edit-distance scenario 2', solve('unacknowledged-edit-distance', (1,1,0,['a'],['a'],'ok',True,False)), 1)\ncheck('unacknowledged-edit-distance scenario 3', solve('unacknowledged-edit-distance', (2,1,0,['a','b'],['a'],'failed',True,False)), 2)\ncheck('unacknowledged-edit-distance scenario 4', solve('unacknowledged-edit-distance', (0,0,0,[],[],'ok',True,True)), 0)\ncheck('unacknowledged-edit-distance scenario 5', solve('unacknowledged-edit-distance', (3,2,1,['b'],['a'],'ok',False,False)), 2)\ncheck('unacknowledged-edit-distance scenario 6', solve('unacknowledged-edit-distance', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), 1)\ncheck('resave-after-ack scenario 1', solve('resave-after-ack', (N+2,N+1,N,['a','b'],['a'],'ok',True,False)), True)\ncheck('resave-after-ack scenario 2', solve('resave-after-ack', (1,1,0,['a'],['a'],'ok',True,False)), False)\ncheck('resave-after-ack scenario 3', solve('resave-after-ack', (2,1,0,['a','b'],['a'],'failed',True,False)), False)\ncheck('resave-after-ack scenario 4', solve('resave-after-ack', (0,0,0,[],[],'ok',True,True)), False)\ncheck('resave-after-ack scenario 5', solve('resave-after-ack', (3,2,1,['b'],['a'],'ok',False,False)), False)\ncheck('resave-after-ack scenario 6', solve('resave-after-ack', (4,4,3,['a','b'],['a','b'],'conflict',True,True)), False)\ncheck('many edits during conflicting save: acknowledge-sent-revision', solve('acknowledge-sent-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 1)\ncheck('many edits during conflicting save: newer-edit-retains-dirty', solve('newer-edit-retains-dirty', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])\ncheck('many edits during conflicting save: composition-defers-save', solve('composition-defers-save', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), True)\ncheck('many edits during conflicting save: save-completion-status', solve('save-completion-status', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), 'conflict')\ncheck('many edits during conflicting save: next-save-revision', solve('next-save-revision', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+5)\ncheck('many edits during conflicting save: unsent-field-difference', solve('unsent-field-difference', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['b'])\ncheck('many edits during conflicting save: conflict-preserves-local-fields', solve('conflict-preserves-local-fields', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a','b'])\ncheck('many edits during conflicting save: save-payload-field-snapshot', solve('save-payload-field-snapshot', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), ['a'])\ncheck('many edits during conflicting save: unacknowledged-edit-distance', solve('unacknowledged-edit-distance', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), N+4)\ncheck('many edits during conflicting save: resave-after-ack', solve('resave-after-ack', (N+5,2,1,['a','b'],['a'],'conflict',True,False)), False)\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":"Only the explicitly specified operations and finite deterministic records are modeled; no browser or framework 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-client-state-autosave-revision-composition-defers-save","generated_at":"2026-09-29T14:40:56.463192+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline client lifecycle model that isolates a state-management defect without DOM rendering or network services.","repair":"Apply the modeled composition-defers-save rule: `online and bool(dirty_fields) and not composing`.","root_cause":"The composition-defers-save client decision evaluates `online and bool(dirty_fields)` instead of `online and bool(dirty_fields) and not composing`.","sha256":"d65b6a1689d84746559917a5fbcebe23e5a4b5b98c1182d44a0af4e50e75b643","title":"Editor autosave revision reconciliation: Composition defers save · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":60.998,"exit_code":1,"observations":[{"actual":2,"check":"acknowledge-sent-revision scenario 1","expected":2,"passed":true},{"actual":1,"check":"acknowledge-sent-revision scenario 2","expected":1,"passed":true},{"actual":0,"check":"acknowledge-sent-revision scenario 3","expected":0,"passed":true},{"actual":0,"check":"acknowledge-sent-revision scenario 4","expected":0,"passed":true},{"actual":2,"check":"acknowledge-sent-revision scenario 5","expected":2,"passed":true},{"actual":3,"check":"acknowledge-sent-revision scenario 6","expected":3,"passed":true},{"actual":["a","b"],"check":"newer-edit-retains-dirty scenario 1","expected":["a","b"],"passed":true},{"actual":[],"check":"newer-edit-retains-dirty scenario 2","expected":[],"passed":true},{"actual":["a","b"],"check":"newer-edit-retains-dirty scenario 3","expected":["a","b"],"passed":true},{"actual":[],"check":"newer-edit-retains-dirty scenario 4","expected":[],"passed":true},{"actual":["b"],"check":"newer-edit-retains-dirty scenario 5","expected":["b"],"passed":true},{"actual":["a","b"],"check":"newer-edit-retains-dirty scenario 6","expected":["a","b"],"passed":true},{"actual":true,"check":"composition-defers-save scenario 1","expected":true,"passed":true},{"actual":true,"check":"composition-defers-save scenario 2","expected":true,"passed":true},{"actual":true,"check":"composition-defers-save scenario 3","expected":true,"passed":true},{"actual":false,"check":"composition-defers-save scenario 4","expected":false,"passed":true},{"actual":true,"check":"composition-defers-save scenario 5","expected":false,"passed":false},{"actual":false,"check":"composition-defers-save scenario 6","expected":false,"passed":true},{"actual":"unsaved","check":"save-completion-status scenario 1","expected":"unsaved","passed":true},{"actual":"saved","check":"save-completion-status scenario 2","expected":"saved","passed":true},{"actual":"error","check":"save-completion-status scenario 3","expected":"error","passed":true},{"actual":"saved","check":"save-completion-status scenario 4","expected":"saved","passed":true},{"actual":"unsaved","check":"save-completion-status scenario 5","expected":"unsaved","passed":true},{"actual":"conflict","check":"save-completion-status scenario 6","expected":"conflict","passed":true},{"actual":3,"check":"next-save-revision scenario 1","expected":3,"passed":true},{"actual":null,"check":"next-save-revision scenario 2","expected":null,"passed":true},{"actual":2,"check":"next-save-revision scenario 3","expected":2,"passed":true},{"actual":null,"check":"next-save-revision scenario 4","expected":null,"passed":true},{"actual":3,"check":"next-save-revision scenario 5","expected":3,"passed":true},{"actual":null,"check":"next-save-revision scenario 6","expected":null,"passed":true},{"actual":["b"],"check":"unsent-field-difference scenario 1","expected":["b"],"passed":true},{"actual":[],"check":"unsent-field-difference scenario 2","expected":[],"passed":true},{"actual":["b"],"check":"unsent-field-difference scenario 3","expected":["b"],"passed":true},{"actual":[],"check":"unsent-field-difference scenario 4","expected":[],"passed":true},{"actual":["b"],"check":"unsent-field-difference scenario 5","expected":["b"],"passed":true},{"actual":[],"check":"unsent-field-difference scenario 6","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 1","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 2","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 3","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 4","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 5","expected":[],"passed":true},{"actual":["a","b"],"check":"conflict-preserves-local-fields scenario 6","expected":["a","b"],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 1","expected":["a"],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 2","expected":["a"],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 3","expected":["a"],"passed":true},{"actual":[],"check":"save-payload-field-snapshot scenario 4","expected":[],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 5","expected":["a"],"passed":true},{"actual":["a","b"],"check":"save-payload-field-snapshot scenario 6","expected":["a","b"],"passed":true},{"actual":2,"check":"unacknowledged-edit-distance scenario 1","expected":2,"passed":true},{"actual":1,"check":"unacknowledged-edit-distance scenario 2","expected":1,"passed":true},{"actual":2,"check":"unacknowledged-edit-distance scenario 3","expected":2,"passed":true},{"actual":0,"check":"unacknowledged-edit-distance scenario 4","expected":0,"passed":true},{"actual":2,"check":"unacknowledged-edit-distance scenario 5","expected":2,"passed":true},{"actual":1,"check":"unacknowledged-edit-distance scenario 6","expected":1,"passed":true},{"actual":true,"check":"resave-after-ack scenario 1","expected":true,"passed":true},{"actual":false,"check":"resave-after-ack scenario 2","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 3","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 4","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 5","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 6","expected":false,"passed":true},{"actual":1,"check":"many edits during conflicting save: acknowledge-sent-revision","expected":1,"passed":true},{"actual":["a","b"],"check":"many edits during conflicting save: newer-edit-retains-dirty","expected":["a","b"],"passed":true},{"actual":true,"check":"many edits during conflicting save: composition-defers-save","expected":true,"passed":true},{"actual":"conflict","check":"many edits during conflicting save: save-completion-status","expected":"conflict","passed":true},{"actual":6,"check":"many edits during conflicting save: next-save-revision","expected":6,"passed":true},{"actual":["b"],"check":"many edits during conflicting save: unsent-field-difference","expected":["b"],"passed":true},{"actual":["a","b"],"check":"many edits during conflicting save: conflict-preserves-local-fields","expected":["a","b"],"passed":true},{"actual":["a"],"check":"many edits during conflicting save: save-payload-field-snapshot","expected":["a"],"passed":true},{"actual":5,"check":"many edits during conflicting save: unacknowledged-edit-distance","expected":5,"passed":true},{"actual":false,"check":"many edits during conflicting save: resave-after-ack","expected":false,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"acknowledge-sent-revision scenario 1\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 2\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 3\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 4\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 5\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 6\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 1\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 3\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 5\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 6\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"composition-defers-save scenario 1\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"composition-defers-save scenario 2\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"composition-defers-save scenario 3\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"composition-defers-save scenario 4\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"composition-defers-save scenario 5\", \"actual\": true, \"expected\": false, \"passed\": false}, {\"check\": \"composition-defers-save scenario 6\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"save-completion-status scenario 1\", \"actual\": \"unsaved\", \"expected\": \"unsaved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 2\", \"actual\": \"saved\", \"expected\": \"saved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 3\", \"actual\": \"error\", \"expected\": \"error\", \"passed\": true}, {\"check\": \"save-completion-status scenario 4\", \"actual\": \"saved\", \"expected\": \"saved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 5\", \"actual\": \"unsaved\", \"expected\": \"unsaved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 6\", \"actual\": \"conflict\", \"expected\": \"conflict\", \"passed\": true}, {\"check\": \"next-save-revision scenario 1\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"next-save-revision scenario 2\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"next-save-revision scenario 3\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"next-save-revision scenario 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"next-save-revision scenario 5\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"next-save-revision scenario 6\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"unsent-field-difference scenario 1\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 3\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 5\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 6\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 1\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 3\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 5\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 6\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 1\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 2\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 3\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 5\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 6\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 1\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 2\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 3\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 4\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 5\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 6\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"resave-after-ack scenario 1\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"resave-after-ack scenario 2\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 3\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 4\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 5\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 6\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"many edits during conflicting save: acknowledge-sent-revision\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"many edits during conflicting save: newer-edit-retains-dirty\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: composition-defers-save\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"many edits during conflicting save: save-completion-status\", \"actual\": \"conflict\", \"expected\": \"conflict\", \"passed\": true}, {\"check\": \"many edits during conflicting save: next-save-revision\", \"actual\": 6, \"expected\": 6, \"passed\": true}, {\"check\": \"many edits during conflicting save: unsent-field-difference\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: conflict-preserves-local-fields\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: save-payload-field-snapshot\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: unacknowledged-edit-distance\", \"actual\": 5, \"expected\": 5, \"passed\": true}, {\"check\": \"many edits during conflicting save: resave-after-ack\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.902,"exit_code":1,"observations":[{"actual":2,"check":"acknowledge-sent-revision scenario 1","expected":2,"passed":true},{"actual":1,"check":"acknowledge-sent-revision scenario 2","expected":1,"passed":true},{"actual":0,"check":"acknowledge-sent-revision scenario 3","expected":0,"passed":true},{"actual":0,"check":"acknowledge-sent-revision scenario 4","expected":0,"passed":true},{"actual":2,"check":"acknowledge-sent-revision scenario 5","expected":2,"passed":true},{"actual":3,"check":"acknowledge-sent-revision scenario 6","expected":3,"passed":true},{"actual":["a","b"],"check":"newer-edit-retains-dirty scenario 1","expected":["a","b"],"passed":true},{"actual":[],"check":"newer-edit-retains-dirty scenario 2","expected":[],"passed":true},{"actual":["a","b"],"check":"newer-edit-retains-dirty scenario 3","expected":["a","b"],"passed":true},{"actual":[],"check":"newer-edit-retains-dirty scenario 4","expected":[],"passed":true},{"actual":["b"],"check":"newer-edit-retains-dirty scenario 5","expected":["b"],"passed":true},{"actual":["a","b"],"check":"newer-edit-retains-dirty scenario 6","expected":["a","b"],"passed":true},{"actual":true,"check":"composition-defers-save scenario 1","expected":true,"passed":true},{"actual":true,"check":"composition-defers-save scenario 2","expected":true,"passed":true},{"actual":true,"check":"composition-defers-save scenario 3","expected":true,"passed":true},{"actual":false,"check":"composition-defers-save scenario 4","expected":false,"passed":true},{"actual":false,"check":"composition-defers-save scenario 5","expected":false,"passed":true},{"actual":true,"check":"composition-defers-save scenario 6","expected":false,"passed":false},{"actual":"unsaved","check":"save-completion-status scenario 1","expected":"unsaved","passed":true},{"actual":"saved","check":"save-completion-status scenario 2","expected":"saved","passed":true},{"actual":"error","check":"save-completion-status scenario 3","expected":"error","passed":true},{"actual":"saved","check":"save-completion-status scenario 4","expected":"saved","passed":true},{"actual":"unsaved","check":"save-completion-status scenario 5","expected":"unsaved","passed":true},{"actual":"conflict","check":"save-completion-status scenario 6","expected":"conflict","passed":true},{"actual":3,"check":"next-save-revision scenario 1","expected":3,"passed":true},{"actual":null,"check":"next-save-revision scenario 2","expected":null,"passed":true},{"actual":2,"check":"next-save-revision scenario 3","expected":2,"passed":true},{"actual":null,"check":"next-save-revision scenario 4","expected":null,"passed":true},{"actual":3,"check":"next-save-revision scenario 5","expected":3,"passed":true},{"actual":null,"check":"next-save-revision scenario 6","expected":null,"passed":true},{"actual":["b"],"check":"unsent-field-difference scenario 1","expected":["b"],"passed":true},{"actual":[],"check":"unsent-field-difference scenario 2","expected":[],"passed":true},{"actual":["b"],"check":"unsent-field-difference scenario 3","expected":["b"],"passed":true},{"actual":[],"check":"unsent-field-difference scenario 4","expected":[],"passed":true},{"actual":["b"],"check":"unsent-field-difference scenario 5","expected":["b"],"passed":true},{"actual":[],"check":"unsent-field-difference scenario 6","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 1","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 2","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 3","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 4","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 5","expected":[],"passed":true},{"actual":["a","b"],"check":"conflict-preserves-local-fields scenario 6","expected":["a","b"],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 1","expected":["a"],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 2","expected":["a"],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 3","expected":["a"],"passed":true},{"actual":[],"check":"save-payload-field-snapshot scenario 4","expected":[],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 5","expected":["a"],"passed":true},{"actual":["a","b"],"check":"save-payload-field-snapshot scenario 6","expected":["a","b"],"passed":true},{"actual":2,"check":"unacknowledged-edit-distance scenario 1","expected":2,"passed":true},{"actual":1,"check":"unacknowledged-edit-distance scenario 2","expected":1,"passed":true},{"actual":2,"check":"unacknowledged-edit-distance scenario 3","expected":2,"passed":true},{"actual":0,"check":"unacknowledged-edit-distance scenario 4","expected":0,"passed":true},{"actual":2,"check":"unacknowledged-edit-distance scenario 5","expected":2,"passed":true},{"actual":1,"check":"unacknowledged-edit-distance scenario 6","expected":1,"passed":true},{"actual":true,"check":"resave-after-ack scenario 1","expected":true,"passed":true},{"actual":false,"check":"resave-after-ack scenario 2","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 3","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 4","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 5","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 6","expected":false,"passed":true},{"actual":1,"check":"many edits during conflicting save: acknowledge-sent-revision","expected":1,"passed":true},{"actual":["a","b"],"check":"many edits during conflicting save: newer-edit-retains-dirty","expected":["a","b"],"passed":true},{"actual":true,"check":"many edits during conflicting save: composition-defers-save","expected":true,"passed":true},{"actual":"conflict","check":"many edits during conflicting save: save-completion-status","expected":"conflict","passed":true},{"actual":6,"check":"many edits during conflicting save: next-save-revision","expected":6,"passed":true},{"actual":["b"],"check":"many edits during conflicting save: unsent-field-difference","expected":["b"],"passed":true},{"actual":["a","b"],"check":"many edits during conflicting save: conflict-preserves-local-fields","expected":["a","b"],"passed":true},{"actual":["a"],"check":"many edits during conflicting save: save-payload-field-snapshot","expected":["a"],"passed":true},{"actual":5,"check":"many edits during conflicting save: unacknowledged-edit-distance","expected":5,"passed":true},{"actual":false,"check":"many edits during conflicting save: resave-after-ack","expected":false,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"acknowledge-sent-revision scenario 1\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 2\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 3\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 4\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 5\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 6\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 1\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 3\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 5\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 6\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"composition-defers-save scenario 1\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"composition-defers-save scenario 2\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"composition-defers-save scenario 3\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"composition-defers-save scenario 4\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"composition-defers-save scenario 5\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"composition-defers-save scenario 6\", \"actual\": true, \"expected\": false, \"passed\": false}, {\"check\": \"save-completion-status scenario 1\", \"actual\": \"unsaved\", \"expected\": \"unsaved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 2\", \"actual\": \"saved\", \"expected\": \"saved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 3\", \"actual\": \"error\", \"expected\": \"error\", \"passed\": true}, {\"check\": \"save-completion-status scenario 4\", \"actual\": \"saved\", \"expected\": \"saved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 5\", \"actual\": \"unsaved\", \"expected\": \"unsaved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 6\", \"actual\": \"conflict\", \"expected\": \"conflict\", \"passed\": true}, {\"check\": \"next-save-revision scenario 1\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"next-save-revision scenario 2\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"next-save-revision scenario 3\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"next-save-revision scenario 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"next-save-revision scenario 5\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"next-save-revision scenario 6\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"unsent-field-difference scenario 1\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 3\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 5\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 6\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 1\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 3\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 5\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 6\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 1\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 2\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 3\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 5\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 6\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 1\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 2\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 3\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 4\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 5\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 6\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"resave-after-ack scenario 1\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"resave-after-ack scenario 2\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 3\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 4\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 5\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 6\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"many edits during conflicting save: acknowledge-sent-revision\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"many edits during conflicting save: newer-edit-retains-dirty\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: composition-defers-save\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"many edits during conflicting save: save-completion-status\", \"actual\": \"conflict\", \"expected\": \"conflict\", \"passed\": true}, {\"check\": \"many edits during conflicting save: next-save-revision\", \"actual\": 6, \"expected\": 6, \"passed\": true}, {\"check\": \"many edits during conflicting save: unsent-field-difference\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: conflict-preserves-local-fields\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: save-payload-field-snapshot\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: unacknowledged-edit-distance\", \"actual\": 5, \"expected\": 5, \"passed\": true}, {\"check\": \"many edits during conflicting save: resave-after-ack\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":48.699,"exit_code":0,"observations":[{"actual":2,"check":"acknowledge-sent-revision scenario 1","expected":2,"passed":true},{"actual":1,"check":"acknowledge-sent-revision scenario 2","expected":1,"passed":true},{"actual":0,"check":"acknowledge-sent-revision scenario 3","expected":0,"passed":true},{"actual":0,"check":"acknowledge-sent-revision scenario 4","expected":0,"passed":true},{"actual":2,"check":"acknowledge-sent-revision scenario 5","expected":2,"passed":true},{"actual":3,"check":"acknowledge-sent-revision scenario 6","expected":3,"passed":true},{"actual":["a","b"],"check":"newer-edit-retains-dirty scenario 1","expected":["a","b"],"passed":true},{"actual":[],"check":"newer-edit-retains-dirty scenario 2","expected":[],"passed":true},{"actual":["a","b"],"check":"newer-edit-retains-dirty scenario 3","expected":["a","b"],"passed":true},{"actual":[],"check":"newer-edit-retains-dirty scenario 4","expected":[],"passed":true},{"actual":["b"],"check":"newer-edit-retains-dirty scenario 5","expected":["b"],"passed":true},{"actual":["a","b"],"check":"newer-edit-retains-dirty scenario 6","expected":["a","b"],"passed":true},{"actual":true,"check":"composition-defers-save scenario 1","expected":true,"passed":true},{"actual":true,"check":"composition-defers-save scenario 2","expected":true,"passed":true},{"actual":true,"check":"composition-defers-save scenario 3","expected":true,"passed":true},{"actual":false,"check":"composition-defers-save scenario 4","expected":false,"passed":true},{"actual":false,"check":"composition-defers-save scenario 5","expected":false,"passed":true},{"actual":false,"check":"composition-defers-save scenario 6","expected":false,"passed":true},{"actual":"unsaved","check":"save-completion-status scenario 1","expected":"unsaved","passed":true},{"actual":"saved","check":"save-completion-status scenario 2","expected":"saved","passed":true},{"actual":"error","check":"save-completion-status scenario 3","expected":"error","passed":true},{"actual":"saved","check":"save-completion-status scenario 4","expected":"saved","passed":true},{"actual":"unsaved","check":"save-completion-status scenario 5","expected":"unsaved","passed":true},{"actual":"conflict","check":"save-completion-status scenario 6","expected":"conflict","passed":true},{"actual":3,"check":"next-save-revision scenario 1","expected":3,"passed":true},{"actual":null,"check":"next-save-revision scenario 2","expected":null,"passed":true},{"actual":2,"check":"next-save-revision scenario 3","expected":2,"passed":true},{"actual":null,"check":"next-save-revision scenario 4","expected":null,"passed":true},{"actual":3,"check":"next-save-revision scenario 5","expected":3,"passed":true},{"actual":null,"check":"next-save-revision scenario 6","expected":null,"passed":true},{"actual":["b"],"check":"unsent-field-difference scenario 1","expected":["b"],"passed":true},{"actual":[],"check":"unsent-field-difference scenario 2","expected":[],"passed":true},{"actual":["b"],"check":"unsent-field-difference scenario 3","expected":["b"],"passed":true},{"actual":[],"check":"unsent-field-difference scenario 4","expected":[],"passed":true},{"actual":["b"],"check":"unsent-field-difference scenario 5","expected":["b"],"passed":true},{"actual":[],"check":"unsent-field-difference scenario 6","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 1","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 2","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 3","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 4","expected":[],"passed":true},{"actual":[],"check":"conflict-preserves-local-fields scenario 5","expected":[],"passed":true},{"actual":["a","b"],"check":"conflict-preserves-local-fields scenario 6","expected":["a","b"],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 1","expected":["a"],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 2","expected":["a"],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 3","expected":["a"],"passed":true},{"actual":[],"check":"save-payload-field-snapshot scenario 4","expected":[],"passed":true},{"actual":["a"],"check":"save-payload-field-snapshot scenario 5","expected":["a"],"passed":true},{"actual":["a","b"],"check":"save-payload-field-snapshot scenario 6","expected":["a","b"],"passed":true},{"actual":2,"check":"unacknowledged-edit-distance scenario 1","expected":2,"passed":true},{"actual":1,"check":"unacknowledged-edit-distance scenario 2","expected":1,"passed":true},{"actual":2,"check":"unacknowledged-edit-distance scenario 3","expected":2,"passed":true},{"actual":0,"check":"unacknowledged-edit-distance scenario 4","expected":0,"passed":true},{"actual":2,"check":"unacknowledged-edit-distance scenario 5","expected":2,"passed":true},{"actual":1,"check":"unacknowledged-edit-distance scenario 6","expected":1,"passed":true},{"actual":true,"check":"resave-after-ack scenario 1","expected":true,"passed":true},{"actual":false,"check":"resave-after-ack scenario 2","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 3","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 4","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 5","expected":false,"passed":true},{"actual":false,"check":"resave-after-ack scenario 6","expected":false,"passed":true},{"actual":1,"check":"many edits during conflicting save: acknowledge-sent-revision","expected":1,"passed":true},{"actual":["a","b"],"check":"many edits during conflicting save: newer-edit-retains-dirty","expected":["a","b"],"passed":true},{"actual":true,"check":"many edits during conflicting save: composition-defers-save","expected":true,"passed":true},{"actual":"conflict","check":"many edits during conflicting save: save-completion-status","expected":"conflict","passed":true},{"actual":6,"check":"many edits during conflicting save: next-save-revision","expected":6,"passed":true},{"actual":["b"],"check":"many edits during conflicting save: unsent-field-difference","expected":["b"],"passed":true},{"actual":["a","b"],"check":"many edits during conflicting save: conflict-preserves-local-fields","expected":["a","b"],"passed":true},{"actual":["a"],"check":"many edits during conflicting save: save-payload-field-snapshot","expected":["a"],"passed":true},{"actual":5,"check":"many edits during conflicting save: unacknowledged-edit-distance","expected":5,"passed":true},{"actual":false,"check":"many edits during conflicting save: resave-after-ack","expected":false,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"acknowledge-sent-revision scenario 1\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 2\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 3\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 4\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 5\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"acknowledge-sent-revision scenario 6\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 1\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 3\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 5\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"newer-edit-retains-dirty scenario 6\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"composition-defers-save scenario 1\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"composition-defers-save scenario 2\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"composition-defers-save scenario 3\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"composition-defers-save scenario 4\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"composition-defers-save scenario 5\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"composition-defers-save scenario 6\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"save-completion-status scenario 1\", \"actual\": \"unsaved\", \"expected\": \"unsaved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 2\", \"actual\": \"saved\", \"expected\": \"saved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 3\", \"actual\": \"error\", \"expected\": \"error\", \"passed\": true}, {\"check\": \"save-completion-status scenario 4\", \"actual\": \"saved\", \"expected\": \"saved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 5\", \"actual\": \"unsaved\", \"expected\": \"unsaved\", \"passed\": true}, {\"check\": \"save-completion-status scenario 6\", \"actual\": \"conflict\", \"expected\": \"conflict\", \"passed\": true}, {\"check\": \"next-save-revision scenario 1\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"next-save-revision scenario 2\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"next-save-revision scenario 3\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"next-save-revision scenario 4\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"next-save-revision scenario 5\", \"actual\": 3, \"expected\": 3, \"passed\": true}, {\"check\": \"next-save-revision scenario 6\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"unsent-field-difference scenario 1\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 3\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 5\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"unsent-field-difference scenario 6\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 1\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 2\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 3\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 5\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"conflict-preserves-local-fields scenario 6\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 1\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 2\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 3\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 4\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 5\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"save-payload-field-snapshot scenario 6\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 1\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 2\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 3\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 4\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 5\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"unacknowledged-edit-distance scenario 6\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"resave-after-ack scenario 1\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"resave-after-ack scenario 2\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 3\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 4\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 5\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"resave-after-ack scenario 6\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"many edits during conflicting save: acknowledge-sent-revision\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"many edits during conflicting save: newer-edit-retains-dirty\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: composition-defers-save\", \"actual\": true, \"expected\": true, \"passed\": true}, {\"check\": \"many edits during conflicting save: save-completion-status\", \"actual\": \"conflict\", \"expected\": \"conflict\", \"passed\": true}, {\"check\": \"many edits during conflicting save: next-save-revision\", \"actual\": 6, \"expected\": 6, \"passed\": true}, {\"check\": \"many edits during conflicting save: unsent-field-difference\", \"actual\": [\"b\"], \"expected\": [\"b\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: conflict-preserves-local-fields\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\", \"b\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: save-payload-field-snapshot\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"many edits during conflicting save: unacknowledged-edit-distance\", \"actual\": 5, \"expected\": 5, \"passed\": true}, {\"check\": \"many edits during conflicting save: resave-after-ack\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}