{"abstract":"The close-preview event leaves a notification in revision-three-read instead of revision-three-unread.","category":"Notification interfaces","checks":33,"contract":"Notification content revision review is a bounded visual-notification workflow with mutable policy state {'current': 2, 'ack': 1, 'preview': None, 'withdrawn': False}. Its default transition relation is {('revision-one-read', 'revision-two-arrives'): 'revision-two-unread', ('revision-two-unread', 'open-revision'): 'revision-two-preview', ('revision-two-preview', 'ack-revision'): 'revision-two-read', ('revision-two-preview', 'revision-three-arrives'): 'revision-three-pending-review', ('revision-three-pending-review', 'accept-update'): 'revision-three-preview', ('revision-three-preview', 'ack-revision'): 'revision-three-read', ('revision-three-read', 'late-revision-two'): 'revision-three-read', ('revision-three-pending-review', 'close-preview'): 'revision-three-unread', ('revision-three-unread', 'open-revision'): 'revision-three-preview', ('revision-two-unread', 'revision-withdrawn'): 'withdrawn'}; 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-revision","failed_approach":"Restoring old read status hides the new unread revision.","family":"s3-notification-interfaces-revision-08","id":"FA-34976","implementations":{"attempt":{"sha256":"49baadf44875293e5f024f73fd1b500eb44932a04ef9a9a6cbe9173f29a38b7e","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 = {('revision-one-read', 'revision-two-arrives'): 'revision-two-unread', ('revision-two-unread', 'open-revision'): 'revision-two-preview', ('revision-two-preview', 'ack-revision'): 'revision-two-read', ('revision-two-preview', 'revision-three-arrives'): 'revision-three-pending-review', ('revision-three-pending-review', 'accept-update'): 'revision-three-preview', ('revision-three-preview', 'ack-revision'): 'revision-three-read', ('revision-three-read', 'late-revision-two'): 'revision-three-read', ('revision-three-pending-review', 'close-preview'): 'revision-two-read', ('revision-three-unread', 'open-revision'): 'revision-three-preview', ('revision-two-unread', 'revision-withdrawn'): 'withdrawn'}\n    data = json.loads(json.dumps({'current': 2, 'ack': 1, 'preview': None, 'withdrawn': False})) if payload is None else {**json.loads(json.dumps({'current': 2, 'ack': 1, 'preview': None, 'withdrawn': 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 == 'ack-revision' and arg.get('revision',data['current']) != data['current']: event = 'unknown-event'\n            if event == 'revision-three-arrives': data['current'] = 3\n            state = table.get((state, event), state)\n            if state in ('revision-two-preview','revision-three-preview'): data['preview'] = data['current']\n            if state == 'revision-two-read': data['ack'] = 2\n            if state == 'revision-three-read': data['ack'] = 3\n            if state == 'withdrawn':\n                data['withdrawn'] = True\n                data['preview'] = None\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('revision-one-read / revision-two-arrives', solve('revision-one-read', [('revision-two-arrives', N)], N), 'revision-two-unread')\ncheck('revision-two-unread / open-revision', solve('revision-two-unread', [('open-revision', N)], N), 'revision-two-preview')\ncheck('revision-two-preview / ack-revision', solve('revision-two-preview', [('ack-revision', N)], N), 'revision-two-read')\ncheck('revision-two-preview / revision-three-arrives', solve('revision-two-preview', [('revision-three-arrives', N)], N), 'revision-three-pending-review')\ncheck('revision-three-pending-review / accept-update', solve('revision-three-pending-review', [('accept-update', N)], N), 'revision-three-preview')\ncheck('revision-three-preview / ack-revision', solve('revision-three-preview', [('ack-revision', N)], N), 'revision-three-read')\ncheck('revision-three-read / late-revision-two', solve('revision-three-read', [('late-revision-two', N)], N), 'revision-three-read')\ncheck('revision-three-pending-review / close-preview', solve('revision-three-pending-review', [('close-preview', N)], N), 'revision-three-unread')\ncheck('revision-three-unread / open-revision', solve('revision-three-unread', [('open-revision', N)], N), 'revision-three-preview')\ncheck('revision-two-unread / revision-withdrawn', solve('revision-two-unread', [('revision-withdrawn', N)], N), 'withdrawn')\ncheck('older notification incarnation', solve('revision-one-read', [('revision-two-arrives', N - 1)], N), 'revision-one-read')\ncheck('future notification incarnation', solve('revision-one-read', [('revision-two-arrives', N + 1)], N), 'revision-one-read')\ncheck('unknown event is inert', solve('revision-one-read', [('unknown-event', N)], N), 'revision-one-read')\ncheck('empty delivery batch', solve('revision-one-read', [], N), 'revision-one-read')\ncheck('N stale deliveries before current delivery', solve('revision-one-read', [('revision-two-arrives', N - 1)] * N + [('revision-two-arrives', N)], N), 'revision-two-unread')\ncheck('trace revision-two-arrives then open-revision', solve('revision-one-read', [('revision-two-arrives', N), ('open-revision', N)], N), 'revision-two-preview')\ncheck('trace revision-two-arrives then revision-withdrawn', solve('revision-one-read', [('revision-two-arrives', N), ('revision-withdrawn', N)], N), 'withdrawn')\ncheck('trace open-revision then ack-revision', solve('revision-two-unread', [('open-revision', N), ('ack-revision', N)], N), 'revision-two-read')\ncheck('trace open-revision then revision-three-arrives', solve('revision-two-unread', [('open-revision', N), ('revision-three-arrives', N)], N), 'revision-three-pending-review')\ncheck('trace revision-three-arrives then accept-update', solve('revision-two-preview', [('revision-three-arrives', N), ('accept-update', N)], N), 'revision-three-preview')\ncheck('trace revision-three-arrives then close-preview', solve('revision-two-preview', [('revision-three-arrives', N), ('close-preview', N)], N), 'revision-three-unread')\ncheck('trace accept-update then ack-revision', solve('revision-three-pending-review', [('accept-update', N), ('ack-revision', N)], N), 'revision-three-read')\ncheck('trace ack-revision then late-revision-two', solve('revision-three-preview', [('ack-revision', N), ('late-revision-two', N)], N), 'revision-three-read')\ncheck('trace late-revision-two then late-revision-two', solve('revision-three-read', [('late-revision-two', N), ('late-revision-two', N)], N), 'revision-three-read')\ncheck('trace close-preview then open-revision', solve('revision-three-pending-review', [('close-preview', N), ('open-revision', N)], N), 'revision-three-preview')\ncheck('trace open-revision then ack-revision', solve('revision-three-unread', [('open-revision', N), ('ack-revision', N)], N), 'revision-three-read')\ncheck('domain state regression 1: ack', solve('revision-two-preview', [('ack-revision', N, {'revision': 1})], N, {}, 'ack'), {'phase': 'revision-two-preview', 'value': 1})\ncheck('domain state regression 2: ack', solve('revision-two-preview', [('ack-revision', N, {'revision': 2})], N, {}, 'ack'), {'phase': 'revision-two-read', 'value': 2})\ncheck('domain state regression 3: preview', solve('revision-two-preview', [('revision-three-arrives', N, {})], N, {'preview': 2}, 'preview'), {'phase': 'revision-three-pending-review', 'value': 2})\ncheck('domain state regression 4: preview', solve('revision-three-pending-review', [('accept-update', N, {})], N, {'current': 3, 'preview': 2}, 'preview'), {'phase': 'revision-three-preview', 'value': 3})\ncheck('domain state regression 5: current', solve('revision-three-read', [('late-revision-two', N, {})], N, {'current': 3, 'ack': 3}, 'current'), {'phase': 'revision-three-read', 'value': 3})\ncheck('domain state regression 6: preview', solve('revision-two-unread', [('revision-withdrawn', N, {})], N, {'preview': 2}, 'preview'), {'phase': 'withdrawn', 'value': None})\ncheck('domain state regression 7: ack', solve('revision-two-preview', [('revision-three-arrives', N, {}), ('accept-update', N, {}), ('ack-revision', N, {'revision': 2}), ('ack-revision', N, {'revision': 3})], N, {}, 'ack'), {'phase': 'revision-three-read', 'value': 3})\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":"8c717878f46f402e335c9548494fa40b6156c84e2061de4167dfad9aea71e595","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 = {('revision-one-read', 'revision-two-arrives'): 'revision-two-unread', ('revision-two-unread', 'open-revision'): 'revision-two-preview', ('revision-two-preview', 'ack-revision'): 'revision-two-read', ('revision-two-preview', 'revision-three-arrives'): 'revision-three-pending-review', ('revision-three-pending-review', 'accept-update'): 'revision-three-preview', ('revision-three-preview', 'ack-revision'): 'revision-three-read', ('revision-three-read', 'late-revision-two'): 'revision-three-read', ('revision-three-pending-review', 'close-preview'): 'revision-three-read', ('revision-three-unread', 'open-revision'): 'revision-three-preview', ('revision-two-unread', 'revision-withdrawn'): 'withdrawn'}\n    data = json.loads(json.dumps({'current': 2, 'ack': 1, 'preview': None, 'withdrawn': False})) if payload is None else {**json.loads(json.dumps({'current': 2, 'ack': 1, 'preview': None, 'withdrawn': 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 == 'ack-revision' and arg.get('revision',data['current']) != data['current']: event = 'unknown-event'\n            if event == 'revision-three-arrives': data['current'] = 3\n            state = table.get((state, event), state)\n            if state in ('revision-two-preview','revision-three-preview'): data['preview'] = data['current']\n            if state == 'revision-two-read': data['ack'] = 2\n            if state == 'revision-three-read': data['ack'] = 3\n            if state == 'withdrawn':\n                data['withdrawn'] = True\n                data['preview'] = None\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('revision-one-read / revision-two-arrives', solve('revision-one-read', [('revision-two-arrives', N)], N), 'revision-two-unread')\ncheck('revision-two-unread / open-revision', solve('revision-two-unread', [('open-revision', N)], N), 'revision-two-preview')\ncheck('revision-two-preview / ack-revision', solve('revision-two-preview', [('ack-revision', N)], N), 'revision-two-read')\ncheck('revision-two-preview / revision-three-arrives', solve('revision-two-preview', [('revision-three-arrives', N)], N), 'revision-three-pending-review')\ncheck('revision-three-pending-review / accept-update', solve('revision-three-pending-review', [('accept-update', N)], N), 'revision-three-preview')\ncheck('revision-three-preview / ack-revision', solve('revision-three-preview', [('ack-revision', N)], N), 'revision-three-read')\ncheck('revision-three-read / late-revision-two', solve('revision-three-read', [('late-revision-two', N)], N), 'revision-three-read')\ncheck('revision-three-pending-review / close-preview', solve('revision-three-pending-review', [('close-preview', N)], N), 'revision-three-unread')\ncheck('revision-three-unread / open-revision', solve('revision-three-unread', [('open-revision', N)], N), 'revision-three-preview')\ncheck('revision-two-unread / revision-withdrawn', solve('revision-two-unread', [('revision-withdrawn', N)], N), 'withdrawn')\ncheck('older notification incarnation', solve('revision-one-read', [('revision-two-arrives', N - 1)], N), 'revision-one-read')\ncheck('future notification incarnation', solve('revision-one-read', [('revision-two-arrives', N + 1)], N), 'revision-one-read')\ncheck('unknown event is inert', solve('revision-one-read', [('unknown-event', N)], N), 'revision-one-read')\ncheck('empty delivery batch', solve('revision-one-read', [], N), 'revision-one-read')\ncheck('N stale deliveries before current delivery', solve('revision-one-read', [('revision-two-arrives', N - 1)] * N + [('revision-two-arrives', N)], N), 'revision-two-unread')\ncheck('trace revision-two-arrives then open-revision', solve('revision-one-read', [('revision-two-arrives', N), ('open-revision', N)], N), 'revision-two-preview')\ncheck('trace revision-two-arrives then revision-withdrawn', solve('revision-one-read', [('revision-two-arrives', N), ('revision-withdrawn', N)], N), 'withdrawn')\ncheck('trace open-revision then ack-revision', solve('revision-two-unread', [('open-revision', N), ('ack-revision', N)], N), 'revision-two-read')\ncheck('trace open-revision then revision-three-arrives', solve('revision-two-unread', [('open-revision', N), ('revision-three-arrives', N)], N), 'revision-three-pending-review')\ncheck('trace revision-three-arrives then accept-update', solve('revision-two-preview', [('revision-three-arrives', N), ('accept-update', N)], N), 'revision-three-preview')\ncheck('trace revision-three-arrives then close-preview', solve('revision-two-preview', [('revision-three-arrives', N), ('close-preview', N)], N), 'revision-three-unread')\ncheck('trace accept-update then ack-revision', solve('revision-three-pending-review', [('accept-update', N), ('ack-revision', N)], N), 'revision-three-read')\ncheck('trace ack-revision then late-revision-two', solve('revision-three-preview', [('ack-revision', N), ('late-revision-two', N)], N), 'revision-three-read')\ncheck('trace late-revision-two then late-revision-two', solve('revision-three-read', [('late-revision-two', N), ('late-revision-two', N)], N), 'revision-three-read')\ncheck('trace close-preview then open-revision', solve('revision-three-pending-review', [('close-preview', N), ('open-revision', N)], N), 'revision-three-preview')\ncheck('trace open-revision then ack-revision', solve('revision-three-unread', [('open-revision', N), ('ack-revision', N)], N), 'revision-three-read')\ncheck('domain state regression 1: ack', solve('revision-two-preview', [('ack-revision', N, {'revision': 1})], N, {}, 'ack'), {'phase': 'revision-two-preview', 'value': 1})\ncheck('domain state regression 2: ack', solve('revision-two-preview', [('ack-revision', N, {'revision': 2})], N, {}, 'ack'), {'phase': 'revision-two-read', 'value': 2})\ncheck('domain state regression 3: preview', solve('revision-two-preview', [('revision-three-arrives', N, {})], N, {'preview': 2}, 'preview'), {'phase': 'revision-three-pending-review', 'value': 2})\ncheck('domain state regression 4: preview', solve('revision-three-pending-review', [('accept-update', N, {})], N, {'current': 3, 'preview': 2}, 'preview'), {'phase': 'revision-three-preview', 'value': 3})\ncheck('domain state regression 5: current', solve('revision-three-read', [('late-revision-two', N, {})], N, {'current': 3, 'ack': 3}, 'current'), {'phase': 'revision-three-read', 'value': 3})\ncheck('domain state regression 6: preview', solve('revision-two-unread', [('revision-withdrawn', N, {})], N, {'preview': 2}, 'preview'), {'phase': 'withdrawn', 'value': None})\ncheck('domain state regression 7: ack', solve('revision-two-preview', [('revision-three-arrives', N, {}), ('accept-update', N, {}), ('ack-revision', N, {'revision': 2}), ('ack-revision', N, {'revision': 3})], N, {}, 'ack'), {'phase': 'revision-three-read', 'value': 3})\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":"105cd701d9e0d3cef3711b1f96b777ab493651494f0e6e0111aace730fa9baa5","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 = {('revision-one-read', 'revision-two-arrives'): 'revision-two-unread', ('revision-two-unread', 'open-revision'): 'revision-two-preview', ('revision-two-preview', 'ack-revision'): 'revision-two-read', ('revision-two-preview', 'revision-three-arrives'): 'revision-three-pending-review', ('revision-three-pending-review', 'accept-update'): 'revision-three-preview', ('revision-three-preview', 'ack-revision'): 'revision-three-read', ('revision-three-read', 'late-revision-two'): 'revision-three-read', ('revision-three-pending-review', 'close-preview'): 'revision-three-unread', ('revision-three-unread', 'open-revision'): 'revision-three-preview', ('revision-two-unread', 'revision-withdrawn'): 'withdrawn'}\n    data = json.loads(json.dumps({'current': 2, 'ack': 1, 'preview': None, 'withdrawn': False})) if payload is None else {**json.loads(json.dumps({'current': 2, 'ack': 1, 'preview': None, 'withdrawn': 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 == 'ack-revision' and arg.get('revision',data['current']) != data['current']: event = 'unknown-event'\n            if event == 'revision-three-arrives': data['current'] = 3\n            state = table.get((state, event), state)\n            if state in ('revision-two-preview','revision-three-preview'): data['preview'] = data['current']\n            if state == 'revision-two-read': data['ack'] = 2\n            if state == 'revision-three-read': data['ack'] = 3\n            if state == 'withdrawn':\n                data['withdrawn'] = True\n                data['preview'] = None\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('revision-one-read / revision-two-arrives', solve('revision-one-read', [('revision-two-arrives', N)], N), 'revision-two-unread')\ncheck('revision-two-unread / open-revision', solve('revision-two-unread', [('open-revision', N)], N), 'revision-two-preview')\ncheck('revision-two-preview / ack-revision', solve('revision-two-preview', [('ack-revision', N)], N), 'revision-two-read')\ncheck('revision-two-preview / revision-three-arrives', solve('revision-two-preview', [('revision-three-arrives', N)], N), 'revision-three-pending-review')\ncheck('revision-three-pending-review / accept-update', solve('revision-three-pending-review', [('accept-update', N)], N), 'revision-three-preview')\ncheck('revision-three-preview / ack-revision', solve('revision-three-preview', [('ack-revision', N)], N), 'revision-three-read')\ncheck('revision-three-read / late-revision-two', solve('revision-three-read', [('late-revision-two', N)], N), 'revision-three-read')\ncheck('revision-three-pending-review / close-preview', solve('revision-three-pending-review', [('close-preview', N)], N), 'revision-three-unread')\ncheck('revision-three-unread / open-revision', solve('revision-three-unread', [('open-revision', N)], N), 'revision-three-preview')\ncheck('revision-two-unread / revision-withdrawn', solve('revision-two-unread', [('revision-withdrawn', N)], N), 'withdrawn')\ncheck('older notification incarnation', solve('revision-one-read', [('revision-two-arrives', N - 1)], N), 'revision-one-read')\ncheck('future notification incarnation', solve('revision-one-read', [('revision-two-arrives', N + 1)], N), 'revision-one-read')\ncheck('unknown event is inert', solve('revision-one-read', [('unknown-event', N)], N), 'revision-one-read')\ncheck('empty delivery batch', solve('revision-one-read', [], N), 'revision-one-read')\ncheck('N stale deliveries before current delivery', solve('revision-one-read', [('revision-two-arrives', N - 1)] * N + [('revision-two-arrives', N)], N), 'revision-two-unread')\ncheck('trace revision-two-arrives then open-revision', solve('revision-one-read', [('revision-two-arrives', N), ('open-revision', N)], N), 'revision-two-preview')\ncheck('trace revision-two-arrives then revision-withdrawn', solve('revision-one-read', [('revision-two-arrives', N), ('revision-withdrawn', N)], N), 'withdrawn')\ncheck('trace open-revision then ack-revision', solve('revision-two-unread', [('open-revision', N), ('ack-revision', N)], N), 'revision-two-read')\ncheck('trace open-revision then revision-three-arrives', solve('revision-two-unread', [('open-revision', N), ('revision-three-arrives', N)], N), 'revision-three-pending-review')\ncheck('trace revision-three-arrives then accept-update', solve('revision-two-preview', [('revision-three-arrives', N), ('accept-update', N)], N), 'revision-three-preview')\ncheck('trace revision-three-arrives then close-preview', solve('revision-two-preview', [('revision-three-arrives', N), ('close-preview', N)], N), 'revision-three-unread')\ncheck('trace accept-update then ack-revision', solve('revision-three-pending-review', [('accept-update', N), ('ack-revision', N)], N), 'revision-three-read')\ncheck('trace ack-revision then late-revision-two', solve('revision-three-preview', [('ack-revision', N), ('late-revision-two', N)], N), 'revision-three-read')\ncheck('trace late-revision-two then late-revision-two', solve('revision-three-read', [('late-revision-two', N), ('late-revision-two', N)], N), 'revision-three-read')\ncheck('trace close-preview then open-revision', solve('revision-three-pending-review', [('close-preview', N), ('open-revision', N)], N), 'revision-three-preview')\ncheck('trace open-revision then ack-revision', solve('revision-three-unread', [('open-revision', N), ('ack-revision', N)], N), 'revision-three-read')\ncheck('domain state regression 1: ack', solve('revision-two-preview', [('ack-revision', N, {'revision': 1})], N, {}, 'ack'), {'phase': 'revision-two-preview', 'value': 1})\ncheck('domain state regression 2: ack', solve('revision-two-preview', [('ack-revision', N, {'revision': 2})], N, {}, 'ack'), {'phase': 'revision-two-read', 'value': 2})\ncheck('domain state regression 3: preview', solve('revision-two-preview', [('revision-three-arrives', N, {})], N, {'preview': 2}, 'preview'), {'phase': 'revision-three-pending-review', 'value': 2})\ncheck('domain state regression 4: preview', solve('revision-three-pending-review', [('accept-update', N, {})], N, {'current': 3, 'preview': 2}, 'preview'), {'phase': 'revision-three-preview', 'value': 3})\ncheck('domain state regression 5: current', solve('revision-three-read', [('late-revision-two', N, {})], N, {'current': 3, 'ack': 3}, 'current'), {'phase': 'revision-three-read', 'value': 3})\ncheck('domain state regression 6: preview', solve('revision-two-unread', [('revision-withdrawn', N, {})], N, {'preview': 2}, 'preview'), {'phase': 'withdrawn', 'value': None})\ncheck('domain state regression 7: ack', solve('revision-two-preview', [('revision-three-arrives', N, {}), ('accept-update', N, {}), ('ack-revision', N, {'revision': 2}), ('ack-revision', N, {'revision': 3})], N, {}, 'ack'), {'phase': 'revision-three-read', 'value': 3})\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-revision-08","generated_at":"2026-09-29T14:42:37.120920+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 revision-three-pending-review / close-preview transition to revision-three-unread; preserve the other explicitly stipulated transitions.","root_cause":"Closing an interrupted preview acknowledges unseen replacement content.","sha256":"332148c8a22b36f44a819b9864bf5dd3e806adbd96d816d0f69bc22cd3e34b51","title":"Notification content revision review: close-preview from revision-three-pending-review · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.618,"exit_code":1,"observations":[{"actual":"revision-two-unread","check":"revision-one-read / revision-two-arrives","expected":"revision-two-unread","passed":true},{"actual":"revision-two-preview","check":"revision-two-unread / open-revision","expected":"revision-two-preview","passed":true},{"actual":"revision-two-read","check":"revision-two-preview / ack-revision","expected":"revision-two-read","passed":true},{"actual":"revision-three-pending-review","check":"revision-two-preview / revision-three-arrives","expected":"revision-three-pending-review","passed":true},{"actual":"revision-three-preview","check":"revision-three-pending-review / accept-update","expected":"revision-three-preview","passed":true},{"actual":"revision-three-read","check":"revision-three-preview / ack-revision","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"revision-three-read / late-revision-two","expected":"revision-three-read","passed":true},{"actual":"revision-two-read","check":"revision-three-pending-review / close-preview","expected":"revision-three-unread","passed":false},{"actual":"revision-three-preview","check":"revision-three-unread / open-revision","expected":"revision-three-preview","passed":true},{"actual":"withdrawn","check":"revision-two-unread / revision-withdrawn","expected":"withdrawn","passed":true},{"actual":"revision-one-read","check":"older notification incarnation","expected":"revision-one-read","passed":true},{"actual":"revision-one-read","check":"future notification incarnation","expected":"revision-one-read","passed":true},{"actual":"revision-one-read","check":"unknown event is inert","expected":"revision-one-read","passed":true},{"actual":"revision-one-read","check":"empty delivery batch","expected":"revision-one-read","passed":true},{"actual":"revision-two-unread","check":"N stale deliveries before current delivery","expected":"revision-two-unread","passed":true},{"actual":"revision-two-preview","check":"trace revision-two-arrives then open-revision","expected":"revision-two-preview","passed":true},{"actual":"withdrawn","check":"trace revision-two-arrives then revision-withdrawn","expected":"withdrawn","passed":true},{"actual":"revision-two-read","check":"trace open-revision then ack-revision","expected":"revision-two-read","passed":true},{"actual":"revision-three-pending-review","check":"trace open-revision then revision-three-arrives","expected":"revision-three-pending-review","passed":true},{"actual":"revision-three-preview","check":"trace revision-three-arrives then accept-update","expected":"revision-three-preview","passed":true},{"actual":"revision-two-read","check":"trace revision-three-arrives then close-preview","expected":"revision-three-unread","passed":false},{"actual":"revision-three-read","check":"trace accept-update then ack-revision","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"trace ack-revision then late-revision-two","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"trace late-revision-two then late-revision-two","expected":"revision-three-read","passed":true},{"actual":"revision-two-read","check":"trace close-preview then open-revision","expected":"revision-three-preview","passed":false},{"actual":"revision-three-read","check":"trace open-revision then ack-revision","expected":"revision-three-read","passed":true},{"actual":{"phase":"revision-two-preview","value":1},"check":"domain state regression 1: ack","expected":{"phase":"revision-two-preview","value":1},"passed":true},{"actual":{"phase":"revision-two-read","value":2},"check":"domain state regression 2: ack","expected":{"phase":"revision-two-read","value":2},"passed":true},{"actual":{"phase":"revision-three-pending-review","value":2},"check":"domain state regression 3: preview","expected":{"phase":"revision-three-pending-review","value":2},"passed":true},{"actual":{"phase":"revision-three-preview","value":3},"check":"domain state regression 4: preview","expected":{"phase":"revision-three-preview","value":3},"passed":true},{"actual":{"phase":"revision-three-read","value":3},"check":"domain state regression 5: current","expected":{"phase":"revision-three-read","value":3},"passed":true},{"actual":{"phase":"withdrawn","value":null},"check":"domain state regression 6: preview","expected":{"phase":"withdrawn","value":null},"passed":true},{"actual":{"phase":"revision-three-read","value":3},"check":"domain state regression 7: ack","expected":{"phase":"revision-three-read","value":3},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"revision-one-read / revision-two-arrives\", \"actual\": \"revision-two-unread\", \"expected\": \"revision-two-unread\", \"passed\": true}, {\"check\": \"revision-two-unread / open-revision\", \"actual\": \"revision-two-preview\", \"expected\": \"revision-two-preview\", \"passed\": true}, {\"check\": \"revision-two-preview / ack-revision\", \"actual\": \"revision-two-read\", \"expected\": \"revision-two-read\", \"passed\": true}, {\"check\": \"revision-two-preview / revision-three-arrives\", \"actual\": \"revision-three-pending-review\", \"expected\": \"revision-three-pending-review\", \"passed\": true}, {\"check\": \"revision-three-pending-review / accept-update\", \"actual\": \"revision-three-preview\", \"expected\": \"revision-three-preview\", \"passed\": true}, {\"check\": \"revision-three-preview / ack-revision\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"revision-three-read / late-revision-two\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"revision-three-pending-review / close-preview\", \"actual\": \"revision-two-read\", \"expected\": \"revision-three-unread\", \"passed\": false}, {\"check\": \"revision-three-unread / open-revision\", \"actual\": \"revision-three-preview\", \"expected\": \"revision-three-preview\", \"passed\": true}, {\"check\": \"revision-two-unread / revision-withdrawn\", \"actual\": \"withdrawn\", \"expected\": \"withdrawn\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"revision-two-unread\", \"expected\": \"revision-two-unread\", \"passed\": true}, {\"check\": \"trace revision-two-arrives then open-revision\", \"actual\": \"revision-two-preview\", \"expected\": \"revision-two-preview\", \"passed\": true}, {\"check\": \"trace revision-two-arrives then revision-withdrawn\", \"actual\": \"withdrawn\", \"expected\": \"withdrawn\", \"passed\": true}, {\"check\": \"trace open-revision then ack-revision\", \"actual\": \"revision-two-read\", \"expected\": \"revision-two-read\", \"passed\": true}, {\"check\": \"trace open-revision then revision-three-arrives\", \"actual\": \"revision-three-pending-review\", \"expected\": \"revision-three-pending-review\", \"passed\": true}, {\"check\": \"trace revision-three-arrives then accept-update\", \"actual\": \"revision-three-preview\", \"expected\": \"revision-three-preview\", \"passed\": true}, {\"check\": \"trace revision-three-arrives then close-preview\", \"actual\": \"revision-two-read\", \"expected\": \"revision-three-unread\", \"passed\": false}, {\"check\": \"trace accept-update then ack-revision\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"trace ack-revision then late-revision-two\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"trace late-revision-two then late-revision-two\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"trace close-preview then open-revision\", \"actual\": \"revision-two-read\", \"expected\": \"revision-three-preview\", \"passed\": false}, {\"check\": \"trace open-revision then ack-revision\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"domain state regression 1: ack\", \"actual\": {\"phase\": \"revision-two-preview\", \"value\": 1}, \"expected\": {\"phase\": \"revision-two-preview\", \"value\": 1}, \"passed\": true}, {\"check\": \"domain state regression 2: ack\", \"actual\": {\"phase\": \"revision-two-read\", \"value\": 2}, \"expected\": {\"phase\": \"revision-two-read\", \"value\": 2}, \"passed\": true}, {\"check\": \"domain state regression 3: preview\", \"actual\": {\"phase\": \"revision-three-pending-review\", \"value\": 2}, \"expected\": {\"phase\": \"revision-three-pending-review\", \"value\": 2}, \"passed\": true}, {\"check\": \"domain state regression 4: preview\", \"actual\": {\"phase\": \"revision-three-preview\", \"value\": 3}, \"expected\": {\"phase\": \"revision-three-preview\", \"value\": 3}, \"passed\": true}, {\"check\": \"domain state regression 5: current\", \"actual\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"expected\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"passed\": true}, {\"check\": \"domain state regression 6: preview\", \"actual\": {\"phase\": \"withdrawn\", \"value\": null}, \"expected\": {\"phase\": \"withdrawn\", \"value\": null}, \"passed\": true}, {\"check\": \"domain state regression 7: ack\", \"actual\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"expected\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.643,"exit_code":1,"observations":[{"actual":"revision-two-unread","check":"revision-one-read / revision-two-arrives","expected":"revision-two-unread","passed":true},{"actual":"revision-two-preview","check":"revision-two-unread / open-revision","expected":"revision-two-preview","passed":true},{"actual":"revision-two-read","check":"revision-two-preview / ack-revision","expected":"revision-two-read","passed":true},{"actual":"revision-three-pending-review","check":"revision-two-preview / revision-three-arrives","expected":"revision-three-pending-review","passed":true},{"actual":"revision-three-preview","check":"revision-three-pending-review / accept-update","expected":"revision-three-preview","passed":true},{"actual":"revision-three-read","check":"revision-three-preview / ack-revision","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"revision-three-read / late-revision-two","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"revision-three-pending-review / close-preview","expected":"revision-three-unread","passed":false},{"actual":"revision-three-preview","check":"revision-three-unread / open-revision","expected":"revision-three-preview","passed":true},{"actual":"withdrawn","check":"revision-two-unread / revision-withdrawn","expected":"withdrawn","passed":true},{"actual":"revision-one-read","check":"older notification incarnation","expected":"revision-one-read","passed":true},{"actual":"revision-one-read","check":"future notification incarnation","expected":"revision-one-read","passed":true},{"actual":"revision-one-read","check":"unknown event is inert","expected":"revision-one-read","passed":true},{"actual":"revision-one-read","check":"empty delivery batch","expected":"revision-one-read","passed":true},{"actual":"revision-two-unread","check":"N stale deliveries before current delivery","expected":"revision-two-unread","passed":true},{"actual":"revision-two-preview","check":"trace revision-two-arrives then open-revision","expected":"revision-two-preview","passed":true},{"actual":"withdrawn","check":"trace revision-two-arrives then revision-withdrawn","expected":"withdrawn","passed":true},{"actual":"revision-two-read","check":"trace open-revision then ack-revision","expected":"revision-two-read","passed":true},{"actual":"revision-three-pending-review","check":"trace open-revision then revision-three-arrives","expected":"revision-three-pending-review","passed":true},{"actual":"revision-three-preview","check":"trace revision-three-arrives then accept-update","expected":"revision-three-preview","passed":true},{"actual":"revision-three-read","check":"trace revision-three-arrives then close-preview","expected":"revision-three-unread","passed":false},{"actual":"revision-three-read","check":"trace accept-update then ack-revision","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"trace ack-revision then late-revision-two","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"trace late-revision-two then late-revision-two","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"trace close-preview then open-revision","expected":"revision-three-preview","passed":false},{"actual":"revision-three-read","check":"trace open-revision then ack-revision","expected":"revision-three-read","passed":true},{"actual":{"phase":"revision-two-preview","value":1},"check":"domain state regression 1: ack","expected":{"phase":"revision-two-preview","value":1},"passed":true},{"actual":{"phase":"revision-two-read","value":2},"check":"domain state regression 2: ack","expected":{"phase":"revision-two-read","value":2},"passed":true},{"actual":{"phase":"revision-three-pending-review","value":2},"check":"domain state regression 3: preview","expected":{"phase":"revision-three-pending-review","value":2},"passed":true},{"actual":{"phase":"revision-three-preview","value":3},"check":"domain state regression 4: preview","expected":{"phase":"revision-three-preview","value":3},"passed":true},{"actual":{"phase":"revision-three-read","value":3},"check":"domain state regression 5: current","expected":{"phase":"revision-three-read","value":3},"passed":true},{"actual":{"phase":"withdrawn","value":null},"check":"domain state regression 6: preview","expected":{"phase":"withdrawn","value":null},"passed":true},{"actual":{"phase":"revision-three-read","value":3},"check":"domain state regression 7: ack","expected":{"phase":"revision-three-read","value":3},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"revision-one-read / revision-two-arrives\", \"actual\": \"revision-two-unread\", \"expected\": \"revision-two-unread\", \"passed\": true}, {\"check\": \"revision-two-unread / open-revision\", \"actual\": \"revision-two-preview\", \"expected\": \"revision-two-preview\", \"passed\": true}, {\"check\": \"revision-two-preview / ack-revision\", \"actual\": \"revision-two-read\", \"expected\": \"revision-two-read\", \"passed\": true}, {\"check\": \"revision-two-preview / revision-three-arrives\", \"actual\": \"revision-three-pending-review\", \"expected\": \"revision-three-pending-review\", \"passed\": true}, {\"check\": \"revision-three-pending-review / accept-update\", \"actual\": \"revision-three-preview\", \"expected\": \"revision-three-preview\", \"passed\": true}, {\"check\": \"revision-three-preview / ack-revision\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"revision-three-read / late-revision-two\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"revision-three-pending-review / close-preview\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-unread\", \"passed\": false}, {\"check\": \"revision-three-unread / open-revision\", \"actual\": \"revision-three-preview\", \"expected\": \"revision-three-preview\", \"passed\": true}, {\"check\": \"revision-two-unread / revision-withdrawn\", \"actual\": \"withdrawn\", \"expected\": \"withdrawn\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"revision-two-unread\", \"expected\": \"revision-two-unread\", \"passed\": true}, {\"check\": \"trace revision-two-arrives then open-revision\", \"actual\": \"revision-two-preview\", \"expected\": \"revision-two-preview\", \"passed\": true}, {\"check\": \"trace revision-two-arrives then revision-withdrawn\", \"actual\": \"withdrawn\", \"expected\": \"withdrawn\", \"passed\": true}, {\"check\": \"trace open-revision then ack-revision\", \"actual\": \"revision-two-read\", \"expected\": \"revision-two-read\", \"passed\": true}, {\"check\": \"trace open-revision then revision-three-arrives\", \"actual\": \"revision-three-pending-review\", \"expected\": \"revision-three-pending-review\", \"passed\": true}, {\"check\": \"trace revision-three-arrives then accept-update\", \"actual\": \"revision-three-preview\", \"expected\": \"revision-three-preview\", \"passed\": true}, {\"check\": \"trace revision-three-arrives then close-preview\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-unread\", \"passed\": false}, {\"check\": \"trace accept-update then ack-revision\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"trace ack-revision then late-revision-two\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"trace late-revision-two then late-revision-two\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"trace close-preview then open-revision\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-preview\", \"passed\": false}, {\"check\": \"trace open-revision then ack-revision\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"domain state regression 1: ack\", \"actual\": {\"phase\": \"revision-two-preview\", \"value\": 1}, \"expected\": {\"phase\": \"revision-two-preview\", \"value\": 1}, \"passed\": true}, {\"check\": \"domain state regression 2: ack\", \"actual\": {\"phase\": \"revision-two-read\", \"value\": 2}, \"expected\": {\"phase\": \"revision-two-read\", \"value\": 2}, \"passed\": true}, {\"check\": \"domain state regression 3: preview\", \"actual\": {\"phase\": \"revision-three-pending-review\", \"value\": 2}, \"expected\": {\"phase\": \"revision-three-pending-review\", \"value\": 2}, \"passed\": true}, {\"check\": \"domain state regression 4: preview\", \"actual\": {\"phase\": \"revision-three-preview\", \"value\": 3}, \"expected\": {\"phase\": \"revision-three-preview\", \"value\": 3}, \"passed\": true}, {\"check\": \"domain state regression 5: current\", \"actual\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"expected\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"passed\": true}, {\"check\": \"domain state regression 6: preview\", \"actual\": {\"phase\": \"withdrawn\", \"value\": null}, \"expected\": {\"phase\": \"withdrawn\", \"value\": null}, \"passed\": true}, {\"check\": \"domain state regression 7: ack\", \"actual\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"expected\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.328,"exit_code":0,"observations":[{"actual":"revision-two-unread","check":"revision-one-read / revision-two-arrives","expected":"revision-two-unread","passed":true},{"actual":"revision-two-preview","check":"revision-two-unread / open-revision","expected":"revision-two-preview","passed":true},{"actual":"revision-two-read","check":"revision-two-preview / ack-revision","expected":"revision-two-read","passed":true},{"actual":"revision-three-pending-review","check":"revision-two-preview / revision-three-arrives","expected":"revision-three-pending-review","passed":true},{"actual":"revision-three-preview","check":"revision-three-pending-review / accept-update","expected":"revision-three-preview","passed":true},{"actual":"revision-three-read","check":"revision-three-preview / ack-revision","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"revision-three-read / late-revision-two","expected":"revision-three-read","passed":true},{"actual":"revision-three-unread","check":"revision-three-pending-review / close-preview","expected":"revision-three-unread","passed":true},{"actual":"revision-three-preview","check":"revision-three-unread / open-revision","expected":"revision-three-preview","passed":true},{"actual":"withdrawn","check":"revision-two-unread / revision-withdrawn","expected":"withdrawn","passed":true},{"actual":"revision-one-read","check":"older notification incarnation","expected":"revision-one-read","passed":true},{"actual":"revision-one-read","check":"future notification incarnation","expected":"revision-one-read","passed":true},{"actual":"revision-one-read","check":"unknown event is inert","expected":"revision-one-read","passed":true},{"actual":"revision-one-read","check":"empty delivery batch","expected":"revision-one-read","passed":true},{"actual":"revision-two-unread","check":"N stale deliveries before current delivery","expected":"revision-two-unread","passed":true},{"actual":"revision-two-preview","check":"trace revision-two-arrives then open-revision","expected":"revision-two-preview","passed":true},{"actual":"withdrawn","check":"trace revision-two-arrives then revision-withdrawn","expected":"withdrawn","passed":true},{"actual":"revision-two-read","check":"trace open-revision then ack-revision","expected":"revision-two-read","passed":true},{"actual":"revision-three-pending-review","check":"trace open-revision then revision-three-arrives","expected":"revision-three-pending-review","passed":true},{"actual":"revision-three-preview","check":"trace revision-three-arrives then accept-update","expected":"revision-three-preview","passed":true},{"actual":"revision-three-unread","check":"trace revision-three-arrives then close-preview","expected":"revision-three-unread","passed":true},{"actual":"revision-three-read","check":"trace accept-update then ack-revision","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"trace ack-revision then late-revision-two","expected":"revision-three-read","passed":true},{"actual":"revision-three-read","check":"trace late-revision-two then late-revision-two","expected":"revision-three-read","passed":true},{"actual":"revision-three-preview","check":"trace close-preview then open-revision","expected":"revision-three-preview","passed":true},{"actual":"revision-three-read","check":"trace open-revision then ack-revision","expected":"revision-three-read","passed":true},{"actual":{"phase":"revision-two-preview","value":1},"check":"domain state regression 1: ack","expected":{"phase":"revision-two-preview","value":1},"passed":true},{"actual":{"phase":"revision-two-read","value":2},"check":"domain state regression 2: ack","expected":{"phase":"revision-two-read","value":2},"passed":true},{"actual":{"phase":"revision-three-pending-review","value":2},"check":"domain state regression 3: preview","expected":{"phase":"revision-three-pending-review","value":2},"passed":true},{"actual":{"phase":"revision-three-preview","value":3},"check":"domain state regression 4: preview","expected":{"phase":"revision-three-preview","value":3},"passed":true},{"actual":{"phase":"revision-three-read","value":3},"check":"domain state regression 5: current","expected":{"phase":"revision-three-read","value":3},"passed":true},{"actual":{"phase":"withdrawn","value":null},"check":"domain state regression 6: preview","expected":{"phase":"withdrawn","value":null},"passed":true},{"actual":{"phase":"revision-three-read","value":3},"check":"domain state regression 7: ack","expected":{"phase":"revision-three-read","value":3},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"revision-one-read / revision-two-arrives\", \"actual\": \"revision-two-unread\", \"expected\": \"revision-two-unread\", \"passed\": true}, {\"check\": \"revision-two-unread / open-revision\", \"actual\": \"revision-two-preview\", \"expected\": \"revision-two-preview\", \"passed\": true}, {\"check\": \"revision-two-preview / ack-revision\", \"actual\": \"revision-two-read\", \"expected\": \"revision-two-read\", \"passed\": true}, {\"check\": \"revision-two-preview / revision-three-arrives\", \"actual\": \"revision-three-pending-review\", \"expected\": \"revision-three-pending-review\", \"passed\": true}, {\"check\": \"revision-three-pending-review / accept-update\", \"actual\": \"revision-three-preview\", \"expected\": \"revision-three-preview\", \"passed\": true}, {\"check\": \"revision-three-preview / ack-revision\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"revision-three-read / late-revision-two\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"revision-three-pending-review / close-preview\", \"actual\": \"revision-three-unread\", \"expected\": \"revision-three-unread\", \"passed\": true}, {\"check\": \"revision-three-unread / open-revision\", \"actual\": \"revision-three-preview\", \"expected\": \"revision-three-preview\", \"passed\": true}, {\"check\": \"revision-two-unread / revision-withdrawn\", \"actual\": \"withdrawn\", \"expected\": \"withdrawn\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"revision-one-read\", \"expected\": \"revision-one-read\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"revision-two-unread\", \"expected\": \"revision-two-unread\", \"passed\": true}, {\"check\": \"trace revision-two-arrives then open-revision\", \"actual\": \"revision-two-preview\", \"expected\": \"revision-two-preview\", \"passed\": true}, {\"check\": \"trace revision-two-arrives then revision-withdrawn\", \"actual\": \"withdrawn\", \"expected\": \"withdrawn\", \"passed\": true}, {\"check\": \"trace open-revision then ack-revision\", \"actual\": \"revision-two-read\", \"expected\": \"revision-two-read\", \"passed\": true}, {\"check\": \"trace open-revision then revision-three-arrives\", \"actual\": \"revision-three-pending-review\", \"expected\": \"revision-three-pending-review\", \"passed\": true}, {\"check\": \"trace revision-three-arrives then accept-update\", \"actual\": \"revision-three-preview\", \"expected\": \"revision-three-preview\", \"passed\": true}, {\"check\": \"trace revision-three-arrives then close-preview\", \"actual\": \"revision-three-unread\", \"expected\": \"revision-three-unread\", \"passed\": true}, {\"check\": \"trace accept-update then ack-revision\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"trace ack-revision then late-revision-two\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"trace late-revision-two then late-revision-two\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"trace close-preview then open-revision\", \"actual\": \"revision-three-preview\", \"expected\": \"revision-three-preview\", \"passed\": true}, {\"check\": \"trace open-revision then ack-revision\", \"actual\": \"revision-three-read\", \"expected\": \"revision-three-read\", \"passed\": true}, {\"check\": \"domain state regression 1: ack\", \"actual\": {\"phase\": \"revision-two-preview\", \"value\": 1}, \"expected\": {\"phase\": \"revision-two-preview\", \"value\": 1}, \"passed\": true}, {\"check\": \"domain state regression 2: ack\", \"actual\": {\"phase\": \"revision-two-read\", \"value\": 2}, \"expected\": {\"phase\": \"revision-two-read\", \"value\": 2}, \"passed\": true}, {\"check\": \"domain state regression 3: preview\", \"actual\": {\"phase\": \"revision-three-pending-review\", \"value\": 2}, \"expected\": {\"phase\": \"revision-three-pending-review\", \"value\": 2}, \"passed\": true}, {\"check\": \"domain state regression 4: preview\", \"actual\": {\"phase\": \"revision-three-preview\", \"value\": 3}, \"expected\": {\"phase\": \"revision-three-preview\", \"value\": 3}, \"passed\": true}, {\"check\": \"domain state regression 5: current\", \"actual\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"expected\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"passed\": true}, {\"check\": \"domain state regression 6: preview\", \"actual\": {\"phase\": \"withdrawn\", \"value\": null}, \"expected\": {\"phase\": \"withdrawn\", \"value\": null}, \"passed\": true}, {\"check\": \"domain state regression 7: ack\", \"actual\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"expected\": {\"phase\": \"revision-three-read\", \"value\": 3}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}