{"abstract":"The snapshot-failed event leaves a notification in live instead of offline-error.","category":"Notification interfaces","checks":39,"contract":"Notification inbox reconnect recovery is a bounded visual-notification workflow with mutable policy state {'cached': ['old'], 'cursor': 8, 'preview': 'old', 'fresh': False}. Its default transition relation is {('live', 'connection-lost'): 'offline-cached', ('offline-cached', 'connection-restored'): 'reconciling', ('reconciling', 'snapshot-current'): 'live', ('reconciling', 'snapshot-failed'): 'offline-error', ('offline-error', 'retry-refresh'): 'reconciling', ('reconciling', 'connection-lost'): 'offline-cached', ('offline-cached', 'open-cached-item'): 'offline-preview', ('offline-preview', 'close-preview'): 'offline-cached', ('offline-preview', 'connection-restored'): 'reconciling-preview', ('reconciling-preview', 'snapshot-current'): 'live-preview'}; 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-reconnect","failed_approach":"Discarding the cache hides useful historical notifications.","family":"s3-notification-interfaces-reconnect-04","id":"FA-34206","implementations":{"attempt":{"sha256":"843862ab5206e31e87129ad7a7bd592036ad2669151430825e5a4cb1f6584b0c","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 = {('live', 'connection-lost'): 'offline-cached', ('offline-cached', 'connection-restored'): 'reconciling', ('reconciling', 'snapshot-current'): 'live', ('reconciling', 'snapshot-failed'): 'empty', ('offline-error', 'retry-refresh'): 'reconciling', ('reconciling', 'connection-lost'): 'offline-cached', ('offline-cached', 'open-cached-item'): 'offline-preview', ('offline-preview', 'close-preview'): 'offline-cached', ('offline-preview', 'connection-restored'): 'reconciling-preview', ('reconciling-preview', 'snapshot-current'): 'live-preview'}\n    data = json.loads(json.dumps({'cached': ['old'], 'cursor': 8, 'preview': 'old', 'fresh': False})) if payload is None else {**json.loads(json.dumps({'cached': ['old'], 'cursor': 8, 'preview': 'old', 'fresh': False})), **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 == 'snapshot-current':\n                if arg.get('cursor',data['cursor']) < data['cursor']: event = 'unknown-event'\n                else:\n                    data['cursor'] = arg.get('cursor',data['cursor'])\n                    data['cached'] = arg.get('items',data['cached'])[:]\n            if event == 'connection-lost': data['fresh'] = False\n            state = table.get((state, event), state)\n            if state in ('live','live-preview'): data['fresh'] = True\n            if state == 'live-preview' and data['preview'] not in data['cached']: data['preview'] = None\n            if state == 'empty': data['cached'] = []\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('live / connection-lost', solve('live', [('connection-lost', N)], N), 'offline-cached')\ncheck('offline-cached / connection-restored', solve('offline-cached', [('connection-restored', N)], N), 'reconciling')\ncheck('reconciling / snapshot-current', solve('reconciling', [('snapshot-current', N)], N), 'live')\ncheck('reconciling / snapshot-failed', solve('reconciling', [('snapshot-failed', N)], N), 'offline-error')\ncheck('offline-error / retry-refresh', solve('offline-error', [('retry-refresh', N)], N), 'reconciling')\ncheck('reconciling / connection-lost', solve('reconciling', [('connection-lost', N)], N), 'offline-cached')\ncheck('offline-cached / open-cached-item', solve('offline-cached', [('open-cached-item', N)], N), 'offline-preview')\ncheck('offline-preview / close-preview', solve('offline-preview', [('close-preview', N)], N), 'offline-cached')\ncheck('offline-preview / connection-restored', solve('offline-preview', [('connection-restored', N)], N), 'reconciling-preview')\ncheck('reconciling-preview / snapshot-current', solve('reconciling-preview', [('snapshot-current', N)], N), 'live-preview')\ncheck('older notification incarnation', solve('live', [('connection-lost', N - 1)], N), 'live')\ncheck('future notification incarnation', solve('live', [('connection-lost', N + 1)], N), 'live')\ncheck('unknown event is inert', solve('live', [('unknown-event', N)], N), 'live')\ncheck('empty delivery batch', solve('live', [], N), 'live')\ncheck('N stale deliveries before current delivery', solve('live', [('connection-lost', N - 1)] * N + [('connection-lost', N)], N), 'offline-cached')\ncheck('trace connection-lost then connection-restored', solve('live', [('connection-lost', N), ('connection-restored', N)], N), 'reconciling')\ncheck('trace connection-lost then open-cached-item', solve('live', [('connection-lost', N), ('open-cached-item', N)], N), 'offline-preview')\ncheck('trace connection-restored then snapshot-current', solve('offline-cached', [('connection-restored', N), ('snapshot-current', N)], N), 'live')\ncheck('trace connection-restored then snapshot-failed', solve('offline-cached', [('connection-restored', N), ('snapshot-failed', N)], N), 'offline-error')\ncheck('trace connection-restored then connection-lost', solve('offline-cached', [('connection-restored', N), ('connection-lost', N)], N), 'offline-cached')\ncheck('trace snapshot-current then connection-lost', solve('reconciling', [('snapshot-current', N), ('connection-lost', N)], N), 'offline-cached')\ncheck('trace snapshot-failed then retry-refresh', solve('reconciling', [('snapshot-failed', N), ('retry-refresh', N)], N), 'reconciling')\ncheck('trace retry-refresh then snapshot-current', solve('offline-error', [('retry-refresh', N), ('snapshot-current', N)], N), 'live')\ncheck('trace retry-refresh then snapshot-failed', solve('offline-error', [('retry-refresh', N), ('snapshot-failed', N)], N), 'offline-error')\ncheck('trace retry-refresh then connection-lost', solve('offline-error', [('retry-refresh', N), ('connection-lost', N)], N), 'offline-cached')\ncheck('trace connection-lost then connection-restored', solve('reconciling', [('connection-lost', N), ('connection-restored', N)], N), 'reconciling')\ncheck('trace connection-lost then open-cached-item', solve('reconciling', [('connection-lost', N), ('open-cached-item', N)], N), 'offline-preview')\ncheck('trace open-cached-item then close-preview', solve('offline-cached', [('open-cached-item', N), ('close-preview', N)], N), 'offline-cached')\ncheck('trace open-cached-item then connection-restored', solve('offline-cached', [('open-cached-item', N), ('connection-restored', N)], N), 'reconciling-preview')\ncheck('trace close-preview then connection-restored', solve('offline-preview', [('close-preview', N), ('connection-restored', N)], N), 'reconciling')\ncheck('trace close-preview then open-cached-item', solve('offline-preview', [('close-preview', N), ('open-cached-item', N)], N), 'offline-preview')\ncheck('trace connection-restored then snapshot-current', solve('offline-preview', [('connection-restored', N), ('snapshot-current', N)], N), 'live-preview')\ncheck('domain state regression 1: cached', solve('reconciling', [('snapshot-current', N, {'cursor': 7, 'items': ['stale']})], N, {}, 'cached'), {'phase': 'reconciling', 'value': ['old']})\ncheck('domain state regression 2: cached', solve('reconciling', [('snapshot-current', N, {'cursor': 9, 'items': ['new']})], N, {}, 'cached'), {'phase': 'live', 'value': ['new']})\ncheck('domain state regression 3: cached', solve('live', [('connection-lost', N, {})], N, {'fresh': True}, 'cached'), {'phase': 'offline-cached', 'value': ['old']})\ncheck('domain state regression 4: preview', solve('reconciling-preview', [('snapshot-current', N, {'items': ['new']})], N, {}, 'preview'), {'phase': 'live-preview', 'value': None})\ncheck('domain state regression 5: preview', solve('reconciling-preview', [('snapshot-current', N, {'items': ['old', 'new']})], N, {}, 'preview'), {'phase': 'live-preview', 'value': 'old'})\ncheck('domain state regression 6: fresh', solve('reconciling', [('snapshot-failed', N, {})], N, {}, 'fresh'), {'phase': 'offline-error', 'value': False})\ncheck('domain state regression 7: preview', solve('offline-preview', [('connection-restored', N, {}), ('snapshot-current', N, {'cursor': 9, 'items': ['new']})], N, {}, 'preview'), {'phase': 'live-preview', 'value': None})\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":"58cee63e7438a31de37285250467917ed6b26b61adf5551954d2262f4555fc4f","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 = {('live', 'connection-lost'): 'offline-cached', ('offline-cached', 'connection-restored'): 'reconciling', ('reconciling', 'snapshot-current'): 'live', ('reconciling', 'snapshot-failed'): 'live', ('offline-error', 'retry-refresh'): 'reconciling', ('reconciling', 'connection-lost'): 'offline-cached', ('offline-cached', 'open-cached-item'): 'offline-preview', ('offline-preview', 'close-preview'): 'offline-cached', ('offline-preview', 'connection-restored'): 'reconciling-preview', ('reconciling-preview', 'snapshot-current'): 'live-preview'}\n    data = json.loads(json.dumps({'cached': ['old'], 'cursor': 8, 'preview': 'old', 'fresh': False})) if payload is None else {**json.loads(json.dumps({'cached': ['old'], 'cursor': 8, 'preview': 'old', 'fresh': False})), **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 == 'snapshot-current':\n                if arg.get('cursor',data['cursor']) < data['cursor']: event = 'unknown-event'\n                else:\n                    data['cursor'] = arg.get('cursor',data['cursor'])\n                    data['cached'] = arg.get('items',data['cached'])[:]\n            if event == 'connection-lost': data['fresh'] = False\n            state = table.get((state, event), state)\n            if state in ('live','live-preview'): data['fresh'] = True\n            if state == 'live-preview' and data['preview'] not in data['cached']: data['preview'] = None\n            if state == 'empty': data['cached'] = []\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('live / connection-lost', solve('live', [('connection-lost', N)], N), 'offline-cached')\ncheck('offline-cached / connection-restored', solve('offline-cached', [('connection-restored', N)], N), 'reconciling')\ncheck('reconciling / snapshot-current', solve('reconciling', [('snapshot-current', N)], N), 'live')\ncheck('reconciling / snapshot-failed', solve('reconciling', [('snapshot-failed', N)], N), 'offline-error')\ncheck('offline-error / retry-refresh', solve('offline-error', [('retry-refresh', N)], N), 'reconciling')\ncheck('reconciling / connection-lost', solve('reconciling', [('connection-lost', N)], N), 'offline-cached')\ncheck('offline-cached / open-cached-item', solve('offline-cached', [('open-cached-item', N)], N), 'offline-preview')\ncheck('offline-preview / close-preview', solve('offline-preview', [('close-preview', N)], N), 'offline-cached')\ncheck('offline-preview / connection-restored', solve('offline-preview', [('connection-restored', N)], N), 'reconciling-preview')\ncheck('reconciling-preview / snapshot-current', solve('reconciling-preview', [('snapshot-current', N)], N), 'live-preview')\ncheck('older notification incarnation', solve('live', [('connection-lost', N - 1)], N), 'live')\ncheck('future notification incarnation', solve('live', [('connection-lost', N + 1)], N), 'live')\ncheck('unknown event is inert', solve('live', [('unknown-event', N)], N), 'live')\ncheck('empty delivery batch', solve('live', [], N), 'live')\ncheck('N stale deliveries before current delivery', solve('live', [('connection-lost', N - 1)] * N + [('connection-lost', N)], N), 'offline-cached')\ncheck('trace connection-lost then connection-restored', solve('live', [('connection-lost', N), ('connection-restored', N)], N), 'reconciling')\ncheck('trace connection-lost then open-cached-item', solve('live', [('connection-lost', N), ('open-cached-item', N)], N), 'offline-preview')\ncheck('trace connection-restored then snapshot-current', solve('offline-cached', [('connection-restored', N), ('snapshot-current', N)], N), 'live')\ncheck('trace connection-restored then snapshot-failed', solve('offline-cached', [('connection-restored', N), ('snapshot-failed', N)], N), 'offline-error')\ncheck('trace connection-restored then connection-lost', solve('offline-cached', [('connection-restored', N), ('connection-lost', N)], N), 'offline-cached')\ncheck('trace snapshot-current then connection-lost', solve('reconciling', [('snapshot-current', N), ('connection-lost', N)], N), 'offline-cached')\ncheck('trace snapshot-failed then retry-refresh', solve('reconciling', [('snapshot-failed', N), ('retry-refresh', N)], N), 'reconciling')\ncheck('trace retry-refresh then snapshot-current', solve('offline-error', [('retry-refresh', N), ('snapshot-current', N)], N), 'live')\ncheck('trace retry-refresh then snapshot-failed', solve('offline-error', [('retry-refresh', N), ('snapshot-failed', N)], N), 'offline-error')\ncheck('trace retry-refresh then connection-lost', solve('offline-error', [('retry-refresh', N), ('connection-lost', N)], N), 'offline-cached')\ncheck('trace connection-lost then connection-restored', solve('reconciling', [('connection-lost', N), ('connection-restored', N)], N), 'reconciling')\ncheck('trace connection-lost then open-cached-item', solve('reconciling', [('connection-lost', N), ('open-cached-item', N)], N), 'offline-preview')\ncheck('trace open-cached-item then close-preview', solve('offline-cached', [('open-cached-item', N), ('close-preview', N)], N), 'offline-cached')\ncheck('trace open-cached-item then connection-restored', solve('offline-cached', [('open-cached-item', N), ('connection-restored', N)], N), 'reconciling-preview')\ncheck('trace close-preview then connection-restored', solve('offline-preview', [('close-preview', N), ('connection-restored', N)], N), 'reconciling')\ncheck('trace close-preview then open-cached-item', solve('offline-preview', [('close-preview', N), ('open-cached-item', N)], N), 'offline-preview')\ncheck('trace connection-restored then snapshot-current', solve('offline-preview', [('connection-restored', N), ('snapshot-current', N)], N), 'live-preview')\ncheck('domain state regression 1: cached', solve('reconciling', [('snapshot-current', N, {'cursor': 7, 'items': ['stale']})], N, {}, 'cached'), {'phase': 'reconciling', 'value': ['old']})\ncheck('domain state regression 2: cached', solve('reconciling', [('snapshot-current', N, {'cursor': 9, 'items': ['new']})], N, {}, 'cached'), {'phase': 'live', 'value': ['new']})\ncheck('domain state regression 3: cached', solve('live', [('connection-lost', N, {})], N, {'fresh': True}, 'cached'), {'phase': 'offline-cached', 'value': ['old']})\ncheck('domain state regression 4: preview', solve('reconciling-preview', [('snapshot-current', N, {'items': ['new']})], N, {}, 'preview'), {'phase': 'live-preview', 'value': None})\ncheck('domain state regression 5: preview', solve('reconciling-preview', [('snapshot-current', N, {'items': ['old', 'new']})], N, {}, 'preview'), {'phase': 'live-preview', 'value': 'old'})\ncheck('domain state regression 6: fresh', solve('reconciling', [('snapshot-failed', N, {})], N, {}, 'fresh'), {'phase': 'offline-error', 'value': False})\ncheck('domain state regression 7: preview', solve('offline-preview', [('connection-restored', N, {}), ('snapshot-current', N, {'cursor': 9, 'items': ['new']})], N, {}, 'preview'), {'phase': 'live-preview', 'value': None})\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":"86b2728771ed321c6746eacd6bfa2233835858f9a54f2677399812c4b5a22e21","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 = {('live', 'connection-lost'): 'offline-cached', ('offline-cached', 'connection-restored'): 'reconciling', ('reconciling', 'snapshot-current'): 'live', ('reconciling', 'snapshot-failed'): 'offline-error', ('offline-error', 'retry-refresh'): 'reconciling', ('reconciling', 'connection-lost'): 'offline-cached', ('offline-cached', 'open-cached-item'): 'offline-preview', ('offline-preview', 'close-preview'): 'offline-cached', ('offline-preview', 'connection-restored'): 'reconciling-preview', ('reconciling-preview', 'snapshot-current'): 'live-preview'}\n    data = json.loads(json.dumps({'cached': ['old'], 'cursor': 8, 'preview': 'old', 'fresh': False})) if payload is None else {**json.loads(json.dumps({'cached': ['old'], 'cursor': 8, 'preview': 'old', 'fresh': False})), **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 == 'snapshot-current':\n                if arg.get('cursor',data['cursor']) < data['cursor']: event = 'unknown-event'\n                else:\n                    data['cursor'] = arg.get('cursor',data['cursor'])\n                    data['cached'] = arg.get('items',data['cached'])[:]\n            if event == 'connection-lost': data['fresh'] = False\n            state = table.get((state, event), state)\n            if state in ('live','live-preview'): data['fresh'] = True\n            if state == 'live-preview' and data['preview'] not in data['cached']: data['preview'] = None\n            if state == 'empty': data['cached'] = []\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('live / connection-lost', solve('live', [('connection-lost', N)], N), 'offline-cached')\ncheck('offline-cached / connection-restored', solve('offline-cached', [('connection-restored', N)], N), 'reconciling')\ncheck('reconciling / snapshot-current', solve('reconciling', [('snapshot-current', N)], N), 'live')\ncheck('reconciling / snapshot-failed', solve('reconciling', [('snapshot-failed', N)], N), 'offline-error')\ncheck('offline-error / retry-refresh', solve('offline-error', [('retry-refresh', N)], N), 'reconciling')\ncheck('reconciling / connection-lost', solve('reconciling', [('connection-lost', N)], N), 'offline-cached')\ncheck('offline-cached / open-cached-item', solve('offline-cached', [('open-cached-item', N)], N), 'offline-preview')\ncheck('offline-preview / close-preview', solve('offline-preview', [('close-preview', N)], N), 'offline-cached')\ncheck('offline-preview / connection-restored', solve('offline-preview', [('connection-restored', N)], N), 'reconciling-preview')\ncheck('reconciling-preview / snapshot-current', solve('reconciling-preview', [('snapshot-current', N)], N), 'live-preview')\ncheck('older notification incarnation', solve('live', [('connection-lost', N - 1)], N), 'live')\ncheck('future notification incarnation', solve('live', [('connection-lost', N + 1)], N), 'live')\ncheck('unknown event is inert', solve('live', [('unknown-event', N)], N), 'live')\ncheck('empty delivery batch', solve('live', [], N), 'live')\ncheck('N stale deliveries before current delivery', solve('live', [('connection-lost', N - 1)] * N + [('connection-lost', N)], N), 'offline-cached')\ncheck('trace connection-lost then connection-restored', solve('live', [('connection-lost', N), ('connection-restored', N)], N), 'reconciling')\ncheck('trace connection-lost then open-cached-item', solve('live', [('connection-lost', N), ('open-cached-item', N)], N), 'offline-preview')\ncheck('trace connection-restored then snapshot-current', solve('offline-cached', [('connection-restored', N), ('snapshot-current', N)], N), 'live')\ncheck('trace connection-restored then snapshot-failed', solve('offline-cached', [('connection-restored', N), ('snapshot-failed', N)], N), 'offline-error')\ncheck('trace connection-restored then connection-lost', solve('offline-cached', [('connection-restored', N), ('connection-lost', N)], N), 'offline-cached')\ncheck('trace snapshot-current then connection-lost', solve('reconciling', [('snapshot-current', N), ('connection-lost', N)], N), 'offline-cached')\ncheck('trace snapshot-failed then retry-refresh', solve('reconciling', [('snapshot-failed', N), ('retry-refresh', N)], N), 'reconciling')\ncheck('trace retry-refresh then snapshot-current', solve('offline-error', [('retry-refresh', N), ('snapshot-current', N)], N), 'live')\ncheck('trace retry-refresh then snapshot-failed', solve('offline-error', [('retry-refresh', N), ('snapshot-failed', N)], N), 'offline-error')\ncheck('trace retry-refresh then connection-lost', solve('offline-error', [('retry-refresh', N), ('connection-lost', N)], N), 'offline-cached')\ncheck('trace connection-lost then connection-restored', solve('reconciling', [('connection-lost', N), ('connection-restored', N)], N), 'reconciling')\ncheck('trace connection-lost then open-cached-item', solve('reconciling', [('connection-lost', N), ('open-cached-item', N)], N), 'offline-preview')\ncheck('trace open-cached-item then close-preview', solve('offline-cached', [('open-cached-item', N), ('close-preview', N)], N), 'offline-cached')\ncheck('trace open-cached-item then connection-restored', solve('offline-cached', [('open-cached-item', N), ('connection-restored', N)], N), 'reconciling-preview')\ncheck('trace close-preview then connection-restored', solve('offline-preview', [('close-preview', N), ('connection-restored', N)], N), 'reconciling')\ncheck('trace close-preview then open-cached-item', solve('offline-preview', [('close-preview', N), ('open-cached-item', N)], N), 'offline-preview')\ncheck('trace connection-restored then snapshot-current', solve('offline-preview', [('connection-restored', N), ('snapshot-current', N)], N), 'live-preview')\ncheck('domain state regression 1: cached', solve('reconciling', [('snapshot-current', N, {'cursor': 7, 'items': ['stale']})], N, {}, 'cached'), {'phase': 'reconciling', 'value': ['old']})\ncheck('domain state regression 2: cached', solve('reconciling', [('snapshot-current', N, {'cursor': 9, 'items': ['new']})], N, {}, 'cached'), {'phase': 'live', 'value': ['new']})\ncheck('domain state regression 3: cached', solve('live', [('connection-lost', N, {})], N, {'fresh': True}, 'cached'), {'phase': 'offline-cached', 'value': ['old']})\ncheck('domain state regression 4: preview', solve('reconciling-preview', [('snapshot-current', N, {'items': ['new']})], N, {}, 'preview'), {'phase': 'live-preview', 'value': None})\ncheck('domain state regression 5: preview', solve('reconciling-preview', [('snapshot-current', N, {'items': ['old', 'new']})], N, {}, 'preview'), {'phase': 'live-preview', 'value': 'old'})\ncheck('domain state regression 6: fresh', solve('reconciling', [('snapshot-failed', N, {})], N, {}, 'fresh'), {'phase': 'offline-error', 'value': False})\ncheck('domain state regression 7: preview', solve('offline-preview', [('connection-restored', N, {}), ('snapshot-current', N, {'cursor': 9, 'items': ['new']})], N, {}, 'preview'), {'phase': 'live-preview', 'value': None})\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-reconnect-04","generated_at":"2026-09-29T14:42:29.679310+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 reconciling / snapshot-failed transition to offline-error; preserve the other explicitly stipulated transitions.","root_cause":"A failed refresh claims current connectivity and content.","sha256":"c901bc24fd2e754c8f4d22eac2952f8aabc281d83ef89a9d4ca546028d106caa","title":"Notification inbox reconnect recovery: snapshot-failed from reconciling · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.94,"exit_code":1,"observations":[{"actual":"offline-cached","check":"live / connection-lost","expected":"offline-cached","passed":true},{"actual":"reconciling","check":"offline-cached / connection-restored","expected":"reconciling","passed":true},{"actual":"live","check":"reconciling / snapshot-current","expected":"live","passed":true},{"actual":"empty","check":"reconciling / snapshot-failed","expected":"offline-error","passed":false},{"actual":"reconciling","check":"offline-error / retry-refresh","expected":"reconciling","passed":true},{"actual":"offline-cached","check":"reconciling / connection-lost","expected":"offline-cached","passed":true},{"actual":"offline-preview","check":"offline-cached / open-cached-item","expected":"offline-preview","passed":true},{"actual":"offline-cached","check":"offline-preview / close-preview","expected":"offline-cached","passed":true},{"actual":"reconciling-preview","check":"offline-preview / connection-restored","expected":"reconciling-preview","passed":true},{"actual":"live-preview","check":"reconciling-preview / snapshot-current","expected":"live-preview","passed":true},{"actual":"live","check":"older notification incarnation","expected":"live","passed":true},{"actual":"live","check":"future notification incarnation","expected":"live","passed":true},{"actual":"live","check":"unknown event is inert","expected":"live","passed":true},{"actual":"live","check":"empty delivery batch","expected":"live","passed":true},{"actual":"offline-cached","check":"N stale deliveries before current delivery","expected":"offline-cached","passed":true},{"actual":"reconciling","check":"trace connection-lost then connection-restored","expected":"reconciling","passed":true},{"actual":"offline-preview","check":"trace connection-lost then open-cached-item","expected":"offline-preview","passed":true},{"actual":"live","check":"trace connection-restored then snapshot-current","expected":"live","passed":true},{"actual":"empty","check":"trace connection-restored then snapshot-failed","expected":"offline-error","passed":false},{"actual":"offline-cached","check":"trace connection-restored then connection-lost","expected":"offline-cached","passed":true},{"actual":"offline-cached","check":"trace snapshot-current then connection-lost","expected":"offline-cached","passed":true},{"actual":"empty","check":"trace snapshot-failed then retry-refresh","expected":"reconciling","passed":false},{"actual":"live","check":"trace retry-refresh then snapshot-current","expected":"live","passed":true},{"actual":"empty","check":"trace retry-refresh then snapshot-failed","expected":"offline-error","passed":false},{"actual":"offline-cached","check":"trace retry-refresh then connection-lost","expected":"offline-cached","passed":true},{"actual":"reconciling","check":"trace connection-lost then connection-restored","expected":"reconciling","passed":true},{"actual":"offline-preview","check":"trace connection-lost then open-cached-item","expected":"offline-preview","passed":true},{"actual":"offline-cached","check":"trace open-cached-item then close-preview","expected":"offline-cached","passed":true},{"actual":"reconciling-preview","check":"trace open-cached-item then connection-restored","expected":"reconciling-preview","passed":true},{"actual":"reconciling","check":"trace close-preview then connection-restored","expected":"reconciling","passed":true},{"actual":"offline-preview","check":"trace close-preview then open-cached-item","expected":"offline-preview","passed":true},{"actual":"live-preview","check":"trace connection-restored then snapshot-current","expected":"live-preview","passed":true},{"actual":{"phase":"reconciling","value":["old"]},"check":"domain state regression 1: cached","expected":{"phase":"reconciling","value":["old"]},"passed":true},{"actual":{"phase":"live","value":["new"]},"check":"domain state regression 2: cached","expected":{"phase":"live","value":["new"]},"passed":true},{"actual":{"phase":"offline-cached","value":["old"]},"check":"domain state regression 3: cached","expected":{"phase":"offline-cached","value":["old"]},"passed":true},{"actual":{"phase":"live-preview","value":null},"check":"domain state regression 4: preview","expected":{"phase":"live-preview","value":null},"passed":true},{"actual":{"phase":"live-preview","value":"old"},"check":"domain state regression 5: preview","expected":{"phase":"live-preview","value":"old"},"passed":true},{"actual":{"phase":"empty","value":false},"check":"domain state regression 6: fresh","expected":{"phase":"offline-error","value":false},"passed":false},{"actual":{"phase":"live-preview","value":null},"check":"domain state regression 7: preview","expected":{"phase":"live-preview","value":null},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"live / connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"offline-cached / connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"reconciling / snapshot-current\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"reconciling / snapshot-failed\", \"actual\": \"empty\", \"expected\": \"offline-error\", \"passed\": false}, {\"check\": \"offline-error / retry-refresh\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"reconciling / connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"offline-cached / open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"offline-preview / close-preview\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"offline-preview / connection-restored\", \"actual\": \"reconciling-preview\", \"expected\": \"reconciling-preview\", \"passed\": true}, {\"check\": \"reconciling-preview / snapshot-current\", \"actual\": \"live-preview\", \"expected\": \"live-preview\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace connection-lost then connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"trace connection-lost then open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"trace connection-restored then snapshot-current\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"trace connection-restored then snapshot-failed\", \"actual\": \"empty\", \"expected\": \"offline-error\", \"passed\": false}, {\"check\": \"trace connection-restored then connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace snapshot-current then connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace snapshot-failed then retry-refresh\", \"actual\": \"empty\", \"expected\": \"reconciling\", \"passed\": false}, {\"check\": \"trace retry-refresh then snapshot-current\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"trace retry-refresh then snapshot-failed\", \"actual\": \"empty\", \"expected\": \"offline-error\", \"passed\": false}, {\"check\": \"trace retry-refresh then connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace connection-lost then connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"trace connection-lost then open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"trace open-cached-item then close-preview\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace open-cached-item then connection-restored\", \"actual\": \"reconciling-preview\", \"expected\": \"reconciling-preview\", \"passed\": true}, {\"check\": \"trace close-preview then connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"trace close-preview then open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"trace connection-restored then snapshot-current\", \"actual\": \"live-preview\", \"expected\": \"live-preview\", \"passed\": true}, {\"check\": \"domain state regression 1: cached\", \"actual\": {\"phase\": \"reconciling\", \"value\": [\"old\"]}, \"expected\": {\"phase\": \"reconciling\", \"value\": [\"old\"]}, \"passed\": true}, {\"check\": \"domain state regression 2: cached\", \"actual\": {\"phase\": \"live\", \"value\": [\"new\"]}, \"expected\": {\"phase\": \"live\", \"value\": [\"new\"]}, \"passed\": true}, {\"check\": \"domain state regression 3: cached\", \"actual\": {\"phase\": \"offline-cached\", \"value\": [\"old\"]}, \"expected\": {\"phase\": \"offline-cached\", \"value\": [\"old\"]}, \"passed\": true}, {\"check\": \"domain state regression 4: preview\", \"actual\": {\"phase\": \"live-preview\", \"value\": null}, \"expected\": {\"phase\": \"live-preview\", \"value\": null}, \"passed\": true}, {\"check\": \"domain state regression 5: preview\", \"actual\": {\"phase\": \"live-preview\", \"value\": \"old\"}, \"expected\": {\"phase\": \"live-preview\", \"value\": \"old\"}, \"passed\": true}, {\"check\": \"domain state regression 6: fresh\", \"actual\": {\"phase\": \"empty\", \"value\": false}, \"expected\": {\"phase\": \"offline-error\", \"value\": false}, \"passed\": false}, {\"check\": \"domain state regression 7: preview\", \"actual\": {\"phase\": \"live-preview\", \"value\": null}, \"expected\": {\"phase\": \"live-preview\", \"value\": null}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":54.477,"exit_code":1,"observations":[{"actual":"offline-cached","check":"live / connection-lost","expected":"offline-cached","passed":true},{"actual":"reconciling","check":"offline-cached / connection-restored","expected":"reconciling","passed":true},{"actual":"live","check":"reconciling / snapshot-current","expected":"live","passed":true},{"actual":"live","check":"reconciling / snapshot-failed","expected":"offline-error","passed":false},{"actual":"reconciling","check":"offline-error / retry-refresh","expected":"reconciling","passed":true},{"actual":"offline-cached","check":"reconciling / connection-lost","expected":"offline-cached","passed":true},{"actual":"offline-preview","check":"offline-cached / open-cached-item","expected":"offline-preview","passed":true},{"actual":"offline-cached","check":"offline-preview / close-preview","expected":"offline-cached","passed":true},{"actual":"reconciling-preview","check":"offline-preview / connection-restored","expected":"reconciling-preview","passed":true},{"actual":"live-preview","check":"reconciling-preview / snapshot-current","expected":"live-preview","passed":true},{"actual":"live","check":"older notification incarnation","expected":"live","passed":true},{"actual":"live","check":"future notification incarnation","expected":"live","passed":true},{"actual":"live","check":"unknown event is inert","expected":"live","passed":true},{"actual":"live","check":"empty delivery batch","expected":"live","passed":true},{"actual":"offline-cached","check":"N stale deliveries before current delivery","expected":"offline-cached","passed":true},{"actual":"reconciling","check":"trace connection-lost then connection-restored","expected":"reconciling","passed":true},{"actual":"offline-preview","check":"trace connection-lost then open-cached-item","expected":"offline-preview","passed":true},{"actual":"live","check":"trace connection-restored then snapshot-current","expected":"live","passed":true},{"actual":"live","check":"trace connection-restored then snapshot-failed","expected":"offline-error","passed":false},{"actual":"offline-cached","check":"trace connection-restored then connection-lost","expected":"offline-cached","passed":true},{"actual":"offline-cached","check":"trace snapshot-current then connection-lost","expected":"offline-cached","passed":true},{"actual":"live","check":"trace snapshot-failed then retry-refresh","expected":"reconciling","passed":false},{"actual":"live","check":"trace retry-refresh then snapshot-current","expected":"live","passed":true},{"actual":"live","check":"trace retry-refresh then snapshot-failed","expected":"offline-error","passed":false},{"actual":"offline-cached","check":"trace retry-refresh then connection-lost","expected":"offline-cached","passed":true},{"actual":"reconciling","check":"trace connection-lost then connection-restored","expected":"reconciling","passed":true},{"actual":"offline-preview","check":"trace connection-lost then open-cached-item","expected":"offline-preview","passed":true},{"actual":"offline-cached","check":"trace open-cached-item then close-preview","expected":"offline-cached","passed":true},{"actual":"reconciling-preview","check":"trace open-cached-item then connection-restored","expected":"reconciling-preview","passed":true},{"actual":"reconciling","check":"trace close-preview then connection-restored","expected":"reconciling","passed":true},{"actual":"offline-preview","check":"trace close-preview then open-cached-item","expected":"offline-preview","passed":true},{"actual":"live-preview","check":"trace connection-restored then snapshot-current","expected":"live-preview","passed":true},{"actual":{"phase":"reconciling","value":["old"]},"check":"domain state regression 1: cached","expected":{"phase":"reconciling","value":["old"]},"passed":true},{"actual":{"phase":"live","value":["new"]},"check":"domain state regression 2: cached","expected":{"phase":"live","value":["new"]},"passed":true},{"actual":{"phase":"offline-cached","value":["old"]},"check":"domain state regression 3: cached","expected":{"phase":"offline-cached","value":["old"]},"passed":true},{"actual":{"phase":"live-preview","value":null},"check":"domain state regression 4: preview","expected":{"phase":"live-preview","value":null},"passed":true},{"actual":{"phase":"live-preview","value":"old"},"check":"domain state regression 5: preview","expected":{"phase":"live-preview","value":"old"},"passed":true},{"actual":{"phase":"live","value":true},"check":"domain state regression 6: fresh","expected":{"phase":"offline-error","value":false},"passed":false},{"actual":{"phase":"live-preview","value":null},"check":"domain state regression 7: preview","expected":{"phase":"live-preview","value":null},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"live / connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"offline-cached / connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"reconciling / snapshot-current\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"reconciling / snapshot-failed\", \"actual\": \"live\", \"expected\": \"offline-error\", \"passed\": false}, {\"check\": \"offline-error / retry-refresh\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"reconciling / connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"offline-cached / open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"offline-preview / close-preview\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"offline-preview / connection-restored\", \"actual\": \"reconciling-preview\", \"expected\": \"reconciling-preview\", \"passed\": true}, {\"check\": \"reconciling-preview / snapshot-current\", \"actual\": \"live-preview\", \"expected\": \"live-preview\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace connection-lost then connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"trace connection-lost then open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"trace connection-restored then snapshot-current\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"trace connection-restored then snapshot-failed\", \"actual\": \"live\", \"expected\": \"offline-error\", \"passed\": false}, {\"check\": \"trace connection-restored then connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace snapshot-current then connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace snapshot-failed then retry-refresh\", \"actual\": \"live\", \"expected\": \"reconciling\", \"passed\": false}, {\"check\": \"trace retry-refresh then snapshot-current\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"trace retry-refresh then snapshot-failed\", \"actual\": \"live\", \"expected\": \"offline-error\", \"passed\": false}, {\"check\": \"trace retry-refresh then connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace connection-lost then connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"trace connection-lost then open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"trace open-cached-item then close-preview\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace open-cached-item then connection-restored\", \"actual\": \"reconciling-preview\", \"expected\": \"reconciling-preview\", \"passed\": true}, {\"check\": \"trace close-preview then connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"trace close-preview then open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"trace connection-restored then snapshot-current\", \"actual\": \"live-preview\", \"expected\": \"live-preview\", \"passed\": true}, {\"check\": \"domain state regression 1: cached\", \"actual\": {\"phase\": \"reconciling\", \"value\": [\"old\"]}, \"expected\": {\"phase\": \"reconciling\", \"value\": [\"old\"]}, \"passed\": true}, {\"check\": \"domain state regression 2: cached\", \"actual\": {\"phase\": \"live\", \"value\": [\"new\"]}, \"expected\": {\"phase\": \"live\", \"value\": [\"new\"]}, \"passed\": true}, {\"check\": \"domain state regression 3: cached\", \"actual\": {\"phase\": \"offline-cached\", \"value\": [\"old\"]}, \"expected\": {\"phase\": \"offline-cached\", \"value\": [\"old\"]}, \"passed\": true}, {\"check\": \"domain state regression 4: preview\", \"actual\": {\"phase\": \"live-preview\", \"value\": null}, \"expected\": {\"phase\": \"live-preview\", \"value\": null}, \"passed\": true}, {\"check\": \"domain state regression 5: preview\", \"actual\": {\"phase\": \"live-preview\", \"value\": \"old\"}, \"expected\": {\"phase\": \"live-preview\", \"value\": \"old\"}, \"passed\": true}, {\"check\": \"domain state regression 6: fresh\", \"actual\": {\"phase\": \"live\", \"value\": true}, \"expected\": {\"phase\": \"offline-error\", \"value\": false}, \"passed\": false}, {\"check\": \"domain state regression 7: preview\", \"actual\": {\"phase\": \"live-preview\", \"value\": null}, \"expected\": {\"phase\": \"live-preview\", \"value\": null}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.608,"exit_code":0,"observations":[{"actual":"offline-cached","check":"live / connection-lost","expected":"offline-cached","passed":true},{"actual":"reconciling","check":"offline-cached / connection-restored","expected":"reconciling","passed":true},{"actual":"live","check":"reconciling / snapshot-current","expected":"live","passed":true},{"actual":"offline-error","check":"reconciling / snapshot-failed","expected":"offline-error","passed":true},{"actual":"reconciling","check":"offline-error / retry-refresh","expected":"reconciling","passed":true},{"actual":"offline-cached","check":"reconciling / connection-lost","expected":"offline-cached","passed":true},{"actual":"offline-preview","check":"offline-cached / open-cached-item","expected":"offline-preview","passed":true},{"actual":"offline-cached","check":"offline-preview / close-preview","expected":"offline-cached","passed":true},{"actual":"reconciling-preview","check":"offline-preview / connection-restored","expected":"reconciling-preview","passed":true},{"actual":"live-preview","check":"reconciling-preview / snapshot-current","expected":"live-preview","passed":true},{"actual":"live","check":"older notification incarnation","expected":"live","passed":true},{"actual":"live","check":"future notification incarnation","expected":"live","passed":true},{"actual":"live","check":"unknown event is inert","expected":"live","passed":true},{"actual":"live","check":"empty delivery batch","expected":"live","passed":true},{"actual":"offline-cached","check":"N stale deliveries before current delivery","expected":"offline-cached","passed":true},{"actual":"reconciling","check":"trace connection-lost then connection-restored","expected":"reconciling","passed":true},{"actual":"offline-preview","check":"trace connection-lost then open-cached-item","expected":"offline-preview","passed":true},{"actual":"live","check":"trace connection-restored then snapshot-current","expected":"live","passed":true},{"actual":"offline-error","check":"trace connection-restored then snapshot-failed","expected":"offline-error","passed":true},{"actual":"offline-cached","check":"trace connection-restored then connection-lost","expected":"offline-cached","passed":true},{"actual":"offline-cached","check":"trace snapshot-current then connection-lost","expected":"offline-cached","passed":true},{"actual":"reconciling","check":"trace snapshot-failed then retry-refresh","expected":"reconciling","passed":true},{"actual":"live","check":"trace retry-refresh then snapshot-current","expected":"live","passed":true},{"actual":"offline-error","check":"trace retry-refresh then snapshot-failed","expected":"offline-error","passed":true},{"actual":"offline-cached","check":"trace retry-refresh then connection-lost","expected":"offline-cached","passed":true},{"actual":"reconciling","check":"trace connection-lost then connection-restored","expected":"reconciling","passed":true},{"actual":"offline-preview","check":"trace connection-lost then open-cached-item","expected":"offline-preview","passed":true},{"actual":"offline-cached","check":"trace open-cached-item then close-preview","expected":"offline-cached","passed":true},{"actual":"reconciling-preview","check":"trace open-cached-item then connection-restored","expected":"reconciling-preview","passed":true},{"actual":"reconciling","check":"trace close-preview then connection-restored","expected":"reconciling","passed":true},{"actual":"offline-preview","check":"trace close-preview then open-cached-item","expected":"offline-preview","passed":true},{"actual":"live-preview","check":"trace connection-restored then snapshot-current","expected":"live-preview","passed":true},{"actual":{"phase":"reconciling","value":["old"]},"check":"domain state regression 1: cached","expected":{"phase":"reconciling","value":["old"]},"passed":true},{"actual":{"phase":"live","value":["new"]},"check":"domain state regression 2: cached","expected":{"phase":"live","value":["new"]},"passed":true},{"actual":{"phase":"offline-cached","value":["old"]},"check":"domain state regression 3: cached","expected":{"phase":"offline-cached","value":["old"]},"passed":true},{"actual":{"phase":"live-preview","value":null},"check":"domain state regression 4: preview","expected":{"phase":"live-preview","value":null},"passed":true},{"actual":{"phase":"live-preview","value":"old"},"check":"domain state regression 5: preview","expected":{"phase":"live-preview","value":"old"},"passed":true},{"actual":{"phase":"offline-error","value":false},"check":"domain state regression 6: fresh","expected":{"phase":"offline-error","value":false},"passed":true},{"actual":{"phase":"live-preview","value":null},"check":"domain state regression 7: preview","expected":{"phase":"live-preview","value":null},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"live / connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"offline-cached / connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"reconciling / snapshot-current\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"reconciling / snapshot-failed\", \"actual\": \"offline-error\", \"expected\": \"offline-error\", \"passed\": true}, {\"check\": \"offline-error / retry-refresh\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"reconciling / connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"offline-cached / open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"offline-preview / close-preview\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"offline-preview / connection-restored\", \"actual\": \"reconciling-preview\", \"expected\": \"reconciling-preview\", \"passed\": true}, {\"check\": \"reconciling-preview / snapshot-current\", \"actual\": \"live-preview\", \"expected\": \"live-preview\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace connection-lost then connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"trace connection-lost then open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"trace connection-restored then snapshot-current\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"trace connection-restored then snapshot-failed\", \"actual\": \"offline-error\", \"expected\": \"offline-error\", \"passed\": true}, {\"check\": \"trace connection-restored then connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace snapshot-current then connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace snapshot-failed then retry-refresh\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"trace retry-refresh then snapshot-current\", \"actual\": \"live\", \"expected\": \"live\", \"passed\": true}, {\"check\": \"trace retry-refresh then snapshot-failed\", \"actual\": \"offline-error\", \"expected\": \"offline-error\", \"passed\": true}, {\"check\": \"trace retry-refresh then connection-lost\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace connection-lost then connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"trace connection-lost then open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"trace open-cached-item then close-preview\", \"actual\": \"offline-cached\", \"expected\": \"offline-cached\", \"passed\": true}, {\"check\": \"trace open-cached-item then connection-restored\", \"actual\": \"reconciling-preview\", \"expected\": \"reconciling-preview\", \"passed\": true}, {\"check\": \"trace close-preview then connection-restored\", \"actual\": \"reconciling\", \"expected\": \"reconciling\", \"passed\": true}, {\"check\": \"trace close-preview then open-cached-item\", \"actual\": \"offline-preview\", \"expected\": \"offline-preview\", \"passed\": true}, {\"check\": \"trace connection-restored then snapshot-current\", \"actual\": \"live-preview\", \"expected\": \"live-preview\", \"passed\": true}, {\"check\": \"domain state regression 1: cached\", \"actual\": {\"phase\": \"reconciling\", \"value\": [\"old\"]}, \"expected\": {\"phase\": \"reconciling\", \"value\": [\"old\"]}, \"passed\": true}, {\"check\": \"domain state regression 2: cached\", \"actual\": {\"phase\": \"live\", \"value\": [\"new\"]}, \"expected\": {\"phase\": \"live\", \"value\": [\"new\"]}, \"passed\": true}, {\"check\": \"domain state regression 3: cached\", \"actual\": {\"phase\": \"offline-cached\", \"value\": [\"old\"]}, \"expected\": {\"phase\": \"offline-cached\", \"value\": [\"old\"]}, \"passed\": true}, {\"check\": \"domain state regression 4: preview\", \"actual\": {\"phase\": \"live-preview\", \"value\": null}, \"expected\": {\"phase\": \"live-preview\", \"value\": null}, \"passed\": true}, {\"check\": \"domain state regression 5: preview\", \"actual\": {\"phase\": \"live-preview\", \"value\": \"old\"}, \"expected\": {\"phase\": \"live-preview\", \"value\": \"old\"}, \"passed\": true}, {\"check\": \"domain state regression 6: fresh\", \"actual\": {\"phase\": \"offline-error\", \"value\": false}, \"expected\": {\"phase\": \"offline-error\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 7: preview\", \"actual\": {\"phase\": \"live-preview\", \"value\": null}, \"expected\": {\"phase\": \"live-preview\", \"value\": null}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}