FAILURE MAP
← Case archive

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

Place "seen by" avatars under the latest read message: avatar order · case 01

Avatars under a message are sorted by user id instead of most recent reader first.

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

ROOT CAUSE

The avatar order decision evaluates `key=lambda x: x[1]` where the contract requires `key=lambda x: (-x[0], x[1])`.

VERIFIED REPAIR

Use `key=lambda x: (-x[0], x[1])` for the avatar order decision and keep every other rule of the model unchanged.

Unsuccessful approach: Sorting read times ascending puts the earliest reader first. The attempted `key=lambda x: (x[0], x[1])` still disagrees with a fixture.

Case contract

messages are ascending [seq, author] of the visible window. reads maps user -> [read_seq, read_at]. Each user other than me gets an avatar under the latest visible message with seq <= read_seq; users whose read_seq is before the first visible message get none. Avatars under one message are ordered by read_at descending, then user id. Result: [[seq, [users...]]...] by seq.

Why this case matters

"Seen by" rows show how far each participant has read; misplacement misreports who saw what.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from bisect import bisect_left, bisect_right
N = 1
observations = []
def solve(messages, reads, me):
    seqs = [s for s, _ in messages]
    slots = {}
    for user, (r, at) in reads.items():
        if user == me:
            continue
        i = bisect_right(seqs, r) - 1
        if i < 0:
            continue
        slots.setdefault(seqs[i], []).append((at, user))
    return [[s, [u for _, u in sorted(v, key=lambda x: x[1])]] for s, v in sorted(slots.items())]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
_CASES = {1: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [14, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [6, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 31], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [2, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 2: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [13, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [7, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 32], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [3, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 3: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [14, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [8, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 33], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [4, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 4: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [13, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [9, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 34], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [5, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 5: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [14, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [10, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 35], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [6, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])]}
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
read exactly a message[[12, ['bo']]][[12, ['bo']]]Passed
read between messages[[12, ['bo']]][[12, ['bo']]]Passed
read before window[][]Passed
several readers same message[[2, ['al', 'bo', 'cy']]][[2, ['cy', 'al', 'bo']]]Failed
self excluded[[1, ['bo']]][[1, ['bo']]]Passed
empty reads[][]Passed

SHA-256 / 9ece3eef28d267453d88e3fd0d31863274f89fabaca6a114c5ce725983c0a3d6

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from bisect import bisect_left, bisect_right
N = 1
observations = []
def solve(messages, reads, me):
    seqs = [s for s, _ in messages]
    slots = {}
    for user, (r, at) in reads.items():
        if user == me:
            continue
        i = bisect_right(seqs, r) - 1
        if i < 0:
            continue
        slots.setdefault(seqs[i], []).append((at, user))
    return [[s, [u for _, u in sorted(v, key=lambda x: (x[0], x[1]))]] for s, v in sorted(slots.items())]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
_CASES = {1: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [14, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [6, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 31], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [2, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 2: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [13, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [7, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 32], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [3, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 3: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [14, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [8, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 33], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [4, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 4: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [13, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [9, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 34], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [5, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 5: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [14, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [10, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 35], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [6, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])]}
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
read exactly a message[[12, ['bo']]][[12, ['bo']]]Passed
read between messages[[12, ['bo']]][[12, ['bo']]]Passed
read before window[][]Passed
several readers same message[[2, ['al', 'bo', 'cy']]][[2, ['cy', 'al', 'bo']]]Failed
self excluded[[1, ['bo']]][[1, ['bo']]]Passed
empty reads[][]Passed

SHA-256 / 33dd95b9e3431312da2f832b06fe5b9f9f5fb28fa1e9fc7001b5459298f4fa47

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
from bisect import bisect_left, bisect_right
N = 1
observations = []
def solve(messages, reads, me):
    seqs = [s for s, _ in messages]
    slots = {}
    for user, (r, at) in reads.items():
        if user == me:
            continue
        i = bisect_right(seqs, r) - 1
        if i < 0:
            continue
        slots.setdefault(seqs[i], []).append((at, user))
    return [[s, [u for _, u in sorted(v, key=lambda x: (-x[0], x[1]))]] for s, v in sorted(slots.items())]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
_CASES = {1: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [14, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [6, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 31], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [2, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 2: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [13, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [7, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 32], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [3, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 3: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [14, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [8, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 33], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [4, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 4: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [13, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [9, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 34], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [5, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])], 5: [('read exactly a message', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [12, 5]}, 'me'), [[12, ['bo']]]), ('read between messages', ([[10, 'a'], [12, 'b'], [15, 'c']], {'bo': [14, 5]}, 'me'), [[12, ['bo']]]), ('read before window', ([[20, 'a'], [22, 'b']], {'bo': [19, 1], 'cy': [10, 1]}, 'me'), []), ('several readers same message', ([[1, 'a'], [2, 'b']], {'bo': [2, 10], 'cy': [2, 35], 'al': [2, 10]}, 'me'), [[2, ['cy', 'al', 'bo']]]), ('self excluded', ([[1, 'a']], {'me': [1, 1], 'bo': [6, 2]}, 'me'), [[1, ['bo']]]), ('empty reads', ([[1, 'a']], {}, 'me'), [])]}
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
read exactly a message[[12, ['bo']]][[12, ['bo']]]Passed
read between messages[[12, ['bo']]][[12, ['bo']]]Passed
read before window[][]Passed
several readers same message[[2, ['cy', 'al', 'bo']]][[2, ['cy', 'al', 'bo']]]Passed
self excluded[[1, ['bo']]][[1, ['bo']]]Passed
empty reads[][]Passed

SHA-256 / 0a9e50f6a08b7bd57cfb531fc984525365af6c41254c2eb1e656748f76315c13

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.226099+00:00.

Case digest / ab044bd76c9ce74a5a1ac1a446e0d775f057bc3085f750869e2b0cc2b898098d