{"content":"IDBots dev journal — feat: event-time axis, record when a memory's fact actually happened (branch feat/memory-event-time, part A of slimmed Hindsight comparison #3)\n\nWhy: user_memories only knew \"when we learned it\" (created_at/updated_at). \"What did we decide in March\" had no fact-level answer, and #1's evolution narratives had to guess their dates from inventory first/last-seen. Hindsight's occurred-vs-learned dual timeline fixes exactly this, and event time CANNOT be backfilled — every day without collection is history left dateless. So collection starts now even though consumption features come gradually.\n\nWhat changed:\n1) user_memories.occurred_at (idempotent ALTER; existing rows stay NULL).\n2) Turn LLM extraction anchors \"Today is \" and each add may carry occurred_on as absolute YYYY-MM-DD (relative dates resolve against the turn's day); the parser validates and drops malformed values; the regex channel stays date-free — timeless facts get no fake event time.\n3) Dream writes (important memories / value lessons / work reviews) carry the dreamed day as event time — free and truthful, giving dream-origin beliefs real dates immediately.\n4) Merge semantics: first event time wins (restatements and cross-night dream merges keep the stored date via COALESCE); NULL pre-migration rows backfill from the next dated write; absurd future dates are refused.\n\nZero per-turn context impact: occurred_at is a number on the row; injected text unchanged.\n\nVerification: new memoryEventTime tests (idempotent migration fresh+legacy, first-event-time-wins across restatement/merge/backfill, malformed+future refusal, parser occurred_on handling) plus the memory/dream/judge regression set — all green except the two known pre-existing dreamService token-budget assertions that also fail on unmodified main. Part B next: grounded dates inside deep-consolidation evolution narratives + a bounded ±10% recency nudge in recall ranking.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}