FAILURE MAP
← Case archive

FA-76206 / Chat ordering and read receipts / Open access

Batch outgoing read receipts per conversation: advance only · case 01

Receipts at or below the marker already sent are transmitted again.

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

ROOT CAUSE

The advance only decision evaluates `if s != sent_markers` where the contract requires `if s > sent_markers`.

VERIFIED REPAIR

Use `if s > sent_markers` for the advance only decision and keep every other rule of the model unchanged.

Unsuccessful approach: Allowing equality resends the marker the server already holds. The attempted `if s >= sent_markers` still disagrees with a fixture.

Case contract

pending_reads are [conv, seq] events produced while scrolling, in any order. Per conversation only the highest seq is sent, and only if it is above the marker already sent (missing marker means nothing sent, -1). In the background nothing is sent: the eligible conversations are deferred. Result {send: [[conv, seq]...] sorted by conv, defer: [conv...]}.

Why this case matters

Receipt batching limits traffic; batching errors send stale receipts or none at all.

1 / The failure

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

N = 1
observations = []
def solve(pending_reads, sent_markers, foreground):
    best = {}
    for conv, seq in pending_reads:
        if seq > best.get(conv, -1):
            best[conv] = seq
    rows = [[c, s] for c, s in sorted(best.items()) if s != sent_markers.get(c, -1)]
    if not foreground:
        return {'send': [], 'defer': [c for c, _ in rows]}
    return {'send': rows, 'defer': []}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
_CASES = {1: [('scroll events out of order', ([['a', 10], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 10], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 8]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 8]]}), ('lower than sent', ([['a', 2]], {'a': 7}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 2]], {'b': 2}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 2: [('scroll events out of order', ([['a', 11], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 11], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 9]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 9]]}), ('lower than sent', ([['a', 2]], {'a': 8}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 3]], {'b': 3}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 3: [('scroll events out of order', ([['a', 12], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 12], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 10]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 10]]}), ('lower than sent', ([['a', 2]], {'a': 9}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 4]], {'b': 4}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 4: [('scroll events out of order', ([['a', 13], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 13], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 11]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 11]]}), ('lower than sent', ([['a', 2]], {'a': 10}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 5]], {'b': 5}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 5: [('scroll events out of order', ([['a', 14], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 14], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 12]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 12]]}), ('lower than sent', ([['a', 2]], {'a': 11}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 6]], {'b': 6}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})]}
for _label, _args, _expected in _CASES[N]:
    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 fixtureActualExpectedOutcome
scroll events out of order{'defer': [], 'send': [['a', 10], ['b', 2]]}{'defer': [], 'send': [['a', 10], ['b', 2]]}Passed
first message has seq zero{'defer': [], 'send': [['n', 0]]}{'defer': [], 'send': [['n', 0]]}Passed
not advancing{'defer': [], 'send': [['b', 8]]}{'defer': [], 'send': [['b', 8]]}Passed
lower than sent{'defer': [], 'send': [['a', 2]]}{'defer': [], 'send': []}Failed
background defers{'defer': ['a'], 'send': []}{'defer': ['a'], 'send': []}Passed
empty{'defer': [], 'send': []}{'defer': [], 'send': []}Passed

SHA-256 / 41449072c0503c0cba3e6e966b67e5b907413eb299e38ccc84fda30aafbf99ec

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(pending_reads, sent_markers, foreground):
    best = {}
    for conv, seq in pending_reads:
        if seq > best.get(conv, -1):
            best[conv] = seq
    rows = [[c, s] for c, s in sorted(best.items()) if s >= sent_markers.get(c, -1)]
    if not foreground:
        return {'send': [], 'defer': [c for c, _ in rows]}
    return {'send': rows, 'defer': []}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
_CASES = {1: [('scroll events out of order', ([['a', 10], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 10], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 8]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 8]]}), ('lower than sent', ([['a', 2]], {'a': 7}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 2]], {'b': 2}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 2: [('scroll events out of order', ([['a', 11], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 11], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 9]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 9]]}), ('lower than sent', ([['a', 2]], {'a': 8}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 3]], {'b': 3}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 3: [('scroll events out of order', ([['a', 12], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 12], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 10]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 10]]}), ('lower than sent', ([['a', 2]], {'a': 9}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 4]], {'b': 4}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 4: [('scroll events out of order', ([['a', 13], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 13], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 11]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 11]]}), ('lower than sent', ([['a', 2]], {'a': 10}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 5]], {'b': 5}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 5: [('scroll events out of order', ([['a', 14], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 14], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 12]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 12]]}), ('lower than sent', ([['a', 2]], {'a': 11}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 6]], {'b': 6}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})]}
for _label, _args, _expected in _CASES[N]:
    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 fixtureActualExpectedOutcome
scroll events out of order{'defer': [], 'send': [['a', 10], ['b', 2]]}{'defer': [], 'send': [['a', 10], ['b', 2]]}Passed
first message has seq zero{'defer': [], 'send': [['n', 0]]}{'defer': [], 'send': [['n', 0]]}Passed
not advancing{'defer': [], 'send': [['a', 5], ['b', 8]]}{'defer': [], 'send': [['b', 8]]}Failed
lower than sent{'defer': [], 'send': []}{'defer': [], 'send': []}Passed
background defers{'defer': ['a', 'b'], 'send': []}{'defer': ['a'], 'send': []}Failed
empty{'defer': [], 'send': []}{'defer': [], 'send': []}Passed

SHA-256 / 8fbd4a91cdc38ecaaa0a29a7eb0c1b5bdc3a4e89c7c01dff79558679a0d91216

3 / The verified repair

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

N = 1
observations = []
def solve(pending_reads, sent_markers, foreground):
    best = {}
    for conv, seq in pending_reads:
        if seq > best.get(conv, -1):
            best[conv] = seq
    rows = [[c, s] for c, s in sorted(best.items()) if s > sent_markers.get(c, -1)]
    if not foreground:
        return {'send': [], 'defer': [c for c, _ in rows]}
    return {'send': rows, 'defer': []}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
_CASES = {1: [('scroll events out of order', ([['a', 10], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 10], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 8]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 8]]}), ('lower than sent', ([['a', 2]], {'a': 7}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 2]], {'b': 2}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 2: [('scroll events out of order', ([['a', 11], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 11], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 9]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 9]]}), ('lower than sent', ([['a', 2]], {'a': 8}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 3]], {'b': 3}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 3: [('scroll events out of order', ([['a', 12], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 12], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 10]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 10]]}), ('lower than sent', ([['a', 2]], {'a': 9}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 4]], {'b': 4}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 4: [('scroll events out of order', ([['a', 13], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 13], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 11]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 11]]}), ('lower than sent', ([['a', 2]], {'a': 10}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 5]], {'b': 5}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})], 5: [('scroll events out of order', ([['a', 14], ['a', 4], ['b', 2]], {}, True), {'defer': [], 'send': [['a', 14], ['b', 2]]}), ('first message has seq zero', ([['n', 0]], {}, True), {'defer': [], 'send': [['n', 0]]}), ('not advancing', ([['a', 5], ['b', 12]], {'a': 5, 'b': 3}, True), {'defer': [], 'send': [['b', 12]]}), ('lower than sent', ([['a', 2]], {'a': 11}, True), {'defer': [], 'send': []}), ('background defers', ([['a', 3], ['b', 6]], {'b': 6}, False), {'defer': ['a'], 'send': []}), ('empty', ([], {'a': 1}, True), {'defer': [], 'send': []})]}
for _label, _args, _expected in _CASES[N]:
    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 fixtureActualExpectedOutcome
scroll events out of order{'defer': [], 'send': [['a', 10], ['b', 2]]}{'defer': [], 'send': [['a', 10], ['b', 2]]}Passed
first message has seq zero{'defer': [], 'send': [['n', 0]]}{'defer': [], 'send': [['n', 0]]}Passed
not advancing{'defer': [], 'send': [['b', 8]]}{'defer': [], 'send': [['b', 8]]}Passed
lower than sent{'defer': [], 'send': []}{'defer': [], 'send': []}Passed
background defers{'defer': ['a'], 'send': []}{'defer': ['a'], 'send': []}Passed
empty{'defer': [], 'send': []}{'defer': [], 'send': []}Passed

SHA-256 / 0b9d0c38fb9b77cba0190af534fc4ad09f3294a1edef2cef856ee2ce6edb4015

Verification & scope

Stipulated offline chat model; not a complete messaging protocol, client or server implementation. 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:14.142358+00:00.

Case digest / 77e81c73a42c8a4a77de76e8b9a90ba0332a94668741c36572904eed3d6e1674