{"results":[{"id":"chat-contacts-always-bidirectional","text":"`send_message` adds both directions to the contacts graph as a side effect — contacts are always symmetric.","truth_value":"IN","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"chat-dm-conversation-dedup","text":"DM conversations use a deterministic sorted-pair ID (`dm:{min}:{max}`) guaranteeing exactly one conversation per user pair regardless of who messages first.","truth_value":"IN","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"chat-dual-ordering-scheme","text":"Messages carry both per-conversation sequence numbers (for pagination and read cursors) and global Lamport timestamps (for causal ordering), serving different purposes by design.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"chat-dual-ordering-sequence-and-lamport","text":"Chat system uses per-conversation monotonic sequence numbers for total order within a conversation and Lamport timestamps for cross-conversation causal ordering.","truth_value":"IN","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"chat-fanout-on-write","text":"`_deliver` routes messages at send time based on recipient presence: online/away users get messages in `inbox`, offline users in `offline_queue` — this is fan-out-on-write, not fan-out-on-read.","truth_value":"IN","justification_count":0,"dependent_count":2,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"chat-group-size-cap-500","text":"`add_member` raises `ValueError` if the group already has 500 or more members, enforcing a hard cap on group size.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"chat-lamport-clock-is-thread-safe","text":"The Lamport clock and per-conversation sequence numbers are protected by threading.Lock, making all clock/sequence increments atomic across send_message, send_group_message, add_member, and remove_member.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"chat-monotonic-read-progress","text":"Chat combines per-conversation sequence numbers with monotonic read cursors, guaranteeing that once a message is marked read, no earlier message in that conversation can regress to unread.","truth_value":"IN","justification_count":1,"dependent_count":1,"challenges":[],"last_reviewed":"2026-06-05T18:21:49","review_result":"pass","source_type":""},{"id":"chat-offline-queue-flush-on-connect","text":"When a user connects, their `offline_queue` is drained into `inbox` in FIFO order, preserving message arrival ordering.","truth_value":"IN","justification_count":0,"dependent_count":0,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"chat-read-cursors-monotonic","text":"`mark_read` only advances the read cursor; it silently ignores attempts to set a lower sequence number, preventing regression.","truth_value":"IN","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"chat-soft-delete-preserves-sequence","text":"Deleted messages remain in the conversation list with `deleted=True` and content replaced with `\"[deleted]\"`, preserving sequence number continuity for pagination.","truth_value":"IN","justification_count":0,"dependent_count":1,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"current-time-fallback-inconsistent","text":"Rate limiter defaults `current_time` to `time.time()` while chat system defaults to `0.0`, creating different behavior when the parameter is omitted.","truth_value":"OUT","justification_count":0,"dependent_count":3,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"deterministic-ids-eliminate-coordination","text":"Both chat and email derive identifiers deterministically from existing data (sorted user-pair for DM conversations, first message ID for threads) rather than generating separate IDs, eliminating coordination overhead and guaranteeing idempotent ID creation.","truth_value":"IN","justification_count":1,"dependent_count":1,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"fan-out-write-pushes-references-not-data","text":"Both chat (inbox routing) and news feed (post ID distribution) push lightweight references at write time, deferring full data hydration to the read path — this shared pattern helps decouple write-time fanout cost from payload size in these two systems.","truth_value":"IN","justification_count":1,"dependent_count":2,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"invalid","source_type":""},{"id":"no-divergence-annotations","text":"The rate limiter, payment system, and chat system contain zero TODO/FIXME/HACK comments; deviations from plans are undocumented in the code itself.","truth_value":"OUT","justification_count":0,"dependent_count":2,"challenges":[],"last_reviewed":null,"review_result":null,"source_type":""},{"id":"soft-delete-preserves-structural-invariants","text":"Chat and autocomplete use soft delete to preserve structural invariants that physical deletion would break — sequence number contiguity and trie node connectivity — independently of the distributed-resurrection concern that motivates tombstones in replicated systems.","truth_value":"IN","justification_count":1,"dependent_count":1,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"symmetric-social-graphs-simplify-visibility","text":"Both chat contacts and nearby-friends enforce bidirectional relationships with no one-way follow mechanism, trading social model expressiveness for simpler visibility logic — if A sees B, B always sees A.","truth_value":"IN","justification_count":1,"dependent_count":2,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"time-injection-is-a-complete-testing-strategy","text":"Time injection enables fully deterministic testing by making wall-clock time an explicit parameter across notification, rate limiting, and crawling — unless the inconsistent fallback defaults (rate limiter falls back to `time.time()` while chat defaults to `0.0`) mean that tests omitting the time parameter exercise fundamentally different behavior depending on which module's convention they inherit.","truth_value":"IN","justification_count":1,"dependent_count":0,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""},{"id":"write-time-routing-is-irrevocable","text":"Both news feed and chat make irrevocable routing decisions at write time — selecting push vs pull strategy and routing to inbox vs offline queue respectively — with no mechanism to retroactively re-route messages when conditions change.","truth_value":"IN","justification_count":1,"dependent_count":1,"challenges":[],"last_reviewed":"2026-06-06T06:26:57","review_result":"pass","source_type":""}],"count":19,"limit":20,"offset":0}