FA-75021 / CRDT convergence / Open access
Causal delivery buffer: a delivery does not retry the rest of the buffer · case 01
Buffered messages that became deliverable stay pending until another message arrives.
ROOT CAUSE
After one delivery the scan stops without re-examining buffered messages that it unblocked.
VERIFIED REPAIR
After each delivery restart the scan from the oldest buffered message until nothing is ready.
Unsuccessful approach: Removing from the buffer while continuing the same iteration skips the next message and changes delivery order.
Case 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.
Why this case matters
Operation-based CRDTs converge only if operations are delivered exactly once and in causal order.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(arrivals):
local = {}
delivered, buffer, dups = [], [], 0
def ready(msg):
s, vc = msg[0], msg[1]
if vc.get(s, 0) != local.get(s, 0) + 1:
return False
return all(v <= local.get(k, 0) for k, v in vc.items() if k != s)
for msg in arrivals:
s, vc = msg[0], msg[1]
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):
dups += 1
continue
buffer.append(msg)
progress = True
while progress:
progress = False
for b in buffer:
if ready(b):
buffer.remove(b)
local[b[0]] = b[1][b[0]]
delivered.append(b[2])
break
return {'delivered': delivered, 'pending': sorted(b[2] for b in buffer), 'duplicates': dups, 'clock': sorted([k, v] for k, v in local.items())}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {
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': []})],
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': []})],
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': []})],
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': []})],
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]
for label, args, expected in cases:
check(label, solve(*args), 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| in-order stream delivers immediately | {'clock': [['a', 2], ['b', 1]], 'delivered': ['a1', 'a2', 'b1'], 'duplicates': 0, 'pending': []} | {'clock': [['a', 2], ['b', 1]], 'delivered': ['a1', 'a2', 'b1'], 'duplicates': 0, 'pending': []} | Passed |
| gap from one sender waits | {'clock': [['b', 2]], 'delivered': ['b1', 'b2'], 'duplicates': 0, 'pending': ['a2']} | {'clock': [['b', 2]], 'delivered': ['b1', 'b2'], 'duplicates': 0, 'pending': ['a2']} | Passed |
| dependency on another sender waits | {'clock': [['a', 1]], 'delivered': ['a1'], 'duplicates': 0, 'pending': ['b1']} | {'clock': [['a', 1], ['b', 1]], 'delivered': ['a1', 'b1'], 'duplicates': 0, 'pending': []} | Failed |
| dependency on an unseen sender waits | {'clock': [['a', 1]], 'delivered': ['a1'], 'duplicates': 0, 'pending': ['b1']} | {'clock': [['a', 1]], 'delivered': ['a1'], 'duplicates': 0, 'pending': ['b1']} | Passed |
| buffer drains in cascade | {'clock': [['a', 1]], 'delivered': ['a1'], 'duplicates': 0, 'pending': ['a2', 'a3', 'b1']} | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'a3', 'b1'], 'duplicates': 0, 'pending': []} | Failed |
| duplicate of a delivered message is discarded | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | Passed |
| duplicate of a buffered message is discarded | {'clock': [['a', 1]], 'delivered': ['a1'], 'duplicates': 1, 'pending': ['a2']} | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | Failed |
| receiver ahead of a dependency keeps its clock | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'b1', 'a3'], 'duplicates': 1, 'pending': []} | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'b1', 'a3'], 'duplicates': 1, 'pending': []} | Passed |
| scan restarts from the oldest buffered message | {'clock': [['a', 1], ['c', 1]], 'delivered': ['c0', 'a1'], 'duplicates': 0, 'pending': ['b1', 'b2', 'c2']} | {'clock': [['a', 1], ['b', 2], ['c', 2]], 'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'duplicates': 0, 'pending': []} | Failed |
| empty arrival stream | {'clock': [], 'delivered': [], 'duplicates': 0, 'pending': []} | {'clock': [], 'delivered': [], 'duplicates': 0, 'pending': []} | Passed |
SHA-256 / b0f36ae21bf86ff695a894d23eb96a2b8b03e6b93f6690067e75bfd287378f43
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(arrivals):
local = {}
delivered, buffer, dups = [], [], 0
def ready(msg):
s, vc = msg[0], msg[1]
if vc.get(s, 0) != local.get(s, 0) + 1:
return False
return all(v <= local.get(k, 0) for k, v in vc.items() if k != s)
for msg in arrivals:
s, vc = msg[0], msg[1]
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):
dups += 1
continue
buffer.append(msg)
progress = True
while progress:
progress = False
for b in buffer:
if ready(b):
buffer.remove(b)
local[b[0]] = b[1][b[0]]
delivered.append(b[2])
progress = True
return {'delivered': delivered, 'pending': sorted(b[2] for b in buffer), 'duplicates': dups, 'clock': sorted([k, v] for k, v in local.items())}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {
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': []})],
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': []})],
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': []})],
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': []})],
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]
for label, args, expected in cases:
check(label, solve(*args), 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| in-order stream delivers immediately | {'clock': [['a', 2], ['b', 1]], 'delivered': ['a1', 'a2', 'b1'], 'duplicates': 0, 'pending': []} | {'clock': [['a', 2], ['b', 1]], 'delivered': ['a1', 'a2', 'b1'], 'duplicates': 0, 'pending': []} | Passed |
| gap from one sender waits | {'clock': [['b', 2]], 'delivered': ['b1', 'b2'], 'duplicates': 0, 'pending': ['a2']} | {'clock': [['b', 2]], 'delivered': ['b1', 'b2'], 'duplicates': 0, 'pending': ['a2']} | Passed |
| dependency on another sender waits | {'clock': [['a', 1], ['b', 1]], 'delivered': ['a1', 'b1'], 'duplicates': 0, 'pending': []} | {'clock': [['a', 1], ['b', 1]], 'delivered': ['a1', 'b1'], 'duplicates': 0, 'pending': []} | Passed |
| dependency on an unseen sender waits | {'clock': [['a', 1]], 'delivered': ['a1'], 'duplicates': 0, 'pending': ['b1']} | {'clock': [['a', 1]], 'delivered': ['a1'], 'duplicates': 0, 'pending': ['b1']} | Passed |
| buffer drains in cascade | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'a3', 'b1'], 'duplicates': 0, 'pending': []} | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'a3', 'b1'], 'duplicates': 0, 'pending': []} | Passed |
| duplicate of a delivered message is discarded | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | Passed |
| duplicate of a buffered message is discarded | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | Passed |
| receiver ahead of a dependency keeps its clock | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'b1', 'a3'], 'duplicates': 1, 'pending': []} | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'b1', 'a3'], 'duplicates': 1, 'pending': []} | Passed |
| scan restarts from the oldest buffered message | {'clock': [['a', 1], ['b', 2], ['c', 2]], 'delivered': ['c0', 'a1', 'b1', 'c2', 'b2'], 'duplicates': 0, 'pending': []} | {'clock': [['a', 1], ['b', 2], ['c', 2]], 'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'duplicates': 0, 'pending': []} | Failed |
| empty arrival stream | {'clock': [], 'delivered': [], 'duplicates': 0, 'pending': []} | {'clock': [], 'delivered': [], 'duplicates': 0, 'pending': []} | Passed |
SHA-256 / ebcd54adaf57147b871645d2e0f92ba21f99bcb06c93c3cd5d35b0adec42be99
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(arrivals):
local = {}
delivered, buffer, dups = [], [], 0
def ready(msg):
s, vc = msg[0], msg[1]
if vc.get(s, 0) != local.get(s, 0) + 1:
return False
return all(v <= local.get(k, 0) for k, v in vc.items() if k != s)
for msg in arrivals:
s, vc = msg[0], msg[1]
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):
dups += 1
continue
buffer.append(msg)
progress = True
while progress:
progress = False
for b in buffer:
if ready(b):
buffer.remove(b)
local[b[0]] = b[1][b[0]]
delivered.append(b[2])
progress = True
break
return {'delivered': delivered, 'pending': sorted(b[2] for b in buffer), 'duplicates': dups, 'clock': sorted([k, v] for k, v in local.items())}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = {
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': []})],
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': []})],
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': []})],
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': []})],
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]
for label, args, expected in cases:
check(label, solve(*args), 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| in-order stream delivers immediately | {'clock': [['a', 2], ['b', 1]], 'delivered': ['a1', 'a2', 'b1'], 'duplicates': 0, 'pending': []} | {'clock': [['a', 2], ['b', 1]], 'delivered': ['a1', 'a2', 'b1'], 'duplicates': 0, 'pending': []} | Passed |
| gap from one sender waits | {'clock': [['b', 2]], 'delivered': ['b1', 'b2'], 'duplicates': 0, 'pending': ['a2']} | {'clock': [['b', 2]], 'delivered': ['b1', 'b2'], 'duplicates': 0, 'pending': ['a2']} | Passed |
| dependency on another sender waits | {'clock': [['a', 1], ['b', 1]], 'delivered': ['a1', 'b1'], 'duplicates': 0, 'pending': []} | {'clock': [['a', 1], ['b', 1]], 'delivered': ['a1', 'b1'], 'duplicates': 0, 'pending': []} | Passed |
| dependency on an unseen sender waits | {'clock': [['a', 1]], 'delivered': ['a1'], 'duplicates': 0, 'pending': ['b1']} | {'clock': [['a', 1]], 'delivered': ['a1'], 'duplicates': 0, 'pending': ['b1']} | Passed |
| buffer drains in cascade | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'a3', 'b1'], 'duplicates': 0, 'pending': []} | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'a3', 'b1'], 'duplicates': 0, 'pending': []} | Passed |
| duplicate of a delivered message is discarded | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | Passed |
| duplicate of a buffered message is discarded | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | {'clock': [['a', 2]], 'delivered': ['a1', 'a2'], 'duplicates': 1, 'pending': []} | Passed |
| receiver ahead of a dependency keeps its clock | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'b1', 'a3'], 'duplicates': 1, 'pending': []} | {'clock': [['a', 3], ['b', 1]], 'delivered': ['a1', 'a2', 'b1', 'a3'], 'duplicates': 1, 'pending': []} | Passed |
| scan restarts from the oldest buffered message | {'clock': [['a', 1], ['b', 2], ['c', 2]], 'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'duplicates': 0, 'pending': []} | {'clock': [['a', 1], ['b', 2], ['c', 2]], 'delivered': ['c0', 'a1', 'b1', 'b2', 'c2'], 'duplicates': 0, 'pending': []} | Passed |
| empty arrival stream | {'clock': [], 'delivered': [], 'duplicates': 0, 'pending': []} | {'clock': [], 'delivered': [], 'duplicates': 0, 'pending': []} | Passed |
SHA-256 / b844ebc26fbe825a39e76464200ad3d682c8714e4b3fb1fe94e30244fd2bb3df
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:49:02.316885+00:00.
Case digest / f4bdbdf10a2c6794637abe9561cb83db23124d61f5872cb444cb405e4e41937a