{"abstract":"Receipts are sent while the app is in the background, exposing activity the user has not seen.","category":"Chat ordering and read receipts","checks":6,"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...]}.","evaluation_group":"w2-chat_ordering_and_read_receipts-receipt-batcher","failed_approach":"Deferring only multi-conversation batches still sends a single background receipt. The attempted `if not foreground and len(rows) > 1:` still disagrees with a fixture.","family":"w2-chat_ordering_and_read_receipts-receipt-batcher-background-defer","id":"FA-76216","implementations":{"attempt":{"sha256":"0683f72206ba31e91cc2bbfef8e2a633cf1a320ab38518db85b33f54fcba4d70","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(pending_reads, sent_markers, foreground):\n    best = {}\n    for conv, seq in pending_reads:\n        if seq > best.get(conv, -1):\n            best[conv] = seq\n    rows = [[c, s] for c, s in sorted(best.items()) if s > sent_markers.get(c, -1)]\n    if not foreground and len(rows) > 1:\n        return {'send': [], 'defer': [c for c, _ in rows]}\n    return {'send': rows, 'defer': []}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\n_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': []})]}\nfor _label, _args, _expected in _CASES[N]:\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":"1ecc591cd5e8ee495786e1fd53447317a3f21c438ceebc9447292bbb54f2c66b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(pending_reads, sent_markers, foreground):\n    best = {}\n    for conv, seq in pending_reads:\n        if seq > best.get(conv, -1):\n            best[conv] = seq\n    rows = [[c, s] for c, s in sorted(best.items()) if s > sent_markers.get(c, -1)]\n    if not foreground and not rows:\n        return {'send': [], 'defer': [c for c, _ in rows]}\n    return {'send': rows, 'defer': []}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\n_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': []})]}\nfor _label, _args, _expected in _CASES[N]:\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":"0b9d0c38fb9b77cba0190af534fc4ad09f3294a1edef2cef856ee2ce6edb4015","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(pending_reads, sent_markers, foreground):\n    best = {}\n    for conv, seq in pending_reads:\n        if seq > best.get(conv, -1):\n            best[conv] = seq\n    rows = [[c, s] for c, s in sorted(best.items()) if s > sent_markers.get(c, -1)]\n    if not foreground:\n        return {'send': [], 'defer': [c for c, _ in rows]}\n    return {'send': rows, 'defer': []}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\n_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': []})]}\nfor _label, _args, _expected in _CASES[N]:\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":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-chat_ordering_and_read_receipts-receipt-batcher-background-defer","generated_at":"2026-09-29T14:49:14.181465+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Receipt batching limits traffic; batching errors send stale receipts or none at all.","repair":"Use `if not foreground:` for the background defer decision and keep every other rule of the model unchanged.","root_cause":"The background defer decision evaluates `if not foreground and not rows:` where the contract requires `if not foreground:`.","sha256":"262b6e8e31d31962a6335d6ab0482da2b5c20df45bcd48d671197d2565a2c1db","title":"Batch outgoing read receipts per conversation: background defer · case 01","variant":1,"variant_policy":"N selects a different enumerated fixture set (shifted clocks, identifiers and sizes); boundary fixtures recur across variants.","verification":{"attempt":{"elapsed_ms":41.621,"exit_code":1,"observations":[{"actual":{"defer":[],"send":[["a",10],["b",2]]},"check":"scroll events out of order","expected":{"defer":[],"send":[["a",10],["b",2]]},"passed":true},{"actual":{"defer":[],"send":[["n",0]]},"check":"first message has seq zero","expected":{"defer":[],"send":[["n",0]]},"passed":true},{"actual":{"defer":[],"send":[["b",8]]},"check":"not advancing","expected":{"defer":[],"send":[["b",8]]},"passed":true},{"actual":{"defer":[],"send":[]},"check":"lower than sent","expected":{"defer":[],"send":[]},"passed":true},{"actual":{"defer":[],"send":[["a",3]]},"check":"background defers","expected":{"defer":["a"],"send":[]},"passed":false},{"actual":{"defer":[],"send":[]},"check":"empty","expected":{"defer":[],"send":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"scroll events out of order\", \"actual\": {\"send\": [[\"a\", 10], [\"b\", 2]], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": [[\"a\", 10], [\"b\", 2]]}, \"passed\": true}, {\"check\": \"first message has seq zero\", \"actual\": {\"send\": [[\"n\", 0]], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": [[\"n\", 0]]}, \"passed\": true}, {\"check\": \"not advancing\", \"actual\": {\"send\": [[\"b\", 8]], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": [[\"b\", 8]]}, \"passed\": true}, {\"check\": \"lower than sent\", \"actual\": {\"send\": [], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": []}, \"passed\": true}, {\"check\": \"background defers\", \"actual\": {\"send\": [[\"a\", 3]], \"defer\": []}, \"expected\": {\"defer\": [\"a\"], \"send\": []}, \"passed\": false}, {\"check\": \"empty\", \"actual\": {\"send\": [], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": []}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.456,"exit_code":1,"observations":[{"actual":{"defer":[],"send":[["a",10],["b",2]]},"check":"scroll events out of order","expected":{"defer":[],"send":[["a",10],["b",2]]},"passed":true},{"actual":{"defer":[],"send":[["n",0]]},"check":"first message has seq zero","expected":{"defer":[],"send":[["n",0]]},"passed":true},{"actual":{"defer":[],"send":[["b",8]]},"check":"not advancing","expected":{"defer":[],"send":[["b",8]]},"passed":true},{"actual":{"defer":[],"send":[]},"check":"lower than sent","expected":{"defer":[],"send":[]},"passed":true},{"actual":{"defer":[],"send":[["a",3]]},"check":"background defers","expected":{"defer":["a"],"send":[]},"passed":false},{"actual":{"defer":[],"send":[]},"check":"empty","expected":{"defer":[],"send":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"scroll events out of order\", \"actual\": {\"send\": [[\"a\", 10], [\"b\", 2]], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": [[\"a\", 10], [\"b\", 2]]}, \"passed\": true}, {\"check\": \"first message has seq zero\", \"actual\": {\"send\": [[\"n\", 0]], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": [[\"n\", 0]]}, \"passed\": true}, {\"check\": \"not advancing\", \"actual\": {\"send\": [[\"b\", 8]], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": [[\"b\", 8]]}, \"passed\": true}, {\"check\": \"lower than sent\", \"actual\": {\"send\": [], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": []}, \"passed\": true}, {\"check\": \"background defers\", \"actual\": {\"send\": [[\"a\", 3]], \"defer\": []}, \"expected\": {\"defer\": [\"a\"], \"send\": []}, \"passed\": false}, {\"check\": \"empty\", \"actual\": {\"send\": [], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": []}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.056,"exit_code":0,"observations":[{"actual":{"defer":[],"send":[["a",10],["b",2]]},"check":"scroll events out of order","expected":{"defer":[],"send":[["a",10],["b",2]]},"passed":true},{"actual":{"defer":[],"send":[["n",0]]},"check":"first message has seq zero","expected":{"defer":[],"send":[["n",0]]},"passed":true},{"actual":{"defer":[],"send":[["b",8]]},"check":"not advancing","expected":{"defer":[],"send":[["b",8]]},"passed":true},{"actual":{"defer":[],"send":[]},"check":"lower than sent","expected":{"defer":[],"send":[]},"passed":true},{"actual":{"defer":["a"],"send":[]},"check":"background defers","expected":{"defer":["a"],"send":[]},"passed":true},{"actual":{"defer":[],"send":[]},"check":"empty","expected":{"defer":[],"send":[]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"scroll events out of order\", \"actual\": {\"send\": [[\"a\", 10], [\"b\", 2]], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": [[\"a\", 10], [\"b\", 2]]}, \"passed\": true}, {\"check\": \"first message has seq zero\", \"actual\": {\"send\": [[\"n\", 0]], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": [[\"n\", 0]]}, \"passed\": true}, {\"check\": \"not advancing\", \"actual\": {\"send\": [[\"b\", 8]], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": [[\"b\", 8]]}, \"passed\": true}, {\"check\": \"lower than sent\", \"actual\": {\"send\": [], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": []}, \"passed\": true}, {\"check\": \"background defers\", \"actual\": {\"send\": [], \"defer\": [\"a\"]}, \"expected\": {\"defer\": [\"a\"], \"send\": []}, \"passed\": true}, {\"check\": \"empty\", \"actual\": {\"send\": [], \"defer\": []}, \"expected\": {\"defer\": [], \"send\": []}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}