FAILURE MAP
← Case archive

FA-19916 / Protocols / Open access

Scoped address assignment controller: bound / renew due · case 01

While bound, event renew_due produces unassigned/clear_address instead of renewing/request_renewal.

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

ROOT CAUSE

In bound, the renew due handler runs clear address and enters unassigned; it must instead run request renewal and enter renewing.

VERIFIED REPAIR

In phase bound, classify renew_due as transition to renewing and emit request_renewal.

Unsuccessful approach: The partial repair chooses renewing/stop_using_address, which still violates this phase-specific event contract.

Case contract

For the stipulated Scoped address assignment controller, initialize the explicitly shown resource registers from seed (1..5), then consume classified events sequentially. After each event return a deep snapshot of phase, resource registers, and cumulative emitted control frames. The explicit ten phase/event rules and their resource effects define admission and response semantics. Unlisted events preserve phase and emit rejection. Payload is the consecutive integers seed through 2*seed+1. Empty event input returns no observations.

Why this case matters

Incorrect event admission now changes concrete queued data, resource ownership, or emitted protocol frames and subsequent trace behavior.

1 / The failure

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

N = 1
observations = []
def solve(phase, events, seed):
    payload = list(range(seed, seed * 2 + 2))
    r = {'address': seed if phase in ('bound','renewing') else None, 'expiry': seed+2 if phase in ('bound','renewing') else None, 'selected': seed+1 if phase!='unassigned' else None, 'offers': [seed+1,seed+2], 'announced': phase in ('bound','renewing'), 'released': False}
    frames = []
    observed = []
    table = {('unassigned', 'solicit'): ('discovering', 'send_discovery'), ('discovering', 'offer'): ('offered', 'record_offer'), ('offered', 'select'): ('requesting', 'request_selected'), ('requesting', 'ack'): ('bound', 'install_lease'), ('requesting', 'nack'): ('unassigned', 'discard_offer'), ('bound', 'renew_due'): ('unassigned', 'clear_address'), ('renewing', 'renew_ack'): ('bound', 'replace_expiry'), ('renewing', 'expired'): ('unassigned', 'clear_address'), ('bound', 'conflict_detected'): ('unassigned', 'decline_clear'), ('bound', 'release'): ('unassigned', 'release_clear')}
    for event in events:
        phase, action = table.get((phase, event), (phase, "reject"))
        if action == 'send_discovery':
            frames.append(['DISCOVER',seed])
        elif action == 'record_offer':
            r['selected']=seed+1
        elif action == 'request_selected':
            frames.append(['REQUEST_ADDRESS',r['selected']])
        elif action == 'install_lease':
            r['address']=r['selected']; r['expiry']=seed+len(payload)+2
        elif action == 'discard_offer':
            r['address']=None; r['selected']=None
        elif action == 'request_renewal':
            frames.append(['RENEW_ADDRESS',r['address']])
        elif action == 'replace_expiry':
            r['expiry']=seed+len(payload)+2
        elif action == 'clear_address':
            r['address']=None; r['announced']=False
        elif action == 'decline_clear':
            frames.append(['DECLINE',r['address']]); r['address']=None; r['announced']=False
        elif action == 'release_clear':
            frames.append(['RELEASE',r['address']]); r['address']=None; r['announced']=False; r['released']=True
        elif action == 'use_default':
            r['address']=0
        elif action == 'send_payload':
            frames.append(['DATA',r['address'],payload])
        elif action == 'use_address':
            frames.append(['DATA',r['address'],payload])
        elif action == 'announce_address':
            r['announced']=True; frames.append(['ANNOUNCE',r['address']])
        elif action == 'request_all_offers':
            frames.extend([['REQUEST_ADDRESS',a] for a in r['offers']])
        elif action == 'install_offer_without_lifetime':
            r['address']=r['selected']; r['expiry']=None
        elif action == 'stop_using_address':
            r['address']=None
        elif action == 'clear_without_decline':
            r['address']=None; r['announced']=False
        elif action == 'clear_without_release':
            r['address']=None; r['announced']=False
        else:
            if action not in ("wait", "ignore", "keep", "retain", "keep_peer", "keep_offer", "keep_hold", "keep_batch", "retain_staging", "keep_staging", "keep_local_owner", "keep_old_session", "keep_address", "keep_old_expiry", "ignore_conflict", "keep_service", "keep_subscription", "retain_shadow", "keep_live", "keep_suspicion", "keep_roles", "keep_staged"):
                frames.append([action, payload[:]])
        observed.append(json.loads(json.dumps({"phase": phase, "registers": r, "frames": frames})))
    return observed
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 2]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 2, 'expiry': 6, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 1, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 1]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 1, 'expiry': 6, 'selected': 2, 'offers': [2, 3], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DECLINE', 1]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': True}, 'frames': [['RELEASE', 1]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['reject', [1, 2, 3]]]}])], 2: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 3]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 3, 'expiry': 8, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 2, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 2]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 2, 'expiry': 8, 'selected': 3, 'offers': [3, 4], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DECLINE', 2]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': True}, 'frames': [['RELEASE', 2]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3], ['DISCOVER', 2]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['reject', [2, 3, 4, 5]]]}])], 3: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 4]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 4, 'expiry': 10, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 3, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 3]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 3, 'expiry': 10, 'selected': 4, 'offers': [4, 5], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DECLINE', 3]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': True}, 'frames': [['RELEASE', 3]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit', 'offer'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4], ['DISCOVER', 3]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4], ['DISCOVER', 3]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack', 'solicit'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4], ['DISCOVER', 3]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['reject', [3, 4, 5, 6, 7]]]}])], 4: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 5]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 5, 'expiry': 12, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 4, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 4]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 4, 'expiry': 12, 'selected': 5, 'offers': [5, 6], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DECLINE', 4]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': True}, 'frames': [['RELEASE', 4]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit', 'offer', 'select'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack', 'solicit', 'offer'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['reject', [4, 5, 6, 7, 8, 9]]]}])], 5: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 6]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 6, 'expiry': 14, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 5, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 5]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 5, 'expiry': 14, 'selected': 6, 'offers': [6, 7], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DECLINE', 5]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': True}, 'frames': [['RELEASE', 5]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit', 'offer', 'select', 'nack'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack', 'solicit', 'offer', 'select'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['reject', [5, 6, 7, 8, 9, 10, 11]]]}])]}
for label, phase, events, expected in cases[N]:
    check(label, solve(phase, events, N), expected)
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
unassigned/solicit[{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed
discovering/offer[{'frames': [], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
offered/select[{'frames': [['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
requesting/ack[{'frames': [], 'phase': 'bound', 'registers': {'address': 2, 'announced': False, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'bound', 'registers': {'address': 2, 'announced': False, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
requesting/nack[{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed
bound/renew_due[{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [['RENEW_ADDRESS', 1]], 'phase': 'renewing', 'registers': {'address': 1, 'announced': True, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}]Failed
renewing/renew_ack[{'frames': [], 'phase': 'bound', 'registers': {'address': 1, 'announced': True, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'bound', 'registers': {'address': 1, 'announced': True, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
renewing/expired[{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
bound/conflict_detected[{'frames': [['DECLINE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [['DECLINE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
bound/release[{'frames': [['RELEASE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': True, 'selected': 2}}][{'frames': [['RELEASE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': True, 'selected': 2}}]Passed
ordered trace 0[{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed
ordered trace 3[{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
empty input[][]Passed
unknown event[{'frames': [['reject', [1, 2, 3]]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [['reject', [1, 2, 3]]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed

SHA-256 / d580f7a42f63255faf51aff8a2573329ad7913f1f14930223e31cd09c1bf6c2b

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(phase, events, seed):
    payload = list(range(seed, seed * 2 + 2))
    r = {'address': seed if phase in ('bound','renewing') else None, 'expiry': seed+2 if phase in ('bound','renewing') else None, 'selected': seed+1 if phase!='unassigned' else None, 'offers': [seed+1,seed+2], 'announced': phase in ('bound','renewing'), 'released': False}
    frames = []
    observed = []
    table = {('unassigned', 'solicit'): ('discovering', 'send_discovery'), ('discovering', 'offer'): ('offered', 'record_offer'), ('offered', 'select'): ('requesting', 'request_selected'), ('requesting', 'ack'): ('bound', 'install_lease'), ('requesting', 'nack'): ('unassigned', 'discard_offer'), ('bound', 'renew_due'): ('renewing', 'stop_using_address'), ('renewing', 'renew_ack'): ('bound', 'replace_expiry'), ('renewing', 'expired'): ('unassigned', 'clear_address'), ('bound', 'conflict_detected'): ('unassigned', 'decline_clear'), ('bound', 'release'): ('unassigned', 'release_clear')}
    for event in events:
        phase, action = table.get((phase, event), (phase, "reject"))
        if action == 'send_discovery':
            frames.append(['DISCOVER',seed])
        elif action == 'record_offer':
            r['selected']=seed+1
        elif action == 'request_selected':
            frames.append(['REQUEST_ADDRESS',r['selected']])
        elif action == 'install_lease':
            r['address']=r['selected']; r['expiry']=seed+len(payload)+2
        elif action == 'discard_offer':
            r['address']=None; r['selected']=None
        elif action == 'request_renewal':
            frames.append(['RENEW_ADDRESS',r['address']])
        elif action == 'replace_expiry':
            r['expiry']=seed+len(payload)+2
        elif action == 'clear_address':
            r['address']=None; r['announced']=False
        elif action == 'decline_clear':
            frames.append(['DECLINE',r['address']]); r['address']=None; r['announced']=False
        elif action == 'release_clear':
            frames.append(['RELEASE',r['address']]); r['address']=None; r['announced']=False; r['released']=True
        elif action == 'use_default':
            r['address']=0
        elif action == 'send_payload':
            frames.append(['DATA',r['address'],payload])
        elif action == 'use_address':
            frames.append(['DATA',r['address'],payload])
        elif action == 'announce_address':
            r['announced']=True; frames.append(['ANNOUNCE',r['address']])
        elif action == 'request_all_offers':
            frames.extend([['REQUEST_ADDRESS',a] for a in r['offers']])
        elif action == 'install_offer_without_lifetime':
            r['address']=r['selected']; r['expiry']=None
        elif action == 'stop_using_address':
            r['address']=None
        elif action == 'clear_without_decline':
            r['address']=None; r['announced']=False
        elif action == 'clear_without_release':
            r['address']=None; r['announced']=False
        else:
            if action not in ("wait", "ignore", "keep", "retain", "keep_peer", "keep_offer", "keep_hold", "keep_batch", "retain_staging", "keep_staging", "keep_local_owner", "keep_old_session", "keep_address", "keep_old_expiry", "ignore_conflict", "keep_service", "keep_subscription", "retain_shadow", "keep_live", "keep_suspicion", "keep_roles", "keep_staged"):
                frames.append([action, payload[:]])
        observed.append(json.loads(json.dumps({"phase": phase, "registers": r, "frames": frames})))
    return observed
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 2]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 2, 'expiry': 6, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 1, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 1]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 1, 'expiry': 6, 'selected': 2, 'offers': [2, 3], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DECLINE', 1]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': True}, 'frames': [['RELEASE', 1]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['reject', [1, 2, 3]]]}])], 2: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 3]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 3, 'expiry': 8, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 2, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 2]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 2, 'expiry': 8, 'selected': 3, 'offers': [3, 4], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DECLINE', 2]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': True}, 'frames': [['RELEASE', 2]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3], ['DISCOVER', 2]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['reject', [2, 3, 4, 5]]]}])], 3: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 4]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 4, 'expiry': 10, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 3, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 3]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 3, 'expiry': 10, 'selected': 4, 'offers': [4, 5], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DECLINE', 3]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': True}, 'frames': [['RELEASE', 3]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit', 'offer'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4], ['DISCOVER', 3]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4], ['DISCOVER', 3]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack', 'solicit'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4], ['DISCOVER', 3]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['reject', [3, 4, 5, 6, 7]]]}])], 4: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 5]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 5, 'expiry': 12, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 4, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 4]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 4, 'expiry': 12, 'selected': 5, 'offers': [5, 6], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DECLINE', 4]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': True}, 'frames': [['RELEASE', 4]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit', 'offer', 'select'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack', 'solicit', 'offer'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['reject', [4, 5, 6, 7, 8, 9]]]}])], 5: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 6]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 6, 'expiry': 14, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 5, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 5]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 5, 'expiry': 14, 'selected': 6, 'offers': [6, 7], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DECLINE', 5]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': True}, 'frames': [['RELEASE', 5]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit', 'offer', 'select', 'nack'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack', 'solicit', 'offer', 'select'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['reject', [5, 6, 7, 8, 9, 10, 11]]]}])]}
for label, phase, events, expected in cases[N]:
    check(label, solve(phase, events, N), expected)
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
unassigned/solicit[{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed
discovering/offer[{'frames': [], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
offered/select[{'frames': [['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
requesting/ack[{'frames': [], 'phase': 'bound', 'registers': {'address': 2, 'announced': False, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'bound', 'registers': {'address': 2, 'announced': False, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
requesting/nack[{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed
bound/renew_due[{'frames': [], 'phase': 'renewing', 'registers': {'address': None, 'announced': True, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [['RENEW_ADDRESS', 1]], 'phase': 'renewing', 'registers': {'address': 1, 'announced': True, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}]Failed
renewing/renew_ack[{'frames': [], 'phase': 'bound', 'registers': {'address': 1, 'announced': True, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'bound', 'registers': {'address': 1, 'announced': True, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
renewing/expired[{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
bound/conflict_detected[{'frames': [['DECLINE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [['DECLINE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
bound/release[{'frames': [['RELEASE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': True, 'selected': 2}}][{'frames': [['RELEASE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': True, 'selected': 2}}]Passed
ordered trace 0[{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed
ordered trace 3[{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
empty input[][]Passed
unknown event[{'frames': [['reject', [1, 2, 3]]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [['reject', [1, 2, 3]]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed

SHA-256 / a3473a474c13bb411ff55f56d846e78a4e3a106601cc3806b710db891ecbdcd1

3 / The verified repair

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

N = 1
observations = []
def solve(phase, events, seed):
    payload = list(range(seed, seed * 2 + 2))
    r = {'address': seed if phase in ('bound','renewing') else None, 'expiry': seed+2 if phase in ('bound','renewing') else None, 'selected': seed+1 if phase!='unassigned' else None, 'offers': [seed+1,seed+2], 'announced': phase in ('bound','renewing'), 'released': False}
    frames = []
    observed = []
    table = {('unassigned', 'solicit'): ('discovering', 'send_discovery'), ('discovering', 'offer'): ('offered', 'record_offer'), ('offered', 'select'): ('requesting', 'request_selected'), ('requesting', 'ack'): ('bound', 'install_lease'), ('requesting', 'nack'): ('unassigned', 'discard_offer'), ('bound', 'renew_due'): ('renewing', 'request_renewal'), ('renewing', 'renew_ack'): ('bound', 'replace_expiry'), ('renewing', 'expired'): ('unassigned', 'clear_address'), ('bound', 'conflict_detected'): ('unassigned', 'decline_clear'), ('bound', 'release'): ('unassigned', 'release_clear')}
    for event in events:
        phase, action = table.get((phase, event), (phase, "reject"))
        if action == 'send_discovery':
            frames.append(['DISCOVER',seed])
        elif action == 'record_offer':
            r['selected']=seed+1
        elif action == 'request_selected':
            frames.append(['REQUEST_ADDRESS',r['selected']])
        elif action == 'install_lease':
            r['address']=r['selected']; r['expiry']=seed+len(payload)+2
        elif action == 'discard_offer':
            r['address']=None; r['selected']=None
        elif action == 'request_renewal':
            frames.append(['RENEW_ADDRESS',r['address']])
        elif action == 'replace_expiry':
            r['expiry']=seed+len(payload)+2
        elif action == 'clear_address':
            r['address']=None; r['announced']=False
        elif action == 'decline_clear':
            frames.append(['DECLINE',r['address']]); r['address']=None; r['announced']=False
        elif action == 'release_clear':
            frames.append(['RELEASE',r['address']]); r['address']=None; r['announced']=False; r['released']=True
        elif action == 'use_default':
            r['address']=0
        elif action == 'send_payload':
            frames.append(['DATA',r['address'],payload])
        elif action == 'use_address':
            frames.append(['DATA',r['address'],payload])
        elif action == 'announce_address':
            r['announced']=True; frames.append(['ANNOUNCE',r['address']])
        elif action == 'request_all_offers':
            frames.extend([['REQUEST_ADDRESS',a] for a in r['offers']])
        elif action == 'install_offer_without_lifetime':
            r['address']=r['selected']; r['expiry']=None
        elif action == 'stop_using_address':
            r['address']=None
        elif action == 'clear_without_decline':
            r['address']=None; r['announced']=False
        elif action == 'clear_without_release':
            r['address']=None; r['announced']=False
        else:
            if action not in ("wait", "ignore", "keep", "retain", "keep_peer", "keep_offer", "keep_hold", "keep_batch", "retain_staging", "keep_staging", "keep_local_owner", "keep_old_session", "keep_address", "keep_old_expiry", "ignore_conflict", "keep_service", "keep_subscription", "retain_shadow", "keep_live", "keep_suspicion", "keep_roles", "keep_staged"):
                frames.append([action, payload[:]])
        observed.append(json.loads(json.dumps({"phase": phase, "registers": r, "frames": frames})))
    return observed
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {1: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 2]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 2, 'expiry': 6, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 1, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 1]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 1, 'expiry': 6, 'selected': 2, 'offers': [2, 3], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DECLINE', 1]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 3, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': True}, 'frames': [['RELEASE', 1]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 2, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [2, 3], 'announced': False, 'released': False}, 'frames': [['reject', [1, 2, 3]]]}])], 2: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 3]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 3, 'expiry': 8, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 2, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 2]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 2, 'expiry': 8, 'selected': 3, 'offers': [3, 4], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DECLINE', 2]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 4, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': True}, 'frames': [['RELEASE', 2]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3], ['DISCOVER', 2]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 3, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 2], ['REQUEST_ADDRESS', 3]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [3, 4], 'announced': False, 'released': False}, 'frames': [['reject', [2, 3, 4, 5]]]}])], 3: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 4]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 4, 'expiry': 10, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 3, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 3]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 3, 'expiry': 10, 'selected': 4, 'offers': [4, 5], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DECLINE', 3]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 5, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': True}, 'frames': [['RELEASE', 3]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit', 'offer'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4], ['DISCOVER', 3]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4], ['DISCOVER', 3]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack', 'solicit'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 4, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 3], ['REQUEST_ADDRESS', 4], ['DISCOVER', 3]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [4, 5], 'announced': False, 'released': False}, 'frames': [['reject', [3, 4, 5, 6, 7]]]}])], 4: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 5]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 5, 'expiry': 12, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 4, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 4]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 4, 'expiry': 12, 'selected': 5, 'offers': [5, 6], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DECLINE', 4]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 6, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': True}, 'frames': [['RELEASE', 4]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit', 'offer', 'select'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack', 'solicit', 'offer'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 5, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 4], ['REQUEST_ADDRESS', 5], ['DISCOVER', 4]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [5, 6], 'announced': False, 'released': False}, 'frames': [['reject', [4, 5, 6, 7, 8, 9]]]}])], 5: [('unassigned/solicit', 'unassigned', ['solicit'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}]), ('discovering/offer', 'discovering', ['offer'], [{'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('offered/select', 'offered', ['select'], [{'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['REQUEST_ADDRESS', 6]]}]), ('requesting/ack', 'requesting', ['ack'], [{'phase': 'bound', 'registers': {'address': 6, 'expiry': 14, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('requesting/nack', 'requesting', ['nack'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('bound/renew_due', 'bound', ['renew_due'], [{'phase': 'renewing', 'registers': {'address': 5, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': True, 'released': False}, 'frames': [['RENEW_ADDRESS', 5]]}]), ('renewing/renew_ack', 'renewing', ['renew_ack'], [{'phase': 'bound', 'registers': {'address': 5, 'expiry': 14, 'selected': 6, 'offers': [6, 7], 'announced': True, 'released': False}, 'frames': []}]), ('renewing/expired', 'renewing', ['expired'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}]), ('bound/conflict_detected', 'bound', ['conflict_detected'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DECLINE', 5]]}]), ('bound/release', 'bound', ['release'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': 7, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': True}, 'frames': [['RELEASE', 5]]}]), ('ordered trace 0', 'unassigned', ['solicit', 'offer', 'select', 'nack', 'solicit', 'offer', 'select', 'nack'], [{'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}]), ('ordered trace 3', 'requesting', ['nack', 'solicit', 'offer', 'select', 'nack', 'solicit', 'offer', 'select'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': []}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}, {'phase': 'discovering', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'offered', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5]]}, {'phase': 'requesting', 'registers': {'address': None, 'expiry': None, 'selected': 6, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['DISCOVER', 5], ['REQUEST_ADDRESS', 6], ['DISCOVER', 5], ['REQUEST_ADDRESS', 6]]}]), ('empty input', 'unassigned', [], []), ('unknown event', 'unassigned', ['unsupported'], [{'phase': 'unassigned', 'registers': {'address': None, 'expiry': None, 'selected': None, 'offers': [6, 7], 'announced': False, 'released': False}, 'frames': [['reject', [5, 6, 7, 8, 9, 10, 11]]]}])]}
for label, phase, events, expected in cases[N]:
    check(label, solve(phase, events, N), expected)
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
unassigned/solicit[{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed
discovering/offer[{'frames': [], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
offered/select[{'frames': [['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
requesting/ack[{'frames': [], 'phase': 'bound', 'registers': {'address': 2, 'announced': False, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'bound', 'registers': {'address': 2, 'announced': False, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
requesting/nack[{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed
bound/renew_due[{'frames': [['RENEW_ADDRESS', 1]], 'phase': 'renewing', 'registers': {'address': 1, 'announced': True, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [['RENEW_ADDRESS', 1]], 'phase': 'renewing', 'registers': {'address': 1, 'announced': True, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
renewing/renew_ack[{'frames': [], 'phase': 'bound', 'registers': {'address': 1, 'announced': True, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'bound', 'registers': {'address': 1, 'announced': True, 'expiry': 6, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
renewing/expired[{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
bound/conflict_detected[{'frames': [['DECLINE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [['DECLINE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
bound/release[{'frames': [['RELEASE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': True, 'selected': 2}}][{'frames': [['RELEASE', 1]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': 3, 'offers': [2, 3], 'released': True, 'selected': 2}}]Passed
ordered trace 0[{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed
ordered trace 3[{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}][{'frames': [], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'discovering', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}, {'frames': [['DISCOVER', 1]], 'phase': 'offered', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}, {'frames': [['DISCOVER', 1], ['REQUEST_ADDRESS', 2]], 'phase': 'requesting', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': 2}}]Passed
empty input[][]Passed
unknown event[{'frames': [['reject', [1, 2, 3]]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}][{'frames': [['reject', [1, 2, 3]]], 'phase': 'unassigned', 'registers': {'address': None, 'announced': False, 'expiry': None, 'offers': [2, 3], 'released': False, 'selected': None}}]Passed

SHA-256 / a2571d4ed8a8f3b33193213ea0d935f1f92d78c0daa60f7a698339e2ab9928f1

Verification & scope

Bounded offline control-plane abstraction with prescribed initial registers and classified events. Not a named protocol implementation or conformance test; excludes wire parsing, transport retries, physical execution, authentication, crash persistence, and timing. Related event faults share the full corrected controller and evaluation group. 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:40:13.350762+00:00.

Case digest / 2eccd5be4086234677e3353afb789253efce28f6f43b96155591c9dd59367055