{"abstract":"The pointer-leave event leaves a notification in visible instead of hidden-paused.","category":"Notification interfaces","checks":42,"contract":"Toast exposure timeout is a bounded visual-notification workflow with mutable policy state {'remaining': 10, 'pause_owners': [], 'spent': 0}. Its default transition relation is {('visible', 'pointer-enter'): 'hover-paused', ('hover-paused', 'pointer-leave'): 'visible', ('visible', 'page-hidden'): 'hidden-paused', ('hidden-paused', 'page-visible'): 'visible', ('hover-paused', 'page-hidden'): 'both-paused', ('both-paused', 'page-visible'): 'hover-paused', ('both-paused', 'pointer-leave'): 'hidden-paused', ('visible', 'budget-consumed'): 'expired', ('expired', 'late-pointer-enter'): 'expired', ('hidden-paused', 'budget-callback'): 'hidden-paused'}; 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-timeout-pauses","failed_approach":"Keeping only hover pause loses the reason the page remains hidden.","family":"s3-notification-interfaces-timeout-pauses-07","id":"FA-33871","implementations":{"attempt":{"sha256":"82ffe5f5d6dacb0a14de2e43de41303f9f4df0b03de4a2a1d570a5bba78342b2","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 = {('visible', 'pointer-enter'): 'hover-paused', ('hover-paused', 'pointer-leave'): 'visible', ('visible', 'page-hidden'): 'hidden-paused', ('hidden-paused', 'page-visible'): 'visible', ('hover-paused', 'page-hidden'): 'both-paused', ('both-paused', 'page-visible'): 'hover-paused', ('both-paused', 'pointer-leave'): 'hover-paused', ('visible', 'budget-consumed'): 'expired', ('expired', 'late-pointer-enter'): 'expired', ('hidden-paused', 'budget-callback'): 'hidden-paused'}\n    data = json.loads(json.dumps({'remaining': 10, 'pause_owners': [], 'spent': 0})) if payload is None else {**json.loads(json.dumps({'remaining': 10, 'pause_owners': [], 'spent': 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 == 'pointer-enter': data['pause_owners'] = sorted(set(data['pause_owners']) | {'pointer'})\n            if event == 'page-hidden': data['pause_owners'] = sorted(set(data['pause_owners']) | {'page'})\n            if event == 'pointer-leave': data['pause_owners'] = [x for x in data['pause_owners'] if x != 'pointer']\n            if event == 'page-visible': data['pause_owners'] = [x for x in data['pause_owners'] if x != 'page']\n            if event in ('budget-consumed', 'budget-callback'):\n                elapsed = max(0, arg.get('elapsed', data['remaining']))\n                charge = 0 if data['pause_owners'] else min(elapsed, data['remaining'])\n                data['remaining'] -= charge\n                data['spent'] += charge\n                if data['remaining'] > 0 and event == 'budget-consumed': event = 'unknown-event'\n            state = table.get((state, event), state)\n            if state == 'expired': data['remaining'] = 0\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('visible / pointer-enter', solve('visible', [('pointer-enter', N)], N), 'hover-paused')\ncheck('hover-paused / pointer-leave', solve('hover-paused', [('pointer-leave', N)], N), 'visible')\ncheck('visible / page-hidden', solve('visible', [('page-hidden', N)], N), 'hidden-paused')\ncheck('hidden-paused / page-visible', solve('hidden-paused', [('page-visible', N)], N), 'visible')\ncheck('hover-paused / page-hidden', solve('hover-paused', [('page-hidden', N)], N), 'both-paused')\ncheck('both-paused / page-visible', solve('both-paused', [('page-visible', N)], N), 'hover-paused')\ncheck('both-paused / pointer-leave', solve('both-paused', [('pointer-leave', N)], N), 'hidden-paused')\ncheck('visible / budget-consumed', solve('visible', [('budget-consumed', N)], N), 'expired')\ncheck('expired / late-pointer-enter', solve('expired', [('late-pointer-enter', N)], N), 'expired')\ncheck('hidden-paused / budget-callback', solve('hidden-paused', [('budget-callback', N)], N), 'hidden-paused')\ncheck('older notification incarnation', solve('visible', [('pointer-enter', N - 1)], N), 'visible')\ncheck('future notification incarnation', solve('visible', [('pointer-enter', N + 1)], N), 'visible')\ncheck('unknown event is inert', solve('visible', [('unknown-event', N)], N), 'visible')\ncheck('empty delivery batch', solve('visible', [], N), 'visible')\ncheck('N stale deliveries before current delivery', solve('visible', [('pointer-enter', N - 1)] * N + [('pointer-enter', N)], N), 'hover-paused')\ncheck('trace pointer-enter then pointer-leave', solve('visible', [('pointer-enter', N), ('pointer-leave', N)], N), 'visible')\ncheck('trace pointer-enter then page-hidden', solve('visible', [('pointer-enter', N), ('page-hidden', N)], N), 'both-paused')\ncheck('trace pointer-leave then pointer-enter', solve('hover-paused', [('pointer-leave', N), ('pointer-enter', N)], N), 'hover-paused')\ncheck('trace pointer-leave then page-hidden', solve('hover-paused', [('pointer-leave', N), ('page-hidden', N)], N), 'hidden-paused')\ncheck('trace pointer-leave then budget-consumed', solve('hover-paused', [('pointer-leave', N), ('budget-consumed', N)], N), 'expired')\ncheck('trace page-hidden then page-visible', solve('visible', [('page-hidden', N), ('page-visible', N)], N), 'visible')\ncheck('trace page-hidden then budget-callback', solve('visible', [('page-hidden', N), ('budget-callback', N)], N), 'hidden-paused')\ncheck('trace page-visible then pointer-enter', solve('hidden-paused', [('page-visible', N), ('pointer-enter', N)], N), 'hover-paused')\ncheck('trace page-visible then page-hidden', solve('hidden-paused', [('page-visible', N), ('page-hidden', N)], N), 'hidden-paused')\ncheck('trace page-visible then budget-consumed', solve('hidden-paused', [('page-visible', N), ('budget-consumed', N)], N), 'expired')\ncheck('trace page-hidden then page-visible', solve('hover-paused', [('page-hidden', N), ('page-visible', N)], N), 'hover-paused')\ncheck('trace page-hidden then pointer-leave', solve('hover-paused', [('page-hidden', N), ('pointer-leave', N)], N), 'hidden-paused')\ncheck('trace page-visible then pointer-leave', solve('both-paused', [('page-visible', N), ('pointer-leave', N)], N), 'visible')\ncheck('trace page-visible then page-hidden', solve('both-paused', [('page-visible', N), ('page-hidden', N)], N), 'both-paused')\ncheck('trace pointer-leave then page-visible', solve('both-paused', [('pointer-leave', N), ('page-visible', N)], N), 'visible')\ncheck('trace pointer-leave then budget-callback', solve('both-paused', [('pointer-leave', N), ('budget-callback', N)], N), 'hidden-paused')\ncheck('trace budget-consumed then late-pointer-enter', solve('visible', [('budget-consumed', N), ('late-pointer-enter', N)], N), 'expired')\ncheck('trace late-pointer-enter then late-pointer-enter', solve('expired', [('late-pointer-enter', N), ('late-pointer-enter', N)], N), 'expired')\ncheck('trace budget-callback then page-visible', solve('hidden-paused', [('budget-callback', N), ('page-visible', N)], N), 'visible')\ncheck('trace budget-callback then budget-callback', solve('hidden-paused', [('budget-callback', N), ('budget-callback', N)], N), 'hidden-paused')\ncheck('domain state regression 1: remaining', solve('visible', [('budget-consumed', N, {'elapsed': 3})], N, {}, 'remaining'), {'phase': 'visible', 'value': 7})\ncheck('domain state regression 2: spent', solve('visible', [('budget-consumed', N, {'elapsed': 20})], N, {}, 'spent'), {'phase': 'expired', 'value': 10})\ncheck('domain state regression 3: remaining', solve('visible', [('pointer-enter', N, {}), ('budget-callback', N, {'elapsed': 20})], N, {}, 'remaining'), {'phase': 'hover-paused', 'value': 10})\ncheck('domain state regression 4: pause_owners', solve('both-paused', [('pointer-leave', N, {})], N, {'pause_owners': ['page', 'pointer']}, 'pause_owners'), {'phase': 'hidden-paused', 'value': ['page']})\ncheck('domain state regression 5: pause_owners', solve('both-paused', [('page-visible', N, {})], N, {'pause_owners': ['page', 'pointer']}, 'pause_owners'), {'phase': 'hover-paused', 'value': ['pointer']})\ncheck('domain state regression 6: spent', solve('visible', [('budget-consumed', N, {'elapsed': -2})], N, {}, 'spent'), {'phase': 'visible', 'value': 0})\ncheck('domain state regression 7: remaining', solve('visible', [('pointer-enter', N, {}), ('page-hidden', N, {}), ('pointer-leave', N, {}), ('budget-callback', N, {'elapsed': 99})], N, {}, 'remaining'), {'phase': 'hidden-paused', 'value': 10})\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":"ebd26b35f1461d760ca6817030e81086fc04f9fd668aca3da67c404bf859d853","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 = {('visible', 'pointer-enter'): 'hover-paused', ('hover-paused', 'pointer-leave'): 'visible', ('visible', 'page-hidden'): 'hidden-paused', ('hidden-paused', 'page-visible'): 'visible', ('hover-paused', 'page-hidden'): 'both-paused', ('both-paused', 'page-visible'): 'hover-paused', ('both-paused', 'pointer-leave'): 'visible', ('visible', 'budget-consumed'): 'expired', ('expired', 'late-pointer-enter'): 'expired', ('hidden-paused', 'budget-callback'): 'hidden-paused'}\n    data = json.loads(json.dumps({'remaining': 10, 'pause_owners': [], 'spent': 0})) if payload is None else {**json.loads(json.dumps({'remaining': 10, 'pause_owners': [], 'spent': 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 == 'pointer-enter': data['pause_owners'] = sorted(set(data['pause_owners']) | {'pointer'})\n            if event == 'page-hidden': data['pause_owners'] = sorted(set(data['pause_owners']) | {'page'})\n            if event == 'pointer-leave': data['pause_owners'] = [x for x in data['pause_owners'] if x != 'pointer']\n            if event == 'page-visible': data['pause_owners'] = [x for x in data['pause_owners'] if x != 'page']\n            if event in ('budget-consumed', 'budget-callback'):\n                elapsed = max(0, arg.get('elapsed', data['remaining']))\n                charge = 0 if data['pause_owners'] else min(elapsed, data['remaining'])\n                data['remaining'] -= charge\n                data['spent'] += charge\n                if data['remaining'] > 0 and event == 'budget-consumed': event = 'unknown-event'\n            state = table.get((state, event), state)\n            if state == 'expired': data['remaining'] = 0\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('visible / pointer-enter', solve('visible', [('pointer-enter', N)], N), 'hover-paused')\ncheck('hover-paused / pointer-leave', solve('hover-paused', [('pointer-leave', N)], N), 'visible')\ncheck('visible / page-hidden', solve('visible', [('page-hidden', N)], N), 'hidden-paused')\ncheck('hidden-paused / page-visible', solve('hidden-paused', [('page-visible', N)], N), 'visible')\ncheck('hover-paused / page-hidden', solve('hover-paused', [('page-hidden', N)], N), 'both-paused')\ncheck('both-paused / page-visible', solve('both-paused', [('page-visible', N)], N), 'hover-paused')\ncheck('both-paused / pointer-leave', solve('both-paused', [('pointer-leave', N)], N), 'hidden-paused')\ncheck('visible / budget-consumed', solve('visible', [('budget-consumed', N)], N), 'expired')\ncheck('expired / late-pointer-enter', solve('expired', [('late-pointer-enter', N)], N), 'expired')\ncheck('hidden-paused / budget-callback', solve('hidden-paused', [('budget-callback', N)], N), 'hidden-paused')\ncheck('older notification incarnation', solve('visible', [('pointer-enter', N - 1)], N), 'visible')\ncheck('future notification incarnation', solve('visible', [('pointer-enter', N + 1)], N), 'visible')\ncheck('unknown event is inert', solve('visible', [('unknown-event', N)], N), 'visible')\ncheck('empty delivery batch', solve('visible', [], N), 'visible')\ncheck('N stale deliveries before current delivery', solve('visible', [('pointer-enter', N - 1)] * N + [('pointer-enter', N)], N), 'hover-paused')\ncheck('trace pointer-enter then pointer-leave', solve('visible', [('pointer-enter', N), ('pointer-leave', N)], N), 'visible')\ncheck('trace pointer-enter then page-hidden', solve('visible', [('pointer-enter', N), ('page-hidden', N)], N), 'both-paused')\ncheck('trace pointer-leave then pointer-enter', solve('hover-paused', [('pointer-leave', N), ('pointer-enter', N)], N), 'hover-paused')\ncheck('trace pointer-leave then page-hidden', solve('hover-paused', [('pointer-leave', N), ('page-hidden', N)], N), 'hidden-paused')\ncheck('trace pointer-leave then budget-consumed', solve('hover-paused', [('pointer-leave', N), ('budget-consumed', N)], N), 'expired')\ncheck('trace page-hidden then page-visible', solve('visible', [('page-hidden', N), ('page-visible', N)], N), 'visible')\ncheck('trace page-hidden then budget-callback', solve('visible', [('page-hidden', N), ('budget-callback', N)], N), 'hidden-paused')\ncheck('trace page-visible then pointer-enter', solve('hidden-paused', [('page-visible', N), ('pointer-enter', N)], N), 'hover-paused')\ncheck('trace page-visible then page-hidden', solve('hidden-paused', [('page-visible', N), ('page-hidden', N)], N), 'hidden-paused')\ncheck('trace page-visible then budget-consumed', solve('hidden-paused', [('page-visible', N), ('budget-consumed', N)], N), 'expired')\ncheck('trace page-hidden then page-visible', solve('hover-paused', [('page-hidden', N), ('page-visible', N)], N), 'hover-paused')\ncheck('trace page-hidden then pointer-leave', solve('hover-paused', [('page-hidden', N), ('pointer-leave', N)], N), 'hidden-paused')\ncheck('trace page-visible then pointer-leave', solve('both-paused', [('page-visible', N), ('pointer-leave', N)], N), 'visible')\ncheck('trace page-visible then page-hidden', solve('both-paused', [('page-visible', N), ('page-hidden', N)], N), 'both-paused')\ncheck('trace pointer-leave then page-visible', solve('both-paused', [('pointer-leave', N), ('page-visible', N)], N), 'visible')\ncheck('trace pointer-leave then budget-callback', solve('both-paused', [('pointer-leave', N), ('budget-callback', N)], N), 'hidden-paused')\ncheck('trace budget-consumed then late-pointer-enter', solve('visible', [('budget-consumed', N), ('late-pointer-enter', N)], N), 'expired')\ncheck('trace late-pointer-enter then late-pointer-enter', solve('expired', [('late-pointer-enter', N), ('late-pointer-enter', N)], N), 'expired')\ncheck('trace budget-callback then page-visible', solve('hidden-paused', [('budget-callback', N), ('page-visible', N)], N), 'visible')\ncheck('trace budget-callback then budget-callback', solve('hidden-paused', [('budget-callback', N), ('budget-callback', N)], N), 'hidden-paused')\ncheck('domain state regression 1: remaining', solve('visible', [('budget-consumed', N, {'elapsed': 3})], N, {}, 'remaining'), {'phase': 'visible', 'value': 7})\ncheck('domain state regression 2: spent', solve('visible', [('budget-consumed', N, {'elapsed': 20})], N, {}, 'spent'), {'phase': 'expired', 'value': 10})\ncheck('domain state regression 3: remaining', solve('visible', [('pointer-enter', N, {}), ('budget-callback', N, {'elapsed': 20})], N, {}, 'remaining'), {'phase': 'hover-paused', 'value': 10})\ncheck('domain state regression 4: pause_owners', solve('both-paused', [('pointer-leave', N, {})], N, {'pause_owners': ['page', 'pointer']}, 'pause_owners'), {'phase': 'hidden-paused', 'value': ['page']})\ncheck('domain state regression 5: pause_owners', solve('both-paused', [('page-visible', N, {})], N, {'pause_owners': ['page', 'pointer']}, 'pause_owners'), {'phase': 'hover-paused', 'value': ['pointer']})\ncheck('domain state regression 6: spent', solve('visible', [('budget-consumed', N, {'elapsed': -2})], N, {}, 'spent'), {'phase': 'visible', 'value': 0})\ncheck('domain state regression 7: remaining', solve('visible', [('pointer-enter', N, {}), ('page-hidden', N, {}), ('pointer-leave', N, {}), ('budget-callback', N, {'elapsed': 99})], N, {}, 'remaining'), {'phase': 'hidden-paused', 'value': 10})\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":"74ff3a0b031610ac4c4c9c53f1dfc4d1758371c8903cbcfed769c697fa9ff1e1","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 = {('visible', 'pointer-enter'): 'hover-paused', ('hover-paused', 'pointer-leave'): 'visible', ('visible', 'page-hidden'): 'hidden-paused', ('hidden-paused', 'page-visible'): 'visible', ('hover-paused', 'page-hidden'): 'both-paused', ('both-paused', 'page-visible'): 'hover-paused', ('both-paused', 'pointer-leave'): 'hidden-paused', ('visible', 'budget-consumed'): 'expired', ('expired', 'late-pointer-enter'): 'expired', ('hidden-paused', 'budget-callback'): 'hidden-paused'}\n    data = json.loads(json.dumps({'remaining': 10, 'pause_owners': [], 'spent': 0})) if payload is None else {**json.loads(json.dumps({'remaining': 10, 'pause_owners': [], 'spent': 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 == 'pointer-enter': data['pause_owners'] = sorted(set(data['pause_owners']) | {'pointer'})\n            if event == 'page-hidden': data['pause_owners'] = sorted(set(data['pause_owners']) | {'page'})\n            if event == 'pointer-leave': data['pause_owners'] = [x for x in data['pause_owners'] if x != 'pointer']\n            if event == 'page-visible': data['pause_owners'] = [x for x in data['pause_owners'] if x != 'page']\n            if event in ('budget-consumed', 'budget-callback'):\n                elapsed = max(0, arg.get('elapsed', data['remaining']))\n                charge = 0 if data['pause_owners'] else min(elapsed, data['remaining'])\n                data['remaining'] -= charge\n                data['spent'] += charge\n                if data['remaining'] > 0 and event == 'budget-consumed': event = 'unknown-event'\n            state = table.get((state, event), state)\n            if state == 'expired': data['remaining'] = 0\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('visible / pointer-enter', solve('visible', [('pointer-enter', N)], N), 'hover-paused')\ncheck('hover-paused / pointer-leave', solve('hover-paused', [('pointer-leave', N)], N), 'visible')\ncheck('visible / page-hidden', solve('visible', [('page-hidden', N)], N), 'hidden-paused')\ncheck('hidden-paused / page-visible', solve('hidden-paused', [('page-visible', N)], N), 'visible')\ncheck('hover-paused / page-hidden', solve('hover-paused', [('page-hidden', N)], N), 'both-paused')\ncheck('both-paused / page-visible', solve('both-paused', [('page-visible', N)], N), 'hover-paused')\ncheck('both-paused / pointer-leave', solve('both-paused', [('pointer-leave', N)], N), 'hidden-paused')\ncheck('visible / budget-consumed', solve('visible', [('budget-consumed', N)], N), 'expired')\ncheck('expired / late-pointer-enter', solve('expired', [('late-pointer-enter', N)], N), 'expired')\ncheck('hidden-paused / budget-callback', solve('hidden-paused', [('budget-callback', N)], N), 'hidden-paused')\ncheck('older notification incarnation', solve('visible', [('pointer-enter', N - 1)], N), 'visible')\ncheck('future notification incarnation', solve('visible', [('pointer-enter', N + 1)], N), 'visible')\ncheck('unknown event is inert', solve('visible', [('unknown-event', N)], N), 'visible')\ncheck('empty delivery batch', solve('visible', [], N), 'visible')\ncheck('N stale deliveries before current delivery', solve('visible', [('pointer-enter', N - 1)] * N + [('pointer-enter', N)], N), 'hover-paused')\ncheck('trace pointer-enter then pointer-leave', solve('visible', [('pointer-enter', N), ('pointer-leave', N)], N), 'visible')\ncheck('trace pointer-enter then page-hidden', solve('visible', [('pointer-enter', N), ('page-hidden', N)], N), 'both-paused')\ncheck('trace pointer-leave then pointer-enter', solve('hover-paused', [('pointer-leave', N), ('pointer-enter', N)], N), 'hover-paused')\ncheck('trace pointer-leave then page-hidden', solve('hover-paused', [('pointer-leave', N), ('page-hidden', N)], N), 'hidden-paused')\ncheck('trace pointer-leave then budget-consumed', solve('hover-paused', [('pointer-leave', N), ('budget-consumed', N)], N), 'expired')\ncheck('trace page-hidden then page-visible', solve('visible', [('page-hidden', N), ('page-visible', N)], N), 'visible')\ncheck('trace page-hidden then budget-callback', solve('visible', [('page-hidden', N), ('budget-callback', N)], N), 'hidden-paused')\ncheck('trace page-visible then pointer-enter', solve('hidden-paused', [('page-visible', N), ('pointer-enter', N)], N), 'hover-paused')\ncheck('trace page-visible then page-hidden', solve('hidden-paused', [('page-visible', N), ('page-hidden', N)], N), 'hidden-paused')\ncheck('trace page-visible then budget-consumed', solve('hidden-paused', [('page-visible', N), ('budget-consumed', N)], N), 'expired')\ncheck('trace page-hidden then page-visible', solve('hover-paused', [('page-hidden', N), ('page-visible', N)], N), 'hover-paused')\ncheck('trace page-hidden then pointer-leave', solve('hover-paused', [('page-hidden', N), ('pointer-leave', N)], N), 'hidden-paused')\ncheck('trace page-visible then pointer-leave', solve('both-paused', [('page-visible', N), ('pointer-leave', N)], N), 'visible')\ncheck('trace page-visible then page-hidden', solve('both-paused', [('page-visible', N), ('page-hidden', N)], N), 'both-paused')\ncheck('trace pointer-leave then page-visible', solve('both-paused', [('pointer-leave', N), ('page-visible', N)], N), 'visible')\ncheck('trace pointer-leave then budget-callback', solve('both-paused', [('pointer-leave', N), ('budget-callback', N)], N), 'hidden-paused')\ncheck('trace budget-consumed then late-pointer-enter', solve('visible', [('budget-consumed', N), ('late-pointer-enter', N)], N), 'expired')\ncheck('trace late-pointer-enter then late-pointer-enter', solve('expired', [('late-pointer-enter', N), ('late-pointer-enter', N)], N), 'expired')\ncheck('trace budget-callback then page-visible', solve('hidden-paused', [('budget-callback', N), ('page-visible', N)], N), 'visible')\ncheck('trace budget-callback then budget-callback', solve('hidden-paused', [('budget-callback', N), ('budget-callback', N)], N), 'hidden-paused')\ncheck('domain state regression 1: remaining', solve('visible', [('budget-consumed', N, {'elapsed': 3})], N, {}, 'remaining'), {'phase': 'visible', 'value': 7})\ncheck('domain state regression 2: spent', solve('visible', [('budget-consumed', N, {'elapsed': 20})], N, {}, 'spent'), {'phase': 'expired', 'value': 10})\ncheck('domain state regression 3: remaining', solve('visible', [('pointer-enter', N, {}), ('budget-callback', N, {'elapsed': 20})], N, {}, 'remaining'), {'phase': 'hover-paused', 'value': 10})\ncheck('domain state regression 4: pause_owners', solve('both-paused', [('pointer-leave', N, {})], N, {'pause_owners': ['page', 'pointer']}, 'pause_owners'), {'phase': 'hidden-paused', 'value': ['page']})\ncheck('domain state regression 5: pause_owners', solve('both-paused', [('page-visible', N, {})], N, {'pause_owners': ['page', 'pointer']}, 'pause_owners'), {'phase': 'hover-paused', 'value': ['pointer']})\ncheck('domain state regression 6: spent', solve('visible', [('budget-consumed', N, {'elapsed': -2})], N, {}, 'spent'), {'phase': 'visible', 'value': 0})\ncheck('domain state regression 7: remaining', solve('visible', [('pointer-enter', N, {}), ('page-hidden', N, {}), ('pointer-leave', N, {}), ('budget-callback', N, {'elapsed': 99})], N, {}, 'remaining'), {'phase': 'hidden-paused', 'value': 10})\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-timeout-pauses-07","generated_at":"2026-09-29T14:42:26.420802+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 both-paused / pointer-leave transition to hidden-paused; preserve the other explicitly stipulated transitions.","root_cause":"Pointer departure clears the page visibility pause too.","sha256":"dcbd565049024bee6a738c7eb9e16bb1d443b9ab8943b083c217d5fbf928b64b","title":"Toast exposure timeout: pointer-leave from both-paused · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.138,"exit_code":1,"observations":[{"actual":"hover-paused","check":"visible / pointer-enter","expected":"hover-paused","passed":true},{"actual":"visible","check":"hover-paused / pointer-leave","expected":"visible","passed":true},{"actual":"hidden-paused","check":"visible / page-hidden","expected":"hidden-paused","passed":true},{"actual":"visible","check":"hidden-paused / page-visible","expected":"visible","passed":true},{"actual":"both-paused","check":"hover-paused / page-hidden","expected":"both-paused","passed":true},{"actual":"hover-paused","check":"both-paused / page-visible","expected":"hover-paused","passed":true},{"actual":"hover-paused","check":"both-paused / pointer-leave","expected":"hidden-paused","passed":false},{"actual":"expired","check":"visible / budget-consumed","expected":"expired","passed":true},{"actual":"expired","check":"expired / late-pointer-enter","expected":"expired","passed":true},{"actual":"hidden-paused","check":"hidden-paused / budget-callback","expected":"hidden-paused","passed":true},{"actual":"visible","check":"older notification incarnation","expected":"visible","passed":true},{"actual":"visible","check":"future notification incarnation","expected":"visible","passed":true},{"actual":"visible","check":"unknown event is inert","expected":"visible","passed":true},{"actual":"visible","check":"empty delivery batch","expected":"visible","passed":true},{"actual":"hover-paused","check":"N stale deliveries before current delivery","expected":"hover-paused","passed":true},{"actual":"visible","check":"trace pointer-enter then pointer-leave","expected":"visible","passed":true},{"actual":"both-paused","check":"trace pointer-enter then page-hidden","expected":"both-paused","passed":true},{"actual":"hover-paused","check":"trace pointer-leave then pointer-enter","expected":"hover-paused","passed":true},{"actual":"hidden-paused","check":"trace pointer-leave then page-hidden","expected":"hidden-paused","passed":true},{"actual":"expired","check":"trace pointer-leave then budget-consumed","expected":"expired","passed":true},{"actual":"visible","check":"trace page-hidden then page-visible","expected":"visible","passed":true},{"actual":"hidden-paused","check":"trace page-hidden then budget-callback","expected":"hidden-paused","passed":true},{"actual":"hover-paused","check":"trace page-visible then pointer-enter","expected":"hover-paused","passed":true},{"actual":"hidden-paused","check":"trace page-visible then page-hidden","expected":"hidden-paused","passed":true},{"actual":"expired","check":"trace page-visible then budget-consumed","expected":"expired","passed":true},{"actual":"hover-paused","check":"trace page-hidden then page-visible","expected":"hover-paused","passed":true},{"actual":"hover-paused","check":"trace page-hidden then pointer-leave","expected":"hidden-paused","passed":false},{"actual":"visible","check":"trace page-visible then pointer-leave","expected":"visible","passed":true},{"actual":"both-paused","check":"trace page-visible then page-hidden","expected":"both-paused","passed":true},{"actual":"hover-paused","check":"trace pointer-leave then page-visible","expected":"visible","passed":false},{"actual":"hover-paused","check":"trace pointer-leave then budget-callback","expected":"hidden-paused","passed":false},{"actual":"expired","check":"trace budget-consumed then late-pointer-enter","expected":"expired","passed":true},{"actual":"expired","check":"trace late-pointer-enter then late-pointer-enter","expected":"expired","passed":true},{"actual":"visible","check":"trace budget-callback then page-visible","expected":"visible","passed":true},{"actual":"hidden-paused","check":"trace budget-callback then budget-callback","expected":"hidden-paused","passed":true},{"actual":{"phase":"visible","value":7},"check":"domain state regression 1: remaining","expected":{"phase":"visible","value":7},"passed":true},{"actual":{"phase":"expired","value":10},"check":"domain state regression 2: spent","expected":{"phase":"expired","value":10},"passed":true},{"actual":{"phase":"hover-paused","value":10},"check":"domain state regression 3: remaining","expected":{"phase":"hover-paused","value":10},"passed":true},{"actual":{"phase":"hover-paused","value":["page"]},"check":"domain state regression 4: pause_owners","expected":{"phase":"hidden-paused","value":["page"]},"passed":false},{"actual":{"phase":"hover-paused","value":["pointer"]},"check":"domain state regression 5: pause_owners","expected":{"phase":"hover-paused","value":["pointer"]},"passed":true},{"actual":{"phase":"visible","value":0},"check":"domain state regression 6: spent","expected":{"phase":"visible","value":0},"passed":true},{"actual":{"phase":"hover-paused","value":10},"check":"domain state regression 7: remaining","expected":{"phase":"hidden-paused","value":10},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"visible / pointer-enter\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"hover-paused / pointer-leave\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"visible / page-hidden\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"hidden-paused / page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"hover-paused / page-hidden\", \"actual\": \"both-paused\", \"expected\": \"both-paused\", \"passed\": true}, {\"check\": \"both-paused / page-visible\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"both-paused / pointer-leave\", \"actual\": \"hover-paused\", \"expected\": \"hidden-paused\", \"passed\": false}, {\"check\": \"visible / budget-consumed\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"expired / late-pointer-enter\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"hidden-paused / budget-callback\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace pointer-enter then pointer-leave\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace pointer-enter then page-hidden\", \"actual\": \"both-paused\", \"expected\": \"both-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then pointer-enter\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then page-hidden\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then budget-consumed\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace page-hidden then page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace page-hidden then budget-callback\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace page-visible then pointer-enter\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace page-visible then page-hidden\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace page-visible then budget-consumed\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace page-hidden then page-visible\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace page-hidden then pointer-leave\", \"actual\": \"hover-paused\", \"expected\": \"hidden-paused\", \"passed\": false}, {\"check\": \"trace page-visible then pointer-leave\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace page-visible then page-hidden\", \"actual\": \"both-paused\", \"expected\": \"both-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then page-visible\", \"actual\": \"hover-paused\", \"expected\": \"visible\", \"passed\": false}, {\"check\": \"trace pointer-leave then budget-callback\", \"actual\": \"hover-paused\", \"expected\": \"hidden-paused\", \"passed\": false}, {\"check\": \"trace budget-consumed then late-pointer-enter\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace late-pointer-enter then late-pointer-enter\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace budget-callback then page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace budget-callback then budget-callback\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"domain state regression 1: remaining\", \"actual\": {\"phase\": \"visible\", \"value\": 7}, \"expected\": {\"phase\": \"visible\", \"value\": 7}, \"passed\": true}, {\"check\": \"domain state regression 2: spent\", \"actual\": {\"phase\": \"expired\", \"value\": 10}, \"expected\": {\"phase\": \"expired\", \"value\": 10}, \"passed\": true}, {\"check\": \"domain state regression 3: remaining\", \"actual\": {\"phase\": \"hover-paused\", \"value\": 10}, \"expected\": {\"phase\": \"hover-paused\", \"value\": 10}, \"passed\": true}, {\"check\": \"domain state regression 4: pause_owners\", \"actual\": {\"phase\": \"hover-paused\", \"value\": [\"page\"]}, \"expected\": {\"phase\": \"hidden-paused\", \"value\": [\"page\"]}, \"passed\": false}, {\"check\": \"domain state regression 5: pause_owners\", \"actual\": {\"phase\": \"hover-paused\", \"value\": [\"pointer\"]}, \"expected\": {\"phase\": \"hover-paused\", \"value\": [\"pointer\"]}, \"passed\": true}, {\"check\": \"domain state regression 6: spent\", \"actual\": {\"phase\": \"visible\", \"value\": 0}, \"expected\": {\"phase\": \"visible\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 7: remaining\", \"actual\": {\"phase\": \"hover-paused\", \"value\": 10}, \"expected\": {\"phase\": \"hidden-paused\", \"value\": 10}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.365,"exit_code":1,"observations":[{"actual":"hover-paused","check":"visible / pointer-enter","expected":"hover-paused","passed":true},{"actual":"visible","check":"hover-paused / pointer-leave","expected":"visible","passed":true},{"actual":"hidden-paused","check":"visible / page-hidden","expected":"hidden-paused","passed":true},{"actual":"visible","check":"hidden-paused / page-visible","expected":"visible","passed":true},{"actual":"both-paused","check":"hover-paused / page-hidden","expected":"both-paused","passed":true},{"actual":"hover-paused","check":"both-paused / page-visible","expected":"hover-paused","passed":true},{"actual":"visible","check":"both-paused / pointer-leave","expected":"hidden-paused","passed":false},{"actual":"expired","check":"visible / budget-consumed","expected":"expired","passed":true},{"actual":"expired","check":"expired / late-pointer-enter","expected":"expired","passed":true},{"actual":"hidden-paused","check":"hidden-paused / budget-callback","expected":"hidden-paused","passed":true},{"actual":"visible","check":"older notification incarnation","expected":"visible","passed":true},{"actual":"visible","check":"future notification incarnation","expected":"visible","passed":true},{"actual":"visible","check":"unknown event is inert","expected":"visible","passed":true},{"actual":"visible","check":"empty delivery batch","expected":"visible","passed":true},{"actual":"hover-paused","check":"N stale deliveries before current delivery","expected":"hover-paused","passed":true},{"actual":"visible","check":"trace pointer-enter then pointer-leave","expected":"visible","passed":true},{"actual":"both-paused","check":"trace pointer-enter then page-hidden","expected":"both-paused","passed":true},{"actual":"hover-paused","check":"trace pointer-leave then pointer-enter","expected":"hover-paused","passed":true},{"actual":"hidden-paused","check":"trace pointer-leave then page-hidden","expected":"hidden-paused","passed":true},{"actual":"expired","check":"trace pointer-leave then budget-consumed","expected":"expired","passed":true},{"actual":"visible","check":"trace page-hidden then page-visible","expected":"visible","passed":true},{"actual":"hidden-paused","check":"trace page-hidden then budget-callback","expected":"hidden-paused","passed":true},{"actual":"hover-paused","check":"trace page-visible then pointer-enter","expected":"hover-paused","passed":true},{"actual":"hidden-paused","check":"trace page-visible then page-hidden","expected":"hidden-paused","passed":true},{"actual":"expired","check":"trace page-visible then budget-consumed","expected":"expired","passed":true},{"actual":"hover-paused","check":"trace page-hidden then page-visible","expected":"hover-paused","passed":true},{"actual":"visible","check":"trace page-hidden then pointer-leave","expected":"hidden-paused","passed":false},{"actual":"visible","check":"trace page-visible then pointer-leave","expected":"visible","passed":true},{"actual":"both-paused","check":"trace page-visible then page-hidden","expected":"both-paused","passed":true},{"actual":"visible","check":"trace pointer-leave then page-visible","expected":"visible","passed":true},{"actual":"visible","check":"trace pointer-leave then budget-callback","expected":"hidden-paused","passed":false},{"actual":"expired","check":"trace budget-consumed then late-pointer-enter","expected":"expired","passed":true},{"actual":"expired","check":"trace late-pointer-enter then late-pointer-enter","expected":"expired","passed":true},{"actual":"visible","check":"trace budget-callback then page-visible","expected":"visible","passed":true},{"actual":"hidden-paused","check":"trace budget-callback then budget-callback","expected":"hidden-paused","passed":true},{"actual":{"phase":"visible","value":7},"check":"domain state regression 1: remaining","expected":{"phase":"visible","value":7},"passed":true},{"actual":{"phase":"expired","value":10},"check":"domain state regression 2: spent","expected":{"phase":"expired","value":10},"passed":true},{"actual":{"phase":"hover-paused","value":10},"check":"domain state regression 3: remaining","expected":{"phase":"hover-paused","value":10},"passed":true},{"actual":{"phase":"visible","value":["page"]},"check":"domain state regression 4: pause_owners","expected":{"phase":"hidden-paused","value":["page"]},"passed":false},{"actual":{"phase":"hover-paused","value":["pointer"]},"check":"domain state regression 5: pause_owners","expected":{"phase":"hover-paused","value":["pointer"]},"passed":true},{"actual":{"phase":"visible","value":0},"check":"domain state regression 6: spent","expected":{"phase":"visible","value":0},"passed":true},{"actual":{"phase":"visible","value":10},"check":"domain state regression 7: remaining","expected":{"phase":"hidden-paused","value":10},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"visible / pointer-enter\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"hover-paused / pointer-leave\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"visible / page-hidden\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"hidden-paused / page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"hover-paused / page-hidden\", \"actual\": \"both-paused\", \"expected\": \"both-paused\", \"passed\": true}, {\"check\": \"both-paused / page-visible\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"both-paused / pointer-leave\", \"actual\": \"visible\", \"expected\": \"hidden-paused\", \"passed\": false}, {\"check\": \"visible / budget-consumed\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"expired / late-pointer-enter\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"hidden-paused / budget-callback\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace pointer-enter then pointer-leave\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace pointer-enter then page-hidden\", \"actual\": \"both-paused\", \"expected\": \"both-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then pointer-enter\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then page-hidden\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then budget-consumed\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace page-hidden then page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace page-hidden then budget-callback\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace page-visible then pointer-enter\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace page-visible then page-hidden\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace page-visible then budget-consumed\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace page-hidden then page-visible\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace page-hidden then pointer-leave\", \"actual\": \"visible\", \"expected\": \"hidden-paused\", \"passed\": false}, {\"check\": \"trace page-visible then pointer-leave\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace page-visible then page-hidden\", \"actual\": \"both-paused\", \"expected\": \"both-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace pointer-leave then budget-callback\", \"actual\": \"visible\", \"expected\": \"hidden-paused\", \"passed\": false}, {\"check\": \"trace budget-consumed then late-pointer-enter\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace late-pointer-enter then late-pointer-enter\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace budget-callback then page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace budget-callback then budget-callback\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"domain state regression 1: remaining\", \"actual\": {\"phase\": \"visible\", \"value\": 7}, \"expected\": {\"phase\": \"visible\", \"value\": 7}, \"passed\": true}, {\"check\": \"domain state regression 2: spent\", \"actual\": {\"phase\": \"expired\", \"value\": 10}, \"expected\": {\"phase\": \"expired\", \"value\": 10}, \"passed\": true}, {\"check\": \"domain state regression 3: remaining\", \"actual\": {\"phase\": \"hover-paused\", \"value\": 10}, \"expected\": {\"phase\": \"hover-paused\", \"value\": 10}, \"passed\": true}, {\"check\": \"domain state regression 4: pause_owners\", \"actual\": {\"phase\": \"visible\", \"value\": [\"page\"]}, \"expected\": {\"phase\": \"hidden-paused\", \"value\": [\"page\"]}, \"passed\": false}, {\"check\": \"domain state regression 5: pause_owners\", \"actual\": {\"phase\": \"hover-paused\", \"value\": [\"pointer\"]}, \"expected\": {\"phase\": \"hover-paused\", \"value\": [\"pointer\"]}, \"passed\": true}, {\"check\": \"domain state regression 6: spent\", \"actual\": {\"phase\": \"visible\", \"value\": 0}, \"expected\": {\"phase\": \"visible\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 7: remaining\", \"actual\": {\"phase\": \"visible\", \"value\": 10}, \"expected\": {\"phase\": \"hidden-paused\", \"value\": 10}, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.782,"exit_code":0,"observations":[{"actual":"hover-paused","check":"visible / pointer-enter","expected":"hover-paused","passed":true},{"actual":"visible","check":"hover-paused / pointer-leave","expected":"visible","passed":true},{"actual":"hidden-paused","check":"visible / page-hidden","expected":"hidden-paused","passed":true},{"actual":"visible","check":"hidden-paused / page-visible","expected":"visible","passed":true},{"actual":"both-paused","check":"hover-paused / page-hidden","expected":"both-paused","passed":true},{"actual":"hover-paused","check":"both-paused / page-visible","expected":"hover-paused","passed":true},{"actual":"hidden-paused","check":"both-paused / pointer-leave","expected":"hidden-paused","passed":true},{"actual":"expired","check":"visible / budget-consumed","expected":"expired","passed":true},{"actual":"expired","check":"expired / late-pointer-enter","expected":"expired","passed":true},{"actual":"hidden-paused","check":"hidden-paused / budget-callback","expected":"hidden-paused","passed":true},{"actual":"visible","check":"older notification incarnation","expected":"visible","passed":true},{"actual":"visible","check":"future notification incarnation","expected":"visible","passed":true},{"actual":"visible","check":"unknown event is inert","expected":"visible","passed":true},{"actual":"visible","check":"empty delivery batch","expected":"visible","passed":true},{"actual":"hover-paused","check":"N stale deliveries before current delivery","expected":"hover-paused","passed":true},{"actual":"visible","check":"trace pointer-enter then pointer-leave","expected":"visible","passed":true},{"actual":"both-paused","check":"trace pointer-enter then page-hidden","expected":"both-paused","passed":true},{"actual":"hover-paused","check":"trace pointer-leave then pointer-enter","expected":"hover-paused","passed":true},{"actual":"hidden-paused","check":"trace pointer-leave then page-hidden","expected":"hidden-paused","passed":true},{"actual":"expired","check":"trace pointer-leave then budget-consumed","expected":"expired","passed":true},{"actual":"visible","check":"trace page-hidden then page-visible","expected":"visible","passed":true},{"actual":"hidden-paused","check":"trace page-hidden then budget-callback","expected":"hidden-paused","passed":true},{"actual":"hover-paused","check":"trace page-visible then pointer-enter","expected":"hover-paused","passed":true},{"actual":"hidden-paused","check":"trace page-visible then page-hidden","expected":"hidden-paused","passed":true},{"actual":"expired","check":"trace page-visible then budget-consumed","expected":"expired","passed":true},{"actual":"hover-paused","check":"trace page-hidden then page-visible","expected":"hover-paused","passed":true},{"actual":"hidden-paused","check":"trace page-hidden then pointer-leave","expected":"hidden-paused","passed":true},{"actual":"visible","check":"trace page-visible then pointer-leave","expected":"visible","passed":true},{"actual":"both-paused","check":"trace page-visible then page-hidden","expected":"both-paused","passed":true},{"actual":"visible","check":"trace pointer-leave then page-visible","expected":"visible","passed":true},{"actual":"hidden-paused","check":"trace pointer-leave then budget-callback","expected":"hidden-paused","passed":true},{"actual":"expired","check":"trace budget-consumed then late-pointer-enter","expected":"expired","passed":true},{"actual":"expired","check":"trace late-pointer-enter then late-pointer-enter","expected":"expired","passed":true},{"actual":"visible","check":"trace budget-callback then page-visible","expected":"visible","passed":true},{"actual":"hidden-paused","check":"trace budget-callback then budget-callback","expected":"hidden-paused","passed":true},{"actual":{"phase":"visible","value":7},"check":"domain state regression 1: remaining","expected":{"phase":"visible","value":7},"passed":true},{"actual":{"phase":"expired","value":10},"check":"domain state regression 2: spent","expected":{"phase":"expired","value":10},"passed":true},{"actual":{"phase":"hover-paused","value":10},"check":"domain state regression 3: remaining","expected":{"phase":"hover-paused","value":10},"passed":true},{"actual":{"phase":"hidden-paused","value":["page"]},"check":"domain state regression 4: pause_owners","expected":{"phase":"hidden-paused","value":["page"]},"passed":true},{"actual":{"phase":"hover-paused","value":["pointer"]},"check":"domain state regression 5: pause_owners","expected":{"phase":"hover-paused","value":["pointer"]},"passed":true},{"actual":{"phase":"visible","value":0},"check":"domain state regression 6: spent","expected":{"phase":"visible","value":0},"passed":true},{"actual":{"phase":"hidden-paused","value":10},"check":"domain state regression 7: remaining","expected":{"phase":"hidden-paused","value":10},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"visible / pointer-enter\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"hover-paused / pointer-leave\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"visible / page-hidden\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"hidden-paused / page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"hover-paused / page-hidden\", \"actual\": \"both-paused\", \"expected\": \"both-paused\", \"passed\": true}, {\"check\": \"both-paused / page-visible\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"both-paused / pointer-leave\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"visible / budget-consumed\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"expired / late-pointer-enter\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"hidden-paused / budget-callback\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"older notification incarnation\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"future notification incarnation\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"unknown event is inert\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"empty delivery batch\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"N stale deliveries before current delivery\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace pointer-enter then pointer-leave\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace pointer-enter then page-hidden\", \"actual\": \"both-paused\", \"expected\": \"both-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then pointer-enter\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then page-hidden\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then budget-consumed\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace page-hidden then page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace page-hidden then budget-callback\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace page-visible then pointer-enter\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace page-visible then page-hidden\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace page-visible then budget-consumed\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace page-hidden then page-visible\", \"actual\": \"hover-paused\", \"expected\": \"hover-paused\", \"passed\": true}, {\"check\": \"trace page-hidden then pointer-leave\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace page-visible then pointer-leave\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace page-visible then page-hidden\", \"actual\": \"both-paused\", \"expected\": \"both-paused\", \"passed\": true}, {\"check\": \"trace pointer-leave then page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace pointer-leave then budget-callback\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"trace budget-consumed then late-pointer-enter\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace late-pointer-enter then late-pointer-enter\", \"actual\": \"expired\", \"expected\": \"expired\", \"passed\": true}, {\"check\": \"trace budget-callback then page-visible\", \"actual\": \"visible\", \"expected\": \"visible\", \"passed\": true}, {\"check\": \"trace budget-callback then budget-callback\", \"actual\": \"hidden-paused\", \"expected\": \"hidden-paused\", \"passed\": true}, {\"check\": \"domain state regression 1: remaining\", \"actual\": {\"phase\": \"visible\", \"value\": 7}, \"expected\": {\"phase\": \"visible\", \"value\": 7}, \"passed\": true}, {\"check\": \"domain state regression 2: spent\", \"actual\": {\"phase\": \"expired\", \"value\": 10}, \"expected\": {\"phase\": \"expired\", \"value\": 10}, \"passed\": true}, {\"check\": \"domain state regression 3: remaining\", \"actual\": {\"phase\": \"hover-paused\", \"value\": 10}, \"expected\": {\"phase\": \"hover-paused\", \"value\": 10}, \"passed\": true}, {\"check\": \"domain state regression 4: pause_owners\", \"actual\": {\"phase\": \"hidden-paused\", \"value\": [\"page\"]}, \"expected\": {\"phase\": \"hidden-paused\", \"value\": [\"page\"]}, \"passed\": true}, {\"check\": \"domain state regression 5: pause_owners\", \"actual\": {\"phase\": \"hover-paused\", \"value\": [\"pointer\"]}, \"expected\": {\"phase\": \"hover-paused\", \"value\": [\"pointer\"]}, \"passed\": true}, {\"check\": \"domain state regression 6: spent\", \"actual\": {\"phase\": \"visible\", \"value\": 0}, \"expected\": {\"phase\": \"visible\", \"value\": 0}, \"passed\": true}, {\"check\": \"domain state regression 7: remaining\", \"actual\": {\"phase\": \"hidden-paused\", \"value\": 10}, \"expected\": {\"phase\": \"hidden-paused\", \"value\": 10}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}