mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
NIP-37 expiration tags were validated at ingest then discarded — expired drafts were served and counted indefinitely. This addresses R3 from Tyler's team's retention review. Adds draft_expired(event, now) to reader_can_receive_event: a KIND_DRAFT event is suppressed when now >= min(expiration_tag, created_at + 30d). Tombstones follow the same rule. Non-draft kinds are unaffected. The COUNT fast-path (author_is_self SQL count_events()) cannot evaluate per-event expiry, so filter_can_match_draft forces draft-matching COUNT filters to the per-event fallback on all four fast-path sites (count.rs ×2, bridge.rs ×2). KIND_EVENT_REMINDER retains its fast-path — reminders carry no expiry semantics. All changes are rebase-safe against #1771: nothing in replace_parameterized_event or schema is touched. NIP-40 advertisement stays absent until the physical delete reaper (#1771 coupling) lands.