FAILURE MAP
← Case archive

FA-34181 / Notification interfaces / Open access

Visual notification delivery acknowledgement: route-unmount from mounting · case 01

The route-unmount event leaves a notification in seen instead of undisplayed.

Verified by executionVariant 1 · 40 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

A canceled mount is recorded as viewed.

VERIFIED REPAIR

Commit the mounting / route-unmount transition to undisplayed; preserve the other explicitly stipulated transitions.

Unsuccessful approach: Submitting acknowledgement on route exit counts nonexistent exposure.

Case contract

Visual notification delivery acknowledgement is a bounded visual-notification workflow with mutable policy state {'mount': 4, 'painted': False, 'acknowledged': False, 'ack_attempts': 0}. Its default transition relation is {('received', 'mount-request'): 'mounting', ('mounting', 'paint-confirmed'): 'ack-pending', ('mounting', 'mount-failed'): 'undisplayed', ('ack-pending', 'ack-success'): 'seen', ('ack-pending', 'ack-failure'): 'ack-retry', ('ack-retry', 'retry-ack'): 'ack-pending', ('undisplayed', 'retry-mount'): 'mounting', ('seen', 'delivery-replay'): 'seen', ('mounting', 'route-unmount'): 'undisplayed', ('ack-retry', 'surface-unmount'): 'ack-retry'}; 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.

Why this case matters

Visual notification lifecycle ordering can leave an inbox or toast showing the wrong actionable state even when transport succeeds.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(initial, events, generation, payload=None, observe=None):
    table = {('received', 'mount-request'): 'mounting', ('mounting', 'paint-confirmed'): 'ack-pending', ('mounting', 'mount-failed'): 'undisplayed', ('ack-pending', 'ack-success'): 'seen', ('ack-pending', 'ack-failure'): 'ack-retry', ('ack-retry', 'retry-ack'): 'ack-pending', ('undisplayed', 'retry-mount'): 'mounting', ('seen', 'delivery-replay'): 'seen', ('mounting', 'route-unmount'): 'seen', ('ack-retry', 'surface-unmount'): 'ack-retry'}
    data = json.loads(json.dumps({'mount': 4, 'painted': False, 'acknowledged': False, 'ack_attempts': 0})) if payload is None else {**json.loads(json.dumps({'mount': 4, 'painted': False, 'acknowledged': False, 'ack_attempts': 0})), **json.loads(json.dumps(payload))}
    state = initial
    for delivery in events:
        event, event_generation = delivery[:2]
        arg = delivery[2] if len(delivery) > 2 else {}
        if event_generation == generation:
            previous = state
            if event in ('paint-confirmed','mount-failed') and arg.get('mount',data['mount']) != data['mount']: event = 'unknown-event'
            if event == 'paint-confirmed': data['painted'] = True
            if event == 'retry-ack': data['ack_attempts'] += 1
            if event == 'ack-success' and 'require_paint' in arg and not data['painted']: event = 'unknown-event'
            state = table.get((state, event), state)
            if state == 'seen': data['acknowledged'] = True
            if state == 'undisplayed': data['painted'] = False
    return {'phase': state, 'value': data[observe]} if observe else state
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('received / mount-request', solve('received', [('mount-request', N)], N), 'mounting')
check('mounting / paint-confirmed', solve('mounting', [('paint-confirmed', N)], N), 'ack-pending')
check('mounting / mount-failed', solve('mounting', [('mount-failed', N)], N), 'undisplayed')
check('ack-pending / ack-success', solve('ack-pending', [('ack-success', N)], N), 'seen')
check('ack-pending / ack-failure', solve('ack-pending', [('ack-failure', N)], N), 'ack-retry')
check('ack-retry / retry-ack', solve('ack-retry', [('retry-ack', N)], N), 'ack-pending')
check('undisplayed / retry-mount', solve('undisplayed', [('retry-mount', N)], N), 'mounting')
check('seen / delivery-replay', solve('seen', [('delivery-replay', N)], N), 'seen')
check('mounting / route-unmount', solve('mounting', [('route-unmount', N)], N), 'undisplayed')
check('ack-retry / surface-unmount', solve('ack-retry', [('surface-unmount', N)], N), 'ack-retry')
check('older notification incarnation', solve('received', [('mount-request', N - 1)], N), 'received')
check('future notification incarnation', solve('received', [('mount-request', N + 1)], N), 'received')
check('unknown event is inert', solve('received', [('unknown-event', N)], N), 'received')
check('empty delivery batch', solve('received', [], N), 'received')
check('N stale deliveries before current delivery', solve('received', [('mount-request', N - 1)] * N + [('mount-request', N)], N), 'mounting')
check('trace mount-request then paint-confirmed', solve('received', [('mount-request', N), ('paint-confirmed', N)], N), 'ack-pending')
check('trace mount-request then mount-failed', solve('received', [('mount-request', N), ('mount-failed', N)], N), 'undisplayed')
check('trace mount-request then route-unmount', solve('received', [('mount-request', N), ('route-unmount', N)], N), 'undisplayed')
check('trace paint-confirmed then ack-success', solve('mounting', [('paint-confirmed', N), ('ack-success', N)], N), 'seen')
check('trace paint-confirmed then ack-failure', solve('mounting', [('paint-confirmed', N), ('ack-failure', N)], N), 'ack-retry')
check('trace mount-failed then retry-mount', solve('mounting', [('mount-failed', N), ('retry-mount', N)], N), 'mounting')
check('trace ack-success then delivery-replay', solve('ack-pending', [('ack-success', N), ('delivery-replay', N)], N), 'seen')
check('trace ack-failure then retry-ack', solve('ack-pending', [('ack-failure', N), ('retry-ack', N)], N), 'ack-pending')
check('trace ack-failure then surface-unmount', solve('ack-pending', [('ack-failure', N), ('surface-unmount', N)], N), 'ack-retry')
check('trace retry-ack then ack-success', solve('ack-retry', [('retry-ack', N), ('ack-success', N)], N), 'seen')
check('trace retry-ack then ack-failure', solve('ack-retry', [('retry-ack', N), ('ack-failure', N)], N), 'ack-retry')
check('trace retry-mount then paint-confirmed', solve('undisplayed', [('retry-mount', N), ('paint-confirmed', N)], N), 'ack-pending')
check('trace retry-mount then mount-failed', solve('undisplayed', [('retry-mount', N), ('mount-failed', N)], N), 'undisplayed')
check('trace retry-mount then route-unmount', solve('undisplayed', [('retry-mount', N), ('route-unmount', N)], N), 'undisplayed')
check('trace delivery-replay then delivery-replay', solve('seen', [('delivery-replay', N), ('delivery-replay', N)], N), 'seen')
check('trace route-unmount then retry-mount', solve('mounting', [('route-unmount', N), ('retry-mount', N)], N), 'mounting')
check('trace surface-unmount then retry-ack', solve('ack-retry', [('surface-unmount', N), ('retry-ack', N)], N), 'ack-pending')
check('trace surface-unmount then surface-unmount', solve('ack-retry', [('surface-unmount', N), ('surface-unmount', N)], N), 'ack-retry')
check('domain state regression 1: painted', solve('mounting', [('paint-confirmed', N, {'mount': 3})], N, {}, 'painted'), {'phase': 'mounting', 'value': False})
check('domain state regression 2: painted', solve('mounting', [('paint-confirmed', N, {'mount': 4})], N, {}, 'painted'), {'phase': 'ack-pending', 'value': True})
check('domain state regression 3: acknowledged', solve('ack-pending', [('ack-success', N, {'require_paint': True})], N, {}, 'acknowledged'), {'phase': 'ack-pending', 'value': False})
check('domain state regression 4: acknowledged', solve('ack-pending', [('ack-success', N, {'require_paint': True})], N, {'painted': True}, 'acknowledged'), {'phase': 'seen', 'value': True})
check('domain state regression 5: ack_attempts', solve('ack-retry', [('retry-ack', N, {})], N, {'painted': True, 'ack_attempts': 2}, 'ack_attempts'), {'phase': 'ack-pending', 'value': 3})
check('domain state regression 6: painted', solve('mounting', [('route-unmount', N, {})], N, {'painted': True}, 'painted'), {'phase': 'undisplayed', 'value': False})
check('domain state regression 7: acknowledged', solve('mounting', [('paint-confirmed', N, {}), ('ack-failure', N, {}), ('surface-unmount', N, {}), ('retry-ack', N, {}), ('ack-success', N, {'require_paint': True})], N, {}, 'acknowledged'), {'phase': 'seen', 'value': True})
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
received / mount-requestmountingmountingPassed
mounting / paint-confirmedack-pendingack-pendingPassed
mounting / mount-failedundisplayedundisplayedPassed
ack-pending / ack-successseenseenPassed
ack-pending / ack-failureack-retryack-retryPassed
ack-retry / retry-ackack-pendingack-pendingPassed
undisplayed / retry-mountmountingmountingPassed
seen / delivery-replayseenseenPassed
mounting / route-unmountseenundisplayedFailed
ack-retry / surface-unmountack-retryack-retryPassed
older notification incarnationreceivedreceivedPassed
future notification incarnationreceivedreceivedPassed
unknown event is inertreceivedreceivedPassed
empty delivery batchreceivedreceivedPassed
N stale deliveries before current deliverymountingmountingPassed
trace mount-request then paint-confirmedack-pendingack-pendingPassed
trace mount-request then mount-failedundisplayedundisplayedPassed
trace mount-request then route-unmountseenundisplayedFailed
trace paint-confirmed then ack-successseenseenPassed
trace paint-confirmed then ack-failureack-retryack-retryPassed
trace mount-failed then retry-mountmountingmountingPassed
trace ack-success then delivery-replayseenseenPassed
trace ack-failure then retry-ackack-pendingack-pendingPassed
trace ack-failure then surface-unmountack-retryack-retryPassed
trace retry-ack then ack-successseenseenPassed
trace retry-ack then ack-failureack-retryack-retryPassed
trace retry-mount then paint-confirmedack-pendingack-pendingPassed
trace retry-mount then mount-failedundisplayedundisplayedPassed
trace retry-mount then route-unmountseenundisplayedFailed
trace delivery-replay then delivery-replayseenseenPassed
trace route-unmount then retry-mountseenmountingFailed
trace surface-unmount then retry-ackack-pendingack-pendingPassed
trace surface-unmount then surface-unmountack-retryack-retryPassed
domain state regression 1: painted{'phase': 'mounting', 'value': False}{'phase': 'mounting', 'value': False}Passed
domain state regression 2: painted{'phase': 'ack-pending', 'value': True}{'phase': 'ack-pending', 'value': True}Passed
domain state regression 3: acknowledged{'phase': 'ack-pending', 'value': False}{'phase': 'ack-pending', 'value': False}Passed
domain state regression 4: acknowledged{'phase': 'seen', 'value': True}{'phase': 'seen', 'value': True}Passed
domain state regression 5: ack_attempts{'phase': 'ack-pending', 'value': 3}{'phase': 'ack-pending', 'value': 3}Passed
domain state regression 6: painted{'phase': 'seen', 'value': True}{'phase': 'undisplayed', 'value': False}Failed
domain state regression 7: acknowledged{'phase': 'seen', 'value': True}{'phase': 'seen', 'value': True}Passed

SHA-256 / 8143d774785682c4f8aa6cbe6e677102632b65255a4c42d401ae534f5c55757c

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(initial, events, generation, payload=None, observe=None):
    table = {('received', 'mount-request'): 'mounting', ('mounting', 'paint-confirmed'): 'ack-pending', ('mounting', 'mount-failed'): 'undisplayed', ('ack-pending', 'ack-success'): 'seen', ('ack-pending', 'ack-failure'): 'ack-retry', ('ack-retry', 'retry-ack'): 'ack-pending', ('undisplayed', 'retry-mount'): 'mounting', ('seen', 'delivery-replay'): 'seen', ('mounting', 'route-unmount'): 'ack-pending', ('ack-retry', 'surface-unmount'): 'ack-retry'}
    data = json.loads(json.dumps({'mount': 4, 'painted': False, 'acknowledged': False, 'ack_attempts': 0})) if payload is None else {**json.loads(json.dumps({'mount': 4, 'painted': False, 'acknowledged': False, 'ack_attempts': 0})), **json.loads(json.dumps(payload))}
    state = initial
    for delivery in events:
        event, event_generation = delivery[:2]
        arg = delivery[2] if len(delivery) > 2 else {}
        if event_generation == generation:
            previous = state
            if event in ('paint-confirmed','mount-failed') and arg.get('mount',data['mount']) != data['mount']: event = 'unknown-event'
            if event == 'paint-confirmed': data['painted'] = True
            if event == 'retry-ack': data['ack_attempts'] += 1
            if event == 'ack-success' and 'require_paint' in arg and not data['painted']: event = 'unknown-event'
            state = table.get((state, event), state)
            if state == 'seen': data['acknowledged'] = True
            if state == 'undisplayed': data['painted'] = False
    return {'phase': state, 'value': data[observe]} if observe else state
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('received / mount-request', solve('received', [('mount-request', N)], N), 'mounting')
check('mounting / paint-confirmed', solve('mounting', [('paint-confirmed', N)], N), 'ack-pending')
check('mounting / mount-failed', solve('mounting', [('mount-failed', N)], N), 'undisplayed')
check('ack-pending / ack-success', solve('ack-pending', [('ack-success', N)], N), 'seen')
check('ack-pending / ack-failure', solve('ack-pending', [('ack-failure', N)], N), 'ack-retry')
check('ack-retry / retry-ack', solve('ack-retry', [('retry-ack', N)], N), 'ack-pending')
check('undisplayed / retry-mount', solve('undisplayed', [('retry-mount', N)], N), 'mounting')
check('seen / delivery-replay', solve('seen', [('delivery-replay', N)], N), 'seen')
check('mounting / route-unmount', solve('mounting', [('route-unmount', N)], N), 'undisplayed')
check('ack-retry / surface-unmount', solve('ack-retry', [('surface-unmount', N)], N), 'ack-retry')
check('older notification incarnation', solve('received', [('mount-request', N - 1)], N), 'received')
check('future notification incarnation', solve('received', [('mount-request', N + 1)], N), 'received')
check('unknown event is inert', solve('received', [('unknown-event', N)], N), 'received')
check('empty delivery batch', solve('received', [], N), 'received')
check('N stale deliveries before current delivery', solve('received', [('mount-request', N - 1)] * N + [('mount-request', N)], N), 'mounting')
check('trace mount-request then paint-confirmed', solve('received', [('mount-request', N), ('paint-confirmed', N)], N), 'ack-pending')
check('trace mount-request then mount-failed', solve('received', [('mount-request', N), ('mount-failed', N)], N), 'undisplayed')
check('trace mount-request then route-unmount', solve('received', [('mount-request', N), ('route-unmount', N)], N), 'undisplayed')
check('trace paint-confirmed then ack-success', solve('mounting', [('paint-confirmed', N), ('ack-success', N)], N), 'seen')
check('trace paint-confirmed then ack-failure', solve('mounting', [('paint-confirmed', N), ('ack-failure', N)], N), 'ack-retry')
check('trace mount-failed then retry-mount', solve('mounting', [('mount-failed', N), ('retry-mount', N)], N), 'mounting')
check('trace ack-success then delivery-replay', solve('ack-pending', [('ack-success', N), ('delivery-replay', N)], N), 'seen')
check('trace ack-failure then retry-ack', solve('ack-pending', [('ack-failure', N), ('retry-ack', N)], N), 'ack-pending')
check('trace ack-failure then surface-unmount', solve('ack-pending', [('ack-failure', N), ('surface-unmount', N)], N), 'ack-retry')
check('trace retry-ack then ack-success', solve('ack-retry', [('retry-ack', N), ('ack-success', N)], N), 'seen')
check('trace retry-ack then ack-failure', solve('ack-retry', [('retry-ack', N), ('ack-failure', N)], N), 'ack-retry')
check('trace retry-mount then paint-confirmed', solve('undisplayed', [('retry-mount', N), ('paint-confirmed', N)], N), 'ack-pending')
check('trace retry-mount then mount-failed', solve('undisplayed', [('retry-mount', N), ('mount-failed', N)], N), 'undisplayed')
check('trace retry-mount then route-unmount', solve('undisplayed', [('retry-mount', N), ('route-unmount', N)], N), 'undisplayed')
check('trace delivery-replay then delivery-replay', solve('seen', [('delivery-replay', N), ('delivery-replay', N)], N), 'seen')
check('trace route-unmount then retry-mount', solve('mounting', [('route-unmount', N), ('retry-mount', N)], N), 'mounting')
check('trace surface-unmount then retry-ack', solve('ack-retry', [('surface-unmount', N), ('retry-ack', N)], N), 'ack-pending')
check('trace surface-unmount then surface-unmount', solve('ack-retry', [('surface-unmount', N), ('surface-unmount', N)], N), 'ack-retry')
check('domain state regression 1: painted', solve('mounting', [('paint-confirmed', N, {'mount': 3})], N, {}, 'painted'), {'phase': 'mounting', 'value': False})
check('domain state regression 2: painted', solve('mounting', [('paint-confirmed', N, {'mount': 4})], N, {}, 'painted'), {'phase': 'ack-pending', 'value': True})
check('domain state regression 3: acknowledged', solve('ack-pending', [('ack-success', N, {'require_paint': True})], N, {}, 'acknowledged'), {'phase': 'ack-pending', 'value': False})
check('domain state regression 4: acknowledged', solve('ack-pending', [('ack-success', N, {'require_paint': True})], N, {'painted': True}, 'acknowledged'), {'phase': 'seen', 'value': True})
check('domain state regression 5: ack_attempts', solve('ack-retry', [('retry-ack', N, {})], N, {'painted': True, 'ack_attempts': 2}, 'ack_attempts'), {'phase': 'ack-pending', 'value': 3})
check('domain state regression 6: painted', solve('mounting', [('route-unmount', N, {})], N, {'painted': True}, 'painted'), {'phase': 'undisplayed', 'value': False})
check('domain state regression 7: acknowledged', solve('mounting', [('paint-confirmed', N, {}), ('ack-failure', N, {}), ('surface-unmount', N, {}), ('retry-ack', N, {}), ('ack-success', N, {'require_paint': True})], N, {}, 'acknowledged'), {'phase': 'seen', 'value': True})
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
received / mount-requestmountingmountingPassed
mounting / paint-confirmedack-pendingack-pendingPassed
mounting / mount-failedundisplayedundisplayedPassed
ack-pending / ack-successseenseenPassed
ack-pending / ack-failureack-retryack-retryPassed
ack-retry / retry-ackack-pendingack-pendingPassed
undisplayed / retry-mountmountingmountingPassed
seen / delivery-replayseenseenPassed
mounting / route-unmountack-pendingundisplayedFailed
ack-retry / surface-unmountack-retryack-retryPassed
older notification incarnationreceivedreceivedPassed
future notification incarnationreceivedreceivedPassed
unknown event is inertreceivedreceivedPassed
empty delivery batchreceivedreceivedPassed
N stale deliveries before current deliverymountingmountingPassed
trace mount-request then paint-confirmedack-pendingack-pendingPassed
trace mount-request then mount-failedundisplayedundisplayedPassed
trace mount-request then route-unmountack-pendingundisplayedFailed
trace paint-confirmed then ack-successseenseenPassed
trace paint-confirmed then ack-failureack-retryack-retryPassed
trace mount-failed then retry-mountmountingmountingPassed
trace ack-success then delivery-replayseenseenPassed
trace ack-failure then retry-ackack-pendingack-pendingPassed
trace ack-failure then surface-unmountack-retryack-retryPassed
trace retry-ack then ack-successseenseenPassed
trace retry-ack then ack-failureack-retryack-retryPassed
trace retry-mount then paint-confirmedack-pendingack-pendingPassed
trace retry-mount then mount-failedundisplayedundisplayedPassed
trace retry-mount then route-unmountack-pendingundisplayedFailed
trace delivery-replay then delivery-replayseenseenPassed
trace route-unmount then retry-mountack-pendingmountingFailed
trace surface-unmount then retry-ackack-pendingack-pendingPassed
trace surface-unmount then surface-unmountack-retryack-retryPassed
domain state regression 1: painted{'phase': 'mounting', 'value': False}{'phase': 'mounting', 'value': False}Passed
domain state regression 2: painted{'phase': 'ack-pending', 'value': True}{'phase': 'ack-pending', 'value': True}Passed
domain state regression 3: acknowledged{'phase': 'ack-pending', 'value': False}{'phase': 'ack-pending', 'value': False}Passed
domain state regression 4: acknowledged{'phase': 'seen', 'value': True}{'phase': 'seen', 'value': True}Passed
domain state regression 5: ack_attempts{'phase': 'ack-pending', 'value': 3}{'phase': 'ack-pending', 'value': 3}Passed
domain state regression 6: painted{'phase': 'ack-pending', 'value': True}{'phase': 'undisplayed', 'value': False}Failed
domain state regression 7: acknowledged{'phase': 'seen', 'value': True}{'phase': 'seen', 'value': True}Passed

SHA-256 / 893969c889a5e6c6ac51255bd03589081a13b397c8e8da1e899395b6944d78fd

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(initial, events, generation, payload=None, observe=None):
    table = {('received', 'mount-request'): 'mounting', ('mounting', 'paint-confirmed'): 'ack-pending', ('mounting', 'mount-failed'): 'undisplayed', ('ack-pending', 'ack-success'): 'seen', ('ack-pending', 'ack-failure'): 'ack-retry', ('ack-retry', 'retry-ack'): 'ack-pending', ('undisplayed', 'retry-mount'): 'mounting', ('seen', 'delivery-replay'): 'seen', ('mounting', 'route-unmount'): 'undisplayed', ('ack-retry', 'surface-unmount'): 'ack-retry'}
    data = json.loads(json.dumps({'mount': 4, 'painted': False, 'acknowledged': False, 'ack_attempts': 0})) if payload is None else {**json.loads(json.dumps({'mount': 4, 'painted': False, 'acknowledged': False, 'ack_attempts': 0})), **json.loads(json.dumps(payload))}
    state = initial
    for delivery in events:
        event, event_generation = delivery[:2]
        arg = delivery[2] if len(delivery) > 2 else {}
        if event_generation == generation:
            previous = state
            if event in ('paint-confirmed','mount-failed') and arg.get('mount',data['mount']) != data['mount']: event = 'unknown-event'
            if event == 'paint-confirmed': data['painted'] = True
            if event == 'retry-ack': data['ack_attempts'] += 1
            if event == 'ack-success' and 'require_paint' in arg and not data['painted']: event = 'unknown-event'
            state = table.get((state, event), state)
            if state == 'seen': data['acknowledged'] = True
            if state == 'undisplayed': data['painted'] = False
    return {'phase': state, 'value': data[observe]} if observe else state
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('received / mount-request', solve('received', [('mount-request', N)], N), 'mounting')
check('mounting / paint-confirmed', solve('mounting', [('paint-confirmed', N)], N), 'ack-pending')
check('mounting / mount-failed', solve('mounting', [('mount-failed', N)], N), 'undisplayed')
check('ack-pending / ack-success', solve('ack-pending', [('ack-success', N)], N), 'seen')
check('ack-pending / ack-failure', solve('ack-pending', [('ack-failure', N)], N), 'ack-retry')
check('ack-retry / retry-ack', solve('ack-retry', [('retry-ack', N)], N), 'ack-pending')
check('undisplayed / retry-mount', solve('undisplayed', [('retry-mount', N)], N), 'mounting')
check('seen / delivery-replay', solve('seen', [('delivery-replay', N)], N), 'seen')
check('mounting / route-unmount', solve('mounting', [('route-unmount', N)], N), 'undisplayed')
check('ack-retry / surface-unmount', solve('ack-retry', [('surface-unmount', N)], N), 'ack-retry')
check('older notification incarnation', solve('received', [('mount-request', N - 1)], N), 'received')
check('future notification incarnation', solve('received', [('mount-request', N + 1)], N), 'received')
check('unknown event is inert', solve('received', [('unknown-event', N)], N), 'received')
check('empty delivery batch', solve('received', [], N), 'received')
check('N stale deliveries before current delivery', solve('received', [('mount-request', N - 1)] * N + [('mount-request', N)], N), 'mounting')
check('trace mount-request then paint-confirmed', solve('received', [('mount-request', N), ('paint-confirmed', N)], N), 'ack-pending')
check('trace mount-request then mount-failed', solve('received', [('mount-request', N), ('mount-failed', N)], N), 'undisplayed')
check('trace mount-request then route-unmount', solve('received', [('mount-request', N), ('route-unmount', N)], N), 'undisplayed')
check('trace paint-confirmed then ack-success', solve('mounting', [('paint-confirmed', N), ('ack-success', N)], N), 'seen')
check('trace paint-confirmed then ack-failure', solve('mounting', [('paint-confirmed', N), ('ack-failure', N)], N), 'ack-retry')
check('trace mount-failed then retry-mount', solve('mounting', [('mount-failed', N), ('retry-mount', N)], N), 'mounting')
check('trace ack-success then delivery-replay', solve('ack-pending', [('ack-success', N), ('delivery-replay', N)], N), 'seen')
check('trace ack-failure then retry-ack', solve('ack-pending', [('ack-failure', N), ('retry-ack', N)], N), 'ack-pending')
check('trace ack-failure then surface-unmount', solve('ack-pending', [('ack-failure', N), ('surface-unmount', N)], N), 'ack-retry')
check('trace retry-ack then ack-success', solve('ack-retry', [('retry-ack', N), ('ack-success', N)], N), 'seen')
check('trace retry-ack then ack-failure', solve('ack-retry', [('retry-ack', N), ('ack-failure', N)], N), 'ack-retry')
check('trace retry-mount then paint-confirmed', solve('undisplayed', [('retry-mount', N), ('paint-confirmed', N)], N), 'ack-pending')
check('trace retry-mount then mount-failed', solve('undisplayed', [('retry-mount', N), ('mount-failed', N)], N), 'undisplayed')
check('trace retry-mount then route-unmount', solve('undisplayed', [('retry-mount', N), ('route-unmount', N)], N), 'undisplayed')
check('trace delivery-replay then delivery-replay', solve('seen', [('delivery-replay', N), ('delivery-replay', N)], N), 'seen')
check('trace route-unmount then retry-mount', solve('mounting', [('route-unmount', N), ('retry-mount', N)], N), 'mounting')
check('trace surface-unmount then retry-ack', solve('ack-retry', [('surface-unmount', N), ('retry-ack', N)], N), 'ack-pending')
check('trace surface-unmount then surface-unmount', solve('ack-retry', [('surface-unmount', N), ('surface-unmount', N)], N), 'ack-retry')
check('domain state regression 1: painted', solve('mounting', [('paint-confirmed', N, {'mount': 3})], N, {}, 'painted'), {'phase': 'mounting', 'value': False})
check('domain state regression 2: painted', solve('mounting', [('paint-confirmed', N, {'mount': 4})], N, {}, 'painted'), {'phase': 'ack-pending', 'value': True})
check('domain state regression 3: acknowledged', solve('ack-pending', [('ack-success', N, {'require_paint': True})], N, {}, 'acknowledged'), {'phase': 'ack-pending', 'value': False})
check('domain state regression 4: acknowledged', solve('ack-pending', [('ack-success', N, {'require_paint': True})], N, {'painted': True}, 'acknowledged'), {'phase': 'seen', 'value': True})
check('domain state regression 5: ack_attempts', solve('ack-retry', [('retry-ack', N, {})], N, {'painted': True, 'ack_attempts': 2}, 'ack_attempts'), {'phase': 'ack-pending', 'value': 3})
check('domain state regression 6: painted', solve('mounting', [('route-unmount', N, {})], N, {'painted': True}, 'painted'), {'phase': 'undisplayed', 'value': False})
check('domain state regression 7: acknowledged', solve('mounting', [('paint-confirmed', N, {}), ('ack-failure', N, {}), ('surface-unmount', N, {}), ('retry-ack', N, {}), ('ack-success', N, {'require_paint': True})], N, {}, 'acknowledged'), {'phase': 'seen', 'value': True})
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
received / mount-requestmountingmountingPassed
mounting / paint-confirmedack-pendingack-pendingPassed
mounting / mount-failedundisplayedundisplayedPassed
ack-pending / ack-successseenseenPassed
ack-pending / ack-failureack-retryack-retryPassed
ack-retry / retry-ackack-pendingack-pendingPassed
undisplayed / retry-mountmountingmountingPassed
seen / delivery-replayseenseenPassed
mounting / route-unmountundisplayedundisplayedPassed
ack-retry / surface-unmountack-retryack-retryPassed
older notification incarnationreceivedreceivedPassed
future notification incarnationreceivedreceivedPassed
unknown event is inertreceivedreceivedPassed
empty delivery batchreceivedreceivedPassed
N stale deliveries before current deliverymountingmountingPassed
trace mount-request then paint-confirmedack-pendingack-pendingPassed
trace mount-request then mount-failedundisplayedundisplayedPassed
trace mount-request then route-unmountundisplayedundisplayedPassed
trace paint-confirmed then ack-successseenseenPassed
trace paint-confirmed then ack-failureack-retryack-retryPassed
trace mount-failed then retry-mountmountingmountingPassed
trace ack-success then delivery-replayseenseenPassed
trace ack-failure then retry-ackack-pendingack-pendingPassed
trace ack-failure then surface-unmountack-retryack-retryPassed
trace retry-ack then ack-successseenseenPassed
trace retry-ack then ack-failureack-retryack-retryPassed
trace retry-mount then paint-confirmedack-pendingack-pendingPassed
trace retry-mount then mount-failedundisplayedundisplayedPassed
trace retry-mount then route-unmountundisplayedundisplayedPassed
trace delivery-replay then delivery-replayseenseenPassed
trace route-unmount then retry-mountmountingmountingPassed
trace surface-unmount then retry-ackack-pendingack-pendingPassed
trace surface-unmount then surface-unmountack-retryack-retryPassed
domain state regression 1: painted{'phase': 'mounting', 'value': False}{'phase': 'mounting', 'value': False}Passed
domain state regression 2: painted{'phase': 'ack-pending', 'value': True}{'phase': 'ack-pending', 'value': True}Passed
domain state regression 3: acknowledged{'phase': 'ack-pending', 'value': False}{'phase': 'ack-pending', 'value': False}Passed
domain state regression 4: acknowledged{'phase': 'seen', 'value': True}{'phase': 'seen', 'value': True}Passed
domain state regression 5: ack_attempts{'phase': 'ack-pending', 'value': 3}{'phase': 'ack-pending', 'value': 3}Passed
domain state regression 6: painted{'phase': 'undisplayed', 'value': False}{'phase': 'undisplayed', 'value': False}Passed
domain state regression 7: acknowledged{'phase': 'seen', 'value': True}{'phase': 'seen', 'value': True}Passed

SHA-256 / f0d88120253486da664ead002bd181a223131f979c5cf335e672cfe2f989437b

Verification & scope

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.

Observations recorded using Python 3.12.14 at 2026-09-29T14:42:29.353377+00:00.

Case digest / d614fc75fd03b5252ce049130e1a25aa37bcfeb13548f3f3bf59f50f030e36b4