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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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