Skip to content

Every evidence line carries a date

Status: accepted (2026-07-06), implemented

The recall operator's evidence block dated only PREVIOUS and EVENT lines, so the composer was asked to "compute date differences from the dated evidence" while CURRENT/MEMORY lines were undated — temporal answers worked only because the benchmarks embed dates inside stored text. Decision: (1) stamp every evidence line with its best-known date — valid_from when it carries real event time (ADR 0001), otherwise created_at rendered as "recorded YYYY-MM-DD" so the composer cannot mistake learned-time for happened-time; (2) temporal_chain evidence drops the CURRENT label (the oldest event is not "the value now") and renders anchor-grouped lines with current=None; (3) chronological sorting uses event time when available, created_at until then. Rejected alternative: dating only temporal_chain evidence — cheaper for prompt caching, but it keeps every other intent blind to time and hides the transaction-vs-event-time distinction the schema now commits to.

Implementation notes (2026-07-06)

The evidence renderer is public (engram.recall.render_evidence) and is the exact block recall() hands the composer; compose_answer=False callers render it themselves. "Real event time" means valid_from differs from created_at (the store defaults valid_from to created_at when the caller supplies no event time, per ADR 0001). temporal_chain groups evidence under ANCHOR <phrase>: headers via RecallAnswer.anchor_evidence; a memory matching both anchor searches is attributed to the anchor where it scored highest, not first-seen (retrieval order misattributed shared matches). The compose prompt now defines the "recorded" marker and tells the composer to prefer plain event dates for date arithmetic.