{"abstract":"An operation is applied before operations from other replicas that it causally depends on.","category":"CRDT convergence","checks":10,"contract":"A receiver starts with an empty delivered vector. An arrival [sender, vector, payload] is a duplicate when its sender entry is at or below the delivered entry or the same (sender, entry) is already buffered. Otherwise it is buffered; then, repeatedly, the oldest buffered message whose sender entry is exactly delivered+1 and whose other entries are all <= delivered is delivered, setting only the sender entry. Return delivered payloads, sorted pending payloads, duplicate count and the delivered vector.","evaluation_group":"w2-crdt-convergence-causal-delivery-buffer","failed_approach":"Skipping replicas not yet in the delivered vector still delivers messages that depend on an unseen replica.","family":"w2-crdt-convergence-causal-delivery-buffer-foreign-dependencies","id":"FA-75016","implementations":{"attempt":{"sha256":"9450dce8361529f96798c8ed439d51bfb0520a4cfe97554e21cec5b061fbbb9a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(arrivals):\n    local = {}\n    delivered, buffer, dups = [], [], 0\n    def ready(msg):\n        s, vc = msg[0], msg[1]\n        if vc.get(s, 0) != local.get(s, 0) + 1:\n            return False\n        return all(v <= local[k] for k, v in vc.items() if k != s and k in local)\n    for msg in arrivals:\n        s, vc = msg[0], msg[1]\n        if vc.get(s, 0) <= local.get(s, 0) or any(b[0] == s and b[1].get(s) == vc.get(s) for b in buffer):\n            dups += 1\n            continue\n        buffer.append(msg)\n        progress = True\n        while progress:\n            progress = False\n            for b in buffer:\n                if ready(b):\n                    buffer.remove(b)\n                    local[b[0]] = b[1][b[0]]\n                    delivered.append(b[2])\n                    progress = True\n                    break\n    return {'delivered': delivered, 'pending': sorted(b[2] for b in buffer), 'duplicates': dups, 'clock': sorted([k, v] for k, v in local.items())}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2']]], {'delivered': ['b1', 'b2'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 2]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    2: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3']]], {'delivered': ['b1', 'b2', 'b3'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 3]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 2, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    3: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3'], ['b', {'b': 4}, 'b4']]], {'delivered': ['b1', 'b2', 'b3', 'b4'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 4]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 3, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    4: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3'], ['b', {'b': 4}, 'b4'], ['b', {'b': 5}, 'b5']]], {'delivered': ['b1', 'b2', 'b3', 'b4', 'b5'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 5]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 4, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    5: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3'], ['b', {'b': 4}, 'b4'], ['b', {'b': 5}, 'b5'], ['b', {'b': 6}, 'b6']]], {'delivered': ['b1', 'b2', 'b3', 'b4', 'b5', 'b6'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 6]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 5, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n}[N]\nfor label, args, expected in cases:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"dee463ca79c04ff838873335299e8b0b69c02841e3a514f5b38b123503b89afb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(arrivals):\n    local = {}\n    delivered, buffer, dups = [], [], 0\n    def ready(msg):\n        s, vc = msg[0], msg[1]\n        if vc.get(s, 0) != local.get(s, 0) + 1:\n            return False\n        return True\n    for msg in arrivals:\n        s, vc = msg[0], msg[1]\n        if vc.get(s, 0) <= local.get(s, 0) or any(b[0] == s and b[1].get(s) == vc.get(s) for b in buffer):\n            dups += 1\n            continue\n        buffer.append(msg)\n        progress = True\n        while progress:\n            progress = False\n            for b in buffer:\n                if ready(b):\n                    buffer.remove(b)\n                    local[b[0]] = b[1][b[0]]\n                    delivered.append(b[2])\n                    progress = True\n                    break\n    return {'delivered': delivered, 'pending': sorted(b[2] for b in buffer), 'duplicates': dups, 'clock': sorted([k, v] for k, v in local.items())}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2']]], {'delivered': ['b1', 'b2'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 2]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    2: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3']]], {'delivered': ['b1', 'b2', 'b3'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 3]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 2, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    3: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3'], ['b', {'b': 4}, 'b4']]], {'delivered': ['b1', 'b2', 'b3', 'b4'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 4]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 3, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    4: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3'], ['b', {'b': 4}, 'b4'], ['b', {'b': 5}, 'b5']]], {'delivered': ['b1', 'b2', 'b3', 'b4', 'b5'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 5]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 4, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    5: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3'], ['b', {'b': 4}, 'b4'], ['b', {'b': 5}, 'b5'], ['b', {'b': 6}, 'b6']]], {'delivered': ['b1', 'b2', 'b3', 'b4', 'b5', 'b6'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 6]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 5, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n}[N]\nfor label, args, expected in cases:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"b844ebc26fbe825a39e76464200ad3d682c8714e4b3fb1fe94e30244fd2bb3df","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(arrivals):\n    local = {}\n    delivered, buffer, dups = [], [], 0\n    def ready(msg):\n        s, vc = msg[0], msg[1]\n        if vc.get(s, 0) != local.get(s, 0) + 1:\n            return False\n        return all(v <= local.get(k, 0) for k, v in vc.items() if k != s)\n    for msg in arrivals:\n        s, vc = msg[0], msg[1]\n        if vc.get(s, 0) <= local.get(s, 0) or any(b[0] == s and b[1].get(s) == vc.get(s) for b in buffer):\n            dups += 1\n            continue\n        buffer.append(msg)\n        progress = True\n        while progress:\n            progress = False\n            for b in buffer:\n                if ready(b):\n                    buffer.remove(b)\n                    local[b[0]] = b[1][b[0]]\n                    delivered.append(b[2])\n                    progress = True\n                    break\n    return {'delivered': delivered, 'pending': sorted(b[2] for b in buffer), 'duplicates': dups, 'clock': sorted([k, v] for k, v in local.items())}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2']]], {'delivered': ['b1', 'b2'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 2]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    2: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3']]], {'delivered': ['b1', 'b2', 'b3'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 3]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 2, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    3: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3'], ['b', {'b': 4}, 'b4']]], {'delivered': ['b1', 'b2', 'b3', 'b4'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 4]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 3, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    4: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3'], ['b', {'b': 4}, 'b4'], ['b', {'b': 5}, 'b5']]], {'delivered': ['b1', 'b2', 'b3', 'b4', 'b5'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 5]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 4, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n    5: [('in-order stream delivers immediately', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 2, 'b': 1}, 'b1']]], {'delivered': ['a1', 'a2', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 2], ['b', 1]]}), ('gap from one sender waits', [[['a', {'a': 2}, 'a2'], ['b', {'b': 1}, 'b1'], ['b', {'b': 2}, 'b2'], ['b', {'b': 3}, 'b3'], ['b', {'b': 4}, 'b4'], ['b', {'b': 5}, 'b5'], ['b', {'b': 6}, 'b6']]], {'delivered': ['b1', 'b2', 'b3', 'b4', 'b5', 'b6'], 'pending': ['a2'], 'duplicates': 0, 'clock': [['b', 6]]}), ('dependency on another sender waits', [[['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 1]]}), ('dependency on an unseen sender waits', [[['b', {'c': 1, 'b': 1}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1'], 'pending': ['b1'], 'duplicates': 0, 'clock': [['a', 1]]}), ('buffer drains in cascade', [[['a', {'a': 3}, 'a3'], ['a', {'a': 2}, 'a2'], ['b', {'b': 1, 'a': 3}, 'b1'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2', 'a3', 'b1'], 'pending': [], 'duplicates': 0, 'clock': [['a', 3], ['b', 1]]}), ('duplicate of a delivered message is discarded', [[['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 5, 'clock': [['a', 2]]}), ('duplicate of a buffered message is discarded', [[['a', {'a': 2}, 'a2'], ['a', {'a': 2}, 'a2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['a1', 'a2'], 'pending': [], 'duplicates': 1, 'clock': [['a', 2]]}), ('receiver ahead of a dependency keeps its clock', [[['a', {'a': 1}, 'a1'], ['a', {'a': 2}, 'a2'], ['b', {'a': 1, 'b': 1}, 'b1'], ['a', {'a': 2}, 'a2'], ['a', {'a': 3}, 'a3']]], {'delivered': ['a1', 'a2', 'b1', 'a3'], 'pending': [], 'duplicates': 1, 'clock': [['a', 3], ['b', 1]]}), ('scan restarts from the oldest buffered message', [[['b', {'b': 1, 'a': 1}, 'b1'], ['c', {'c': 1}, 'c0'], ['b', {'b': 2, 'a': 1}, 'b2'], ['c', {'c': 2, 'a': 1}, 'c2'], ['a', {'a': 1}, 'a1']]], {'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'pending': [], 'duplicates': 0, 'clock': [['a', 1], ['b', 2], ['c', 2]]}), ('empty arrival stream', [[]], {'delivered': [], 'pending': [], 'duplicates': 0, 'clock': []})],\n}[N]\nfor label, args, expected in cases:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic, bounded teaching model of one replicated data type with stipulated operation and merge rules; it is not a production CRDT library and makes no claim of conformance to any specific published design. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-crdt-convergence-causal-delivery-buffer-foreign-dependencies","generated_at":"2026-09-29T14:49:02.270513+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Operation-based CRDTs converge only if operations are delivered exactly once and in causal order.","repair":"Require every non-sender entry to be at or below the delivered vector, treating unknown replicas as zero.","root_cause":"Readiness checks only the sender's own sequence and skips the other vector entries.","sha256":"beee5c957ae011a94c2bd0a374fb114bd2eb6d15e71c88382a129c30274d64ab","title":"Causal delivery buffer: dependencies on other senders are ignored · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":45.428,"exit_code":1,"observations":[{"actual":{"clock":[["a",2],["b",1]],"delivered":["a1","a2","b1"],"duplicates":0,"pending":[]},"check":"in-order stream delivers immediately","expected":{"clock":[["a",2],["b",1]],"delivered":["a1","a2","b1"],"duplicates":0,"pending":[]},"passed":true},{"actual":{"clock":[["b",2]],"delivered":["b1","b2"],"duplicates":0,"pending":["a2"]},"check":"gap from one sender waits","expected":{"clock":[["b",2]],"delivered":["b1","b2"],"duplicates":0,"pending":["a2"]},"passed":true},{"actual":{"clock":[["a",1],["b",1]],"delivered":["b1","a1"],"duplicates":0,"pending":[]},"check":"dependency on another sender waits","expected":{"clock":[["a",1],["b",1]],"delivered":["a1","b1"],"duplicates":0,"pending":[]},"passed":false},{"actual":{"clock":[["a",1],["b",1]],"delivered":["b1","a1"],"duplicates":0,"pending":[]},"check":"dependency on an unseen sender waits","expected":{"clock":[["a",1]],"delivered":["a1"],"duplicates":0,"pending":["b1"]},"passed":false},{"actual":{"clock":[["a",3],["b",1]],"delivered":["b1","a1","a2","a3"],"duplicates":0,"pending":[]},"check":"buffer drains in cascade","expected":{"clock":[["a",3],["b",1]],"delivered":["a1","a2","a3","b1"],"duplicates":0,"pending":[]},"passed":false},{"actual":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"check":"duplicate of a delivered message is discarded","expected":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"passed":true},{"actual":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"check":"duplicate of a buffered message is discarded","expected":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"passed":true},{"actual":{"clock":[["a",3],["b",1]],"delivered":["a1","a2","b1","a3"],"duplicates":1,"pending":[]},"check":"receiver ahead of a dependency keeps its clock","expected":{"clock":[["a",3],["b",1]],"delivered":["a1","a2","b1","a3"],"duplicates":1,"pending":[]},"passed":true},{"actual":{"clock":[["a",1],["b",2],["c",2]],"delivered":["b1","c0","b2","c2","a1"],"duplicates":0,"pending":[]},"check":"scan restarts from the oldest buffered message","expected":{"clock":[["a",1],["b",2],["c",2]],"delivered":["c0","a1","b1","b2","c2"],"duplicates":0,"pending":[]},"passed":false},{"actual":{"clock":[],"delivered":[],"duplicates":0,"pending":[]},"check":"empty arrival stream","expected":{"clock":[],"delivered":[],"duplicates":0,"pending":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"in-order stream delivers immediately\", \"actual\": {\"delivered\": [\"a1\", \"a2\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 2], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 2], [\"b\", 1]]}, \"passed\": true}, {\"check\": \"gap from one sender waits\", \"actual\": {\"delivered\": [\"b1\", \"b2\"], \"pending\": [\"a2\"], \"duplicates\": 0, \"clock\": [[\"b\", 2]]}, \"expected\": {\"delivered\": [\"b1\", \"b2\"], \"pending\": [\"a2\"], \"duplicates\": 0, \"clock\": [[\"b\", 2]]}, \"passed\": true}, {\"check\": \"dependency on another sender waits\", \"actual\": {\"delivered\": [\"b1\", \"a1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 1]]}, \"passed\": false}, {\"check\": \"dependency on an unseen sender waits\", \"actual\": {\"delivered\": [\"b1\", \"a1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\"], \"pending\": [\"b1\"], \"duplicates\": 0, \"clock\": [[\"a\", 1]]}, \"passed\": false}, {\"check\": \"buffer drains in cascade\", \"actual\": {\"delivered\": [\"b1\", \"a1\", \"a2\", \"a3\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\", \"a3\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"passed\": false}, {\"check\": \"duplicate of a delivered message is discarded\", \"actual\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"passed\": true}, {\"check\": \"duplicate of a buffered message is discarded\", \"actual\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"passed\": true}, {\"check\": \"receiver ahead of a dependency keeps its clock\", \"actual\": {\"delivered\": [\"a1\", \"a2\", \"b1\", \"a3\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\", \"b1\", \"a3\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"passed\": true}, {\"check\": \"scan restarts from the oldest buffered message\", \"actual\": {\"delivered\": [\"b1\", \"c0\", \"b2\", \"c2\", \"a1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 2], [\"c\", 2]]}, \"expected\": {\"delivered\": [\"c0\", \"a1\", \"b1\", \"b2\", \"c2\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 2], [\"c\", 2]]}, \"passed\": false}, {\"check\": \"empty arrival stream\", \"actual\": {\"delivered\": [], \"pending\": [], \"duplicates\": 0, \"clock\": []}, \"expected\": {\"delivered\": [], \"pending\": [], \"duplicates\": 0, \"clock\": []}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.727,"exit_code":1,"observations":[{"actual":{"clock":[["a",2],["b",1]],"delivered":["a1","a2","b1"],"duplicates":0,"pending":[]},"check":"in-order stream delivers immediately","expected":{"clock":[["a",2],["b",1]],"delivered":["a1","a2","b1"],"duplicates":0,"pending":[]},"passed":true},{"actual":{"clock":[["b",2]],"delivered":["b1","b2"],"duplicates":0,"pending":["a2"]},"check":"gap from one sender waits","expected":{"clock":[["b",2]],"delivered":["b1","b2"],"duplicates":0,"pending":["a2"]},"passed":true},{"actual":{"clock":[["a",1],["b",1]],"delivered":["b1","a1"],"duplicates":0,"pending":[]},"check":"dependency on another sender waits","expected":{"clock":[["a",1],["b",1]],"delivered":["a1","b1"],"duplicates":0,"pending":[]},"passed":false},{"actual":{"clock":[["a",1],["b",1]],"delivered":["b1","a1"],"duplicates":0,"pending":[]},"check":"dependency on an unseen sender waits","expected":{"clock":[["a",1]],"delivered":["a1"],"duplicates":0,"pending":["b1"]},"passed":false},{"actual":{"clock":[["a",3],["b",1]],"delivered":["b1","a1","a2","a3"],"duplicates":0,"pending":[]},"check":"buffer drains in cascade","expected":{"clock":[["a",3],["b",1]],"delivered":["a1","a2","a3","b1"],"duplicates":0,"pending":[]},"passed":false},{"actual":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"check":"duplicate of a delivered message is discarded","expected":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"passed":true},{"actual":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"check":"duplicate of a buffered message is discarded","expected":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"passed":true},{"actual":{"clock":[["a",3],["b",1]],"delivered":["a1","a2","b1","a3"],"duplicates":1,"pending":[]},"check":"receiver ahead of a dependency keeps its clock","expected":{"clock":[["a",3],["b",1]],"delivered":["a1","a2","b1","a3"],"duplicates":1,"pending":[]},"passed":true},{"actual":{"clock":[["a",1],["b",2],["c",2]],"delivered":["b1","c0","b2","c2","a1"],"duplicates":0,"pending":[]},"check":"scan restarts from the oldest buffered message","expected":{"clock":[["a",1],["b",2],["c",2]],"delivered":["c0","a1","b1","b2","c2"],"duplicates":0,"pending":[]},"passed":false},{"actual":{"clock":[],"delivered":[],"duplicates":0,"pending":[]},"check":"empty arrival stream","expected":{"clock":[],"delivered":[],"duplicates":0,"pending":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"in-order stream delivers immediately\", \"actual\": {\"delivered\": [\"a1\", \"a2\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 2], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 2], [\"b\", 1]]}, \"passed\": true}, {\"check\": \"gap from one sender waits\", \"actual\": {\"delivered\": [\"b1\", \"b2\"], \"pending\": [\"a2\"], \"duplicates\": 0, \"clock\": [[\"b\", 2]]}, \"expected\": {\"delivered\": [\"b1\", \"b2\"], \"pending\": [\"a2\"], \"duplicates\": 0, \"clock\": [[\"b\", 2]]}, \"passed\": true}, {\"check\": \"dependency on another sender waits\", \"actual\": {\"delivered\": [\"b1\", \"a1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 1]]}, \"passed\": false}, {\"check\": \"dependency on an unseen sender waits\", \"actual\": {\"delivered\": [\"b1\", \"a1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\"], \"pending\": [\"b1\"], \"duplicates\": 0, \"clock\": [[\"a\", 1]]}, \"passed\": false}, {\"check\": \"buffer drains in cascade\", \"actual\": {\"delivered\": [\"b1\", \"a1\", \"a2\", \"a3\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\", \"a3\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"passed\": false}, {\"check\": \"duplicate of a delivered message is discarded\", \"actual\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"passed\": true}, {\"check\": \"duplicate of a buffered message is discarded\", \"actual\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"passed\": true}, {\"check\": \"receiver ahead of a dependency keeps its clock\", \"actual\": {\"delivered\": [\"a1\", \"a2\", \"b1\", \"a3\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\", \"b1\", \"a3\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"passed\": true}, {\"check\": \"scan restarts from the oldest buffered message\", \"actual\": {\"delivered\": [\"b1\", \"c0\", \"b2\", \"c2\", \"a1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 2], [\"c\", 2]]}, \"expected\": {\"delivered\": [\"c0\", \"a1\", \"b1\", \"b2\", \"c2\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 2], [\"c\", 2]]}, \"passed\": false}, {\"check\": \"empty arrival stream\", \"actual\": {\"delivered\": [], \"pending\": [], \"duplicates\": 0, \"clock\": []}, \"expected\": {\"delivered\": [], \"pending\": [], \"duplicates\": 0, \"clock\": []}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.406,"exit_code":0,"observations":[{"actual":{"clock":[["a",2],["b",1]],"delivered":["a1","a2","b1"],"duplicates":0,"pending":[]},"check":"in-order stream delivers immediately","expected":{"clock":[["a",2],["b",1]],"delivered":["a1","a2","b1"],"duplicates":0,"pending":[]},"passed":true},{"actual":{"clock":[["b",2]],"delivered":["b1","b2"],"duplicates":0,"pending":["a2"]},"check":"gap from one sender waits","expected":{"clock":[["b",2]],"delivered":["b1","b2"],"duplicates":0,"pending":["a2"]},"passed":true},{"actual":{"clock":[["a",1],["b",1]],"delivered":["a1","b1"],"duplicates":0,"pending":[]},"check":"dependency on another sender waits","expected":{"clock":[["a",1],["b",1]],"delivered":["a1","b1"],"duplicates":0,"pending":[]},"passed":true},{"actual":{"clock":[["a",1]],"delivered":["a1"],"duplicates":0,"pending":["b1"]},"check":"dependency on an unseen sender waits","expected":{"clock":[["a",1]],"delivered":["a1"],"duplicates":0,"pending":["b1"]},"passed":true},{"actual":{"clock":[["a",3],["b",1]],"delivered":["a1","a2","a3","b1"],"duplicates":0,"pending":[]},"check":"buffer drains in cascade","expected":{"clock":[["a",3],["b",1]],"delivered":["a1","a2","a3","b1"],"duplicates":0,"pending":[]},"passed":true},{"actual":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"check":"duplicate of a delivered message is discarded","expected":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"passed":true},{"actual":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"check":"duplicate of a buffered message is discarded","expected":{"clock":[["a",2]],"delivered":["a1","a2"],"duplicates":1,"pending":[]},"passed":true},{"actual":{"clock":[["a",3],["b",1]],"delivered":["a1","a2","b1","a3"],"duplicates":1,"pending":[]},"check":"receiver ahead of a dependency keeps its clock","expected":{"clock":[["a",3],["b",1]],"delivered":["a1","a2","b1","a3"],"duplicates":1,"pending":[]},"passed":true},{"actual":{"clock":[["a",1],["b",2],["c",2]],"delivered":["c0","a1","b1","b2","c2"],"duplicates":0,"pending":[]},"check":"scan restarts from the oldest buffered message","expected":{"clock":[["a",1],["b",2],["c",2]],"delivered":["c0","a1","b1","b2","c2"],"duplicates":0,"pending":[]},"passed":true},{"actual":{"clock":[],"delivered":[],"duplicates":0,"pending":[]},"check":"empty arrival stream","expected":{"clock":[],"delivered":[],"duplicates":0,"pending":[]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"in-order stream delivers immediately\", \"actual\": {\"delivered\": [\"a1\", \"a2\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 2], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 2], [\"b\", 1]]}, \"passed\": true}, {\"check\": \"gap from one sender waits\", \"actual\": {\"delivered\": [\"b1\", \"b2\"], \"pending\": [\"a2\"], \"duplicates\": 0, \"clock\": [[\"b\", 2]]}, \"expected\": {\"delivered\": [\"b1\", \"b2\"], \"pending\": [\"a2\"], \"duplicates\": 0, \"clock\": [[\"b\", 2]]}, \"passed\": true}, {\"check\": \"dependency on another sender waits\", \"actual\": {\"delivered\": [\"a1\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 1]]}, \"passed\": true}, {\"check\": \"dependency on an unseen sender waits\", \"actual\": {\"delivered\": [\"a1\"], \"pending\": [\"b1\"], \"duplicates\": 0, \"clock\": [[\"a\", 1]]}, \"expected\": {\"delivered\": [\"a1\"], \"pending\": [\"b1\"], \"duplicates\": 0, \"clock\": [[\"a\", 1]]}, \"passed\": true}, {\"check\": \"buffer drains in cascade\", \"actual\": {\"delivered\": [\"a1\", \"a2\", \"a3\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\", \"a3\", \"b1\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"passed\": true}, {\"check\": \"duplicate of a delivered message is discarded\", \"actual\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"passed\": true}, {\"check\": \"duplicate of a buffered message is discarded\", \"actual\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 2]]}, \"passed\": true}, {\"check\": \"receiver ahead of a dependency keeps its clock\", \"actual\": {\"delivered\": [\"a1\", \"a2\", \"b1\", \"a3\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"expected\": {\"delivered\": [\"a1\", \"a2\", \"b1\", \"a3\"], \"pending\": [], \"duplicates\": 1, \"clock\": [[\"a\", 3], [\"b\", 1]]}, \"passed\": true}, {\"check\": \"scan restarts from the oldest buffered message\", \"actual\": {\"delivered\": [\"c0\", \"a1\", \"b1\", \"b2\", \"c2\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 2], [\"c\", 2]]}, \"expected\": {\"delivered\": [\"c0\", \"a1\", \"b1\", \"b2\", \"c2\"], \"pending\": [], \"duplicates\": 0, \"clock\": [[\"a\", 1], [\"b\", 2], [\"c\", 2]]}, \"passed\": true}, {\"check\": \"empty arrival stream\", \"actual\": {\"delivered\": [], \"pending\": [], \"duplicates\": 0, \"clock\": []}, \"expected\": {\"delivered\": [], \"pending\": [], \"duplicates\": 0, \"clock\": []}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}