{"abstract":"The archive-failure event leaves a notification in archived instead of restored-error.","category":"Notification interfaces","checks":37,"contract":"Inbox optimistic archive rollback is a bounded visual-notification workflow with mutable policy state {'row': {'revision': 1, 'text': 'old'}, 'saved': None, 'visible': True}. Its default transition relation is {('row-visible', 'archive-click'): 'optimistically-hidden', ('optimistically-hidden', 'archive-success'): 'archived', ('optimistically-hidden', 'archive-failure'): 'restored-error', ('restored-error', 'retry-archive'): 'optimistically-hidden', ('archived', 'restore-click'): 'restoring', ('restoring', 'restore-success'): 'row-visible', ('restoring', 'restore-failure'): 'restore-error', ('restore-error', 'retry-restore'): 'restoring', ('optimistically-hidden', 'new-revision-arrives'): 'hidden-new-revision', ('hidden-new-revision', 'archive-failure'): 'restored-new-revision-error'}; domain inputs can suppress or redirect transitions and update policy fields, as specified in solve. Different-generation events are inert. Batches apply in order. Optional observe returns the selected policy field alongside the phase.","evaluation_group":"s3-notification-interfaces-delete-rollback","failed_approach":"Silent restoration loses the failed-action explanation.","family":"s3-notification-interfaces-delete-rollback-03","id":"FA-34601","implementations":{"attempt":{"sha256":"792fcecfec06074735e8be0b74b4f9a1b8afd04c1a22bf87bffce0be9129b371","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(initial, events, generation, payload=None, observe=None):\n    table = {('row-visible', 'archive-click'): 'optimistically-hidden', ('optimistically-hidden', 'archive-success'): 'archived', ('optimistically-hidden', 'archive-failure'): 'row-visible', ('restored-error', 'retry-archive'): 'optimistically-hidden', ('archived', 'restore-click'): 'restoring', ('restoring', 'restore-success'): 'row-visible', ('restoring', 'restore-failure'): 'restore-error', ('restore-error', 'retry-restore'): 'restoring', ('optimistically-hidden', 'new-revision-arrives'): 'hidden-new-revision', ('hidden-new-revision', 'archive-failure'): 'restored-new-revision-error'}\n    data = json.loads(json.dumps({'row': {'revision': 1, 'text': 'old'}, 'saved': None, 'visible': True})) if payload is None else {**json.loads(json.dumps({'row': {'revision': 1, 'text': 'old'}, 'saved': None, 'visible': True})), **json.loads(json.dumps(payload))}\n    state = initial\n    for delivery in events:\n        event, event_generation = delivery[:2]\n        arg = delivery[2] if len(delivery) > 2 else {}\n        if event_generation == generation:\n            previous = state\n            if event == 'archive-click': data['saved'] = dict(data['row'])\n            if event == 'new-revision-arrives':\n                revision = arg.get('revision',data['row']['revision']+1)\n                if revision <= data['row']['revision']: event = 'unknown-event'\n                else: data['row'] = {'revision':revision,'text':arg.get('text','new')}\n            state = table.get((state, event), state)\n            if state in ('archived','optimistically-hidden','hidden-new-revision','restore-error','restoring'): data['visible'] = False\n            if state in ('row-visible','restored-error','restored-new-revision-error'): data['visible'] = True\n            if state == 'restored-error' and data['saved'] is not None: data['row'] = dict(data['saved'])\n    return {'phase': state, 'value': data[observe]} if observe else state\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('row-visible / archive-click', solve('row-visible', [('archive-click', N)], N), 'optimistically-hidden')\ncheck('optimistically-hidden / archive-success', solve('optimistically-hidden', [('archive-success', N)], N), 'archived')\ncheck('optimistically-hidden / archive-failure', solve('optimistically-hidden', [('archive-failure', N)], N), 'restored-error')\ncheck('restored-error / retry-archive', solve('restored-error', [('retry-archive', N)], N), 'optimistically-hidden')\ncheck('archived / restore-click', solve('archived', [('restore-click', N)], N), 'restoring')\ncheck('restoring / restore-success', solve('restoring', [('restore-success', N)], N), 'row-visible')\ncheck('restoring / restore-failure', solve('restoring', [('restore-failure', N)], N), 'restore-error')\ncheck('restore-error / retry-restore', solve('restore-error', [('retry-restore', N)], N), 'restoring')\ncheck('optimistically-hidden / new-revision-arrives', solve('optimistically-hidden', [('new-revision-arrives', N)], N), 'hidden-new-revision')\ncheck('hidden-new-revision / archive-failure', solve('hidden-new-revision', [('archive-failure', N)], N), 'restored-new-revision-error')\ncheck('older notification incarnation', solve('row-visible', [('archive-click', N - 1)], N), 'row-visible')\ncheck('future notification incarnation', solve('row-visible', [('archive-click', N + 1)], N), 'row-visible')\ncheck('unknown event is inert', solve('row-visible', [('unknown-event', N)], N), 'row-visible')\ncheck('empty delivery batch', solve('row-visible', [], N), 'row-visible')\ncheck('N stale deliveries before current delivery', solve('row-visible', [('archive-click', N - 1)] * N + [('archive-click', N)], N), 'optimistically-hidden')\ncheck('trace archive-click then archive-success', solve('row-visible', [('archive-click', N), ('archive-success', N)], N), 'archived')\ncheck('trace archive-click then archive-failure', solve('row-visible', [('archive-click', N), ('archive-failure', N)], N), 'restored-error')\ncheck('trace archive-click then new-revision-arrives', solve('row-visible', [('archive-click', N), ('new-revision-arrives', N)], N), 'hidden-new-revision')\ncheck('trace archive-success then restore-click', solve('optimistically-hidden', [('archive-success', N), ('restore-click', N)], N), 'restoring')\ncheck('trace archive-failure then retry-archive', solve('optimistically-hidden', [('archive-failure', N), ('retry-archive', N)], N), 'optimistically-hidden')\ncheck('trace retry-archive then archive-success', solve('restored-error', [('retry-archive', N), ('archive-success', N)], N), 'archived')\ncheck('trace retry-archive then archive-failure', solve('restored-error', [('retry-archive', N), ('archive-failure', N)], N), 'restored-error')\ncheck('trace retry-archive then new-revision-arrives', solve('restored-error', [('retry-archive', N), ('new-revision-arrives', N)], N), 'hidden-new-revision')\ncheck('trace restore-click then restore-success', solve('archived', [('restore-click', N), ('restore-success', N)], N), 'row-visible')\ncheck('trace restore-click then restore-failure', solve('archived', [('restore-click', N), ('restore-failure', N)], N), 'restore-error')\ncheck('trace restore-success then archive-click', solve('restoring', [('restore-success', N), ('archive-click', N)], N), 'optimistically-hidden')\ncheck('trace restore-failure then retry-restore', solve('restoring', [('restore-failure', N), ('retry-restore', N)], N), 'restoring')\ncheck('trace retry-restore then restore-success', solve('restore-error', [('retry-restore', N), ('restore-success', N)], N), 'row-visible')\ncheck('trace retry-restore then restore-failure', solve('restore-error', [('retry-restore', N), ('restore-failure', N)], N), 'restore-error')\ncheck('trace new-revision-arrives then archive-failure', solve('optimistically-hidden', [('new-revision-arrives', N), ('archive-failure', N)], N), 'restored-new-revision-error')\ncheck('domain state regression 1: saved', solve('row-visible', [('archive-click', N, {})], N, {}, 'saved'), {'phase': 'optimistically-hidden', 'value': {'revision': 1, 'text': 'old'}})\ncheck('domain state regression 2: row', solve('optimistically-hidden', [('new-revision-arrives', N, {'revision': 1, 'text': 'stale'})], N, {}, 'row'), {'phase': 'optimistically-hidden', 'value': {'revision': 1, 'text': 'old'}})\ncheck('domain state regression 3: visible', solve('optimistically-hidden', [('new-revision-arrives', N, {'revision': 2, 'text': 'new'})], N, {}, 'visible'), {'phase': 'hidden-new-revision', 'value': False})\ncheck('domain state regression 4: row', solve('hidden-new-revision', [('archive-failure', N, {})], N, {'row': {'revision': 2, 'text': 'new'}, 'saved': {'revision': 1, 'text': 'old'}}, 'row'), {'phase': 'restored-new-revision-error', 'value': {'revision': 2, 'text': 'new'}})\ncheck('domain state regression 5: row', solve('optimistically-hidden', [('archive-failure', N, {})], N, {'saved': {'revision': 1, 'text': 'original'}}, 'row'), {'phase': 'restored-error', 'value': {'revision': 1, 'text': 'original'}})\ncheck('domain state regression 6: visible', solve('restoring', [('restore-failure', N, {})], N, {}, 'visible'), {'phase': 'restore-error', 'value': False})\ncheck('domain state regression 7: row', solve('row-visible', [('archive-click', N, {}), ('new-revision-arrives', N, {'revision': 2, 'text': 'new'}), ('archive-failure', N, {})], N, {}, 'row'), {'phase': 'restored-new-revision-error', 'value': {'revision': 2, 'text': 'new'}})\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":"895d0aeca96534e4529de86042c45b56e414db099b75016e622f8c3783a4c472","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(initial, events, generation, payload=None, observe=None):\n    table = {('row-visible', 'archive-click'): 'optimistically-hidden', ('optimistically-hidden', 'archive-success'): 'archived', ('optimistically-hidden', 'archive-failure'): 'archived', ('restored-error', 'retry-archive'): 'optimistically-hidden', ('archived', 'restore-click'): 'restoring', ('restoring', 'restore-success'): 'row-visible', ('restoring', 'restore-failure'): 'restore-error', ('restore-error', 'retry-restore'): 'restoring', ('optimistically-hidden', 'new-revision-arrives'): 'hidden-new-revision', ('hidden-new-revision', 'archive-failure'): 'restored-new-revision-error'}\n    data = json.loads(json.dumps({'row': {'revision': 1, 'text': 'old'}, 'saved': None, 'visible': True})) if payload is None else {**json.loads(json.dumps({'row': {'revision': 1, 'text': 'old'}, 'saved': None, 'visible': True})), **json.loads(json.dumps(payload))}\n    state = initial\n    for delivery in events:\n        event, event_generation = delivery[:2]\n        arg = delivery[2] if len(delivery) > 2 else {}\n        if event_generation == generation:\n            previous = state\n            if event == 'archive-click': data['saved'] = dict(data['row'])\n            if event == 'new-revision-arrives':\n                revision = arg.get('revision',data['row']['revision']+1)\n                if revision <= data['row']['revision']: event = 'unknown-event'\n                else: data['row'] = {'revision':revision,'text':arg.get('text','new')}\n            state = table.get((state, event), state)\n            if state in ('archived','optimistically-hidden','hidden-new-revision','restore-error','restoring'): data['visible'] = False\n            if state in ('row-visible','restored-error','restored-new-revision-error'): data['visible'] = True\n            if state == 'restored-error' and data['saved'] is not None: data['row'] = dict(data['saved'])\n    return {'phase': state, 'value': data[observe]} if observe else state\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('row-visible / archive-click', solve('row-visible', [('archive-click', N)], N), 'optimistically-hidden')\ncheck('optimistically-hidden / archive-success', solve('optimistically-hidden', [('archive-success', N)], N), 'archived')\ncheck('optimistically-hidden / archive-failure', solve('optimistically-hidden', [('archive-failure', N)], N), 'restored-error')\ncheck('restored-error / retry-archive', solve('restored-error', [('retry-archive', N)], N), 'optimistically-hidden')\ncheck('archived / restore-click', solve('archived', [('restore-click', N)], N), 'restoring')\ncheck('restoring / restore-success', solve('restoring', [('restore-success', N)], N), 'row-visible')\ncheck('restoring / restore-failure', solve('restoring', [('restore-failure', N)], N), 'restore-error')\ncheck('restore-error / retry-restore', solve('restore-error', [('retry-restore', N)], N), 'restoring')\ncheck('optimistically-hidden / new-revision-arrives', solve('optimistically-hidden', [('new-revision-arrives', N)], N), 'hidden-new-revision')\ncheck('hidden-new-revision / archive-failure', solve('hidden-new-revision', [('archive-failure', N)], N), 'restored-new-revision-error')\ncheck('older notification incarnation', solve('row-visible', [('archive-click', N - 1)], N), 'row-visible')\ncheck('future notification incarnation', solve('row-visible', [('archive-click', N + 1)], N), 'row-visible')\ncheck('unknown event is inert', solve('row-visible', [('unknown-event', N)], N), 'row-visible')\ncheck('empty delivery batch', solve('row-visible', [], N), 'row-visible')\ncheck('N stale deliveries before current delivery', solve('row-visible', [('archive-click', N - 1)] * N + [('archive-click', N)], N), 'optimistically-hidden')\ncheck('trace archive-click then archive-success', solve('row-visible', [('archive-click', N), ('archive-success', N)], N), 'archived')\ncheck('trace archive-click then archive-failure', solve('row-visible', [('archive-click', N), ('archive-failure', N)], N), 'restored-error')\ncheck('trace archive-click then new-revision-arrives', solve('row-visible', [('archive-click', N), ('new-revision-arrives', N)], N), 'hidden-new-revision')\ncheck('trace archive-success then restore-click', solve('optimistically-hidden', [('archive-success', N), ('restore-click', N)], N), 'restoring')\ncheck('trace archive-failure then retry-archive', solve('optimistically-hidden', [('archive-failure', N), ('retry-archive', N)], N), 'optimistically-hidden')\ncheck('trace retry-archive then archive-success', solve('restored-error', [('retry-archive', N), ('archive-success', N)], N), 'archived')\ncheck('trace retry-archive then archive-failure', solve('restored-error', [('retry-archive', N), ('archive-failure', N)], N), 'restored-error')\ncheck('trace retry-archive then new-revision-arrives', solve('restored-error', [('retry-archive', N), ('new-revision-arrives', N)], N), 'hidden-new-revision')\ncheck('trace restore-click then restore-success', solve('archived', [('restore-click', N), ('restore-success', N)], N), 'row-visible')\ncheck('trace restore-click then restore-failure', solve('archived', [('restore-click', N), ('restore-failure', N)], N), 'restore-error')\ncheck('trace restore-success then archive-click', solve('restoring', [('restore-success', N), ('archive-click', N)], N), 'optimistically-hidden')\ncheck('trace restore-failure then retry-restore', solve('restoring', [('restore-failure', N), ('retry-restore', N)], N), 'restoring')\ncheck('trace retry-restore then restore-success', solve('restore-error', [('retry-restore', N), ('restore-success', N)], N), 'row-visible')\ncheck('trace retry-restore then restore-failure', solve('restore-error', [('retry-restore', N), ('restore-failure', N)], N), 'restore-error')\ncheck('trace new-revision-arrives then archive-failure', solve('optimistically-hidden', [('new-revision-arrives', N), ('archive-failure', N)], N), 'restored-new-revision-error')\ncheck('domain state regression 1: saved', solve('row-visible', [('archive-click', N, {})], N, {}, 'saved'), {'phase': 'optimistically-hidden', 'value': {'revision': 1, 'text': 'old'}})\ncheck('domain state regression 2: row', solve('optimistically-hidden', [('new-revision-arrives', N, {'revision': 1, 'text': 'stale'})], N, {}, 'row'), {'phase': 'optimistically-hidden', 'value': {'revision': 1, 'text': 'old'}})\ncheck('domain state regression 3: visible', solve('optimistically-hidden', [('new-revision-arrives', N, {'revision': 2, 'text': 'new'})], N, {}, 'visible'), {'phase': 'hidden-new-revision', 'value': False})\ncheck('domain state regression 4: row', solve('hidden-new-revision', [('archive-failure', N, {})], N, {'row': {'revision': 2, 'text': 'new'}, 'saved': {'revision': 1, 'text': 'old'}}, 'row'), {'phase': 'restored-new-revision-error', 'value': {'revision': 2, 'text': 'new'}})\ncheck('domain state regression 5: row', solve('optimistically-hidden', [('archive-failure', N, {})], N, {'saved': {'revision': 1, 'text': 'original'}}, 'row'), {'phase': 'restored-error', 'value': {'revision': 1, 'text': 'original'}})\ncheck('domain state regression 6: visible', solve('restoring', [('restore-failure', N, {})], N, {}, 'visible'), {'phase': 'restore-error', 'value': False})\ncheck('domain state regression 7: row', solve('row-visible', [('archive-click', N, {}), ('new-revision-arrives', N, {'revision': 2, 'text': 'new'}), ('archive-failure', N, {})], N, {}, 'row'), {'phase': 'restored-new-revision-error', 'value': {'revision': 2, 'text': 'new'}})\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":"b7e0ab35cfdade33e167dea4e061f3474e68ebc6abd28f23c2e8a2dd20e93f20","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(initial, events, generation, payload=None, observe=None):\n    table = {('row-visible', 'archive-click'): 'optimistically-hidden', ('optimistically-hidden', 'archive-success'): 'archived', ('optimistically-hidden', 'archive-failure'): 'restored-error', ('restored-error', 'retry-archive'): 'optimistically-hidden', ('archived', 'restore-click'): 'restoring', ('restoring', 'restore-success'): 'row-visible', ('restoring', 'restore-failure'): 'restore-error', ('restore-error', 'retry-restore'): 'restoring', ('optimistically-hidden', 'new-revision-arrives'): 'hidden-new-revision', ('hidden-new-revision', 'archive-failure'): 'restored-new-revision-error'}\n    data = json.loads(json.dumps({'row': {'revision': 1, 'text': 'old'}, 'saved': None, 'visible': True})) if payload is None else {**json.loads(json.dumps({'row': {'revision': 1, 'text': 'old'}, 'saved': None, 'visible': True})), **json.loads(json.dumps(payload))}\n    state = initial\n    for delivery in events:\n        event, event_generation = delivery[:2]\n        arg = delivery[2] if len(delivery) > 2 else {}\n        if event_generation == generation:\n            previous = state\n            if event == 'archive-click': data['saved'] = dict(data['row'])\n            if event == 'new-revision-arrives':\n                revision = arg.get('revision',data['row']['revision']+1)\n                if revision <= data['row']['revision']: event = 'unknown-event'\n                else: data['row'] = {'revision':revision,'text':arg.get('text','new')}\n            state = table.get((state, event), state)\n            if state in ('archived','optimistically-hidden','hidden-new-revision','restore-error','restoring'): data['visible'] = False\n            if state in ('row-visible','restored-error','restored-new-revision-error'): data['visible'] = True\n            if state == 'restored-error' and data['saved'] is not None: data['row'] = dict(data['saved'])\n    return {'phase': state, 'value': data[observe]} if observe else state\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('row-visible / archive-click', solve('row-visible', [('archive-click', N)], N), 'optimistically-hidden')\ncheck('optimistically-hidden / archive-success', solve('optimistically-hidden', [('archive-success', N)], N), 'archived')\ncheck('optimistically-hidden / archive-failure', solve('optimistically-hidden', [('archive-failure', N)], N), 'restored-error')\ncheck('restored-error / retry-archive', solve('restored-error', [('retry-archive', N)], N), 'optimistically-hidden')\ncheck('archived / restore-click', solve('archived', [('restore-click', N)], N), 'restoring')\ncheck('restoring / restore-success', solve('restoring', [('restore-success', N)], N), 'row-visible')\ncheck('restoring / restore-failure', solve('restoring', [('restore-failure', N)], N), 'restore-error')\ncheck('restore-error / retry-restore', solve('restore-error', [('retry-restore', N)], N), 'restoring')\ncheck('optimistically-hidden / new-revision-arrives', solve('optimistically-hidden', [('new-revision-arrives', N)], N), 'hidden-new-revision')\ncheck('hidden-new-revision / archive-failure', solve('hidden-new-revision', [('archive-failure', N)], N), 'restored-new-revision-error')\ncheck('older notification incarnation', solve('row-visible', [('archive-click', N - 1)], N), 'row-visible')\ncheck('future notification incarnation', solve('row-visible', [('archive-click', N + 1)], N), 'row-visible')\ncheck('unknown event is inert', solve('row-visible', [('unknown-event', N)], N), 'row-visible')\ncheck('empty delivery batch', solve('row-visible', [], N), 'row-visible')\ncheck('N stale deliveries before current delivery', solve('row-visible', [('archive-click', N - 1)] * N + [('archive-click', N)], N), 'optimistically-hidden')\ncheck('trace archive-click then archive-success', solve('row-visible', [('archive-click', N), ('archive-success', N)], N), 'archived')\ncheck('trace archive-click then archive-failure', solve('row-visible', [('archive-click', N), ('archive-failure', N)], N), 'restored-error')\ncheck('trace archive-click then new-revision-arrives', solve('row-visible', [('archive-click', N), ('new-revision-arrives', N)], N), 'hidden-new-revision')\ncheck('trace archive-success then restore-click', solve('optimistically-hidden', [('archive-success', N), ('restore-click', N)], N), 'restoring')\ncheck('trace archive-failure then retry-archive', solve('optimistically-hidden', [('archive-failure', N), ('retry-archive', N)], N), 'optimistically-hidden')\ncheck('trace retry-archive then archive-success', solve('restored-error', [('retry-archive', N), ('archive-success', N)], N), 'archived')\ncheck('trace retry-archive then archive-failure', solve('restored-error', [('retry-archive', N), ('archive-failure', N)], N), 'restored-error')\ncheck('trace retry-archive then new-revision-arrives', solve('restored-error', [('retry-archive', N), ('new-revision-arrives', N)], N), 'hidden-new-revision')\ncheck('trace restore-click then restore-success', solve('archived', [('restore-click', N), ('restore-success', N)], N), 'row-visible')\ncheck('trace restore-click then restore-failure', solve('archived', [('restore-click', N), ('restore-failure', N)], N), 'restore-error')\ncheck('trace restore-success then archive-click', solve('restoring', [('restore-success', N), ('archive-click', N)], N), 'optimistically-hidden')\ncheck('trace restore-failure then retry-restore', solve('restoring', [('restore-failure', N), ('retry-restore', N)], N), 'restoring')\ncheck('trace retry-restore then restore-success', solve('restore-error', [('retry-restore', N), ('restore-success', N)], N), 'row-visible')\ncheck('trace retry-restore then restore-failure', solve('restore-error', [('retry-restore', N), ('restore-failure', N)], N), 'restore-error')\ncheck('trace new-revision-arrives then archive-failure', solve('optimistically-hidden', [('new-revision-arrives', N), ('archive-failure', N)], N), 'restored-new-revision-error')\ncheck('domain state regression 1: saved', solve('row-visible', [('archive-click', N, {})], N, {}, 'saved'), {'phase': 'optimistically-hidden', 'value': {'revision': 1, 'text': 'old'}})\ncheck('domain state regression 2: row', solve('optimistically-hidden', [('new-revision-arrives', N, {'revision': 1, 'text': 'stale'})], N, {}, 'row'), {'phase': 'optimistically-hidden', 'value': {'revision': 1, 'text': 'old'}})\ncheck('domain state regression 3: visible', solve('optimistically-hidden', [('new-revision-arrives', N, {'revision': 2, 'text': 'new'})], N, {}, 'visible'), {'phase': 'hidden-new-revision', 'value': False})\ncheck('domain state regression 4: row', solve('hidden-new-revision', [('archive-failure', N, {})], N, {'row': {'revision': 2, 'text': 'new'}, 'saved': {'revision': 1, 'text': 'old'}}, 'row'), {'phase': 'restored-new-revision-error', 'value': {'revision': 2, 'text': 'new'}})\ncheck('domain state regression 5: row', solve('optimistically-hidden', [('archive-failure', N, {})], N, {'saved': {'revision': 1, 'text': 'original'}}, 'row'), {'phase': 'restored-error', 'value': {'revision': 1, 'text': 'original'}})\ncheck('domain state regression 6: visible', solve('restoring', [('restore-failure', N, {})], N, {}, 'visible'), {'phase': 'restore-error', 'value': False})\ncheck('domain state regression 7: row', solve('row-visible', [('archive-click', N, {}), ('new-revision-arrives', N, {'revision': 2, 'text': 'new'}), ('archive-failure', N, {})], N, {}, 'row'), {'phase': 'restored-new-revision-error', 'value': {'revision': 2, 'text': 'new'}})\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":"Stipulated single-notification state and policy model only. Event delivery and acknowledgements are explicit test inputs. No DOM, accessibility announcements, live timers, networking, actual rendering, or production-platform conformance is simulated. 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-notification-interfaces-delete-rollback-03","generated_at":"2026-09-29T14:42:33.481958+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Visual notification lifecycle ordering can leave an inbox or toast showing the wrong actionable state even when transport succeeds.","repair":"Commit the optimistically-hidden / archive-failure transition to restored-error; preserve the other explicitly stipulated transitions.","root_cause":"Failed archival leaves the row permanently hidden.","sha256":"d423f211681478210da4b59e2733da172cdd35f3bbacf8c5ae20e072fd72247a","title":"Inbox optimistic archive rollback: archive-failure from optimistically-hidden · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.638,"exit_code":1,"observations":[{"actual":"optimistically-hidden","check":"row-visible / archive-click","expected":"optimistically-hidden","passed":true},{"actual":"archived","check":"optimistically-hidden / archive-success","expected":"archived","passed":true},{"actual":"row-visible","check":"optimistically-hidden / archive-failure","expected":"restored-error","passed":false},{"actual":"optimistically-hidden","check":"restored-error / retry-archive","expected":"optimistically-hidden","passed":true},{"actual":"restoring","check":"archived / restore-click","expected":"restoring","passed":true},{"actual":"row-visible","check":"restoring / restore-success","expected":"row-visible","passed":true},{"actual":"restore-error","check":"restoring / restore-failure","expected":"restore-error","passed":true},{"actual":"restoring","check":"restore-error / retry-restore","expected":"restoring","passed":true},{"actual":"hidden-new-revision","check":"optimistically-hidden / new-revision-arrives","expected":"hidden-new-revision","passed":true},{"actual":"restored-new-revision-error","check":"hidden-new-revision / archive-failure","expected":"restored-new-revision-error","passed":true},{"actual":"row-visible","check":"older notification incarnation","expected":"row-visible","passed":true},{"actual":"row-visible","check":"future notification incarnation","expected":"row-visible","passed":true},{"actual":"row-visible","check":"unknown event is inert","expected":"row-visible","passed":true},{"actual":"row-visible","check":"empty delivery batch","expected":"row-visible","passed":true},{"actual":"optimistically-hidden","check":"N stale deliveries before current delivery","expected":"optimistically-hidden","passed":true},{"actual":"archived","check":"trace archive-click then archive-success","expected":"archived","passed":true},{"actual":"row-visible","check":"trace archive-click then archive-failure","expected":"restored-error","passed":false},{"actual":"hidden-new-revision","check":"trace archive-click then new-revision-arrives","expected":"hidden-new-revision","passed":true},{"actual":"restoring","check":"trace archive-success then restore-click","expected":"restoring","passed":true},{"actual":"row-visible","check":"trace archive-failure then retry-archive","expected":"optimistically-hidden","passed":false},{"actual":"archived","check":"trace retry-archive then archive-success","expected":"archived","passed":true},{"actual":"row-visible","check":"trace retry-archive then archive-failure","expected":"restored-error","passed":false},{"actual":"hidden-new-revision","check":"trace retry-archive then new-revision-arrives","expected":"hidden-new-revision","passed":true},{"actual":"row-visible","check":"trace restore-click then restore-success","expected":"row-visible","passed":true},{"actual":"restore-error","check":"trace restore-click then restore-failure","expected":"restore-error","passed":true},{"actual":"optimistically-hidden","check":"trace restore-success then archive-click","expected":"optimistically-hidden","passed":true},{"actual":"restoring","check":"trace restore-failure then retry-restore","expected":"restoring","passed":true},{"actual":"row-visible","check":"trace retry-restore then restore-success","expected":"row-visible","passed":true},{"actual":"restore-error","check":"trace retry-restore then restore-failure","expected":"restore-error","passed":true},{"actual":"restored-new-revision-error","check":"trace new-revision-arrives then archive-failure","expected":"restored-new-revision-error","passed":true},{"actual":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"check":"domain state regression 1: saved","expected":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"passed":true},{"actual":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"check":"domain state regression 2: row","expected":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"passed":true},{"actual":{"phase":"hidden-new-revision","value":false},"check":"domain state regression 3: visible","expected":{"phase":"hidden-new-revision","value":false},"passed":true},{"actual":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"check":"domain state regression 4: row","expected":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"passed":true},{"actual":{"phase":"row-visible","value":{"revision":1,"text":"old"}},"check":"domain state regression 5: row","expected":{"phase":"restored-error","value":{"revision":1,"text":"original"}},"passed":false},{"actual":{"phase":"restore-error","value":false},"check":"domain state regression 6: visible","expected":{"phase":"restore-error","value":false},"passed":true},{"actual":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"check":"domain state regression 7: row","expected":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"row-visible / archive-click\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"optimistically-hidden / archive-success\", \"actual\": \"archived\", \"expected\": \"archived\", \"passed\": true}, {\"check\": \"optimistically-hidden / archive-failure\", \"actual\": \"row-visible\", \"expected\": \"restored-error\", \"passed\": false}, {\"check\": \"restored-error / retry-archive\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"archived / restore-click\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"restoring / restore-success\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"restoring / restore-failure\", \"actual\": \"restore-error\", \"expected\": \"restore-error\", \"passed\": true}, {\"check\": \"restore-error / retry-restore\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"optimistically-hidden / new-revision-arrives\", \"actual\": \"hidden-new-revision\", \"expected\": \"hidden-new-revision\", \"passed\": true}, {\"check\": \"hidden-new-revision / archive-failure\", \"actual\": \"restored-new-revision-error\", \"expected\": \"restored-new-revision-error\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"trace archive-click then archive-success\", \"actual\": \"archived\", \"expected\": \"archived\", \"passed\": true}, {\"check\": \"trace archive-click then archive-failure\", \"actual\": \"row-visible\", \"expected\": \"restored-error\", \"passed\": false}, {\"check\": \"trace archive-click then new-revision-arrives\", \"actual\": \"hidden-new-revision\", \"expected\": \"hidden-new-revision\", \"passed\": true}, {\"check\": \"trace archive-success then restore-click\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"trace archive-failure then retry-archive\", \"actual\": \"row-visible\", \"expected\": \"optimistically-hidden\", \"passed\": false}, {\"check\": \"trace retry-archive then archive-success\", \"actual\": \"archived\", \"expected\": \"archived\", \"passed\": true}, {\"check\": \"trace retry-archive then archive-failure\", \"actual\": \"row-visible\", \"expected\": \"restored-error\", \"passed\": false}, {\"check\": \"trace retry-archive then new-revision-arrives\", \"actual\": \"hidden-new-revision\", \"expected\": \"hidden-new-revision\", \"passed\": true}, {\"check\": \"trace restore-click then restore-success\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"trace restore-click then restore-failure\", \"actual\": \"restore-error\", \"expected\": \"restore-error\", \"passed\": true}, {\"check\": \"trace restore-success then archive-click\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"trace restore-failure then retry-restore\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"trace retry-restore then restore-success\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"trace retry-restore then restore-failure\", \"actual\": \"restore-error\", \"expected\": \"restore-error\", \"passed\": true}, {\"check\": \"trace new-revision-arrives then archive-failure\", \"actual\": \"restored-new-revision-error\", \"expected\": \"restored-new-revision-error\", \"passed\": true}, {\"check\": \"domain state regression 1: saved\", \"actual\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"expected\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"passed\": true}, {\"check\": \"domain state regression 2: row\", \"actual\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"expected\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"passed\": true}, {\"check\": \"domain state regression 3: visible\", \"actual\": {\"phase\": \"hidden-new-revision\", \"value\": false}, \"expected\": {\"phase\": \"hidden-new-revision\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 4: row\", \"actual\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"expected\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"passed\": true}, {\"check\": \"domain state regression 5: row\", \"actual\": {\"phase\": \"row-visible\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"expected\": {\"phase\": \"restored-error\", \"value\": {\"revision\": 1, \"text\": \"original\"}}, \"passed\": false}, {\"check\": \"domain state regression 6: visible\", \"actual\": {\"phase\": \"restore-error\", \"value\": false}, \"expected\": {\"phase\": \"restore-error\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 7: row\", \"actual\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"expected\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.055,"exit_code":1,"observations":[{"actual":"optimistically-hidden","check":"row-visible / archive-click","expected":"optimistically-hidden","passed":true},{"actual":"archived","check":"optimistically-hidden / archive-success","expected":"archived","passed":true},{"actual":"archived","check":"optimistically-hidden / archive-failure","expected":"restored-error","passed":false},{"actual":"optimistically-hidden","check":"restored-error / retry-archive","expected":"optimistically-hidden","passed":true},{"actual":"restoring","check":"archived / restore-click","expected":"restoring","passed":true},{"actual":"row-visible","check":"restoring / restore-success","expected":"row-visible","passed":true},{"actual":"restore-error","check":"restoring / restore-failure","expected":"restore-error","passed":true},{"actual":"restoring","check":"restore-error / retry-restore","expected":"restoring","passed":true},{"actual":"hidden-new-revision","check":"optimistically-hidden / new-revision-arrives","expected":"hidden-new-revision","passed":true},{"actual":"restored-new-revision-error","check":"hidden-new-revision / archive-failure","expected":"restored-new-revision-error","passed":true},{"actual":"row-visible","check":"older notification incarnation","expected":"row-visible","passed":true},{"actual":"row-visible","check":"future notification incarnation","expected":"row-visible","passed":true},{"actual":"row-visible","check":"unknown event is inert","expected":"row-visible","passed":true},{"actual":"row-visible","check":"empty delivery batch","expected":"row-visible","passed":true},{"actual":"optimistically-hidden","check":"N stale deliveries before current delivery","expected":"optimistically-hidden","passed":true},{"actual":"archived","check":"trace archive-click then archive-success","expected":"archived","passed":true},{"actual":"archived","check":"trace archive-click then archive-failure","expected":"restored-error","passed":false},{"actual":"hidden-new-revision","check":"trace archive-click then new-revision-arrives","expected":"hidden-new-revision","passed":true},{"actual":"restoring","check":"trace archive-success then restore-click","expected":"restoring","passed":true},{"actual":"archived","check":"trace archive-failure then retry-archive","expected":"optimistically-hidden","passed":false},{"actual":"archived","check":"trace retry-archive then archive-success","expected":"archived","passed":true},{"actual":"archived","check":"trace retry-archive then archive-failure","expected":"restored-error","passed":false},{"actual":"hidden-new-revision","check":"trace retry-archive then new-revision-arrives","expected":"hidden-new-revision","passed":true},{"actual":"row-visible","check":"trace restore-click then restore-success","expected":"row-visible","passed":true},{"actual":"restore-error","check":"trace restore-click then restore-failure","expected":"restore-error","passed":true},{"actual":"optimistically-hidden","check":"trace restore-success then archive-click","expected":"optimistically-hidden","passed":true},{"actual":"restoring","check":"trace restore-failure then retry-restore","expected":"restoring","passed":true},{"actual":"row-visible","check":"trace retry-restore then restore-success","expected":"row-visible","passed":true},{"actual":"restore-error","check":"trace retry-restore then restore-failure","expected":"restore-error","passed":true},{"actual":"restored-new-revision-error","check":"trace new-revision-arrives then archive-failure","expected":"restored-new-revision-error","passed":true},{"actual":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"check":"domain state regression 1: saved","expected":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"passed":true},{"actual":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"check":"domain state regression 2: row","expected":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"passed":true},{"actual":{"phase":"hidden-new-revision","value":false},"check":"domain state regression 3: visible","expected":{"phase":"hidden-new-revision","value":false},"passed":true},{"actual":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"check":"domain state regression 4: row","expected":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"passed":true},{"actual":{"phase":"archived","value":{"revision":1,"text":"old"}},"check":"domain state regression 5: row","expected":{"phase":"restored-error","value":{"revision":1,"text":"original"}},"passed":false},{"actual":{"phase":"restore-error","value":false},"check":"domain state regression 6: visible","expected":{"phase":"restore-error","value":false},"passed":true},{"actual":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"check":"domain state regression 7: row","expected":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"row-visible / archive-click\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"optimistically-hidden / archive-success\", \"actual\": \"archived\", \"expected\": \"archived\", \"passed\": true}, {\"check\": \"optimistically-hidden / archive-failure\", \"actual\": \"archived\", \"expected\": \"restored-error\", \"passed\": false}, {\"check\": \"restored-error / retry-archive\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"archived / restore-click\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"restoring / restore-success\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"restoring / restore-failure\", \"actual\": \"restore-error\", \"expected\": \"restore-error\", \"passed\": true}, {\"check\": \"restore-error / retry-restore\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"optimistically-hidden / new-revision-arrives\", \"actual\": \"hidden-new-revision\", \"expected\": \"hidden-new-revision\", \"passed\": true}, {\"check\": \"hidden-new-revision / archive-failure\", \"actual\": \"restored-new-revision-error\", \"expected\": \"restored-new-revision-error\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"trace archive-click then archive-success\", \"actual\": \"archived\", \"expected\": \"archived\", \"passed\": true}, {\"check\": \"trace archive-click then archive-failure\", \"actual\": \"archived\", \"expected\": \"restored-error\", \"passed\": false}, {\"check\": \"trace archive-click then new-revision-arrives\", \"actual\": \"hidden-new-revision\", \"expected\": \"hidden-new-revision\", \"passed\": true}, {\"check\": \"trace archive-success then restore-click\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"trace archive-failure then retry-archive\", \"actual\": \"archived\", \"expected\": \"optimistically-hidden\", \"passed\": false}, {\"check\": \"trace retry-archive then archive-success\", \"actual\": \"archived\", \"expected\": \"archived\", \"passed\": true}, {\"check\": \"trace retry-archive then archive-failure\", \"actual\": \"archived\", \"expected\": \"restored-error\", \"passed\": false}, {\"check\": \"trace retry-archive then new-revision-arrives\", \"actual\": \"hidden-new-revision\", \"expected\": \"hidden-new-revision\", \"passed\": true}, {\"check\": \"trace restore-click then restore-success\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"trace restore-click then restore-failure\", \"actual\": \"restore-error\", \"expected\": \"restore-error\", \"passed\": true}, {\"check\": \"trace restore-success then archive-click\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"trace restore-failure then retry-restore\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"trace retry-restore then restore-success\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"trace retry-restore then restore-failure\", \"actual\": \"restore-error\", \"expected\": \"restore-error\", \"passed\": true}, {\"check\": \"trace new-revision-arrives then archive-failure\", \"actual\": \"restored-new-revision-error\", \"expected\": \"restored-new-revision-error\", \"passed\": true}, {\"check\": \"domain state regression 1: saved\", \"actual\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"expected\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"passed\": true}, {\"check\": \"domain state regression 2: row\", \"actual\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"expected\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"passed\": true}, {\"check\": \"domain state regression 3: visible\", \"actual\": {\"phase\": \"hidden-new-revision\", \"value\": false}, \"expected\": {\"phase\": \"hidden-new-revision\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 4: row\", \"actual\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"expected\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"passed\": true}, {\"check\": \"domain state regression 5: row\", \"actual\": {\"phase\": \"archived\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"expected\": {\"phase\": \"restored-error\", \"value\": {\"revision\": 1, \"text\": \"original\"}}, \"passed\": false}, {\"check\": \"domain state regression 6: visible\", \"actual\": {\"phase\": \"restore-error\", \"value\": false}, \"expected\": {\"phase\": \"restore-error\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 7: row\", \"actual\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"expected\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.566,"exit_code":0,"observations":[{"actual":"optimistically-hidden","check":"row-visible / archive-click","expected":"optimistically-hidden","passed":true},{"actual":"archived","check":"optimistically-hidden / archive-success","expected":"archived","passed":true},{"actual":"restored-error","check":"optimistically-hidden / archive-failure","expected":"restored-error","passed":true},{"actual":"optimistically-hidden","check":"restored-error / retry-archive","expected":"optimistically-hidden","passed":true},{"actual":"restoring","check":"archived / restore-click","expected":"restoring","passed":true},{"actual":"row-visible","check":"restoring / restore-success","expected":"row-visible","passed":true},{"actual":"restore-error","check":"restoring / restore-failure","expected":"restore-error","passed":true},{"actual":"restoring","check":"restore-error / retry-restore","expected":"restoring","passed":true},{"actual":"hidden-new-revision","check":"optimistically-hidden / new-revision-arrives","expected":"hidden-new-revision","passed":true},{"actual":"restored-new-revision-error","check":"hidden-new-revision / archive-failure","expected":"restored-new-revision-error","passed":true},{"actual":"row-visible","check":"older notification incarnation","expected":"row-visible","passed":true},{"actual":"row-visible","check":"future notification incarnation","expected":"row-visible","passed":true},{"actual":"row-visible","check":"unknown event is inert","expected":"row-visible","passed":true},{"actual":"row-visible","check":"empty delivery batch","expected":"row-visible","passed":true},{"actual":"optimistically-hidden","check":"N stale deliveries before current delivery","expected":"optimistically-hidden","passed":true},{"actual":"archived","check":"trace archive-click then archive-success","expected":"archived","passed":true},{"actual":"restored-error","check":"trace archive-click then archive-failure","expected":"restored-error","passed":true},{"actual":"hidden-new-revision","check":"trace archive-click then new-revision-arrives","expected":"hidden-new-revision","passed":true},{"actual":"restoring","check":"trace archive-success then restore-click","expected":"restoring","passed":true},{"actual":"optimistically-hidden","check":"trace archive-failure then retry-archive","expected":"optimistically-hidden","passed":true},{"actual":"archived","check":"trace retry-archive then archive-success","expected":"archived","passed":true},{"actual":"restored-error","check":"trace retry-archive then archive-failure","expected":"restored-error","passed":true},{"actual":"hidden-new-revision","check":"trace retry-archive then new-revision-arrives","expected":"hidden-new-revision","passed":true},{"actual":"row-visible","check":"trace restore-click then restore-success","expected":"row-visible","passed":true},{"actual":"restore-error","check":"trace restore-click then restore-failure","expected":"restore-error","passed":true},{"actual":"optimistically-hidden","check":"trace restore-success then archive-click","expected":"optimistically-hidden","passed":true},{"actual":"restoring","check":"trace restore-failure then retry-restore","expected":"restoring","passed":true},{"actual":"row-visible","check":"trace retry-restore then restore-success","expected":"row-visible","passed":true},{"actual":"restore-error","check":"trace retry-restore then restore-failure","expected":"restore-error","passed":true},{"actual":"restored-new-revision-error","check":"trace new-revision-arrives then archive-failure","expected":"restored-new-revision-error","passed":true},{"actual":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"check":"domain state regression 1: saved","expected":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"passed":true},{"actual":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"check":"domain state regression 2: row","expected":{"phase":"optimistically-hidden","value":{"revision":1,"text":"old"}},"passed":true},{"actual":{"phase":"hidden-new-revision","value":false},"check":"domain state regression 3: visible","expected":{"phase":"hidden-new-revision","value":false},"passed":true},{"actual":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"check":"domain state regression 4: row","expected":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"passed":true},{"actual":{"phase":"restored-error","value":{"revision":1,"text":"original"}},"check":"domain state regression 5: row","expected":{"phase":"restored-error","value":{"revision":1,"text":"original"}},"passed":true},{"actual":{"phase":"restore-error","value":false},"check":"domain state regression 6: visible","expected":{"phase":"restore-error","value":false},"passed":true},{"actual":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"check":"domain state regression 7: row","expected":{"phase":"restored-new-revision-error","value":{"revision":2,"text":"new"}},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"row-visible / archive-click\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"optimistically-hidden / archive-success\", \"actual\": \"archived\", \"expected\": \"archived\", \"passed\": true}, {\"check\": \"optimistically-hidden / archive-failure\", \"actual\": \"restored-error\", \"expected\": \"restored-error\", \"passed\": true}, {\"check\": \"restored-error / retry-archive\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"archived / restore-click\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"restoring / restore-success\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"restoring / restore-failure\", \"actual\": \"restore-error\", \"expected\": \"restore-error\", \"passed\": true}, {\"check\": \"restore-error / retry-restore\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"optimistically-hidden / new-revision-arrives\", \"actual\": \"hidden-new-revision\", \"expected\": \"hidden-new-revision\", \"passed\": true}, {\"check\": \"hidden-new-revision / archive-failure\", \"actual\": \"restored-new-revision-error\", \"expected\": \"restored-new-revision-error\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"trace archive-click then archive-success\", \"actual\": \"archived\", \"expected\": \"archived\", \"passed\": true}, {\"check\": \"trace archive-click then archive-failure\", \"actual\": \"restored-error\", \"expected\": \"restored-error\", \"passed\": true}, {\"check\": \"trace archive-click then new-revision-arrives\", \"actual\": \"hidden-new-revision\", \"expected\": \"hidden-new-revision\", \"passed\": true}, {\"check\": \"trace archive-success then restore-click\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"trace archive-failure then retry-archive\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"trace retry-archive then archive-success\", \"actual\": \"archived\", \"expected\": \"archived\", \"passed\": true}, {\"check\": \"trace retry-archive then archive-failure\", \"actual\": \"restored-error\", \"expected\": \"restored-error\", \"passed\": true}, {\"check\": \"trace retry-archive then new-revision-arrives\", \"actual\": \"hidden-new-revision\", \"expected\": \"hidden-new-revision\", \"passed\": true}, {\"check\": \"trace restore-click then restore-success\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"trace restore-click then restore-failure\", \"actual\": \"restore-error\", \"expected\": \"restore-error\", \"passed\": true}, {\"check\": \"trace restore-success then archive-click\", \"actual\": \"optimistically-hidden\", \"expected\": \"optimistically-hidden\", \"passed\": true}, {\"check\": \"trace restore-failure then retry-restore\", \"actual\": \"restoring\", \"expected\": \"restoring\", \"passed\": true}, {\"check\": \"trace retry-restore then restore-success\", \"actual\": \"row-visible\", \"expected\": \"row-visible\", \"passed\": true}, {\"check\": \"trace retry-restore then restore-failure\", \"actual\": \"restore-error\", \"expected\": \"restore-error\", \"passed\": true}, {\"check\": \"trace new-revision-arrives then archive-failure\", \"actual\": \"restored-new-revision-error\", \"expected\": \"restored-new-revision-error\", \"passed\": true}, {\"check\": \"domain state regression 1: saved\", \"actual\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"expected\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"passed\": true}, {\"check\": \"domain state regression 2: row\", \"actual\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"expected\": {\"phase\": \"optimistically-hidden\", \"value\": {\"revision\": 1, \"text\": \"old\"}}, \"passed\": true}, {\"check\": \"domain state regression 3: visible\", \"actual\": {\"phase\": \"hidden-new-revision\", \"value\": false}, \"expected\": {\"phase\": \"hidden-new-revision\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 4: row\", \"actual\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"expected\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"passed\": true}, {\"check\": \"domain state regression 5: row\", \"actual\": {\"phase\": \"restored-error\", \"value\": {\"revision\": 1, \"text\": \"original\"}}, \"expected\": {\"phase\": \"restored-error\", \"value\": {\"revision\": 1, \"text\": \"original\"}}, \"passed\": true}, {\"check\": \"domain state regression 6: visible\", \"actual\": {\"phase\": \"restore-error\", \"value\": false}, \"expected\": {\"phase\": \"restore-error\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 7: row\", \"actual\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"expected\": {\"phase\": \"restored-new-revision-error\", \"value\": {\"revision\": 2, \"text\": \"new\"}}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}