{"abstract":"The switch-back-to-a event leaves a notification in account-a-visible instead of scrubbing-for-a.","category":"Notification interfaces","checks":38,"contract":"Notification surface account switch is a bounded visual-notification workflow with mutable policy state {'owner': 'a', 'rows': ['a-notice'], 'target': 'b', 'scrubbed': False}. Its default transition relation is {('account-a-visible', 'switch-to-b'): 'scrubbing-a', ('scrubbing-a', 'scrub-complete'): 'account-b-loading', ('account-b-loading', 'b-inbox-loaded'): 'account-b-visible', ('account-b-loading', 'b-inbox-failed'): 'switch-error', ('account-b-loading', 'late-a-response'): 'account-b-loading', ('switch-error', 'retry-b-load'): 'account-b-loading', ('account-b-visible', 'sign-out'): 'scrubbing-b', ('scrubbing-b', 'scrub-complete'): 'signed-out', ('signed-out', 'late-b-response'): 'signed-out', ('scrubbing-a', 'switch-back-to-a'): 'scrubbing-for-a'}; 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-account-switch","failed_approach":"Continuing to B ignores the user's latest account choice.","family":"s3-notification-interfaces-account-switch-10","id":"FA-34786","implementations":{"attempt":{"sha256":"c4a4e7ccfaaeb1788b74e07396df506f82bc0ff4f95530ba0ac2445376656ac4","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 = {('account-a-visible', 'switch-to-b'): 'scrubbing-a', ('scrubbing-a', 'scrub-complete'): 'account-b-loading', ('account-b-loading', 'b-inbox-loaded'): 'account-b-visible', ('account-b-loading', 'b-inbox-failed'): 'switch-error', ('account-b-loading', 'late-a-response'): 'account-b-loading', ('switch-error', 'retry-b-load'): 'account-b-loading', ('account-b-visible', 'sign-out'): 'scrubbing-b', ('scrubbing-b', 'scrub-complete'): 'signed-out', ('signed-out', 'late-b-response'): 'signed-out', ('scrubbing-a', 'switch-back-to-a'): 'account-b-loading'}\n    data = json.loads(json.dumps({'owner': 'a', 'rows': ['a-notice'], 'target': 'b', 'scrubbed': False})) if payload is None else {**json.loads(json.dumps({'owner': 'a', 'rows': ['a-notice'], 'target': 'b', 'scrubbed': 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 == 'b-inbox-loaded' and arg.get('owner',data['target']) != data['target']: event = 'unknown-event'\n            if event == 'b-inbox-loaded' and not data['scrubbed'] and arg.get('require_scrub',False): event = 'unknown-event'\n            if event == 'switch-back-to-a': data['target'] = 'a'\n            state = table.get((state, event), state)\n            if state.startswith('scrubbing'):\n                data['rows'] = []\n                data['scrubbed'] = False\n            if event == 'scrub-complete': data['scrubbed'] = True\n            if state == 'account-b-visible':\n                data['owner'] = 'b'\n                data['rows'] = arg.get('rows',['b-notice'])[:]\n            if state == 'signed-out':\n                data['owner'] = None\n                data['rows'] = []\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('account-a-visible / switch-to-b', solve('account-a-visible', [('switch-to-b', N)], N), 'scrubbing-a')\ncheck('scrubbing-a / scrub-complete', solve('scrubbing-a', [('scrub-complete', N)], N), 'account-b-loading')\ncheck('account-b-loading / b-inbox-loaded', solve('account-b-loading', [('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('account-b-loading / b-inbox-failed', solve('account-b-loading', [('b-inbox-failed', N)], N), 'switch-error')\ncheck('account-b-loading / late-a-response', solve('account-b-loading', [('late-a-response', N)], N), 'account-b-loading')\ncheck('switch-error / retry-b-load', solve('switch-error', [('retry-b-load', N)], N), 'account-b-loading')\ncheck('account-b-visible / sign-out', solve('account-b-visible', [('sign-out', N)], N), 'scrubbing-b')\ncheck('scrubbing-b / scrub-complete', solve('scrubbing-b', [('scrub-complete', N)], N), 'signed-out')\ncheck('signed-out / late-b-response', solve('signed-out', [('late-b-response', N)], N), 'signed-out')\ncheck('scrubbing-a / switch-back-to-a', solve('scrubbing-a', [('switch-back-to-a', N)], N), 'scrubbing-for-a')\ncheck('older notification incarnation', solve('account-a-visible', [('switch-to-b', N - 1)], N), 'account-a-visible')\ncheck('future notification incarnation', solve('account-a-visible', [('switch-to-b', N + 1)], N), 'account-a-visible')\ncheck('unknown event is inert', solve('account-a-visible', [('unknown-event', N)], N), 'account-a-visible')\ncheck('empty delivery batch', solve('account-a-visible', [], N), 'account-a-visible')\ncheck('N stale deliveries before current delivery', solve('account-a-visible', [('switch-to-b', N - 1)] * N + [('switch-to-b', N)], N), 'scrubbing-a')\ncheck('trace switch-to-b then scrub-complete', solve('account-a-visible', [('switch-to-b', N), ('scrub-complete', N)], N), 'account-b-loading')\ncheck('trace switch-to-b then switch-back-to-a', solve('account-a-visible', [('switch-to-b', N), ('switch-back-to-a', N)], N), 'scrubbing-for-a')\ncheck('trace scrub-complete then b-inbox-loaded', solve('scrubbing-a', [('scrub-complete', N), ('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('trace scrub-complete then b-inbox-failed', solve('scrubbing-a', [('scrub-complete', N), ('b-inbox-failed', N)], N), 'switch-error')\ncheck('trace scrub-complete then late-a-response', solve('scrubbing-a', [('scrub-complete', N), ('late-a-response', N)], N), 'account-b-loading')\ncheck('trace b-inbox-loaded then sign-out', solve('account-b-loading', [('b-inbox-loaded', N), ('sign-out', N)], N), 'scrubbing-b')\ncheck('trace b-inbox-failed then retry-b-load', solve('account-b-loading', [('b-inbox-failed', N), ('retry-b-load', N)], N), 'account-b-loading')\ncheck('trace late-a-response then b-inbox-loaded', solve('account-b-loading', [('late-a-response', N), ('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('trace late-a-response then b-inbox-failed', solve('account-b-loading', [('late-a-response', N), ('b-inbox-failed', N)], N), 'switch-error')\ncheck('trace late-a-response then late-a-response', solve('account-b-loading', [('late-a-response', N), ('late-a-response', N)], N), 'account-b-loading')\ncheck('trace retry-b-load then b-inbox-loaded', solve('switch-error', [('retry-b-load', N), ('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('trace retry-b-load then b-inbox-failed', solve('switch-error', [('retry-b-load', N), ('b-inbox-failed', N)], N), 'switch-error')\ncheck('trace retry-b-load then late-a-response', solve('switch-error', [('retry-b-load', N), ('late-a-response', N)], N), 'account-b-loading')\ncheck('trace sign-out then scrub-complete', solve('account-b-visible', [('sign-out', N), ('scrub-complete', N)], N), 'signed-out')\ncheck('trace scrub-complete then late-b-response', solve('scrubbing-b', [('scrub-complete', N), ('late-b-response', N)], N), 'signed-out')\ncheck('trace late-b-response then late-b-response', solve('signed-out', [('late-b-response', N), ('late-b-response', N)], N), 'signed-out')\ncheck('domain state regression 1: rows', solve('account-a-visible', [('switch-to-b', N, {})], N, {}, 'rows'), {'phase': 'scrubbing-a', 'value': []})\ncheck('domain state regression 2: rows', solve('account-b-loading', [('b-inbox-loaded', N, {'owner': 'a'})], N, {}, 'rows'), {'phase': 'account-b-loading', 'value': ['a-notice']})\ncheck('domain state regression 3: owner', solve('account-b-loading', [('b-inbox-loaded', N, {'require_scrub': True})], N, {}, 'owner'), {'phase': 'account-b-loading', 'value': 'a'})\ncheck('domain state regression 4: rows', solve('account-b-loading', [('b-inbox-loaded', N, {'require_scrub': True})], N, {'scrubbed': True, 'rows': []}, 'rows'), {'phase': 'account-b-visible', 'value': ['b-notice']})\ncheck('domain state regression 5: owner', solve('scrubbing-b', [('scrub-complete', N, {})], N, {'owner': 'b'}, 'owner'), {'phase': 'signed-out', 'value': None})\ncheck('domain state regression 6: target', solve('scrubbing-a', [('switch-back-to-a', N, {})], N, {}, 'target'), {'phase': 'scrubbing-for-a', 'value': 'a'})\ncheck('domain state regression 7: rows', solve('account-a-visible', [('switch-to-b', N, {}), ('scrub-complete', N, {}), ('b-inbox-loaded', N, {'require_scrub': True, 'rows': ['b']}), ('sign-out', N, {}), ('scrub-complete', N, {}), ('late-b-response', N, {})], N, {}, 'rows'), {'phase': 'signed-out', 'value': []})\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":"2f43ef6509eba2c0248dea29588865f33a82d6e32a0e3039fcc7f431b13b8684","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 = {('account-a-visible', 'switch-to-b'): 'scrubbing-a', ('scrubbing-a', 'scrub-complete'): 'account-b-loading', ('account-b-loading', 'b-inbox-loaded'): 'account-b-visible', ('account-b-loading', 'b-inbox-failed'): 'switch-error', ('account-b-loading', 'late-a-response'): 'account-b-loading', ('switch-error', 'retry-b-load'): 'account-b-loading', ('account-b-visible', 'sign-out'): 'scrubbing-b', ('scrubbing-b', 'scrub-complete'): 'signed-out', ('signed-out', 'late-b-response'): 'signed-out', ('scrubbing-a', 'switch-back-to-a'): 'account-a-visible'}\n    data = json.loads(json.dumps({'owner': 'a', 'rows': ['a-notice'], 'target': 'b', 'scrubbed': False})) if payload is None else {**json.loads(json.dumps({'owner': 'a', 'rows': ['a-notice'], 'target': 'b', 'scrubbed': 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 == 'b-inbox-loaded' and arg.get('owner',data['target']) != data['target']: event = 'unknown-event'\n            if event == 'b-inbox-loaded' and not data['scrubbed'] and arg.get('require_scrub',False): event = 'unknown-event'\n            if event == 'switch-back-to-a': data['target'] = 'a'\n            state = table.get((state, event), state)\n            if state.startswith('scrubbing'):\n                data['rows'] = []\n                data['scrubbed'] = False\n            if event == 'scrub-complete': data['scrubbed'] = True\n            if state == 'account-b-visible':\n                data['owner'] = 'b'\n                data['rows'] = arg.get('rows',['b-notice'])[:]\n            if state == 'signed-out':\n                data['owner'] = None\n                data['rows'] = []\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('account-a-visible / switch-to-b', solve('account-a-visible', [('switch-to-b', N)], N), 'scrubbing-a')\ncheck('scrubbing-a / scrub-complete', solve('scrubbing-a', [('scrub-complete', N)], N), 'account-b-loading')\ncheck('account-b-loading / b-inbox-loaded', solve('account-b-loading', [('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('account-b-loading / b-inbox-failed', solve('account-b-loading', [('b-inbox-failed', N)], N), 'switch-error')\ncheck('account-b-loading / late-a-response', solve('account-b-loading', [('late-a-response', N)], N), 'account-b-loading')\ncheck('switch-error / retry-b-load', solve('switch-error', [('retry-b-load', N)], N), 'account-b-loading')\ncheck('account-b-visible / sign-out', solve('account-b-visible', [('sign-out', N)], N), 'scrubbing-b')\ncheck('scrubbing-b / scrub-complete', solve('scrubbing-b', [('scrub-complete', N)], N), 'signed-out')\ncheck('signed-out / late-b-response', solve('signed-out', [('late-b-response', N)], N), 'signed-out')\ncheck('scrubbing-a / switch-back-to-a', solve('scrubbing-a', [('switch-back-to-a', N)], N), 'scrubbing-for-a')\ncheck('older notification incarnation', solve('account-a-visible', [('switch-to-b', N - 1)], N), 'account-a-visible')\ncheck('future notification incarnation', solve('account-a-visible', [('switch-to-b', N + 1)], N), 'account-a-visible')\ncheck('unknown event is inert', solve('account-a-visible', [('unknown-event', N)], N), 'account-a-visible')\ncheck('empty delivery batch', solve('account-a-visible', [], N), 'account-a-visible')\ncheck('N stale deliveries before current delivery', solve('account-a-visible', [('switch-to-b', N - 1)] * N + [('switch-to-b', N)], N), 'scrubbing-a')\ncheck('trace switch-to-b then scrub-complete', solve('account-a-visible', [('switch-to-b', N), ('scrub-complete', N)], N), 'account-b-loading')\ncheck('trace switch-to-b then switch-back-to-a', solve('account-a-visible', [('switch-to-b', N), ('switch-back-to-a', N)], N), 'scrubbing-for-a')\ncheck('trace scrub-complete then b-inbox-loaded', solve('scrubbing-a', [('scrub-complete', N), ('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('trace scrub-complete then b-inbox-failed', solve('scrubbing-a', [('scrub-complete', N), ('b-inbox-failed', N)], N), 'switch-error')\ncheck('trace scrub-complete then late-a-response', solve('scrubbing-a', [('scrub-complete', N), ('late-a-response', N)], N), 'account-b-loading')\ncheck('trace b-inbox-loaded then sign-out', solve('account-b-loading', [('b-inbox-loaded', N), ('sign-out', N)], N), 'scrubbing-b')\ncheck('trace b-inbox-failed then retry-b-load', solve('account-b-loading', [('b-inbox-failed', N), ('retry-b-load', N)], N), 'account-b-loading')\ncheck('trace late-a-response then b-inbox-loaded', solve('account-b-loading', [('late-a-response', N), ('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('trace late-a-response then b-inbox-failed', solve('account-b-loading', [('late-a-response', N), ('b-inbox-failed', N)], N), 'switch-error')\ncheck('trace late-a-response then late-a-response', solve('account-b-loading', [('late-a-response', N), ('late-a-response', N)], N), 'account-b-loading')\ncheck('trace retry-b-load then b-inbox-loaded', solve('switch-error', [('retry-b-load', N), ('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('trace retry-b-load then b-inbox-failed', solve('switch-error', [('retry-b-load', N), ('b-inbox-failed', N)], N), 'switch-error')\ncheck('trace retry-b-load then late-a-response', solve('switch-error', [('retry-b-load', N), ('late-a-response', N)], N), 'account-b-loading')\ncheck('trace sign-out then scrub-complete', solve('account-b-visible', [('sign-out', N), ('scrub-complete', N)], N), 'signed-out')\ncheck('trace scrub-complete then late-b-response', solve('scrubbing-b', [('scrub-complete', N), ('late-b-response', N)], N), 'signed-out')\ncheck('trace late-b-response then late-b-response', solve('signed-out', [('late-b-response', N), ('late-b-response', N)], N), 'signed-out')\ncheck('domain state regression 1: rows', solve('account-a-visible', [('switch-to-b', N, {})], N, {}, 'rows'), {'phase': 'scrubbing-a', 'value': []})\ncheck('domain state regression 2: rows', solve('account-b-loading', [('b-inbox-loaded', N, {'owner': 'a'})], N, {}, 'rows'), {'phase': 'account-b-loading', 'value': ['a-notice']})\ncheck('domain state regression 3: owner', solve('account-b-loading', [('b-inbox-loaded', N, {'require_scrub': True})], N, {}, 'owner'), {'phase': 'account-b-loading', 'value': 'a'})\ncheck('domain state regression 4: rows', solve('account-b-loading', [('b-inbox-loaded', N, {'require_scrub': True})], N, {'scrubbed': True, 'rows': []}, 'rows'), {'phase': 'account-b-visible', 'value': ['b-notice']})\ncheck('domain state regression 5: owner', solve('scrubbing-b', [('scrub-complete', N, {})], N, {'owner': 'b'}, 'owner'), {'phase': 'signed-out', 'value': None})\ncheck('domain state regression 6: target', solve('scrubbing-a', [('switch-back-to-a', N, {})], N, {}, 'target'), {'phase': 'scrubbing-for-a', 'value': 'a'})\ncheck('domain state regression 7: rows', solve('account-a-visible', [('switch-to-b', N, {}), ('scrub-complete', N, {}), ('b-inbox-loaded', N, {'require_scrub': True, 'rows': ['b']}), ('sign-out', N, {}), ('scrub-complete', N, {}), ('late-b-response', N, {})], N, {}, 'rows'), {'phase': 'signed-out', 'value': []})\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":"2e205b9b96477c5261258640f8547121fbd0a0d65de12d28dd69bd8c6b7d281c","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 = {('account-a-visible', 'switch-to-b'): 'scrubbing-a', ('scrubbing-a', 'scrub-complete'): 'account-b-loading', ('account-b-loading', 'b-inbox-loaded'): 'account-b-visible', ('account-b-loading', 'b-inbox-failed'): 'switch-error', ('account-b-loading', 'late-a-response'): 'account-b-loading', ('switch-error', 'retry-b-load'): 'account-b-loading', ('account-b-visible', 'sign-out'): 'scrubbing-b', ('scrubbing-b', 'scrub-complete'): 'signed-out', ('signed-out', 'late-b-response'): 'signed-out', ('scrubbing-a', 'switch-back-to-a'): 'scrubbing-for-a'}\n    data = json.loads(json.dumps({'owner': 'a', 'rows': ['a-notice'], 'target': 'b', 'scrubbed': False})) if payload is None else {**json.loads(json.dumps({'owner': 'a', 'rows': ['a-notice'], 'target': 'b', 'scrubbed': 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 == 'b-inbox-loaded' and arg.get('owner',data['target']) != data['target']: event = 'unknown-event'\n            if event == 'b-inbox-loaded' and not data['scrubbed'] and arg.get('require_scrub',False): event = 'unknown-event'\n            if event == 'switch-back-to-a': data['target'] = 'a'\n            state = table.get((state, event), state)\n            if state.startswith('scrubbing'):\n                data['rows'] = []\n                data['scrubbed'] = False\n            if event == 'scrub-complete': data['scrubbed'] = True\n            if state == 'account-b-visible':\n                data['owner'] = 'b'\n                data['rows'] = arg.get('rows',['b-notice'])[:]\n            if state == 'signed-out':\n                data['owner'] = None\n                data['rows'] = []\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('account-a-visible / switch-to-b', solve('account-a-visible', [('switch-to-b', N)], N), 'scrubbing-a')\ncheck('scrubbing-a / scrub-complete', solve('scrubbing-a', [('scrub-complete', N)], N), 'account-b-loading')\ncheck('account-b-loading / b-inbox-loaded', solve('account-b-loading', [('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('account-b-loading / b-inbox-failed', solve('account-b-loading', [('b-inbox-failed', N)], N), 'switch-error')\ncheck('account-b-loading / late-a-response', solve('account-b-loading', [('late-a-response', N)], N), 'account-b-loading')\ncheck('switch-error / retry-b-load', solve('switch-error', [('retry-b-load', N)], N), 'account-b-loading')\ncheck('account-b-visible / sign-out', solve('account-b-visible', [('sign-out', N)], N), 'scrubbing-b')\ncheck('scrubbing-b / scrub-complete', solve('scrubbing-b', [('scrub-complete', N)], N), 'signed-out')\ncheck('signed-out / late-b-response', solve('signed-out', [('late-b-response', N)], N), 'signed-out')\ncheck('scrubbing-a / switch-back-to-a', solve('scrubbing-a', [('switch-back-to-a', N)], N), 'scrubbing-for-a')\ncheck('older notification incarnation', solve('account-a-visible', [('switch-to-b', N - 1)], N), 'account-a-visible')\ncheck('future notification incarnation', solve('account-a-visible', [('switch-to-b', N + 1)], N), 'account-a-visible')\ncheck('unknown event is inert', solve('account-a-visible', [('unknown-event', N)], N), 'account-a-visible')\ncheck('empty delivery batch', solve('account-a-visible', [], N), 'account-a-visible')\ncheck('N stale deliveries before current delivery', solve('account-a-visible', [('switch-to-b', N - 1)] * N + [('switch-to-b', N)], N), 'scrubbing-a')\ncheck('trace switch-to-b then scrub-complete', solve('account-a-visible', [('switch-to-b', N), ('scrub-complete', N)], N), 'account-b-loading')\ncheck('trace switch-to-b then switch-back-to-a', solve('account-a-visible', [('switch-to-b', N), ('switch-back-to-a', N)], N), 'scrubbing-for-a')\ncheck('trace scrub-complete then b-inbox-loaded', solve('scrubbing-a', [('scrub-complete', N), ('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('trace scrub-complete then b-inbox-failed', solve('scrubbing-a', [('scrub-complete', N), ('b-inbox-failed', N)], N), 'switch-error')\ncheck('trace scrub-complete then late-a-response', solve('scrubbing-a', [('scrub-complete', N), ('late-a-response', N)], N), 'account-b-loading')\ncheck('trace b-inbox-loaded then sign-out', solve('account-b-loading', [('b-inbox-loaded', N), ('sign-out', N)], N), 'scrubbing-b')\ncheck('trace b-inbox-failed then retry-b-load', solve('account-b-loading', [('b-inbox-failed', N), ('retry-b-load', N)], N), 'account-b-loading')\ncheck('trace late-a-response then b-inbox-loaded', solve('account-b-loading', [('late-a-response', N), ('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('trace late-a-response then b-inbox-failed', solve('account-b-loading', [('late-a-response', N), ('b-inbox-failed', N)], N), 'switch-error')\ncheck('trace late-a-response then late-a-response', solve('account-b-loading', [('late-a-response', N), ('late-a-response', N)], N), 'account-b-loading')\ncheck('trace retry-b-load then b-inbox-loaded', solve('switch-error', [('retry-b-load', N), ('b-inbox-loaded', N)], N), 'account-b-visible')\ncheck('trace retry-b-load then b-inbox-failed', solve('switch-error', [('retry-b-load', N), ('b-inbox-failed', N)], N), 'switch-error')\ncheck('trace retry-b-load then late-a-response', solve('switch-error', [('retry-b-load', N), ('late-a-response', N)], N), 'account-b-loading')\ncheck('trace sign-out then scrub-complete', solve('account-b-visible', [('sign-out', N), ('scrub-complete', N)], N), 'signed-out')\ncheck('trace scrub-complete then late-b-response', solve('scrubbing-b', [('scrub-complete', N), ('late-b-response', N)], N), 'signed-out')\ncheck('trace late-b-response then late-b-response', solve('signed-out', [('late-b-response', N), ('late-b-response', N)], N), 'signed-out')\ncheck('domain state regression 1: rows', solve('account-a-visible', [('switch-to-b', N, {})], N, {}, 'rows'), {'phase': 'scrubbing-a', 'value': []})\ncheck('domain state regression 2: rows', solve('account-b-loading', [('b-inbox-loaded', N, {'owner': 'a'})], N, {}, 'rows'), {'phase': 'account-b-loading', 'value': ['a-notice']})\ncheck('domain state regression 3: owner', solve('account-b-loading', [('b-inbox-loaded', N, {'require_scrub': True})], N, {}, 'owner'), {'phase': 'account-b-loading', 'value': 'a'})\ncheck('domain state regression 4: rows', solve('account-b-loading', [('b-inbox-loaded', N, {'require_scrub': True})], N, {'scrubbed': True, 'rows': []}, 'rows'), {'phase': 'account-b-visible', 'value': ['b-notice']})\ncheck('domain state regression 5: owner', solve('scrubbing-b', [('scrub-complete', N, {})], N, {'owner': 'b'}, 'owner'), {'phase': 'signed-out', 'value': None})\ncheck('domain state regression 6: target', solve('scrubbing-a', [('switch-back-to-a', N, {})], N, {}, 'target'), {'phase': 'scrubbing-for-a', 'value': 'a'})\ncheck('domain state regression 7: rows', solve('account-a-visible', [('switch-to-b', N, {}), ('scrub-complete', N, {}), ('b-inbox-loaded', N, {'require_scrub': True, 'rows': ['b']}), ('sign-out', N, {}), ('scrub-complete', N, {}), ('late-b-response', N, {})], N, {}, 'rows'), {'phase': 'signed-out', 'value': []})\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-account-switch-10","generated_at":"2026-09-29T14:42:35.358233+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 scrubbing-a / switch-back-to-a transition to scrubbing-for-a; preserve the other explicitly stipulated transitions.","root_cause":"Switching back bypasses the still-pending scrub completion.","sha256":"0b6610af898496f0ad0e45522924d191c4e622eeceffd6a70c927b913a683716","title":"Notification surface account switch: switch-back-to-a from scrubbing-a · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.078,"exit_code":1,"observations":[{"actual":"scrubbing-a","check":"account-a-visible / switch-to-b","expected":"scrubbing-a","passed":true},{"actual":"account-b-loading","check":"scrubbing-a / scrub-complete","expected":"account-b-loading","passed":true},{"actual":"account-b-visible","check":"account-b-loading / b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"account-b-loading / b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"account-b-loading / late-a-response","expected":"account-b-loading","passed":true},{"actual":"account-b-loading","check":"switch-error / retry-b-load","expected":"account-b-loading","passed":true},{"actual":"scrubbing-b","check":"account-b-visible / sign-out","expected":"scrubbing-b","passed":true},{"actual":"signed-out","check":"scrubbing-b / scrub-complete","expected":"signed-out","passed":true},{"actual":"signed-out","check":"signed-out / late-b-response","expected":"signed-out","passed":true},{"actual":"account-b-loading","check":"scrubbing-a / switch-back-to-a","expected":"scrubbing-for-a","passed":false},{"actual":"account-a-visible","check":"older notification incarnation","expected":"account-a-visible","passed":true},{"actual":"account-a-visible","check":"future notification incarnation","expected":"account-a-visible","passed":true},{"actual":"account-a-visible","check":"unknown event is inert","expected":"account-a-visible","passed":true},{"actual":"account-a-visible","check":"empty delivery batch","expected":"account-a-visible","passed":true},{"actual":"scrubbing-a","check":"N stale deliveries before current delivery","expected":"scrubbing-a","passed":true},{"actual":"account-b-loading","check":"trace switch-to-b then scrub-complete","expected":"account-b-loading","passed":true},{"actual":"account-b-loading","check":"trace switch-to-b then switch-back-to-a","expected":"scrubbing-for-a","passed":false},{"actual":"account-b-visible","check":"trace scrub-complete then b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"trace scrub-complete then b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"trace scrub-complete then late-a-response","expected":"account-b-loading","passed":true},{"actual":"scrubbing-b","check":"trace b-inbox-loaded then sign-out","expected":"scrubbing-b","passed":true},{"actual":"account-b-loading","check":"trace b-inbox-failed then retry-b-load","expected":"account-b-loading","passed":true},{"actual":"account-b-visible","check":"trace late-a-response then b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"trace late-a-response then b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"trace late-a-response then late-a-response","expected":"account-b-loading","passed":true},{"actual":"account-b-visible","check":"trace retry-b-load then b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"trace retry-b-load then b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"trace retry-b-load then late-a-response","expected":"account-b-loading","passed":true},{"actual":"signed-out","check":"trace sign-out then scrub-complete","expected":"signed-out","passed":true},{"actual":"signed-out","check":"trace scrub-complete then late-b-response","expected":"signed-out","passed":true},{"actual":"signed-out","check":"trace late-b-response then late-b-response","expected":"signed-out","passed":true},{"actual":{"phase":"scrubbing-a","value":[]},"check":"domain state regression 1: rows","expected":{"phase":"scrubbing-a","value":[]},"passed":true},{"actual":{"phase":"account-b-loading","value":["a-notice"]},"check":"domain state regression 2: rows","expected":{"phase":"account-b-loading","value":["a-notice"]},"passed":true},{"actual":{"phase":"account-b-loading","value":"a"},"check":"domain state regression 3: owner","expected":{"phase":"account-b-loading","value":"a"},"passed":true},{"actual":{"phase":"account-b-visible","value":["b-notice"]},"check":"domain state regression 4: rows","expected":{"phase":"account-b-visible","value":["b-notice"]},"passed":true},{"actual":{"phase":"signed-out","value":null},"check":"domain state regression 5: owner","expected":{"phase":"signed-out","value":null},"passed":true},{"actual":{"phase":"account-b-loading","value":"a"},"check":"domain state regression 6: target","expected":{"phase":"scrubbing-for-a","value":"a"},"passed":false},{"actual":{"phase":"signed-out","value":[]},"check":"domain state regression 7: rows","expected":{"phase":"signed-out","value":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"account-a-visible / switch-to-b\", \"actual\": \"scrubbing-a\", \"expected\": \"scrubbing-a\", \"passed\": true}, {\"check\": \"scrubbing-a / scrub-complete\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"account-b-loading / b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"account-b-loading / b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"account-b-loading / late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"switch-error / retry-b-load\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"account-b-visible / sign-out\", \"actual\": \"scrubbing-b\", \"expected\": \"scrubbing-b\", \"passed\": true}, {\"check\": \"scrubbing-b / scrub-complete\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"signed-out / late-b-response\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"scrubbing-a / switch-back-to-a\", \"actual\": \"account-b-loading\", \"expected\": \"scrubbing-for-a\", \"passed\": false}, {\"check\": \"older notification incarnation\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"scrubbing-a\", \"expected\": \"scrubbing-a\", \"passed\": true}, {\"check\": \"trace switch-to-b then scrub-complete\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace switch-to-b then switch-back-to-a\", \"actual\": \"account-b-loading\", \"expected\": \"scrubbing-for-a\", \"passed\": false}, {\"check\": \"trace scrub-complete then b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"trace scrub-complete then b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"trace scrub-complete then late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace b-inbox-loaded then sign-out\", \"actual\": \"scrubbing-b\", \"expected\": \"scrubbing-b\", \"passed\": true}, {\"check\": \"trace b-inbox-failed then retry-b-load\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace late-a-response then b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"trace late-a-response then b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"trace late-a-response then late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace retry-b-load then b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"trace retry-b-load then b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"trace retry-b-load then late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace sign-out then scrub-complete\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"trace scrub-complete then late-b-response\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"trace late-b-response then late-b-response\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"domain state regression 1: rows\", \"actual\": {\"phase\": \"scrubbing-a\", \"value\": []}, \"expected\": {\"phase\": \"scrubbing-a\", \"value\": []}, \"passed\": true}, {\"check\": \"domain state regression 2: rows\", \"actual\": {\"phase\": \"account-b-loading\", \"value\": [\"a-notice\"]}, \"expected\": {\"phase\": \"account-b-loading\", \"value\": [\"a-notice\"]}, \"passed\": true}, {\"check\": \"domain state regression 3: owner\", \"actual\": {\"phase\": \"account-b-loading\", \"value\": \"a\"}, \"expected\": {\"phase\": \"account-b-loading\", \"value\": \"a\"}, \"passed\": true}, {\"check\": \"domain state regression 4: rows\", \"actual\": {\"phase\": \"account-b-visible\", \"value\": [\"b-notice\"]}, \"expected\": {\"phase\": \"account-b-visible\", \"value\": [\"b-notice\"]}, \"passed\": true}, {\"check\": \"domain state regression 5: owner\", \"actual\": {\"phase\": \"signed-out\", \"value\": null}, \"expected\": {\"phase\": \"signed-out\", \"value\": null}, \"passed\": true}, {\"check\": \"domain state regression 6: target\", \"actual\": {\"phase\": \"account-b-loading\", \"value\": \"a\"}, \"expected\": {\"phase\": \"scrubbing-for-a\", \"value\": \"a\"}, \"passed\": false}, {\"check\": \"domain state regression 7: rows\", \"actual\": {\"phase\": \"signed-out\", \"value\": []}, \"expected\": {\"phase\": \"signed-out\", \"value\": []}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.463,"exit_code":1,"observations":[{"actual":"scrubbing-a","check":"account-a-visible / switch-to-b","expected":"scrubbing-a","passed":true},{"actual":"account-b-loading","check":"scrubbing-a / scrub-complete","expected":"account-b-loading","passed":true},{"actual":"account-b-visible","check":"account-b-loading / b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"account-b-loading / b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"account-b-loading / late-a-response","expected":"account-b-loading","passed":true},{"actual":"account-b-loading","check":"switch-error / retry-b-load","expected":"account-b-loading","passed":true},{"actual":"scrubbing-b","check":"account-b-visible / sign-out","expected":"scrubbing-b","passed":true},{"actual":"signed-out","check":"scrubbing-b / scrub-complete","expected":"signed-out","passed":true},{"actual":"signed-out","check":"signed-out / late-b-response","expected":"signed-out","passed":true},{"actual":"account-a-visible","check":"scrubbing-a / switch-back-to-a","expected":"scrubbing-for-a","passed":false},{"actual":"account-a-visible","check":"older notification incarnation","expected":"account-a-visible","passed":true},{"actual":"account-a-visible","check":"future notification incarnation","expected":"account-a-visible","passed":true},{"actual":"account-a-visible","check":"unknown event is inert","expected":"account-a-visible","passed":true},{"actual":"account-a-visible","check":"empty delivery batch","expected":"account-a-visible","passed":true},{"actual":"scrubbing-a","check":"N stale deliveries before current delivery","expected":"scrubbing-a","passed":true},{"actual":"account-b-loading","check":"trace switch-to-b then scrub-complete","expected":"account-b-loading","passed":true},{"actual":"account-a-visible","check":"trace switch-to-b then switch-back-to-a","expected":"scrubbing-for-a","passed":false},{"actual":"account-b-visible","check":"trace scrub-complete then b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"trace scrub-complete then b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"trace scrub-complete then late-a-response","expected":"account-b-loading","passed":true},{"actual":"scrubbing-b","check":"trace b-inbox-loaded then sign-out","expected":"scrubbing-b","passed":true},{"actual":"account-b-loading","check":"trace b-inbox-failed then retry-b-load","expected":"account-b-loading","passed":true},{"actual":"account-b-visible","check":"trace late-a-response then b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"trace late-a-response then b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"trace late-a-response then late-a-response","expected":"account-b-loading","passed":true},{"actual":"account-b-visible","check":"trace retry-b-load then b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"trace retry-b-load then b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"trace retry-b-load then late-a-response","expected":"account-b-loading","passed":true},{"actual":"signed-out","check":"trace sign-out then scrub-complete","expected":"signed-out","passed":true},{"actual":"signed-out","check":"trace scrub-complete then late-b-response","expected":"signed-out","passed":true},{"actual":"signed-out","check":"trace late-b-response then late-b-response","expected":"signed-out","passed":true},{"actual":{"phase":"scrubbing-a","value":[]},"check":"domain state regression 1: rows","expected":{"phase":"scrubbing-a","value":[]},"passed":true},{"actual":{"phase":"account-b-loading","value":["a-notice"]},"check":"domain state regression 2: rows","expected":{"phase":"account-b-loading","value":["a-notice"]},"passed":true},{"actual":{"phase":"account-b-loading","value":"a"},"check":"domain state regression 3: owner","expected":{"phase":"account-b-loading","value":"a"},"passed":true},{"actual":{"phase":"account-b-visible","value":["b-notice"]},"check":"domain state regression 4: rows","expected":{"phase":"account-b-visible","value":["b-notice"]},"passed":true},{"actual":{"phase":"signed-out","value":null},"check":"domain state regression 5: owner","expected":{"phase":"signed-out","value":null},"passed":true},{"actual":{"phase":"account-a-visible","value":"a"},"check":"domain state regression 6: target","expected":{"phase":"scrubbing-for-a","value":"a"},"passed":false},{"actual":{"phase":"signed-out","value":[]},"check":"domain state regression 7: rows","expected":{"phase":"signed-out","value":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"account-a-visible / switch-to-b\", \"actual\": \"scrubbing-a\", \"expected\": \"scrubbing-a\", \"passed\": true}, {\"check\": \"scrubbing-a / scrub-complete\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"account-b-loading / b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"account-b-loading / b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"account-b-loading / late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"switch-error / retry-b-load\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"account-b-visible / sign-out\", \"actual\": \"scrubbing-b\", \"expected\": \"scrubbing-b\", \"passed\": true}, {\"check\": \"scrubbing-b / scrub-complete\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"signed-out / late-b-response\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"scrubbing-a / switch-back-to-a\", \"actual\": \"account-a-visible\", \"expected\": \"scrubbing-for-a\", \"passed\": false}, {\"check\": \"older notification incarnation\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"scrubbing-a\", \"expected\": \"scrubbing-a\", \"passed\": true}, {\"check\": \"trace switch-to-b then scrub-complete\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace switch-to-b then switch-back-to-a\", \"actual\": \"account-a-visible\", \"expected\": \"scrubbing-for-a\", \"passed\": false}, {\"check\": \"trace scrub-complete then b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"trace scrub-complete then b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"trace scrub-complete then late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace b-inbox-loaded then sign-out\", \"actual\": \"scrubbing-b\", \"expected\": \"scrubbing-b\", \"passed\": true}, {\"check\": \"trace b-inbox-failed then retry-b-load\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace late-a-response then b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"trace late-a-response then b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"trace late-a-response then late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace retry-b-load then b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"trace retry-b-load then b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"trace retry-b-load then late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace sign-out then scrub-complete\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"trace scrub-complete then late-b-response\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"trace late-b-response then late-b-response\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"domain state regression 1: rows\", \"actual\": {\"phase\": \"scrubbing-a\", \"value\": []}, \"expected\": {\"phase\": \"scrubbing-a\", \"value\": []}, \"passed\": true}, {\"check\": \"domain state regression 2: rows\", \"actual\": {\"phase\": \"account-b-loading\", \"value\": [\"a-notice\"]}, \"expected\": {\"phase\": \"account-b-loading\", \"value\": [\"a-notice\"]}, \"passed\": true}, {\"check\": \"domain state regression 3: owner\", \"actual\": {\"phase\": \"account-b-loading\", \"value\": \"a\"}, \"expected\": {\"phase\": \"account-b-loading\", \"value\": \"a\"}, \"passed\": true}, {\"check\": \"domain state regression 4: rows\", \"actual\": {\"phase\": \"account-b-visible\", \"value\": [\"b-notice\"]}, \"expected\": {\"phase\": \"account-b-visible\", \"value\": [\"b-notice\"]}, \"passed\": true}, {\"check\": \"domain state regression 5: owner\", \"actual\": {\"phase\": \"signed-out\", \"value\": null}, \"expected\": {\"phase\": \"signed-out\", \"value\": null}, \"passed\": true}, {\"check\": \"domain state regression 6: target\", \"actual\": {\"phase\": \"account-a-visible\", \"value\": \"a\"}, \"expected\": {\"phase\": \"scrubbing-for-a\", \"value\": \"a\"}, \"passed\": false}, {\"check\": \"domain state regression 7: rows\", \"actual\": {\"phase\": \"signed-out\", \"value\": []}, \"expected\": {\"phase\": \"signed-out\", \"value\": []}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.134,"exit_code":0,"observations":[{"actual":"scrubbing-a","check":"account-a-visible / switch-to-b","expected":"scrubbing-a","passed":true},{"actual":"account-b-loading","check":"scrubbing-a / scrub-complete","expected":"account-b-loading","passed":true},{"actual":"account-b-visible","check":"account-b-loading / b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"account-b-loading / b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"account-b-loading / late-a-response","expected":"account-b-loading","passed":true},{"actual":"account-b-loading","check":"switch-error / retry-b-load","expected":"account-b-loading","passed":true},{"actual":"scrubbing-b","check":"account-b-visible / sign-out","expected":"scrubbing-b","passed":true},{"actual":"signed-out","check":"scrubbing-b / scrub-complete","expected":"signed-out","passed":true},{"actual":"signed-out","check":"signed-out / late-b-response","expected":"signed-out","passed":true},{"actual":"scrubbing-for-a","check":"scrubbing-a / switch-back-to-a","expected":"scrubbing-for-a","passed":true},{"actual":"account-a-visible","check":"older notification incarnation","expected":"account-a-visible","passed":true},{"actual":"account-a-visible","check":"future notification incarnation","expected":"account-a-visible","passed":true},{"actual":"account-a-visible","check":"unknown event is inert","expected":"account-a-visible","passed":true},{"actual":"account-a-visible","check":"empty delivery batch","expected":"account-a-visible","passed":true},{"actual":"scrubbing-a","check":"N stale deliveries before current delivery","expected":"scrubbing-a","passed":true},{"actual":"account-b-loading","check":"trace switch-to-b then scrub-complete","expected":"account-b-loading","passed":true},{"actual":"scrubbing-for-a","check":"trace switch-to-b then switch-back-to-a","expected":"scrubbing-for-a","passed":true},{"actual":"account-b-visible","check":"trace scrub-complete then b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"trace scrub-complete then b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"trace scrub-complete then late-a-response","expected":"account-b-loading","passed":true},{"actual":"scrubbing-b","check":"trace b-inbox-loaded then sign-out","expected":"scrubbing-b","passed":true},{"actual":"account-b-loading","check":"trace b-inbox-failed then retry-b-load","expected":"account-b-loading","passed":true},{"actual":"account-b-visible","check":"trace late-a-response then b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"trace late-a-response then b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"trace late-a-response then late-a-response","expected":"account-b-loading","passed":true},{"actual":"account-b-visible","check":"trace retry-b-load then b-inbox-loaded","expected":"account-b-visible","passed":true},{"actual":"switch-error","check":"trace retry-b-load then b-inbox-failed","expected":"switch-error","passed":true},{"actual":"account-b-loading","check":"trace retry-b-load then late-a-response","expected":"account-b-loading","passed":true},{"actual":"signed-out","check":"trace sign-out then scrub-complete","expected":"signed-out","passed":true},{"actual":"signed-out","check":"trace scrub-complete then late-b-response","expected":"signed-out","passed":true},{"actual":"signed-out","check":"trace late-b-response then late-b-response","expected":"signed-out","passed":true},{"actual":{"phase":"scrubbing-a","value":[]},"check":"domain state regression 1: rows","expected":{"phase":"scrubbing-a","value":[]},"passed":true},{"actual":{"phase":"account-b-loading","value":["a-notice"]},"check":"domain state regression 2: rows","expected":{"phase":"account-b-loading","value":["a-notice"]},"passed":true},{"actual":{"phase":"account-b-loading","value":"a"},"check":"domain state regression 3: owner","expected":{"phase":"account-b-loading","value":"a"},"passed":true},{"actual":{"phase":"account-b-visible","value":["b-notice"]},"check":"domain state regression 4: rows","expected":{"phase":"account-b-visible","value":["b-notice"]},"passed":true},{"actual":{"phase":"signed-out","value":null},"check":"domain state regression 5: owner","expected":{"phase":"signed-out","value":null},"passed":true},{"actual":{"phase":"scrubbing-for-a","value":"a"},"check":"domain state regression 6: target","expected":{"phase":"scrubbing-for-a","value":"a"},"passed":true},{"actual":{"phase":"signed-out","value":[]},"check":"domain state regression 7: rows","expected":{"phase":"signed-out","value":[]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"account-a-visible / switch-to-b\", \"actual\": \"scrubbing-a\", \"expected\": \"scrubbing-a\", \"passed\": true}, {\"check\": \"scrubbing-a / scrub-complete\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"account-b-loading / b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"account-b-loading / b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"account-b-loading / late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"switch-error / retry-b-load\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"account-b-visible / sign-out\", \"actual\": \"scrubbing-b\", \"expected\": \"scrubbing-b\", \"passed\": true}, {\"check\": \"scrubbing-b / scrub-complete\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"signed-out / late-b-response\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"scrubbing-a / switch-back-to-a\", \"actual\": \"scrubbing-for-a\", \"expected\": \"scrubbing-for-a\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"account-a-visible\", \"expected\": \"account-a-visible\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"scrubbing-a\", \"expected\": \"scrubbing-a\", \"passed\": true}, {\"check\": \"trace switch-to-b then scrub-complete\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace switch-to-b then switch-back-to-a\", \"actual\": \"scrubbing-for-a\", \"expected\": \"scrubbing-for-a\", \"passed\": true}, {\"check\": \"trace scrub-complete then b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"trace scrub-complete then b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"trace scrub-complete then late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace b-inbox-loaded then sign-out\", \"actual\": \"scrubbing-b\", \"expected\": \"scrubbing-b\", \"passed\": true}, {\"check\": \"trace b-inbox-failed then retry-b-load\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace late-a-response then b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"trace late-a-response then b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"trace late-a-response then late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace retry-b-load then b-inbox-loaded\", \"actual\": \"account-b-visible\", \"expected\": \"account-b-visible\", \"passed\": true}, {\"check\": \"trace retry-b-load then b-inbox-failed\", \"actual\": \"switch-error\", \"expected\": \"switch-error\", \"passed\": true}, {\"check\": \"trace retry-b-load then late-a-response\", \"actual\": \"account-b-loading\", \"expected\": \"account-b-loading\", \"passed\": true}, {\"check\": \"trace sign-out then scrub-complete\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"trace scrub-complete then late-b-response\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"trace late-b-response then late-b-response\", \"actual\": \"signed-out\", \"expected\": \"signed-out\", \"passed\": true}, {\"check\": \"domain state regression 1: rows\", \"actual\": {\"phase\": \"scrubbing-a\", \"value\": []}, \"expected\": {\"phase\": \"scrubbing-a\", \"value\": []}, \"passed\": true}, {\"check\": \"domain state regression 2: rows\", \"actual\": {\"phase\": \"account-b-loading\", \"value\": [\"a-notice\"]}, \"expected\": {\"phase\": \"account-b-loading\", \"value\": [\"a-notice\"]}, \"passed\": true}, {\"check\": \"domain state regression 3: owner\", \"actual\": {\"phase\": \"account-b-loading\", \"value\": \"a\"}, \"expected\": {\"phase\": \"account-b-loading\", \"value\": \"a\"}, \"passed\": true}, {\"check\": \"domain state regression 4: rows\", \"actual\": {\"phase\": \"account-b-visible\", \"value\": [\"b-notice\"]}, \"expected\": {\"phase\": \"account-b-visible\", \"value\": [\"b-notice\"]}, \"passed\": true}, {\"check\": \"domain state regression 5: owner\", \"actual\": {\"phase\": \"signed-out\", \"value\": null}, \"expected\": {\"phase\": \"signed-out\", \"value\": null}, \"passed\": true}, {\"check\": \"domain state regression 6: target\", \"actual\": {\"phase\": \"scrubbing-for-a\", \"value\": \"a\"}, \"expected\": {\"phase\": \"scrubbing-for-a\", \"value\": \"a\"}, \"passed\": true}, {\"check\": \"domain state regression 7: rows\", \"actual\": {\"phase\": \"signed-out\", \"value\": []}, \"expected\": {\"phase\": \"signed-out\", \"value\": []}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}