{"abstract":"A delayed report from a slower device drags the read marker backwards and resurrects already-read messages.","category":"Chat ordering and read receipts","checks":8,"contract":"A report from a device session whose epoch differs from the current epoch (for example a session that predates a \"mark unread\") is ignored. Otherwise the report is clamped to latest_seq and the marker only moves forward. Result: {marker, broadcast (true only when the marker changed), unread = max(0, latest_seq - marker)}.","evaluation_group":"w2-chat_ordering_and_read_receipts-read-marker-advance","failed_approach":"Guarding only against a zero report still lets any lower late report regress the marker. The attempted `new = target if target else marker` still disagrees with a fixture.","family":"w2-chat_ordering_and_read_receipts-read-marker-advance-monotonic-advance","id":"FA-75871","implementations":{"attempt":{"sha256":"5af655299bb5f22f47b40147e87ab6c7c328164448acde111a1d789eba4f1c35","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(marker, report, latest_seq, session_epoch, current_epoch):\n    if session_epoch != current_epoch:\n        return {'marker': marker, 'broadcast': False, 'unread': max(0, latest_seq - marker)}\n    target = min(report, latest_seq)\n    new = target if target else marker\n    return {'marker': new, 'broadcast': new != marker, 'unread': max(0, latest_seq - new)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\n_CASES = {1: [('stale session after mark-unread', (10, 15, 18, 3, 4), {'broadcast': False, 'marker': 10, 'unread': 8}), ('session two epochs behind', (10, 17, 19, 1, 3), {'broadcast': False, 'marker': 10, 'unread': 9}), ('report beyond latest', (1, 21, 5, 2, 2), {'broadcast': True, 'marker': 5, 'unread': 0}), ('older report arrives late', (51, 41, 61, 1, 1), {'broadcast': False, 'marker': 51, 'unread': 10}), ('equal report no broadcast', (30, 30, 41, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 11}), ('history trimmed below marker', (21, 5, 18, 1, 1), {'broadcast': False, 'marker': 21, 'unread': 0}), ('normal advance', (1, 4, 11, 7, 7), {'broadcast': True, 'marker': 4, 'unread': 7}), ('lower report with zero', (3, 0, 7, 2, 2), {'broadcast': False, 'marker': 3, 'unread': 4})], 2: [('stale session after mark-unread', (20, 25, 28, 3, 4), {'broadcast': False, 'marker': 20, 'unread': 8}), ('session two epochs behind', (20, 27, 29, 1, 3), {'broadcast': False, 'marker': 20, 'unread': 9}), ('report beyond latest', (2, 22, 6, 2, 2), {'broadcast': True, 'marker': 6, 'unread': 0}), ('older report arrives late', (52, 42, 62, 1, 1), {'broadcast': False, 'marker': 52, 'unread': 10}), ('equal report no broadcast', (30, 30, 42, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 12}), ('history trimmed below marker', (22, 5, 18, 1, 1), {'broadcast': False, 'marker': 22, 'unread': 0}), ('normal advance', (2, 5, 12, 7, 7), {'broadcast': True, 'marker': 5, 'unread': 7}), ('lower report with zero', (4, 0, 8, 2, 2), {'broadcast': False, 'marker': 4, 'unread': 4})], 3: [('stale session after mark-unread', (30, 35, 38, 3, 4), {'broadcast': False, 'marker': 30, 'unread': 8}), ('session two epochs behind', (30, 37, 39, 1, 3), {'broadcast': False, 'marker': 30, 'unread': 9}), ('report beyond latest', (3, 23, 7, 2, 2), {'broadcast': True, 'marker': 7, 'unread': 0}), ('older report arrives late', (53, 43, 63, 1, 1), {'broadcast': False, 'marker': 53, 'unread': 10}), ('equal report no broadcast', (30, 30, 43, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 13}), ('history trimmed below marker', (23, 5, 18, 1, 1), {'broadcast': False, 'marker': 23, 'unread': 0}), ('normal advance', (3, 6, 13, 7, 7), {'broadcast': True, 'marker': 6, 'unread': 7}), ('lower report with zero', (5, 0, 9, 2, 2), {'broadcast': False, 'marker': 5, 'unread': 4})], 4: [('stale session after mark-unread', (40, 45, 48, 3, 4), {'broadcast': False, 'marker': 40, 'unread': 8}), ('session two epochs behind', (40, 47, 49, 1, 3), {'broadcast': False, 'marker': 40, 'unread': 9}), ('report beyond latest', (4, 24, 8, 2, 2), {'broadcast': True, 'marker': 8, 'unread': 0}), ('older report arrives late', (54, 44, 64, 1, 1), {'broadcast': False, 'marker': 54, 'unread': 10}), ('equal report no broadcast', (30, 30, 44, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 14}), ('history trimmed below marker', (24, 5, 18, 1, 1), {'broadcast': False, 'marker': 24, 'unread': 0}), ('normal advance', (4, 7, 14, 7, 7), {'broadcast': True, 'marker': 7, 'unread': 7}), ('lower report with zero', (6, 0, 10, 2, 2), {'broadcast': False, 'marker': 6, 'unread': 4})], 5: [('stale session after mark-unread', (50, 55, 58, 3, 4), {'broadcast': False, 'marker': 50, 'unread': 8}), ('session two epochs behind', (50, 57, 59, 1, 3), {'broadcast': False, 'marker': 50, 'unread': 9}), ('report beyond latest', (5, 25, 9, 2, 2), {'broadcast': True, 'marker': 9, 'unread': 0}), ('older report arrives late', (55, 45, 65, 1, 1), {'broadcast': False, 'marker': 55, 'unread': 10}), ('equal report no broadcast', (30, 30, 45, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 15}), ('history trimmed below marker', (25, 5, 18, 1, 1), {'broadcast': False, 'marker': 25, 'unread': 0}), ('normal advance', (5, 8, 15, 7, 7), {'broadcast': True, 'marker': 8, 'unread': 7}), ('lower report with zero', (7, 0, 11, 2, 2), {'broadcast': False, 'marker': 7, 'unread': 4})]}\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":"b54bcd7ec8dc3fad52418320bb0c54c879b662dfae55a1d702b7780ae1252e5f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(marker, report, latest_seq, session_epoch, current_epoch):\n    if session_epoch != current_epoch:\n        return {'marker': marker, 'broadcast': False, 'unread': max(0, latest_seq - marker)}\n    target = min(report, latest_seq)\n    new = target\n    return {'marker': new, 'broadcast': new != marker, 'unread': max(0, latest_seq - new)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\n_CASES = {1: [('stale session after mark-unread', (10, 15, 18, 3, 4), {'broadcast': False, 'marker': 10, 'unread': 8}), ('session two epochs behind', (10, 17, 19, 1, 3), {'broadcast': False, 'marker': 10, 'unread': 9}), ('report beyond latest', (1, 21, 5, 2, 2), {'broadcast': True, 'marker': 5, 'unread': 0}), ('older report arrives late', (51, 41, 61, 1, 1), {'broadcast': False, 'marker': 51, 'unread': 10}), ('equal report no broadcast', (30, 30, 41, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 11}), ('history trimmed below marker', (21, 5, 18, 1, 1), {'broadcast': False, 'marker': 21, 'unread': 0}), ('normal advance', (1, 4, 11, 7, 7), {'broadcast': True, 'marker': 4, 'unread': 7}), ('lower report with zero', (3, 0, 7, 2, 2), {'broadcast': False, 'marker': 3, 'unread': 4})], 2: [('stale session after mark-unread', (20, 25, 28, 3, 4), {'broadcast': False, 'marker': 20, 'unread': 8}), ('session two epochs behind', (20, 27, 29, 1, 3), {'broadcast': False, 'marker': 20, 'unread': 9}), ('report beyond latest', (2, 22, 6, 2, 2), {'broadcast': True, 'marker': 6, 'unread': 0}), ('older report arrives late', (52, 42, 62, 1, 1), {'broadcast': False, 'marker': 52, 'unread': 10}), ('equal report no broadcast', (30, 30, 42, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 12}), ('history trimmed below marker', (22, 5, 18, 1, 1), {'broadcast': False, 'marker': 22, 'unread': 0}), ('normal advance', (2, 5, 12, 7, 7), {'broadcast': True, 'marker': 5, 'unread': 7}), ('lower report with zero', (4, 0, 8, 2, 2), {'broadcast': False, 'marker': 4, 'unread': 4})], 3: [('stale session after mark-unread', (30, 35, 38, 3, 4), {'broadcast': False, 'marker': 30, 'unread': 8}), ('session two epochs behind', (30, 37, 39, 1, 3), {'broadcast': False, 'marker': 30, 'unread': 9}), ('report beyond latest', (3, 23, 7, 2, 2), {'broadcast': True, 'marker': 7, 'unread': 0}), ('older report arrives late', (53, 43, 63, 1, 1), {'broadcast': False, 'marker': 53, 'unread': 10}), ('equal report no broadcast', (30, 30, 43, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 13}), ('history trimmed below marker', (23, 5, 18, 1, 1), {'broadcast': False, 'marker': 23, 'unread': 0}), ('normal advance', (3, 6, 13, 7, 7), {'broadcast': True, 'marker': 6, 'unread': 7}), ('lower report with zero', (5, 0, 9, 2, 2), {'broadcast': False, 'marker': 5, 'unread': 4})], 4: [('stale session after mark-unread', (40, 45, 48, 3, 4), {'broadcast': False, 'marker': 40, 'unread': 8}), ('session two epochs behind', (40, 47, 49, 1, 3), {'broadcast': False, 'marker': 40, 'unread': 9}), ('report beyond latest', (4, 24, 8, 2, 2), {'broadcast': True, 'marker': 8, 'unread': 0}), ('older report arrives late', (54, 44, 64, 1, 1), {'broadcast': False, 'marker': 54, 'unread': 10}), ('equal report no broadcast', (30, 30, 44, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 14}), ('history trimmed below marker', (24, 5, 18, 1, 1), {'broadcast': False, 'marker': 24, 'unread': 0}), ('normal advance', (4, 7, 14, 7, 7), {'broadcast': True, 'marker': 7, 'unread': 7}), ('lower report with zero', (6, 0, 10, 2, 2), {'broadcast': False, 'marker': 6, 'unread': 4})], 5: [('stale session after mark-unread', (50, 55, 58, 3, 4), {'broadcast': False, 'marker': 50, 'unread': 8}), ('session two epochs behind', (50, 57, 59, 1, 3), {'broadcast': False, 'marker': 50, 'unread': 9}), ('report beyond latest', (5, 25, 9, 2, 2), {'broadcast': True, 'marker': 9, 'unread': 0}), ('older report arrives late', (55, 45, 65, 1, 1), {'broadcast': False, 'marker': 55, 'unread': 10}), ('equal report no broadcast', (30, 30, 45, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 15}), ('history trimmed below marker', (25, 5, 18, 1, 1), {'broadcast': False, 'marker': 25, 'unread': 0}), ('normal advance', (5, 8, 15, 7, 7), {'broadcast': True, 'marker': 8, 'unread': 7}), ('lower report with zero', (7, 0, 11, 2, 2), {'broadcast': False, 'marker': 7, 'unread': 4})]}\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":"dd2d1a000597884213acafaeb41562829e91b9cbf08e39227985d1c7d03a7829","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(marker, report, latest_seq, session_epoch, current_epoch):\n    if session_epoch != current_epoch:\n        return {'marker': marker, 'broadcast': False, 'unread': max(0, latest_seq - marker)}\n    target = min(report, latest_seq)\n    new = max(marker, target)\n    return {'marker': new, 'broadcast': new != marker, 'unread': max(0, latest_seq - new)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\n_CASES = {1: [('stale session after mark-unread', (10, 15, 18, 3, 4), {'broadcast': False, 'marker': 10, 'unread': 8}), ('session two epochs behind', (10, 17, 19, 1, 3), {'broadcast': False, 'marker': 10, 'unread': 9}), ('report beyond latest', (1, 21, 5, 2, 2), {'broadcast': True, 'marker': 5, 'unread': 0}), ('older report arrives late', (51, 41, 61, 1, 1), {'broadcast': False, 'marker': 51, 'unread': 10}), ('equal report no broadcast', (30, 30, 41, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 11}), ('history trimmed below marker', (21, 5, 18, 1, 1), {'broadcast': False, 'marker': 21, 'unread': 0}), ('normal advance', (1, 4, 11, 7, 7), {'broadcast': True, 'marker': 4, 'unread': 7}), ('lower report with zero', (3, 0, 7, 2, 2), {'broadcast': False, 'marker': 3, 'unread': 4})], 2: [('stale session after mark-unread', (20, 25, 28, 3, 4), {'broadcast': False, 'marker': 20, 'unread': 8}), ('session two epochs behind', (20, 27, 29, 1, 3), {'broadcast': False, 'marker': 20, 'unread': 9}), ('report beyond latest', (2, 22, 6, 2, 2), {'broadcast': True, 'marker': 6, 'unread': 0}), ('older report arrives late', (52, 42, 62, 1, 1), {'broadcast': False, 'marker': 52, 'unread': 10}), ('equal report no broadcast', (30, 30, 42, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 12}), ('history trimmed below marker', (22, 5, 18, 1, 1), {'broadcast': False, 'marker': 22, 'unread': 0}), ('normal advance', (2, 5, 12, 7, 7), {'broadcast': True, 'marker': 5, 'unread': 7}), ('lower report with zero', (4, 0, 8, 2, 2), {'broadcast': False, 'marker': 4, 'unread': 4})], 3: [('stale session after mark-unread', (30, 35, 38, 3, 4), {'broadcast': False, 'marker': 30, 'unread': 8}), ('session two epochs behind', (30, 37, 39, 1, 3), {'broadcast': False, 'marker': 30, 'unread': 9}), ('report beyond latest', (3, 23, 7, 2, 2), {'broadcast': True, 'marker': 7, 'unread': 0}), ('older report arrives late', (53, 43, 63, 1, 1), {'broadcast': False, 'marker': 53, 'unread': 10}), ('equal report no broadcast', (30, 30, 43, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 13}), ('history trimmed below marker', (23, 5, 18, 1, 1), {'broadcast': False, 'marker': 23, 'unread': 0}), ('normal advance', (3, 6, 13, 7, 7), {'broadcast': True, 'marker': 6, 'unread': 7}), ('lower report with zero', (5, 0, 9, 2, 2), {'broadcast': False, 'marker': 5, 'unread': 4})], 4: [('stale session after mark-unread', (40, 45, 48, 3, 4), {'broadcast': False, 'marker': 40, 'unread': 8}), ('session two epochs behind', (40, 47, 49, 1, 3), {'broadcast': False, 'marker': 40, 'unread': 9}), ('report beyond latest', (4, 24, 8, 2, 2), {'broadcast': True, 'marker': 8, 'unread': 0}), ('older report arrives late', (54, 44, 64, 1, 1), {'broadcast': False, 'marker': 54, 'unread': 10}), ('equal report no broadcast', (30, 30, 44, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 14}), ('history trimmed below marker', (24, 5, 18, 1, 1), {'broadcast': False, 'marker': 24, 'unread': 0}), ('normal advance', (4, 7, 14, 7, 7), {'broadcast': True, 'marker': 7, 'unread': 7}), ('lower report with zero', (6, 0, 10, 2, 2), {'broadcast': False, 'marker': 6, 'unread': 4})], 5: [('stale session after mark-unread', (50, 55, 58, 3, 4), {'broadcast': False, 'marker': 50, 'unread': 8}), ('session two epochs behind', (50, 57, 59, 1, 3), {'broadcast': False, 'marker': 50, 'unread': 9}), ('report beyond latest', (5, 25, 9, 2, 2), {'broadcast': True, 'marker': 9, 'unread': 0}), ('older report arrives late', (55, 45, 65, 1, 1), {'broadcast': False, 'marker': 55, 'unread': 10}), ('equal report no broadcast', (30, 30, 45, 5, 5), {'broadcast': False, 'marker': 30, 'unread': 15}), ('history trimmed below marker', (25, 5, 18, 1, 1), {'broadcast': False, 'marker': 25, 'unread': 0}), ('normal advance', (5, 8, 15, 7, 7), {'broadcast': True, 'marker': 8, 'unread': 7}), ('lower report with zero', (7, 0, 11, 2, 2), {'broadcast': False, 'marker': 7, 'unread': 4})]}\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-read-marker-advance-monotonic-advance","generated_at":"2026-09-29T14:49:10.892994+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Read markers drive unread badges on every device; regressions or stale sessions resurrect or hide unread messages.","repair":"Use `new = max(marker, target)` for the monotonic advance decision and keep every other rule of the model unchanged.","root_cause":"The monotonic advance decision evaluates `new = target` where the contract requires `new = max(marker, target)`.","sha256":"17ccd5a31541564d6baf0ca9cf9e23c4129613a38625699296d67250672e15e4","title":"Advance a stored read marker from a device report: monotonic advance · 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":39.485,"exit_code":1,"observations":[{"actual":{"broadcast":false,"marker":10,"unread":8},"check":"stale session after mark-unread","expected":{"broadcast":false,"marker":10,"unread":8},"passed":true},{"actual":{"broadcast":false,"marker":10,"unread":9},"check":"session two epochs behind","expected":{"broadcast":false,"marker":10,"unread":9},"passed":true},{"actual":{"broadcast":true,"marker":5,"unread":0},"check":"report beyond latest","expected":{"broadcast":true,"marker":5,"unread":0},"passed":true},{"actual":{"broadcast":true,"marker":41,"unread":20},"check":"older report arrives late","expected":{"broadcast":false,"marker":51,"unread":10},"passed":false},{"actual":{"broadcast":false,"marker":30,"unread":11},"check":"equal report no broadcast","expected":{"broadcast":false,"marker":30,"unread":11},"passed":true},{"actual":{"broadcast":true,"marker":5,"unread":13},"check":"history trimmed below marker","expected":{"broadcast":false,"marker":21,"unread":0},"passed":false},{"actual":{"broadcast":true,"marker":4,"unread":7},"check":"normal advance","expected":{"broadcast":true,"marker":4,"unread":7},"passed":true},{"actual":{"broadcast":false,"marker":3,"unread":4},"check":"lower report with zero","expected":{"broadcast":false,"marker":3,"unread":4},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"stale session after mark-unread\", \"actual\": {\"marker\": 10, \"broadcast\": false, \"unread\": 8}, \"expected\": {\"broadcast\": false, \"marker\": 10, \"unread\": 8}, \"passed\": true}, {\"check\": \"session two epochs behind\", \"actual\": {\"marker\": 10, \"broadcast\": false, \"unread\": 9}, \"expected\": {\"broadcast\": false, \"marker\": 10, \"unread\": 9}, \"passed\": true}, {\"check\": \"report beyond latest\", \"actual\": {\"marker\": 5, \"broadcast\": true, \"unread\": 0}, \"expected\": {\"broadcast\": true, \"marker\": 5, \"unread\": 0}, \"passed\": true}, {\"check\": \"older report arrives late\", \"actual\": {\"marker\": 41, \"broadcast\": true, \"unread\": 20}, \"expected\": {\"broadcast\": false, \"marker\": 51, \"unread\": 10}, \"passed\": false}, {\"check\": \"equal report no broadcast\", \"actual\": {\"marker\": 30, \"broadcast\": false, \"unread\": 11}, \"expected\": {\"broadcast\": false, \"marker\": 30, \"unread\": 11}, \"passed\": true}, {\"check\": \"history trimmed below marker\", \"actual\": {\"marker\": 5, \"broadcast\": true, \"unread\": 13}, \"expected\": {\"broadcast\": false, \"marker\": 21, \"unread\": 0}, \"passed\": false}, {\"check\": \"normal advance\", \"actual\": {\"marker\": 4, \"broadcast\": true, \"unread\": 7}, \"expected\": {\"broadcast\": true, \"marker\": 4, \"unread\": 7}, \"passed\": true}, {\"check\": \"lower report with zero\", \"actual\": {\"marker\": 3, \"broadcast\": false, \"unread\": 4}, \"expected\": {\"broadcast\": false, \"marker\": 3, \"unread\": 4}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.51,"exit_code":1,"observations":[{"actual":{"broadcast":false,"marker":10,"unread":8},"check":"stale session after mark-unread","expected":{"broadcast":false,"marker":10,"unread":8},"passed":true},{"actual":{"broadcast":false,"marker":10,"unread":9},"check":"session two epochs behind","expected":{"broadcast":false,"marker":10,"unread":9},"passed":true},{"actual":{"broadcast":true,"marker":5,"unread":0},"check":"report beyond latest","expected":{"broadcast":true,"marker":5,"unread":0},"passed":true},{"actual":{"broadcast":true,"marker":41,"unread":20},"check":"older report arrives late","expected":{"broadcast":false,"marker":51,"unread":10},"passed":false},{"actual":{"broadcast":false,"marker":30,"unread":11},"check":"equal report no broadcast","expected":{"broadcast":false,"marker":30,"unread":11},"passed":true},{"actual":{"broadcast":true,"marker":5,"unread":13},"check":"history trimmed below marker","expected":{"broadcast":false,"marker":21,"unread":0},"passed":false},{"actual":{"broadcast":true,"marker":4,"unread":7},"check":"normal advance","expected":{"broadcast":true,"marker":4,"unread":7},"passed":true},{"actual":{"broadcast":true,"marker":0,"unread":7},"check":"lower report with zero","expected":{"broadcast":false,"marker":3,"unread":4},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"stale session after mark-unread\", \"actual\": {\"marker\": 10, \"broadcast\": false, \"unread\": 8}, \"expected\": {\"broadcast\": false, \"marker\": 10, \"unread\": 8}, \"passed\": true}, {\"check\": \"session two epochs behind\", \"actual\": {\"marker\": 10, \"broadcast\": false, \"unread\": 9}, \"expected\": {\"broadcast\": false, \"marker\": 10, \"unread\": 9}, \"passed\": true}, {\"check\": \"report beyond latest\", \"actual\": {\"marker\": 5, \"broadcast\": true, \"unread\": 0}, \"expected\": {\"broadcast\": true, \"marker\": 5, \"unread\": 0}, \"passed\": true}, {\"check\": \"older report arrives late\", \"actual\": {\"marker\": 41, \"broadcast\": true, \"unread\": 20}, \"expected\": {\"broadcast\": false, \"marker\": 51, \"unread\": 10}, \"passed\": false}, {\"check\": \"equal report no broadcast\", \"actual\": {\"marker\": 30, \"broadcast\": false, \"unread\": 11}, \"expected\": {\"broadcast\": false, \"marker\": 30, \"unread\": 11}, \"passed\": true}, {\"check\": \"history trimmed below marker\", \"actual\": {\"marker\": 5, \"broadcast\": true, \"unread\": 13}, \"expected\": {\"broadcast\": false, \"marker\": 21, \"unread\": 0}, \"passed\": false}, {\"check\": \"normal advance\", \"actual\": {\"marker\": 4, \"broadcast\": true, \"unread\": 7}, \"expected\": {\"broadcast\": true, \"marker\": 4, \"unread\": 7}, \"passed\": true}, {\"check\": \"lower report with zero\", \"actual\": {\"marker\": 0, \"broadcast\": true, \"unread\": 7}, \"expected\": {\"broadcast\": false, \"marker\": 3, \"unread\": 4}, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":37.03,"exit_code":0,"observations":[{"actual":{"broadcast":false,"marker":10,"unread":8},"check":"stale session after mark-unread","expected":{"broadcast":false,"marker":10,"unread":8},"passed":true},{"actual":{"broadcast":false,"marker":10,"unread":9},"check":"session two epochs behind","expected":{"broadcast":false,"marker":10,"unread":9},"passed":true},{"actual":{"broadcast":true,"marker":5,"unread":0},"check":"report beyond latest","expected":{"broadcast":true,"marker":5,"unread":0},"passed":true},{"actual":{"broadcast":false,"marker":51,"unread":10},"check":"older report arrives late","expected":{"broadcast":false,"marker":51,"unread":10},"passed":true},{"actual":{"broadcast":false,"marker":30,"unread":11},"check":"equal report no broadcast","expected":{"broadcast":false,"marker":30,"unread":11},"passed":true},{"actual":{"broadcast":false,"marker":21,"unread":0},"check":"history trimmed below marker","expected":{"broadcast":false,"marker":21,"unread":0},"passed":true},{"actual":{"broadcast":true,"marker":4,"unread":7},"check":"normal advance","expected":{"broadcast":true,"marker":4,"unread":7},"passed":true},{"actual":{"broadcast":false,"marker":3,"unread":4},"check":"lower report with zero","expected":{"broadcast":false,"marker":3,"unread":4},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"stale session after mark-unread\", \"actual\": {\"marker\": 10, \"broadcast\": false, \"unread\": 8}, \"expected\": {\"broadcast\": false, \"marker\": 10, \"unread\": 8}, \"passed\": true}, {\"check\": \"session two epochs behind\", \"actual\": {\"marker\": 10, \"broadcast\": false, \"unread\": 9}, \"expected\": {\"broadcast\": false, \"marker\": 10, \"unread\": 9}, \"passed\": true}, {\"check\": \"report beyond latest\", \"actual\": {\"marker\": 5, \"broadcast\": true, \"unread\": 0}, \"expected\": {\"broadcast\": true, \"marker\": 5, \"unread\": 0}, \"passed\": true}, {\"check\": \"older report arrives late\", \"actual\": {\"marker\": 51, \"broadcast\": false, \"unread\": 10}, \"expected\": {\"broadcast\": false, \"marker\": 51, \"unread\": 10}, \"passed\": true}, {\"check\": \"equal report no broadcast\", \"actual\": {\"marker\": 30, \"broadcast\": false, \"unread\": 11}, \"expected\": {\"broadcast\": false, \"marker\": 30, \"unread\": 11}, \"passed\": true}, {\"check\": \"history trimmed below marker\", \"actual\": {\"marker\": 21, \"broadcast\": false, \"unread\": 0}, \"expected\": {\"broadcast\": false, \"marker\": 21, \"unread\": 0}, \"passed\": true}, {\"check\": \"normal advance\", \"actual\": {\"marker\": 4, \"broadcast\": true, \"unread\": 7}, \"expected\": {\"broadcast\": true, \"marker\": 4, \"unread\": 7}, \"passed\": true}, {\"check\": \"lower report with zero\", \"actual\": {\"marker\": 3, \"broadcast\": false, \"unread\": 4}, \"expected\": {\"broadcast\": false, \"marker\": 3, \"unread\": 4}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}