{"abstract":"The report-success event leaves a notification in qualifying instead of counted.","category":"Notification interfaces","checks":42,"contract":"Notification visual impression qualification is a bounded visual-notification workflow with mutable policy state {'exposure': 0, 'required': 4, 'covered': False, 'reports': 0}. Its default transition relation is {('offscreen', 'enters-viewport'): 'qualifying', ('qualifying', 'exposure-satisfied'): 'reporting', ('qualifying', 'leaves-viewport'): 'offscreen', ('reporting', 'report-success'): 'counted', ('reporting', 'report-failure'): 'report-error', ('report-error', 'retry-report'): 'reporting', ('qualifying', 'covered-by-overlay'): 'occluded', ('occluded', 'overlay-removed'): 'qualifying', ('counted', 'reenter-viewport'): 'counted', ('reporting', 'leaves-viewport'): 'reporting'}; 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-impression","failed_approach":"Resetting offscreen loses the once-only impression marker.","family":"s3-notification-interfaces-impression-04","id":"FA-34906","implementations":{"attempt":{"sha256":"c0fe259586b9f354d1ffd0f63316d0df298259ba566c654d1cfb61f3f0258a10","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 = {('offscreen', 'enters-viewport'): 'qualifying', ('qualifying', 'exposure-satisfied'): 'reporting', ('qualifying', 'leaves-viewport'): 'offscreen', ('reporting', 'report-success'): 'offscreen', ('reporting', 'report-failure'): 'report-error', ('report-error', 'retry-report'): 'reporting', ('qualifying', 'covered-by-overlay'): 'occluded', ('occluded', 'overlay-removed'): 'qualifying', ('counted', 'reenter-viewport'): 'counted', ('reporting', 'leaves-viewport'): 'reporting'}\n    data = json.loads(json.dumps({'exposure': 0, 'required': 4, 'covered': False, 'reports': 0})) if payload is None else {**json.loads(json.dumps({'exposure': 0, 'required': 4, 'covered': False, 'reports': 0})), **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 == 'covered-by-overlay': data['covered'] = True\n            if event == 'overlay-removed':\n                data['covered'] = False\n                data['exposure'] = 0\n            if event == 'exposure-satisfied':\n                if not data['covered']: data['exposure'] += max(0,arg.get('elapsed',data['required']))\n                if data['exposure'] < data['required'] or data['covered']: event = 'unknown-event'\n            if event == 'leaves-viewport' and state == 'qualifying': data['exposure'] = 0\n            state = table.get((state, event), state)\n            if state == 'counted' and previous != 'counted': data['reports'] += 1\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('offscreen / enters-viewport', solve('offscreen', [('enters-viewport', N)], N), 'qualifying')\ncheck('qualifying / exposure-satisfied', solve('qualifying', [('exposure-satisfied', N)], N), 'reporting')\ncheck('qualifying / leaves-viewport', solve('qualifying', [('leaves-viewport', N)], N), 'offscreen')\ncheck('reporting / report-success', solve('reporting', [('report-success', N)], N), 'counted')\ncheck('reporting / report-failure', solve('reporting', [('report-failure', N)], N), 'report-error')\ncheck('report-error / retry-report', solve('report-error', [('retry-report', N)], N), 'reporting')\ncheck('qualifying / covered-by-overlay', solve('qualifying', [('covered-by-overlay', N)], N), 'occluded')\ncheck('occluded / overlay-removed', solve('occluded', [('overlay-removed', N)], N), 'qualifying')\ncheck('counted / reenter-viewport', solve('counted', [('reenter-viewport', N)], N), 'counted')\ncheck('reporting / leaves-viewport', solve('reporting', [('leaves-viewport', N)], N), 'reporting')\ncheck('older notification incarnation', solve('offscreen', [('enters-viewport', N - 1)], N), 'offscreen')\ncheck('future notification incarnation', solve('offscreen', [('enters-viewport', N + 1)], N), 'offscreen')\ncheck('unknown event is inert', solve('offscreen', [('unknown-event', N)], N), 'offscreen')\ncheck('empty delivery batch', solve('offscreen', [], N), 'offscreen')\ncheck('N stale deliveries before current delivery', solve('offscreen', [('enters-viewport', N - 1)] * N + [('enters-viewport', N)], N), 'qualifying')\ncheck('trace enters-viewport then exposure-satisfied', solve('offscreen', [('enters-viewport', N), ('exposure-satisfied', N)], N), 'reporting')\ncheck('trace enters-viewport then leaves-viewport', solve('offscreen', [('enters-viewport', N), ('leaves-viewport', N)], N), 'offscreen')\ncheck('trace enters-viewport then covered-by-overlay', solve('offscreen', [('enters-viewport', N), ('covered-by-overlay', N)], N), 'occluded')\ncheck('trace exposure-satisfied then report-success', solve('qualifying', [('exposure-satisfied', N), ('report-success', N)], N), 'counted')\ncheck('trace exposure-satisfied then report-failure', solve('qualifying', [('exposure-satisfied', N), ('report-failure', N)], N), 'report-error')\ncheck('trace exposure-satisfied then leaves-viewport', solve('qualifying', [('exposure-satisfied', N), ('leaves-viewport', N)], N), 'reporting')\ncheck('trace leaves-viewport then enters-viewport', solve('qualifying', [('leaves-viewport', N), ('enters-viewport', N)], N), 'qualifying')\ncheck('trace report-success then reenter-viewport', solve('reporting', [('report-success', N), ('reenter-viewport', N)], N), 'counted')\ncheck('trace report-failure then retry-report', solve('reporting', [('report-failure', N), ('retry-report', N)], N), 'reporting')\ncheck('trace retry-report then report-success', solve('report-error', [('retry-report', N), ('report-success', N)], N), 'counted')\ncheck('trace retry-report then report-failure', solve('report-error', [('retry-report', N), ('report-failure', N)], N), 'report-error')\ncheck('trace retry-report then leaves-viewport', solve('report-error', [('retry-report', N), ('leaves-viewport', N)], N), 'reporting')\ncheck('trace covered-by-overlay then overlay-removed', solve('qualifying', [('covered-by-overlay', N), ('overlay-removed', N)], N), 'qualifying')\ncheck('trace overlay-removed then exposure-satisfied', solve('occluded', [('overlay-removed', N), ('exposure-satisfied', N)], N), 'reporting')\ncheck('trace overlay-removed then leaves-viewport', solve('occluded', [('overlay-removed', N), ('leaves-viewport', N)], N), 'offscreen')\ncheck('trace overlay-removed then covered-by-overlay', solve('occluded', [('overlay-removed', N), ('covered-by-overlay', N)], N), 'occluded')\ncheck('trace reenter-viewport then reenter-viewport', solve('counted', [('reenter-viewport', N), ('reenter-viewport', N)], N), 'counted')\ncheck('trace leaves-viewport then report-success', solve('reporting', [('leaves-viewport', N), ('report-success', N)], N), 'counted')\ncheck('trace leaves-viewport then report-failure', solve('reporting', [('leaves-viewport', N), ('report-failure', N)], N), 'report-error')\ncheck('trace leaves-viewport then leaves-viewport', solve('reporting', [('leaves-viewport', N), ('leaves-viewport', N)], N), 'reporting')\ncheck('domain state regression 1: exposure', solve('qualifying', [('exposure-satisfied', N, {'elapsed': 3})], N, {}, 'exposure'), {'phase': 'qualifying', 'value': 3})\ncheck('domain state regression 2: exposure', solve('qualifying', [('exposure-satisfied', N, {'elapsed': 4})], N, {}, 'exposure'), {'phase': 'reporting', 'value': 4})\ncheck('domain state regression 3: exposure', solve('qualifying', [('exposure-satisfied', N, {'elapsed': 9})], N, {'covered': True}, 'exposure'), {'phase': 'qualifying', 'value': 0})\ncheck('domain state regression 4: exposure', solve('occluded', [('overlay-removed', N, {})], N, {'exposure': 3, 'covered': True}, 'exposure'), {'phase': 'qualifying', 'value': 0})\ncheck('domain state regression 5: exposure', solve('qualifying', [('leaves-viewport', N, {})], N, {'exposure': 3}, 'exposure'), {'phase': 'offscreen', 'value': 0})\ncheck('domain state regression 6: reports', solve('counted', [('reenter-viewport', N, {})], N, {'reports': 1}, 'reports'), {'phase': 'counted', 'value': 1})\ncheck('domain state regression 7: exposure', solve('offscreen', [('enters-viewport', N, {}), ('exposure-satisfied', N, {'elapsed': 3}), ('covered-by-overlay', N, {}), ('overlay-removed', N, {}), ('exposure-satisfied', N, {'elapsed': 3})], N, {}, 'exposure'), {'phase': 'qualifying', 'value': 3})\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"87090034003967dd292f48b58b73233970bb6cbef48941e8170fba4ea9ba9217","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 = {('offscreen', 'enters-viewport'): 'qualifying', ('qualifying', 'exposure-satisfied'): 'reporting', ('qualifying', 'leaves-viewport'): 'offscreen', ('reporting', 'report-success'): 'qualifying', ('reporting', 'report-failure'): 'report-error', ('report-error', 'retry-report'): 'reporting', ('qualifying', 'covered-by-overlay'): 'occluded', ('occluded', 'overlay-removed'): 'qualifying', ('counted', 'reenter-viewport'): 'counted', ('reporting', 'leaves-viewport'): 'reporting'}\n    data = json.loads(json.dumps({'exposure': 0, 'required': 4, 'covered': False, 'reports': 0})) if payload is None else {**json.loads(json.dumps({'exposure': 0, 'required': 4, 'covered': False, 'reports': 0})), **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 == 'covered-by-overlay': data['covered'] = True\n            if event == 'overlay-removed':\n                data['covered'] = False\n                data['exposure'] = 0\n            if event == 'exposure-satisfied':\n                if not data['covered']: data['exposure'] += max(0,arg.get('elapsed',data['required']))\n                if data['exposure'] < data['required'] or data['covered']: event = 'unknown-event'\n            if event == 'leaves-viewport' and state == 'qualifying': data['exposure'] = 0\n            state = table.get((state, event), state)\n            if state == 'counted' and previous != 'counted': data['reports'] += 1\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('offscreen / enters-viewport', solve('offscreen', [('enters-viewport', N)], N), 'qualifying')\ncheck('qualifying / exposure-satisfied', solve('qualifying', [('exposure-satisfied', N)], N), 'reporting')\ncheck('qualifying / leaves-viewport', solve('qualifying', [('leaves-viewport', N)], N), 'offscreen')\ncheck('reporting / report-success', solve('reporting', [('report-success', N)], N), 'counted')\ncheck('reporting / report-failure', solve('reporting', [('report-failure', N)], N), 'report-error')\ncheck('report-error / retry-report', solve('report-error', [('retry-report', N)], N), 'reporting')\ncheck('qualifying / covered-by-overlay', solve('qualifying', [('covered-by-overlay', N)], N), 'occluded')\ncheck('occluded / overlay-removed', solve('occluded', [('overlay-removed', N)], N), 'qualifying')\ncheck('counted / reenter-viewport', solve('counted', [('reenter-viewport', N)], N), 'counted')\ncheck('reporting / leaves-viewport', solve('reporting', [('leaves-viewport', N)], N), 'reporting')\ncheck('older notification incarnation', solve('offscreen', [('enters-viewport', N - 1)], N), 'offscreen')\ncheck('future notification incarnation', solve('offscreen', [('enters-viewport', N + 1)], N), 'offscreen')\ncheck('unknown event is inert', solve('offscreen', [('unknown-event', N)], N), 'offscreen')\ncheck('empty delivery batch', solve('offscreen', [], N), 'offscreen')\ncheck('N stale deliveries before current delivery', solve('offscreen', [('enters-viewport', N - 1)] * N + [('enters-viewport', N)], N), 'qualifying')\ncheck('trace enters-viewport then exposure-satisfied', solve('offscreen', [('enters-viewport', N), ('exposure-satisfied', N)], N), 'reporting')\ncheck('trace enters-viewport then leaves-viewport', solve('offscreen', [('enters-viewport', N), ('leaves-viewport', N)], N), 'offscreen')\ncheck('trace enters-viewport then covered-by-overlay', solve('offscreen', [('enters-viewport', N), ('covered-by-overlay', N)], N), 'occluded')\ncheck('trace exposure-satisfied then report-success', solve('qualifying', [('exposure-satisfied', N), ('report-success', N)], N), 'counted')\ncheck('trace exposure-satisfied then report-failure', solve('qualifying', [('exposure-satisfied', N), ('report-failure', N)], N), 'report-error')\ncheck('trace exposure-satisfied then leaves-viewport', solve('qualifying', [('exposure-satisfied', N), ('leaves-viewport', N)], N), 'reporting')\ncheck('trace leaves-viewport then enters-viewport', solve('qualifying', [('leaves-viewport', N), ('enters-viewport', N)], N), 'qualifying')\ncheck('trace report-success then reenter-viewport', solve('reporting', [('report-success', N), ('reenter-viewport', N)], N), 'counted')\ncheck('trace report-failure then retry-report', solve('reporting', [('report-failure', N), ('retry-report', N)], N), 'reporting')\ncheck('trace retry-report then report-success', solve('report-error', [('retry-report', N), ('report-success', N)], N), 'counted')\ncheck('trace retry-report then report-failure', solve('report-error', [('retry-report', N), ('report-failure', N)], N), 'report-error')\ncheck('trace retry-report then leaves-viewport', solve('report-error', [('retry-report', N), ('leaves-viewport', N)], N), 'reporting')\ncheck('trace covered-by-overlay then overlay-removed', solve('qualifying', [('covered-by-overlay', N), ('overlay-removed', N)], N), 'qualifying')\ncheck('trace overlay-removed then exposure-satisfied', solve('occluded', [('overlay-removed', N), ('exposure-satisfied', N)], N), 'reporting')\ncheck('trace overlay-removed then leaves-viewport', solve('occluded', [('overlay-removed', N), ('leaves-viewport', N)], N), 'offscreen')\ncheck('trace overlay-removed then covered-by-overlay', solve('occluded', [('overlay-removed', N), ('covered-by-overlay', N)], N), 'occluded')\ncheck('trace reenter-viewport then reenter-viewport', solve('counted', [('reenter-viewport', N), ('reenter-viewport', N)], N), 'counted')\ncheck('trace leaves-viewport then report-success', solve('reporting', [('leaves-viewport', N), ('report-success', N)], N), 'counted')\ncheck('trace leaves-viewport then report-failure', solve('reporting', [('leaves-viewport', N), ('report-failure', N)], N), 'report-error')\ncheck('trace leaves-viewport then leaves-viewport', solve('reporting', [('leaves-viewport', N), ('leaves-viewport', N)], N), 'reporting')\ncheck('domain state regression 1: exposure', solve('qualifying', [('exposure-satisfied', N, {'elapsed': 3})], N, {}, 'exposure'), {'phase': 'qualifying', 'value': 3})\ncheck('domain state regression 2: exposure', solve('qualifying', [('exposure-satisfied', N, {'elapsed': 4})], N, {}, 'exposure'), {'phase': 'reporting', 'value': 4})\ncheck('domain state regression 3: exposure', solve('qualifying', [('exposure-satisfied', N, {'elapsed': 9})], N, {'covered': True}, 'exposure'), {'phase': 'qualifying', 'value': 0})\ncheck('domain state regression 4: exposure', solve('occluded', [('overlay-removed', N, {})], N, {'exposure': 3, 'covered': True}, 'exposure'), {'phase': 'qualifying', 'value': 0})\ncheck('domain state regression 5: exposure', solve('qualifying', [('leaves-viewport', N, {})], N, {'exposure': 3}, 'exposure'), {'phase': 'offscreen', 'value': 0})\ncheck('domain state regression 6: reports', solve('counted', [('reenter-viewport', N, {})], N, {'reports': 1}, 'reports'), {'phase': 'counted', 'value': 1})\ncheck('domain state regression 7: exposure', solve('offscreen', [('enters-viewport', N, {}), ('exposure-satisfied', N, {'elapsed': 3}), ('covered-by-overlay', N, {}), ('overlay-removed', N, {}), ('exposure-satisfied', N, {'elapsed': 3})], N, {}, 'exposure'), {'phase': 'qualifying', 'value': 3})\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"196bac85febf38fb32abfc36b1d452a00fcff79f6637809b3c8262dd0f5d6002","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 = {('offscreen', 'enters-viewport'): 'qualifying', ('qualifying', 'exposure-satisfied'): 'reporting', ('qualifying', 'leaves-viewport'): 'offscreen', ('reporting', 'report-success'): 'counted', ('reporting', 'report-failure'): 'report-error', ('report-error', 'retry-report'): 'reporting', ('qualifying', 'covered-by-overlay'): 'occluded', ('occluded', 'overlay-removed'): 'qualifying', ('counted', 'reenter-viewport'): 'counted', ('reporting', 'leaves-viewport'): 'reporting'}\n    data = json.loads(json.dumps({'exposure': 0, 'required': 4, 'covered': False, 'reports': 0})) if payload is None else {**json.loads(json.dumps({'exposure': 0, 'required': 4, 'covered': False, 'reports': 0})), **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 == 'covered-by-overlay': data['covered'] = True\n            if event == 'overlay-removed':\n                data['covered'] = False\n                data['exposure'] = 0\n            if event == 'exposure-satisfied':\n                if not data['covered']: data['exposure'] += max(0,arg.get('elapsed',data['required']))\n                if data['exposure'] < data['required'] or data['covered']: event = 'unknown-event'\n            if event == 'leaves-viewport' and state == 'qualifying': data['exposure'] = 0\n            state = table.get((state, event), state)\n            if state == 'counted' and previous != 'counted': data['reports'] += 1\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('offscreen / enters-viewport', solve('offscreen', [('enters-viewport', N)], N), 'qualifying')\ncheck('qualifying / exposure-satisfied', solve('qualifying', [('exposure-satisfied', N)], N), 'reporting')\ncheck('qualifying / leaves-viewport', solve('qualifying', [('leaves-viewport', N)], N), 'offscreen')\ncheck('reporting / report-success', solve('reporting', [('report-success', N)], N), 'counted')\ncheck('reporting / report-failure', solve('reporting', [('report-failure', N)], N), 'report-error')\ncheck('report-error / retry-report', solve('report-error', [('retry-report', N)], N), 'reporting')\ncheck('qualifying / covered-by-overlay', solve('qualifying', [('covered-by-overlay', N)], N), 'occluded')\ncheck('occluded / overlay-removed', solve('occluded', [('overlay-removed', N)], N), 'qualifying')\ncheck('counted / reenter-viewport', solve('counted', [('reenter-viewport', N)], N), 'counted')\ncheck('reporting / leaves-viewport', solve('reporting', [('leaves-viewport', N)], N), 'reporting')\ncheck('older notification incarnation', solve('offscreen', [('enters-viewport', N - 1)], N), 'offscreen')\ncheck('future notification incarnation', solve('offscreen', [('enters-viewport', N + 1)], N), 'offscreen')\ncheck('unknown event is inert', solve('offscreen', [('unknown-event', N)], N), 'offscreen')\ncheck('empty delivery batch', solve('offscreen', [], N), 'offscreen')\ncheck('N stale deliveries before current delivery', solve('offscreen', [('enters-viewport', N - 1)] * N + [('enters-viewport', N)], N), 'qualifying')\ncheck('trace enters-viewport then exposure-satisfied', solve('offscreen', [('enters-viewport', N), ('exposure-satisfied', N)], N), 'reporting')\ncheck('trace enters-viewport then leaves-viewport', solve('offscreen', [('enters-viewport', N), ('leaves-viewport', N)], N), 'offscreen')\ncheck('trace enters-viewport then covered-by-overlay', solve('offscreen', [('enters-viewport', N), ('covered-by-overlay', N)], N), 'occluded')\ncheck('trace exposure-satisfied then report-success', solve('qualifying', [('exposure-satisfied', N), ('report-success', N)], N), 'counted')\ncheck('trace exposure-satisfied then report-failure', solve('qualifying', [('exposure-satisfied', N), ('report-failure', N)], N), 'report-error')\ncheck('trace exposure-satisfied then leaves-viewport', solve('qualifying', [('exposure-satisfied', N), ('leaves-viewport', N)], N), 'reporting')\ncheck('trace leaves-viewport then enters-viewport', solve('qualifying', [('leaves-viewport', N), ('enters-viewport', N)], N), 'qualifying')\ncheck('trace report-success then reenter-viewport', solve('reporting', [('report-success', N), ('reenter-viewport', N)], N), 'counted')\ncheck('trace report-failure then retry-report', solve('reporting', [('report-failure', N), ('retry-report', N)], N), 'reporting')\ncheck('trace retry-report then report-success', solve('report-error', [('retry-report', N), ('report-success', N)], N), 'counted')\ncheck('trace retry-report then report-failure', solve('report-error', [('retry-report', N), ('report-failure', N)], N), 'report-error')\ncheck('trace retry-report then leaves-viewport', solve('report-error', [('retry-report', N), ('leaves-viewport', N)], N), 'reporting')\ncheck('trace covered-by-overlay then overlay-removed', solve('qualifying', [('covered-by-overlay', N), ('overlay-removed', N)], N), 'qualifying')\ncheck('trace overlay-removed then exposure-satisfied', solve('occluded', [('overlay-removed', N), ('exposure-satisfied', N)], N), 'reporting')\ncheck('trace overlay-removed then leaves-viewport', solve('occluded', [('overlay-removed', N), ('leaves-viewport', N)], N), 'offscreen')\ncheck('trace overlay-removed then covered-by-overlay', solve('occluded', [('overlay-removed', N), ('covered-by-overlay', N)], N), 'occluded')\ncheck('trace reenter-viewport then reenter-viewport', solve('counted', [('reenter-viewport', N), ('reenter-viewport', N)], N), 'counted')\ncheck('trace leaves-viewport then report-success', solve('reporting', [('leaves-viewport', N), ('report-success', N)], N), 'counted')\ncheck('trace leaves-viewport then report-failure', solve('reporting', [('leaves-viewport', N), ('report-failure', N)], N), 'report-error')\ncheck('trace leaves-viewport then leaves-viewport', solve('reporting', [('leaves-viewport', N), ('leaves-viewport', N)], N), 'reporting')\ncheck('domain state regression 1: exposure', solve('qualifying', [('exposure-satisfied', N, {'elapsed': 3})], N, {}, 'exposure'), {'phase': 'qualifying', 'value': 3})\ncheck('domain state regression 2: exposure', solve('qualifying', [('exposure-satisfied', N, {'elapsed': 4})], N, {}, 'exposure'), {'phase': 'reporting', 'value': 4})\ncheck('domain state regression 3: exposure', solve('qualifying', [('exposure-satisfied', N, {'elapsed': 9})], N, {'covered': True}, 'exposure'), {'phase': 'qualifying', 'value': 0})\ncheck('domain state regression 4: exposure', solve('occluded', [('overlay-removed', N, {})], N, {'exposure': 3, 'covered': True}, 'exposure'), {'phase': 'qualifying', 'value': 0})\ncheck('domain state regression 5: exposure', solve('qualifying', [('leaves-viewport', N, {})], N, {'exposure': 3}, 'exposure'), {'phase': 'offscreen', 'value': 0})\ncheck('domain state regression 6: reports', solve('counted', [('reenter-viewport', N, {})], N, {'reports': 1}, 'reports'), {'phase': 'counted', 'value': 1})\ncheck('domain state regression 7: exposure', solve('offscreen', [('enters-viewport', N, {}), ('exposure-satisfied', N, {'elapsed': 3}), ('covered-by-overlay', N, {}), ('overlay-removed', N, {}), ('exposure-satisfied', N, {'elapsed': 3})], N, {}, 'exposure'), {'phase': 'qualifying', 'value': 3})\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"Stipulated single-notification state and policy model only. Event delivery and acknowledgements are explicit test inputs. No DOM, accessibility announcements, live timers, networking, actual rendering, or production-platform conformance is simulated. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"s3-notification-interfaces-impression-04","generated_at":"2026-09-29T14:42:36.443074+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 reporting / report-success transition to counted; preserve the other explicitly stipulated transitions.","root_cause":"Successful reporting restarts exposure qualification and can count twice.","sha256":"a1c9ccb3253f8db97f4a696079b2785425f58950f9dec401a367b5d2c11b0fed","title":"Notification visual impression qualification: report-success from reporting · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.372,"exit_code":1,"observations":[{"actual":"qualifying","check":"offscreen / enters-viewport","expected":"qualifying","passed":true},{"actual":"reporting","check":"qualifying / exposure-satisfied","expected":"reporting","passed":true},{"actual":"offscreen","check":"qualifying / leaves-viewport","expected":"offscreen","passed":true},{"actual":"offscreen","check":"reporting / report-success","expected":"counted","passed":false},{"actual":"report-error","check":"reporting / report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"report-error / retry-report","expected":"reporting","passed":true},{"actual":"occluded","check":"qualifying / covered-by-overlay","expected":"occluded","passed":true},{"actual":"qualifying","check":"occluded / overlay-removed","expected":"qualifying","passed":true},{"actual":"counted","check":"counted / reenter-viewport","expected":"counted","passed":true},{"actual":"reporting","check":"reporting / leaves-viewport","expected":"reporting","passed":true},{"actual":"offscreen","check":"older notification incarnation","expected":"offscreen","passed":true},{"actual":"offscreen","check":"future notification incarnation","expected":"offscreen","passed":true},{"actual":"offscreen","check":"unknown event is inert","expected":"offscreen","passed":true},{"actual":"offscreen","check":"empty delivery batch","expected":"offscreen","passed":true},{"actual":"qualifying","check":"N stale deliveries before current delivery","expected":"qualifying","passed":true},{"actual":"reporting","check":"trace enters-viewport then exposure-satisfied","expected":"reporting","passed":true},{"actual":"offscreen","check":"trace enters-viewport then leaves-viewport","expected":"offscreen","passed":true},{"actual":"occluded","check":"trace enters-viewport then covered-by-overlay","expected":"occluded","passed":true},{"actual":"offscreen","check":"trace exposure-satisfied then report-success","expected":"counted","passed":false},{"actual":"report-error","check":"trace exposure-satisfied then report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"trace exposure-satisfied then leaves-viewport","expected":"reporting","passed":true},{"actual":"qualifying","check":"trace leaves-viewport then enters-viewport","expected":"qualifying","passed":true},{"actual":"offscreen","check":"trace report-success then reenter-viewport","expected":"counted","passed":false},{"actual":"reporting","check":"trace report-failure then retry-report","expected":"reporting","passed":true},{"actual":"offscreen","check":"trace retry-report then report-success","expected":"counted","passed":false},{"actual":"report-error","check":"trace retry-report then report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"trace retry-report then leaves-viewport","expected":"reporting","passed":true},{"actual":"qualifying","check":"trace covered-by-overlay then overlay-removed","expected":"qualifying","passed":true},{"actual":"reporting","check":"trace overlay-removed then exposure-satisfied","expected":"reporting","passed":true},{"actual":"offscreen","check":"trace overlay-removed then leaves-viewport","expected":"offscreen","passed":true},{"actual":"occluded","check":"trace overlay-removed then covered-by-overlay","expected":"occluded","passed":true},{"actual":"counted","check":"trace reenter-viewport then reenter-viewport","expected":"counted","passed":true},{"actual":"offscreen","check":"trace leaves-viewport then report-success","expected":"counted","passed":false},{"actual":"report-error","check":"trace leaves-viewport then report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"trace leaves-viewport then leaves-viewport","expected":"reporting","passed":true},{"actual":{"phase":"qualifying","value":3},"check":"domain state regression 1: exposure","expected":{"phase":"qualifying","value":3},"passed":true},{"actual":{"phase":"reporting","value":4},"check":"domain state regression 2: exposure","expected":{"phase":"reporting","value":4},"passed":true},{"actual":{"phase":"qualifying","value":0},"check":"domain state regression 3: exposure","expected":{"phase":"qualifying","value":0},"passed":true},{"actual":{"phase":"qualifying","value":0},"check":"domain state regression 4: exposure","expected":{"phase":"qualifying","value":0},"passed":true},{"actual":{"phase":"offscreen","value":0},"check":"domain state regression 5: exposure","expected":{"phase":"offscreen","value":0},"passed":true},{"actual":{"phase":"counted","value":1},"check":"domain state regression 6: reports","expected":{"phase":"counted","value":1},"passed":true},{"actual":{"phase":"qualifying","value":3},"check":"domain state regression 7: exposure","expected":{"phase":"qualifying","value":3},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"offscreen / enters-viewport\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"qualifying / exposure-satisfied\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"qualifying / leaves-viewport\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"reporting / report-success\", \"actual\": \"offscreen\", \"expected\": \"counted\", \"passed\": false}, {\"check\": \"reporting / report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"report-error / retry-report\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"qualifying / covered-by-overlay\", \"actual\": \"occluded\", \"expected\": \"occluded\", \"passed\": true}, {\"check\": \"occluded / overlay-removed\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"counted / reenter-viewport\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"reporting / leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"trace enters-viewport then exposure-satisfied\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace enters-viewport then leaves-viewport\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"trace enters-viewport then covered-by-overlay\", \"actual\": \"occluded\", \"expected\": \"occluded\", \"passed\": true}, {\"check\": \"trace exposure-satisfied then report-success\", \"actual\": \"offscreen\", \"expected\": \"counted\", \"passed\": false}, {\"check\": \"trace exposure-satisfied then report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"trace exposure-satisfied then leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace leaves-viewport then enters-viewport\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"trace report-success then reenter-viewport\", \"actual\": \"offscreen\", \"expected\": \"counted\", \"passed\": false}, {\"check\": \"trace report-failure then retry-report\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace retry-report then report-success\", \"actual\": \"offscreen\", \"expected\": \"counted\", \"passed\": false}, {\"check\": \"trace retry-report then report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"trace retry-report then leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace covered-by-overlay then overlay-removed\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"trace overlay-removed then exposure-satisfied\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace overlay-removed then leaves-viewport\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"trace overlay-removed then covered-by-overlay\", \"actual\": \"occluded\", \"expected\": \"occluded\", \"passed\": true}, {\"check\": \"trace reenter-viewport then reenter-viewport\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"trace leaves-viewport then report-success\", \"actual\": \"offscreen\", \"expected\": \"counted\", \"passed\": false}, {\"check\": \"trace leaves-viewport then report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"trace leaves-viewport then leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"domain state regression 1: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 3}, \"expected\": {\"phase\": \"qualifying\", \"value\": 3}, \"passed\": true}, {\"check\": \"domain state regression 2: exposure\", \"actual\": {\"phase\": \"reporting\", \"value\": 4}, \"expected\": {\"phase\": \"reporting\", \"value\": 4}, \"passed\": true}, {\"check\": \"domain state regression 3: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 0}, \"expected\": {\"phase\": \"qualifying\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 4: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 0}, \"expected\": {\"phase\": \"qualifying\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 5: exposure\", \"actual\": {\"phase\": \"offscreen\", \"value\": 0}, \"expected\": {\"phase\": \"offscreen\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 6: reports\", \"actual\": {\"phase\": \"counted\", \"value\": 1}, \"expected\": {\"phase\": \"counted\", \"value\": 1}, \"passed\": true}, {\"check\": \"domain state regression 7: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 3}, \"expected\": {\"phase\": \"qualifying\", \"value\": 3}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.132,"exit_code":1,"observations":[{"actual":"qualifying","check":"offscreen / enters-viewport","expected":"qualifying","passed":true},{"actual":"reporting","check":"qualifying / exposure-satisfied","expected":"reporting","passed":true},{"actual":"offscreen","check":"qualifying / leaves-viewport","expected":"offscreen","passed":true},{"actual":"qualifying","check":"reporting / report-success","expected":"counted","passed":false},{"actual":"report-error","check":"reporting / report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"report-error / retry-report","expected":"reporting","passed":true},{"actual":"occluded","check":"qualifying / covered-by-overlay","expected":"occluded","passed":true},{"actual":"qualifying","check":"occluded / overlay-removed","expected":"qualifying","passed":true},{"actual":"counted","check":"counted / reenter-viewport","expected":"counted","passed":true},{"actual":"reporting","check":"reporting / leaves-viewport","expected":"reporting","passed":true},{"actual":"offscreen","check":"older notification incarnation","expected":"offscreen","passed":true},{"actual":"offscreen","check":"future notification incarnation","expected":"offscreen","passed":true},{"actual":"offscreen","check":"unknown event is inert","expected":"offscreen","passed":true},{"actual":"offscreen","check":"empty delivery batch","expected":"offscreen","passed":true},{"actual":"qualifying","check":"N stale deliveries before current delivery","expected":"qualifying","passed":true},{"actual":"reporting","check":"trace enters-viewport then exposure-satisfied","expected":"reporting","passed":true},{"actual":"offscreen","check":"trace enters-viewport then leaves-viewport","expected":"offscreen","passed":true},{"actual":"occluded","check":"trace enters-viewport then covered-by-overlay","expected":"occluded","passed":true},{"actual":"qualifying","check":"trace exposure-satisfied then report-success","expected":"counted","passed":false},{"actual":"report-error","check":"trace exposure-satisfied then report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"trace exposure-satisfied then leaves-viewport","expected":"reporting","passed":true},{"actual":"qualifying","check":"trace leaves-viewport then enters-viewport","expected":"qualifying","passed":true},{"actual":"qualifying","check":"trace report-success then reenter-viewport","expected":"counted","passed":false},{"actual":"reporting","check":"trace report-failure then retry-report","expected":"reporting","passed":true},{"actual":"qualifying","check":"trace retry-report then report-success","expected":"counted","passed":false},{"actual":"report-error","check":"trace retry-report then report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"trace retry-report then leaves-viewport","expected":"reporting","passed":true},{"actual":"qualifying","check":"trace covered-by-overlay then overlay-removed","expected":"qualifying","passed":true},{"actual":"reporting","check":"trace overlay-removed then exposure-satisfied","expected":"reporting","passed":true},{"actual":"offscreen","check":"trace overlay-removed then leaves-viewport","expected":"offscreen","passed":true},{"actual":"occluded","check":"trace overlay-removed then covered-by-overlay","expected":"occluded","passed":true},{"actual":"counted","check":"trace reenter-viewport then reenter-viewport","expected":"counted","passed":true},{"actual":"qualifying","check":"trace leaves-viewport then report-success","expected":"counted","passed":false},{"actual":"report-error","check":"trace leaves-viewport then report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"trace leaves-viewport then leaves-viewport","expected":"reporting","passed":true},{"actual":{"phase":"qualifying","value":3},"check":"domain state regression 1: exposure","expected":{"phase":"qualifying","value":3},"passed":true},{"actual":{"phase":"reporting","value":4},"check":"domain state regression 2: exposure","expected":{"phase":"reporting","value":4},"passed":true},{"actual":{"phase":"qualifying","value":0},"check":"domain state regression 3: exposure","expected":{"phase":"qualifying","value":0},"passed":true},{"actual":{"phase":"qualifying","value":0},"check":"domain state regression 4: exposure","expected":{"phase":"qualifying","value":0},"passed":true},{"actual":{"phase":"offscreen","value":0},"check":"domain state regression 5: exposure","expected":{"phase":"offscreen","value":0},"passed":true},{"actual":{"phase":"counted","value":1},"check":"domain state regression 6: reports","expected":{"phase":"counted","value":1},"passed":true},{"actual":{"phase":"qualifying","value":3},"check":"domain state regression 7: exposure","expected":{"phase":"qualifying","value":3},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"offscreen / enters-viewport\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"qualifying / exposure-satisfied\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"qualifying / leaves-viewport\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"reporting / report-success\", \"actual\": \"qualifying\", \"expected\": \"counted\", \"passed\": false}, {\"check\": \"reporting / report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"report-error / retry-report\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"qualifying / covered-by-overlay\", \"actual\": \"occluded\", \"expected\": \"occluded\", \"passed\": true}, {\"check\": \"occluded / overlay-removed\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"counted / reenter-viewport\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"reporting / leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"trace enters-viewport then exposure-satisfied\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace enters-viewport then leaves-viewport\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"trace enters-viewport then covered-by-overlay\", \"actual\": \"occluded\", \"expected\": \"occluded\", \"passed\": true}, {\"check\": \"trace exposure-satisfied then report-success\", \"actual\": \"qualifying\", \"expected\": \"counted\", \"passed\": false}, {\"check\": \"trace exposure-satisfied then report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"trace exposure-satisfied then leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace leaves-viewport then enters-viewport\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"trace report-success then reenter-viewport\", \"actual\": \"qualifying\", \"expected\": \"counted\", \"passed\": false}, {\"check\": \"trace report-failure then retry-report\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace retry-report then report-success\", \"actual\": \"qualifying\", \"expected\": \"counted\", \"passed\": false}, {\"check\": \"trace retry-report then report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"trace retry-report then leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace covered-by-overlay then overlay-removed\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"trace overlay-removed then exposure-satisfied\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace overlay-removed then leaves-viewport\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"trace overlay-removed then covered-by-overlay\", \"actual\": \"occluded\", \"expected\": \"occluded\", \"passed\": true}, {\"check\": \"trace reenter-viewport then reenter-viewport\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"trace leaves-viewport then report-success\", \"actual\": \"qualifying\", \"expected\": \"counted\", \"passed\": false}, {\"check\": \"trace leaves-viewport then report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"trace leaves-viewport then leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"domain state regression 1: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 3}, \"expected\": {\"phase\": \"qualifying\", \"value\": 3}, \"passed\": true}, {\"check\": \"domain state regression 2: exposure\", \"actual\": {\"phase\": \"reporting\", \"value\": 4}, \"expected\": {\"phase\": \"reporting\", \"value\": 4}, \"passed\": true}, {\"check\": \"domain state regression 3: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 0}, \"expected\": {\"phase\": \"qualifying\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 4: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 0}, \"expected\": {\"phase\": \"qualifying\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 5: exposure\", \"actual\": {\"phase\": \"offscreen\", \"value\": 0}, \"expected\": {\"phase\": \"offscreen\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 6: reports\", \"actual\": {\"phase\": \"counted\", \"value\": 1}, \"expected\": {\"phase\": \"counted\", \"value\": 1}, \"passed\": true}, {\"check\": \"domain state regression 7: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 3}, \"expected\": {\"phase\": \"qualifying\", \"value\": 3}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.503,"exit_code":0,"observations":[{"actual":"qualifying","check":"offscreen / enters-viewport","expected":"qualifying","passed":true},{"actual":"reporting","check":"qualifying / exposure-satisfied","expected":"reporting","passed":true},{"actual":"offscreen","check":"qualifying / leaves-viewport","expected":"offscreen","passed":true},{"actual":"counted","check":"reporting / report-success","expected":"counted","passed":true},{"actual":"report-error","check":"reporting / report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"report-error / retry-report","expected":"reporting","passed":true},{"actual":"occluded","check":"qualifying / covered-by-overlay","expected":"occluded","passed":true},{"actual":"qualifying","check":"occluded / overlay-removed","expected":"qualifying","passed":true},{"actual":"counted","check":"counted / reenter-viewport","expected":"counted","passed":true},{"actual":"reporting","check":"reporting / leaves-viewport","expected":"reporting","passed":true},{"actual":"offscreen","check":"older notification incarnation","expected":"offscreen","passed":true},{"actual":"offscreen","check":"future notification incarnation","expected":"offscreen","passed":true},{"actual":"offscreen","check":"unknown event is inert","expected":"offscreen","passed":true},{"actual":"offscreen","check":"empty delivery batch","expected":"offscreen","passed":true},{"actual":"qualifying","check":"N stale deliveries before current delivery","expected":"qualifying","passed":true},{"actual":"reporting","check":"trace enters-viewport then exposure-satisfied","expected":"reporting","passed":true},{"actual":"offscreen","check":"trace enters-viewport then leaves-viewport","expected":"offscreen","passed":true},{"actual":"occluded","check":"trace enters-viewport then covered-by-overlay","expected":"occluded","passed":true},{"actual":"counted","check":"trace exposure-satisfied then report-success","expected":"counted","passed":true},{"actual":"report-error","check":"trace exposure-satisfied then report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"trace exposure-satisfied then leaves-viewport","expected":"reporting","passed":true},{"actual":"qualifying","check":"trace leaves-viewport then enters-viewport","expected":"qualifying","passed":true},{"actual":"counted","check":"trace report-success then reenter-viewport","expected":"counted","passed":true},{"actual":"reporting","check":"trace report-failure then retry-report","expected":"reporting","passed":true},{"actual":"counted","check":"trace retry-report then report-success","expected":"counted","passed":true},{"actual":"report-error","check":"trace retry-report then report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"trace retry-report then leaves-viewport","expected":"reporting","passed":true},{"actual":"qualifying","check":"trace covered-by-overlay then overlay-removed","expected":"qualifying","passed":true},{"actual":"reporting","check":"trace overlay-removed then exposure-satisfied","expected":"reporting","passed":true},{"actual":"offscreen","check":"trace overlay-removed then leaves-viewport","expected":"offscreen","passed":true},{"actual":"occluded","check":"trace overlay-removed then covered-by-overlay","expected":"occluded","passed":true},{"actual":"counted","check":"trace reenter-viewport then reenter-viewport","expected":"counted","passed":true},{"actual":"counted","check":"trace leaves-viewport then report-success","expected":"counted","passed":true},{"actual":"report-error","check":"trace leaves-viewport then report-failure","expected":"report-error","passed":true},{"actual":"reporting","check":"trace leaves-viewport then leaves-viewport","expected":"reporting","passed":true},{"actual":{"phase":"qualifying","value":3},"check":"domain state regression 1: exposure","expected":{"phase":"qualifying","value":3},"passed":true},{"actual":{"phase":"reporting","value":4},"check":"domain state regression 2: exposure","expected":{"phase":"reporting","value":4},"passed":true},{"actual":{"phase":"qualifying","value":0},"check":"domain state regression 3: exposure","expected":{"phase":"qualifying","value":0},"passed":true},{"actual":{"phase":"qualifying","value":0},"check":"domain state regression 4: exposure","expected":{"phase":"qualifying","value":0},"passed":true},{"actual":{"phase":"offscreen","value":0},"check":"domain state regression 5: exposure","expected":{"phase":"offscreen","value":0},"passed":true},{"actual":{"phase":"counted","value":1},"check":"domain state regression 6: reports","expected":{"phase":"counted","value":1},"passed":true},{"actual":{"phase":"qualifying","value":3},"check":"domain state regression 7: exposure","expected":{"phase":"qualifying","value":3},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"offscreen / enters-viewport\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"qualifying / exposure-satisfied\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"qualifying / leaves-viewport\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"reporting / report-success\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"reporting / report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"report-error / retry-report\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"qualifying / covered-by-overlay\", \"actual\": \"occluded\", \"expected\": \"occluded\", \"passed\": true}, {\"check\": \"occluded / overlay-removed\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"counted / reenter-viewport\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"reporting / leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"trace enters-viewport then exposure-satisfied\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace enters-viewport then leaves-viewport\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"trace enters-viewport then covered-by-overlay\", \"actual\": \"occluded\", \"expected\": \"occluded\", \"passed\": true}, {\"check\": \"trace exposure-satisfied then report-success\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"trace exposure-satisfied then report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"trace exposure-satisfied then leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace leaves-viewport then enters-viewport\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"trace report-success then reenter-viewport\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"trace report-failure then retry-report\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace retry-report then report-success\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"trace retry-report then report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"trace retry-report then leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace covered-by-overlay then overlay-removed\", \"actual\": \"qualifying\", \"expected\": \"qualifying\", \"passed\": true}, {\"check\": \"trace overlay-removed then exposure-satisfied\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"trace overlay-removed then leaves-viewport\", \"actual\": \"offscreen\", \"expected\": \"offscreen\", \"passed\": true}, {\"check\": \"trace overlay-removed then covered-by-overlay\", \"actual\": \"occluded\", \"expected\": \"occluded\", \"passed\": true}, {\"check\": \"trace reenter-viewport then reenter-viewport\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"trace leaves-viewport then report-success\", \"actual\": \"counted\", \"expected\": \"counted\", \"passed\": true}, {\"check\": \"trace leaves-viewport then report-failure\", \"actual\": \"report-error\", \"expected\": \"report-error\", \"passed\": true}, {\"check\": \"trace leaves-viewport then leaves-viewport\", \"actual\": \"reporting\", \"expected\": \"reporting\", \"passed\": true}, {\"check\": \"domain state regression 1: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 3}, \"expected\": {\"phase\": \"qualifying\", \"value\": 3}, \"passed\": true}, {\"check\": \"domain state regression 2: exposure\", \"actual\": {\"phase\": \"reporting\", \"value\": 4}, \"expected\": {\"phase\": \"reporting\", \"value\": 4}, \"passed\": true}, {\"check\": \"domain state regression 3: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 0}, \"expected\": {\"phase\": \"qualifying\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 4: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 0}, \"expected\": {\"phase\": \"qualifying\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 5: exposure\", \"actual\": {\"phase\": \"offscreen\", \"value\": 0}, \"expected\": {\"phase\": \"offscreen\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 6: reports\", \"actual\": {\"phase\": \"counted\", \"value\": 1}, \"expected\": {\"phase\": \"counted\", \"value\": 1}, \"passed\": true}, {\"check\": \"domain state regression 7: exposure\", \"actual\": {\"phase\": \"qualifying\", \"value\": 3}, \"expected\": {\"phase\": \"qualifying\", \"value\": 3}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}