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.