-- Add valid-time columns to entity_facts. -- -- entity_facts already has created_at — *transaction time*, the -- moment WE recorded the fact. That's not the same as the real-world -- period the fact was true. "Cameron is_in_relationship_with X" was -- only true during a window; recording it in 2026 doesn't make it -- true today. Without the distinction, every former relationship, -- former job, former address reads as currently-true. -- -- Adding two BIGINT NULL columns: valid_from / valid_until (unix -- seconds). NULL means "unbounded on that side" — `valid_from IS -- NULL` reads as "always-true-back-to-the-beginning", -- `valid_until IS NULL` as "still-true-now-or-unknown". Both NULL = -- temporal validity unknown (current state of all legacy rows). -- -- Conflict detection refines accordingly: same-predicate facts with -- different objects stop flagging when their intervals are disjoint -- ("lives_in NYC 2018-2020" and "lives_in SF 2020-present" are both -- valid, just at different times). ALTER TABLE entity_facts ADD COLUMN valid_from BIGINT; ALTER TABLE entity_facts ADD COLUMN valid_until BIGINT; -- Optional partial index for time-bounded scans. Skipped for now — -- conflict detection runs per-entity (small N) and doesn't need it.