{"abstract":"The save-failure event leaves a notification in gone instead of recovery-banner.","category":"Notification interfaces","checks":36,"contract":"Banner to inbox promotion is a bounded visual-notification workflow with mutable policy state {'banner': True, 'inbox': [], 'item': 'n', 'save_revision': 2}. Its default transition relation is {('banner', 'retain-in-inbox'): 'saving', ('saving', 'save-success'): 'both', ('saving', 'save-failure'): 'save-error', ('both', 'banner-exposure-end'): 'inbox-only', ('save-error', 'retry-retention'): 'saving', ('saving', 'banner-exposure-end'): 'saving-without-banner', ('saving-without-banner', 'save-success'): 'inbox-only', ('saving-without-banner', 'save-failure'): 'recovery-banner', ('inbox-only', 'show-banner-again'): 'repromoting', ('repromoting', 'banner-mounted'): 'both'}; 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-promotion","failed_approach":"Claiming a retained copy hides the loss.","family":"s3-notification-interfaces-promotion-08","id":"FA-34476","implementations":{"attempt":{"sha256":"0a8eeb9be1b2c94f59748d11588a6eb7f25db72946d0e6bb70705ce932b71b07","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 = {('banner', 'retain-in-inbox'): 'saving', ('saving', 'save-success'): 'both', ('saving', 'save-failure'): 'save-error', ('both', 'banner-exposure-end'): 'inbox-only', ('save-error', 'retry-retention'): 'saving', ('saving', 'banner-exposure-end'): 'saving-without-banner', ('saving-without-banner', 'save-success'): 'inbox-only', ('saving-without-banner', 'save-failure'): 'inbox-only', ('inbox-only', 'show-banner-again'): 'repromoting', ('repromoting', 'banner-mounted'): 'both'}\n    data = json.loads(json.dumps({'banner': True, 'inbox': [], 'item': 'n', 'save_revision': 2})) if payload is None else {**json.loads(json.dumps({'banner': True, 'inbox': [], 'item': 'n', 'save_revision': 2})), **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 in ('save-success','save-failure') and arg.get('revision',data['save_revision']) != data['save_revision']: event = 'unknown-event'\n            state = table.get((state, event), state)\n            if state in ('both','inbox-only') and data['item'] not in data['inbox']: data['inbox'].append(data['item'])\n            data['banner'] = state in ('banner','both','saving','save-error','recovery-banner')\n            if state == 'gone': data['inbox'] = [x for x in data['inbox'] if x != data['item']]\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('banner / retain-in-inbox', solve('banner', [('retain-in-inbox', N)], N), 'saving')\ncheck('saving / save-success', solve('saving', [('save-success', N)], N), 'both')\ncheck('saving / save-failure', solve('saving', [('save-failure', N)], N), 'save-error')\ncheck('both / banner-exposure-end', solve('both', [('banner-exposure-end', N)], N), 'inbox-only')\ncheck('save-error / retry-retention', solve('save-error', [('retry-retention', N)], N), 'saving')\ncheck('saving / banner-exposure-end', solve('saving', [('banner-exposure-end', N)], N), 'saving-without-banner')\ncheck('saving-without-banner / save-success', solve('saving-without-banner', [('save-success', N)], N), 'inbox-only')\ncheck('saving-without-banner / save-failure', solve('saving-without-banner', [('save-failure', N)], N), 'recovery-banner')\ncheck('inbox-only / show-banner-again', solve('inbox-only', [('show-banner-again', N)], N), 'repromoting')\ncheck('repromoting / banner-mounted', solve('repromoting', [('banner-mounted', N)], N), 'both')\ncheck('older notification incarnation', solve('banner', [('retain-in-inbox', N - 1)], N), 'banner')\ncheck('future notification incarnation', solve('banner', [('retain-in-inbox', N + 1)], N), 'banner')\ncheck('unknown event is inert', solve('banner', [('unknown-event', N)], N), 'banner')\ncheck('empty delivery batch', solve('banner', [], N), 'banner')\ncheck('N stale deliveries before current delivery', solve('banner', [('retain-in-inbox', N - 1)] * N + [('retain-in-inbox', N)], N), 'saving')\ncheck('trace retain-in-inbox then save-success', solve('banner', [('retain-in-inbox', N), ('save-success', N)], N), 'both')\ncheck('trace retain-in-inbox then save-failure', solve('banner', [('retain-in-inbox', N), ('save-failure', N)], N), 'save-error')\ncheck('trace retain-in-inbox then banner-exposure-end', solve('banner', [('retain-in-inbox', N), ('banner-exposure-end', N)], N), 'saving-without-banner')\ncheck('trace save-success then banner-exposure-end', solve('saving', [('save-success', N), ('banner-exposure-end', N)], N), 'inbox-only')\ncheck('trace save-failure then retry-retention', solve('saving', [('save-failure', N), ('retry-retention', N)], N), 'saving')\ncheck('trace banner-exposure-end then show-banner-again', solve('both', [('banner-exposure-end', N), ('show-banner-again', N)], N), 'repromoting')\ncheck('trace retry-retention then save-success', solve('save-error', [('retry-retention', N), ('save-success', N)], N), 'both')\ncheck('trace retry-retention then save-failure', solve('save-error', [('retry-retention', N), ('save-failure', N)], N), 'save-error')\ncheck('trace retry-retention then banner-exposure-end', solve('save-error', [('retry-retention', N), ('banner-exposure-end', N)], N), 'saving-without-banner')\ncheck('trace banner-exposure-end then save-success', solve('saving', [('banner-exposure-end', N), ('save-success', N)], N), 'inbox-only')\ncheck('trace banner-exposure-end then save-failure', solve('saving', [('banner-exposure-end', N), ('save-failure', N)], N), 'recovery-banner')\ncheck('trace save-success then show-banner-again', solve('saving-without-banner', [('save-success', N), ('show-banner-again', N)], N), 'repromoting')\ncheck('trace show-banner-again then banner-mounted', solve('inbox-only', [('show-banner-again', N), ('banner-mounted', N)], N), 'both')\ncheck('trace banner-mounted then banner-exposure-end', solve('repromoting', [('banner-mounted', N), ('banner-exposure-end', N)], N), 'inbox-only')\ncheck('domain state regression 1: inbox', solve('saving', [('save-success', N, {'revision': 1})], N, {}, 'inbox'), {'phase': 'saving', 'value': []})\ncheck('domain state regression 2: inbox', solve('saving', [('save-success', N, {'revision': 2})], N, {'inbox': ['other']}, 'inbox'), {'phase': 'both', 'value': ['other', 'n']})\ncheck('domain state regression 3: inbox', solve('both', [('banner-exposure-end', N, {})], N, {'inbox': ['n']}, 'inbox'), {'phase': 'inbox-only', 'value': ['n']})\ncheck('domain state regression 4: banner', solve('both', [('banner-exposure-end', N, {})], N, {'inbox': ['n']}, 'banner'), {'phase': 'inbox-only', 'value': False})\ncheck('domain state regression 5: banner', solve('saving-without-banner', [('save-failure', N, {})], N, {'banner': False}, 'banner'), {'phase': 'recovery-banner', 'value': True})\ncheck('domain state regression 6: banner', solve('saving-without-banner', [('save-success', N, {})], N, {'banner': False}, 'banner'), {'phase': 'inbox-only', 'value': False})\ncheck('domain state regression 7: banner', solve('banner', [('retain-in-inbox', N, {}), ('banner-exposure-end', N, {}), ('save-success', N, {})], N, {}, 'banner'), {'phase': 'inbox-only', 'value': False})\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"5944ab93dff29762db71f5ae02e6ba236ca8bd5254d457e4646e34036a4b25d2","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 = {('banner', 'retain-in-inbox'): 'saving', ('saving', 'save-success'): 'both', ('saving', 'save-failure'): 'save-error', ('both', 'banner-exposure-end'): 'inbox-only', ('save-error', 'retry-retention'): 'saving', ('saving', 'banner-exposure-end'): 'saving-without-banner', ('saving-without-banner', 'save-success'): 'inbox-only', ('saving-without-banner', 'save-failure'): 'gone', ('inbox-only', 'show-banner-again'): 'repromoting', ('repromoting', 'banner-mounted'): 'both'}\n    data = json.loads(json.dumps({'banner': True, 'inbox': [], 'item': 'n', 'save_revision': 2})) if payload is None else {**json.loads(json.dumps({'banner': True, 'inbox': [], 'item': 'n', 'save_revision': 2})), **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 in ('save-success','save-failure') and arg.get('revision',data['save_revision']) != data['save_revision']: event = 'unknown-event'\n            state = table.get((state, event), state)\n            if state in ('both','inbox-only') and data['item'] not in data['inbox']: data['inbox'].append(data['item'])\n            data['banner'] = state in ('banner','both','saving','save-error','recovery-banner')\n            if state == 'gone': data['inbox'] = [x for x in data['inbox'] if x != data['item']]\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('banner / retain-in-inbox', solve('banner', [('retain-in-inbox', N)], N), 'saving')\ncheck('saving / save-success', solve('saving', [('save-success', N)], N), 'both')\ncheck('saving / save-failure', solve('saving', [('save-failure', N)], N), 'save-error')\ncheck('both / banner-exposure-end', solve('both', [('banner-exposure-end', N)], N), 'inbox-only')\ncheck('save-error / retry-retention', solve('save-error', [('retry-retention', N)], N), 'saving')\ncheck('saving / banner-exposure-end', solve('saving', [('banner-exposure-end', N)], N), 'saving-without-banner')\ncheck('saving-without-banner / save-success', solve('saving-without-banner', [('save-success', N)], N), 'inbox-only')\ncheck('saving-without-banner / save-failure', solve('saving-without-banner', [('save-failure', N)], N), 'recovery-banner')\ncheck('inbox-only / show-banner-again', solve('inbox-only', [('show-banner-again', N)], N), 'repromoting')\ncheck('repromoting / banner-mounted', solve('repromoting', [('banner-mounted', N)], N), 'both')\ncheck('older notification incarnation', solve('banner', [('retain-in-inbox', N - 1)], N), 'banner')\ncheck('future notification incarnation', solve('banner', [('retain-in-inbox', N + 1)], N), 'banner')\ncheck('unknown event is inert', solve('banner', [('unknown-event', N)], N), 'banner')\ncheck('empty delivery batch', solve('banner', [], N), 'banner')\ncheck('N stale deliveries before current delivery', solve('banner', [('retain-in-inbox', N - 1)] * N + [('retain-in-inbox', N)], N), 'saving')\ncheck('trace retain-in-inbox then save-success', solve('banner', [('retain-in-inbox', N), ('save-success', N)], N), 'both')\ncheck('trace retain-in-inbox then save-failure', solve('banner', [('retain-in-inbox', N), ('save-failure', N)], N), 'save-error')\ncheck('trace retain-in-inbox then banner-exposure-end', solve('banner', [('retain-in-inbox', N), ('banner-exposure-end', N)], N), 'saving-without-banner')\ncheck('trace save-success then banner-exposure-end', solve('saving', [('save-success', N), ('banner-exposure-end', N)], N), 'inbox-only')\ncheck('trace save-failure then retry-retention', solve('saving', [('save-failure', N), ('retry-retention', N)], N), 'saving')\ncheck('trace banner-exposure-end then show-banner-again', solve('both', [('banner-exposure-end', N), ('show-banner-again', N)], N), 'repromoting')\ncheck('trace retry-retention then save-success', solve('save-error', [('retry-retention', N), ('save-success', N)], N), 'both')\ncheck('trace retry-retention then save-failure', solve('save-error', [('retry-retention', N), ('save-failure', N)], N), 'save-error')\ncheck('trace retry-retention then banner-exposure-end', solve('save-error', [('retry-retention', N), ('banner-exposure-end', N)], N), 'saving-without-banner')\ncheck('trace banner-exposure-end then save-success', solve('saving', [('banner-exposure-end', N), ('save-success', N)], N), 'inbox-only')\ncheck('trace banner-exposure-end then save-failure', solve('saving', [('banner-exposure-end', N), ('save-failure', N)], N), 'recovery-banner')\ncheck('trace save-success then show-banner-again', solve('saving-without-banner', [('save-success', N), ('show-banner-again', N)], N), 'repromoting')\ncheck('trace show-banner-again then banner-mounted', solve('inbox-only', [('show-banner-again', N), ('banner-mounted', N)], N), 'both')\ncheck('trace banner-mounted then banner-exposure-end', solve('repromoting', [('banner-mounted', N), ('banner-exposure-end', N)], N), 'inbox-only')\ncheck('domain state regression 1: inbox', solve('saving', [('save-success', N, {'revision': 1})], N, {}, 'inbox'), {'phase': 'saving', 'value': []})\ncheck('domain state regression 2: inbox', solve('saving', [('save-success', N, {'revision': 2})], N, {'inbox': ['other']}, 'inbox'), {'phase': 'both', 'value': ['other', 'n']})\ncheck('domain state regression 3: inbox', solve('both', [('banner-exposure-end', N, {})], N, {'inbox': ['n']}, 'inbox'), {'phase': 'inbox-only', 'value': ['n']})\ncheck('domain state regression 4: banner', solve('both', [('banner-exposure-end', N, {})], N, {'inbox': ['n']}, 'banner'), {'phase': 'inbox-only', 'value': False})\ncheck('domain state regression 5: banner', solve('saving-without-banner', [('save-failure', N, {})], N, {'banner': False}, 'banner'), {'phase': 'recovery-banner', 'value': True})\ncheck('domain state regression 6: banner', solve('saving-without-banner', [('save-success', N, {})], N, {'banner': False}, 'banner'), {'phase': 'inbox-only', 'value': False})\ncheck('domain state regression 7: banner', solve('banner', [('retain-in-inbox', N, {}), ('banner-exposure-end', N, {}), ('save-success', N, {})], N, {}, 'banner'), {'phase': 'inbox-only', 'value': False})\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"4f191d03be26b507cfac945ebf5c759da0d7f67ccce099c8d24d9db4e1576db1","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 = {('banner', 'retain-in-inbox'): 'saving', ('saving', 'save-success'): 'both', ('saving', 'save-failure'): 'save-error', ('both', 'banner-exposure-end'): 'inbox-only', ('save-error', 'retry-retention'): 'saving', ('saving', 'banner-exposure-end'): 'saving-without-banner', ('saving-without-banner', 'save-success'): 'inbox-only', ('saving-without-banner', 'save-failure'): 'recovery-banner', ('inbox-only', 'show-banner-again'): 'repromoting', ('repromoting', 'banner-mounted'): 'both'}\n    data = json.loads(json.dumps({'banner': True, 'inbox': [], 'item': 'n', 'save_revision': 2})) if payload is None else {**json.loads(json.dumps({'banner': True, 'inbox': [], 'item': 'n', 'save_revision': 2})), **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 in ('save-success','save-failure') and arg.get('revision',data['save_revision']) != data['save_revision']: event = 'unknown-event'\n            state = table.get((state, event), state)\n            if state in ('both','inbox-only') and data['item'] not in data['inbox']: data['inbox'].append(data['item'])\n            data['banner'] = state in ('banner','both','saving','save-error','recovery-banner')\n            if state == 'gone': data['inbox'] = [x for x in data['inbox'] if x != data['item']]\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('banner / retain-in-inbox', solve('banner', [('retain-in-inbox', N)], N), 'saving')\ncheck('saving / save-success', solve('saving', [('save-success', N)], N), 'both')\ncheck('saving / save-failure', solve('saving', [('save-failure', N)], N), 'save-error')\ncheck('both / banner-exposure-end', solve('both', [('banner-exposure-end', N)], N), 'inbox-only')\ncheck('save-error / retry-retention', solve('save-error', [('retry-retention', N)], N), 'saving')\ncheck('saving / banner-exposure-end', solve('saving', [('banner-exposure-end', N)], N), 'saving-without-banner')\ncheck('saving-without-banner / save-success', solve('saving-without-banner', [('save-success', N)], N), 'inbox-only')\ncheck('saving-without-banner / save-failure', solve('saving-without-banner', [('save-failure', N)], N), 'recovery-banner')\ncheck('inbox-only / show-banner-again', solve('inbox-only', [('show-banner-again', N)], N), 'repromoting')\ncheck('repromoting / banner-mounted', solve('repromoting', [('banner-mounted', N)], N), 'both')\ncheck('older notification incarnation', solve('banner', [('retain-in-inbox', N - 1)], N), 'banner')\ncheck('future notification incarnation', solve('banner', [('retain-in-inbox', N + 1)], N), 'banner')\ncheck('unknown event is inert', solve('banner', [('unknown-event', N)], N), 'banner')\ncheck('empty delivery batch', solve('banner', [], N), 'banner')\ncheck('N stale deliveries before current delivery', solve('banner', [('retain-in-inbox', N - 1)] * N + [('retain-in-inbox', N)], N), 'saving')\ncheck('trace retain-in-inbox then save-success', solve('banner', [('retain-in-inbox', N), ('save-success', N)], N), 'both')\ncheck('trace retain-in-inbox then save-failure', solve('banner', [('retain-in-inbox', N), ('save-failure', N)], N), 'save-error')\ncheck('trace retain-in-inbox then banner-exposure-end', solve('banner', [('retain-in-inbox', N), ('banner-exposure-end', N)], N), 'saving-without-banner')\ncheck('trace save-success then banner-exposure-end', solve('saving', [('save-success', N), ('banner-exposure-end', N)], N), 'inbox-only')\ncheck('trace save-failure then retry-retention', solve('saving', [('save-failure', N), ('retry-retention', N)], N), 'saving')\ncheck('trace banner-exposure-end then show-banner-again', solve('both', [('banner-exposure-end', N), ('show-banner-again', N)], N), 'repromoting')\ncheck('trace retry-retention then save-success', solve('save-error', [('retry-retention', N), ('save-success', N)], N), 'both')\ncheck('trace retry-retention then save-failure', solve('save-error', [('retry-retention', N), ('save-failure', N)], N), 'save-error')\ncheck('trace retry-retention then banner-exposure-end', solve('save-error', [('retry-retention', N), ('banner-exposure-end', N)], N), 'saving-without-banner')\ncheck('trace banner-exposure-end then save-success', solve('saving', [('banner-exposure-end', N), ('save-success', N)], N), 'inbox-only')\ncheck('trace banner-exposure-end then save-failure', solve('saving', [('banner-exposure-end', N), ('save-failure', N)], N), 'recovery-banner')\ncheck('trace save-success then show-banner-again', solve('saving-without-banner', [('save-success', N), ('show-banner-again', N)], N), 'repromoting')\ncheck('trace show-banner-again then banner-mounted', solve('inbox-only', [('show-banner-again', N), ('banner-mounted', N)], N), 'both')\ncheck('trace banner-mounted then banner-exposure-end', solve('repromoting', [('banner-mounted', N), ('banner-exposure-end', N)], N), 'inbox-only')\ncheck('domain state regression 1: inbox', solve('saving', [('save-success', N, {'revision': 1})], N, {}, 'inbox'), {'phase': 'saving', 'value': []})\ncheck('domain state regression 2: inbox', solve('saving', [('save-success', N, {'revision': 2})], N, {'inbox': ['other']}, 'inbox'), {'phase': 'both', 'value': ['other', 'n']})\ncheck('domain state regression 3: inbox', solve('both', [('banner-exposure-end', N, {})], N, {'inbox': ['n']}, 'inbox'), {'phase': 'inbox-only', 'value': ['n']})\ncheck('domain state regression 4: banner', solve('both', [('banner-exposure-end', N, {})], N, {'inbox': ['n']}, 'banner'), {'phase': 'inbox-only', 'value': False})\ncheck('domain state regression 5: banner', solve('saving-without-banner', [('save-failure', N, {})], N, {'banner': False}, 'banner'), {'phase': 'recovery-banner', 'value': True})\ncheck('domain state regression 6: banner', solve('saving-without-banner', [('save-success', N, {})], N, {'banner': False}, 'banner'), {'phase': 'inbox-only', 'value': False})\ncheck('domain state regression 7: banner', solve('banner', [('retain-in-inbox', N, {}), ('banner-exposure-end', N, {}), ('save-success', N, {})], N, {}, 'banner'), {'phase': 'inbox-only', 'value': False})\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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-promotion-08","generated_at":"2026-09-29T14:42:32.311699+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 saving-without-banner / save-failure transition to recovery-banner; preserve the other explicitly stipulated transitions.","root_cause":"Failed retention after expiry leaves no recovery surface.","sha256":"be3041c006deb91e935987a8986488876baabbb186cc36f8b17630521aeb58ce","title":"Banner to inbox promotion: save-failure from saving-without-banner · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.396,"exit_code":1,"observations":[{"actual":"saving","check":"banner / retain-in-inbox","expected":"saving","passed":true},{"actual":"both","check":"saving / save-success","expected":"both","passed":true},{"actual":"save-error","check":"saving / save-failure","expected":"save-error","passed":true},{"actual":"inbox-only","check":"both / banner-exposure-end","expected":"inbox-only","passed":true},{"actual":"saving","check":"save-error / retry-retention","expected":"saving","passed":true},{"actual":"saving-without-banner","check":"saving / banner-exposure-end","expected":"saving-without-banner","passed":true},{"actual":"inbox-only","check":"saving-without-banner / save-success","expected":"inbox-only","passed":true},{"actual":"inbox-only","check":"saving-without-banner / save-failure","expected":"recovery-banner","passed":false},{"actual":"repromoting","check":"inbox-only / show-banner-again","expected":"repromoting","passed":true},{"actual":"both","check":"repromoting / banner-mounted","expected":"both","passed":true},{"actual":"banner","check":"older notification incarnation","expected":"banner","passed":true},{"actual":"banner","check":"future notification incarnation","expected":"banner","passed":true},{"actual":"banner","check":"unknown event is inert","expected":"banner","passed":true},{"actual":"banner","check":"empty delivery batch","expected":"banner","passed":true},{"actual":"saving","check":"N stale deliveries before current delivery","expected":"saving","passed":true},{"actual":"both","check":"trace retain-in-inbox then save-success","expected":"both","passed":true},{"actual":"save-error","check":"trace retain-in-inbox then save-failure","expected":"save-error","passed":true},{"actual":"saving-without-banner","check":"trace retain-in-inbox then banner-exposure-end","expected":"saving-without-banner","passed":true},{"actual":"inbox-only","check":"trace save-success then banner-exposure-end","expected":"inbox-only","passed":true},{"actual":"saving","check":"trace save-failure then retry-retention","expected":"saving","passed":true},{"actual":"repromoting","check":"trace banner-exposure-end then show-banner-again","expected":"repromoting","passed":true},{"actual":"both","check":"trace retry-retention then save-success","expected":"both","passed":true},{"actual":"save-error","check":"trace retry-retention then save-failure","expected":"save-error","passed":true},{"actual":"saving-without-banner","check":"trace retry-retention then banner-exposure-end","expected":"saving-without-banner","passed":true},{"actual":"inbox-only","check":"trace banner-exposure-end then save-success","expected":"inbox-only","passed":true},{"actual":"inbox-only","check":"trace banner-exposure-end then save-failure","expected":"recovery-banner","passed":false},{"actual":"repromoting","check":"trace save-success then show-banner-again","expected":"repromoting","passed":true},{"actual":"both","check":"trace show-banner-again then banner-mounted","expected":"both","passed":true},{"actual":"inbox-only","check":"trace banner-mounted then banner-exposure-end","expected":"inbox-only","passed":true},{"actual":{"phase":"saving","value":[]},"check":"domain state regression 1: inbox","expected":{"phase":"saving","value":[]},"passed":true},{"actual":{"phase":"both","value":["other","n"]},"check":"domain state regression 2: inbox","expected":{"phase":"both","value":["other","n"]},"passed":true},{"actual":{"phase":"inbox-only","value":["n"]},"check":"domain state regression 3: inbox","expected":{"phase":"inbox-only","value":["n"]},"passed":true},{"actual":{"phase":"inbox-only","value":false},"check":"domain state regression 4: banner","expected":{"phase":"inbox-only","value":false},"passed":true},{"actual":{"phase":"inbox-only","value":false},"check":"domain state regression 5: banner","expected":{"phase":"recovery-banner","value":true},"passed":false},{"actual":{"phase":"inbox-only","value":false},"check":"domain state regression 6: banner","expected":{"phase":"inbox-only","value":false},"passed":true},{"actual":{"phase":"inbox-only","value":false},"check":"domain state regression 7: banner","expected":{"phase":"inbox-only","value":false},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"banner / retain-in-inbox\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"saving / save-success\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"saving / save-failure\", \"actual\": \"save-error\", \"expected\": \"save-error\", \"passed\": true}, {\"check\": \"both / banner-exposure-end\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"save-error / retry-retention\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"saving / banner-exposure-end\", \"actual\": \"saving-without-banner\", \"expected\": \"saving-without-banner\", \"passed\": true}, {\"check\": \"saving-without-banner / save-success\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"saving-without-banner / save-failure\", \"actual\": \"inbox-only\", \"expected\": \"recovery-banner\", \"passed\": false}, {\"check\": \"inbox-only / show-banner-again\", \"actual\": \"repromoting\", \"expected\": \"repromoting\", \"passed\": true}, {\"check\": \"repromoting / banner-mounted\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"trace retain-in-inbox then save-success\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"trace retain-in-inbox then save-failure\", \"actual\": \"save-error\", \"expected\": \"save-error\", \"passed\": true}, {\"check\": \"trace retain-in-inbox then banner-exposure-end\", \"actual\": \"saving-without-banner\", \"expected\": \"saving-without-banner\", \"passed\": true}, {\"check\": \"trace save-success then banner-exposure-end\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"trace save-failure then retry-retention\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"trace banner-exposure-end then show-banner-again\", \"actual\": \"repromoting\", \"expected\": \"repromoting\", \"passed\": true}, {\"check\": \"trace retry-retention then save-success\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"trace retry-retention then save-failure\", \"actual\": \"save-error\", \"expected\": \"save-error\", \"passed\": true}, {\"check\": \"trace retry-retention then banner-exposure-end\", \"actual\": \"saving-without-banner\", \"expected\": \"saving-without-banner\", \"passed\": true}, {\"check\": \"trace banner-exposure-end then save-success\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"trace banner-exposure-end then save-failure\", \"actual\": \"inbox-only\", \"expected\": \"recovery-banner\", \"passed\": false}, {\"check\": \"trace save-success then show-banner-again\", \"actual\": \"repromoting\", \"expected\": \"repromoting\", \"passed\": true}, {\"check\": \"trace show-banner-again then banner-mounted\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"trace banner-mounted then banner-exposure-end\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"domain state regression 1: inbox\", \"actual\": {\"phase\": \"saving\", \"value\": []}, \"expected\": {\"phase\": \"saving\", \"value\": []}, \"passed\": true}, {\"check\": \"domain state regression 2: inbox\", \"actual\": {\"phase\": \"both\", \"value\": [\"other\", \"n\"]}, \"expected\": {\"phase\": \"both\", \"value\": [\"other\", \"n\"]}, \"passed\": true}, {\"check\": \"domain state regression 3: inbox\", \"actual\": {\"phase\": \"inbox-only\", \"value\": [\"n\"]}, \"expected\": {\"phase\": \"inbox-only\", \"value\": [\"n\"]}, \"passed\": true}, {\"check\": \"domain state regression 4: banner\", \"actual\": {\"phase\": \"inbox-only\", \"value\": false}, \"expected\": {\"phase\": \"inbox-only\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 5: banner\", \"actual\": {\"phase\": \"inbox-only\", \"value\": false}, \"expected\": {\"phase\": \"recovery-banner\", \"value\": true}, \"passed\": false}, {\"check\": \"domain state regression 6: banner\", \"actual\": {\"phase\": \"inbox-only\", \"value\": false}, \"expected\": {\"phase\": \"inbox-only\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 7: banner\", \"actual\": {\"phase\": \"inbox-only\", \"value\": false}, \"expected\": {\"phase\": \"inbox-only\", \"value\": false}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.302,"exit_code":1,"observations":[{"actual":"saving","check":"banner / retain-in-inbox","expected":"saving","passed":true},{"actual":"both","check":"saving / save-success","expected":"both","passed":true},{"actual":"save-error","check":"saving / save-failure","expected":"save-error","passed":true},{"actual":"inbox-only","check":"both / banner-exposure-end","expected":"inbox-only","passed":true},{"actual":"saving","check":"save-error / retry-retention","expected":"saving","passed":true},{"actual":"saving-without-banner","check":"saving / banner-exposure-end","expected":"saving-without-banner","passed":true},{"actual":"inbox-only","check":"saving-without-banner / save-success","expected":"inbox-only","passed":true},{"actual":"gone","check":"saving-without-banner / save-failure","expected":"recovery-banner","passed":false},{"actual":"repromoting","check":"inbox-only / show-banner-again","expected":"repromoting","passed":true},{"actual":"both","check":"repromoting / banner-mounted","expected":"both","passed":true},{"actual":"banner","check":"older notification incarnation","expected":"banner","passed":true},{"actual":"banner","check":"future notification incarnation","expected":"banner","passed":true},{"actual":"banner","check":"unknown event is inert","expected":"banner","passed":true},{"actual":"banner","check":"empty delivery batch","expected":"banner","passed":true},{"actual":"saving","check":"N stale deliveries before current delivery","expected":"saving","passed":true},{"actual":"both","check":"trace retain-in-inbox then save-success","expected":"both","passed":true},{"actual":"save-error","check":"trace retain-in-inbox then save-failure","expected":"save-error","passed":true},{"actual":"saving-without-banner","check":"trace retain-in-inbox then banner-exposure-end","expected":"saving-without-banner","passed":true},{"actual":"inbox-only","check":"trace save-success then banner-exposure-end","expected":"inbox-only","passed":true},{"actual":"saving","check":"trace save-failure then retry-retention","expected":"saving","passed":true},{"actual":"repromoting","check":"trace banner-exposure-end then show-banner-again","expected":"repromoting","passed":true},{"actual":"both","check":"trace retry-retention then save-success","expected":"both","passed":true},{"actual":"save-error","check":"trace retry-retention then save-failure","expected":"save-error","passed":true},{"actual":"saving-without-banner","check":"trace retry-retention then banner-exposure-end","expected":"saving-without-banner","passed":true},{"actual":"inbox-only","check":"trace banner-exposure-end then save-success","expected":"inbox-only","passed":true},{"actual":"gone","check":"trace banner-exposure-end then save-failure","expected":"recovery-banner","passed":false},{"actual":"repromoting","check":"trace save-success then show-banner-again","expected":"repromoting","passed":true},{"actual":"both","check":"trace show-banner-again then banner-mounted","expected":"both","passed":true},{"actual":"inbox-only","check":"trace banner-mounted then banner-exposure-end","expected":"inbox-only","passed":true},{"actual":{"phase":"saving","value":[]},"check":"domain state regression 1: inbox","expected":{"phase":"saving","value":[]},"passed":true},{"actual":{"phase":"both","value":["other","n"]},"check":"domain state regression 2: inbox","expected":{"phase":"both","value":["other","n"]},"passed":true},{"actual":{"phase":"inbox-only","value":["n"]},"check":"domain state regression 3: inbox","expected":{"phase":"inbox-only","value":["n"]},"passed":true},{"actual":{"phase":"inbox-only","value":false},"check":"domain state regression 4: banner","expected":{"phase":"inbox-only","value":false},"passed":true},{"actual":{"phase":"gone","value":false},"check":"domain state regression 5: banner","expected":{"phase":"recovery-banner","value":true},"passed":false},{"actual":{"phase":"inbox-only","value":false},"check":"domain state regression 6: banner","expected":{"phase":"inbox-only","value":false},"passed":true},{"actual":{"phase":"inbox-only","value":false},"check":"domain state regression 7: banner","expected":{"phase":"inbox-only","value":false},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"banner / retain-in-inbox\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"saving / save-success\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"saving / save-failure\", \"actual\": \"save-error\", \"expected\": \"save-error\", \"passed\": true}, {\"check\": \"both / banner-exposure-end\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"save-error / retry-retention\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"saving / banner-exposure-end\", \"actual\": \"saving-without-banner\", \"expected\": \"saving-without-banner\", \"passed\": true}, {\"check\": \"saving-without-banner / save-success\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"saving-without-banner / save-failure\", \"actual\": \"gone\", \"expected\": \"recovery-banner\", \"passed\": false}, {\"check\": \"inbox-only / show-banner-again\", \"actual\": \"repromoting\", \"expected\": \"repromoting\", \"passed\": true}, {\"check\": \"repromoting / banner-mounted\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"trace retain-in-inbox then save-success\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"trace retain-in-inbox then save-failure\", \"actual\": \"save-error\", \"expected\": \"save-error\", \"passed\": true}, {\"check\": \"trace retain-in-inbox then banner-exposure-end\", \"actual\": \"saving-without-banner\", \"expected\": \"saving-without-banner\", \"passed\": true}, {\"check\": \"trace save-success then banner-exposure-end\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"trace save-failure then retry-retention\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"trace banner-exposure-end then show-banner-again\", \"actual\": \"repromoting\", \"expected\": \"repromoting\", \"passed\": true}, {\"check\": \"trace retry-retention then save-success\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"trace retry-retention then save-failure\", \"actual\": \"save-error\", \"expected\": \"save-error\", \"passed\": true}, {\"check\": \"trace retry-retention then banner-exposure-end\", \"actual\": \"saving-without-banner\", \"expected\": \"saving-without-banner\", \"passed\": true}, {\"check\": \"trace banner-exposure-end then save-success\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"trace banner-exposure-end then save-failure\", \"actual\": \"gone\", \"expected\": \"recovery-banner\", \"passed\": false}, {\"check\": \"trace save-success then show-banner-again\", \"actual\": \"repromoting\", \"expected\": \"repromoting\", \"passed\": true}, {\"check\": \"trace show-banner-again then banner-mounted\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"trace banner-mounted then banner-exposure-end\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"domain state regression 1: inbox\", \"actual\": {\"phase\": \"saving\", \"value\": []}, \"expected\": {\"phase\": \"saving\", \"value\": []}, \"passed\": true}, {\"check\": \"domain state regression 2: inbox\", \"actual\": {\"phase\": \"both\", \"value\": [\"other\", \"n\"]}, \"expected\": {\"phase\": \"both\", \"value\": [\"other\", \"n\"]}, \"passed\": true}, {\"check\": \"domain state regression 3: inbox\", \"actual\": {\"phase\": \"inbox-only\", \"value\": [\"n\"]}, \"expected\": {\"phase\": \"inbox-only\", \"value\": [\"n\"]}, \"passed\": true}, {\"check\": \"domain state regression 4: banner\", \"actual\": {\"phase\": \"inbox-only\", \"value\": false}, \"expected\": {\"phase\": \"inbox-only\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 5: banner\", \"actual\": {\"phase\": \"gone\", \"value\": false}, \"expected\": {\"phase\": \"recovery-banner\", \"value\": true}, \"passed\": false}, {\"check\": \"domain state regression 6: banner\", \"actual\": {\"phase\": \"inbox-only\", \"value\": false}, \"expected\": {\"phase\": \"inbox-only\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 7: banner\", \"actual\": {\"phase\": \"inbox-only\", \"value\": false}, \"expected\": {\"phase\": \"inbox-only\", \"value\": false}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":45.631,"exit_code":0,"observations":[{"actual":"saving","check":"banner / retain-in-inbox","expected":"saving","passed":true},{"actual":"both","check":"saving / save-success","expected":"both","passed":true},{"actual":"save-error","check":"saving / save-failure","expected":"save-error","passed":true},{"actual":"inbox-only","check":"both / banner-exposure-end","expected":"inbox-only","passed":true},{"actual":"saving","check":"save-error / retry-retention","expected":"saving","passed":true},{"actual":"saving-without-banner","check":"saving / banner-exposure-end","expected":"saving-without-banner","passed":true},{"actual":"inbox-only","check":"saving-without-banner / save-success","expected":"inbox-only","passed":true},{"actual":"recovery-banner","check":"saving-without-banner / save-failure","expected":"recovery-banner","passed":true},{"actual":"repromoting","check":"inbox-only / show-banner-again","expected":"repromoting","passed":true},{"actual":"both","check":"repromoting / banner-mounted","expected":"both","passed":true},{"actual":"banner","check":"older notification incarnation","expected":"banner","passed":true},{"actual":"banner","check":"future notification incarnation","expected":"banner","passed":true},{"actual":"banner","check":"unknown event is inert","expected":"banner","passed":true},{"actual":"banner","check":"empty delivery batch","expected":"banner","passed":true},{"actual":"saving","check":"N stale deliveries before current delivery","expected":"saving","passed":true},{"actual":"both","check":"trace retain-in-inbox then save-success","expected":"both","passed":true},{"actual":"save-error","check":"trace retain-in-inbox then save-failure","expected":"save-error","passed":true},{"actual":"saving-without-banner","check":"trace retain-in-inbox then banner-exposure-end","expected":"saving-without-banner","passed":true},{"actual":"inbox-only","check":"trace save-success then banner-exposure-end","expected":"inbox-only","passed":true},{"actual":"saving","check":"trace save-failure then retry-retention","expected":"saving","passed":true},{"actual":"repromoting","check":"trace banner-exposure-end then show-banner-again","expected":"repromoting","passed":true},{"actual":"both","check":"trace retry-retention then save-success","expected":"both","passed":true},{"actual":"save-error","check":"trace retry-retention then save-failure","expected":"save-error","passed":true},{"actual":"saving-without-banner","check":"trace retry-retention then banner-exposure-end","expected":"saving-without-banner","passed":true},{"actual":"inbox-only","check":"trace banner-exposure-end then save-success","expected":"inbox-only","passed":true},{"actual":"recovery-banner","check":"trace banner-exposure-end then save-failure","expected":"recovery-banner","passed":true},{"actual":"repromoting","check":"trace save-success then show-banner-again","expected":"repromoting","passed":true},{"actual":"both","check":"trace show-banner-again then banner-mounted","expected":"both","passed":true},{"actual":"inbox-only","check":"trace banner-mounted then banner-exposure-end","expected":"inbox-only","passed":true},{"actual":{"phase":"saving","value":[]},"check":"domain state regression 1: inbox","expected":{"phase":"saving","value":[]},"passed":true},{"actual":{"phase":"both","value":["other","n"]},"check":"domain state regression 2: inbox","expected":{"phase":"both","value":["other","n"]},"passed":true},{"actual":{"phase":"inbox-only","value":["n"]},"check":"domain state regression 3: inbox","expected":{"phase":"inbox-only","value":["n"]},"passed":true},{"actual":{"phase":"inbox-only","value":false},"check":"domain state regression 4: banner","expected":{"phase":"inbox-only","value":false},"passed":true},{"actual":{"phase":"recovery-banner","value":true},"check":"domain state regression 5: banner","expected":{"phase":"recovery-banner","value":true},"passed":true},{"actual":{"phase":"inbox-only","value":false},"check":"domain state regression 6: banner","expected":{"phase":"inbox-only","value":false},"passed":true},{"actual":{"phase":"inbox-only","value":false},"check":"domain state regression 7: banner","expected":{"phase":"inbox-only","value":false},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"banner / retain-in-inbox\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"saving / save-success\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"saving / save-failure\", \"actual\": \"save-error\", \"expected\": \"save-error\", \"passed\": true}, {\"check\": \"both / banner-exposure-end\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"save-error / retry-retention\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"saving / banner-exposure-end\", \"actual\": \"saving-without-banner\", \"expected\": \"saving-without-banner\", \"passed\": true}, {\"check\": \"saving-without-banner / save-success\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"saving-without-banner / save-failure\", \"actual\": \"recovery-banner\", \"expected\": \"recovery-banner\", \"passed\": true}, {\"check\": \"inbox-only / show-banner-again\", \"actual\": \"repromoting\", \"expected\": \"repromoting\", \"passed\": true}, {\"check\": \"repromoting / banner-mounted\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"banner\", \"expected\": \"banner\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"trace retain-in-inbox then save-success\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"trace retain-in-inbox then save-failure\", \"actual\": \"save-error\", \"expected\": \"save-error\", \"passed\": true}, {\"check\": \"trace retain-in-inbox then banner-exposure-end\", \"actual\": \"saving-without-banner\", \"expected\": \"saving-without-banner\", \"passed\": true}, {\"check\": \"trace save-success then banner-exposure-end\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"trace save-failure then retry-retention\", \"actual\": \"saving\", \"expected\": \"saving\", \"passed\": true}, {\"check\": \"trace banner-exposure-end then show-banner-again\", \"actual\": \"repromoting\", \"expected\": \"repromoting\", \"passed\": true}, {\"check\": \"trace retry-retention then save-success\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"trace retry-retention then save-failure\", \"actual\": \"save-error\", \"expected\": \"save-error\", \"passed\": true}, {\"check\": \"trace retry-retention then banner-exposure-end\", \"actual\": \"saving-without-banner\", \"expected\": \"saving-without-banner\", \"passed\": true}, {\"check\": \"trace banner-exposure-end then save-success\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"trace banner-exposure-end then save-failure\", \"actual\": \"recovery-banner\", \"expected\": \"recovery-banner\", \"passed\": true}, {\"check\": \"trace save-success then show-banner-again\", \"actual\": \"repromoting\", \"expected\": \"repromoting\", \"passed\": true}, {\"check\": \"trace show-banner-again then banner-mounted\", \"actual\": \"both\", \"expected\": \"both\", \"passed\": true}, {\"check\": \"trace banner-mounted then banner-exposure-end\", \"actual\": \"inbox-only\", \"expected\": \"inbox-only\", \"passed\": true}, {\"check\": \"domain state regression 1: inbox\", \"actual\": {\"phase\": \"saving\", \"value\": []}, \"expected\": {\"phase\": \"saving\", \"value\": []}, \"passed\": true}, {\"check\": \"domain state regression 2: inbox\", \"actual\": {\"phase\": \"both\", \"value\": [\"other\", \"n\"]}, \"expected\": {\"phase\": \"both\", \"value\": [\"other\", \"n\"]}, \"passed\": true}, {\"check\": \"domain state regression 3: inbox\", \"actual\": {\"phase\": \"inbox-only\", \"value\": [\"n\"]}, \"expected\": {\"phase\": \"inbox-only\", \"value\": [\"n\"]}, \"passed\": true}, {\"check\": \"domain state regression 4: banner\", \"actual\": {\"phase\": \"inbox-only\", \"value\": false}, \"expected\": {\"phase\": \"inbox-only\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 5: banner\", \"actual\": {\"phase\": \"recovery-banner\", \"value\": true}, \"expected\": {\"phase\": \"recovery-banner\", \"value\": true}, \"passed\": true}, {\"check\": \"domain state regression 6: banner\", \"actual\": {\"phase\": \"inbox-only\", \"value\": false}, \"expected\": {\"phase\": \"inbox-only\", \"value\": false}, \"passed\": true}, {\"check\": \"domain state regression 7: banner\", \"actual\": {\"phase\": \"inbox-only\", \"value\": false}, \"expected\": {\"phase\": \"inbox-only\", \"value\": false}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}