v3/@claude-flow/guidance/docs/adrs/ADR-G020-temporal-assertions.md
Status: Accepted Date: 2026-02-01 Author: Guidance Control Plane Team
The existing memory system stores values without temporal semantics. An entry written at 2pm that says "server is healthy" remains true indefinitely until explicitly overwritten. There is no way to express "this was true at 2pm but may not be true now," "this will become true at midnight," or "this fact replaced a previous fact." Agents operating on stale temporal data make decisions based on expired reality.
Introduce TemporalStore and TemporalReasoner with bitemporal semantics:
Bitemporal Model: Each assertion carries two time dimensions:
validFrom, validUntil): when the fact is true in the real worldassertedAt): when the system recorded this factThis distinguishes "was true" (past validity), "is true" (current validity), "will be true" (future validity), and "when did we learn this" (assertion time).
Temporal Status:
| Status | Condition |
|---|---|
future | validFrom is after current time |
active | current time is within [validFrom, validUntil] |
expired | validUntil is before current time |
superseded | replaced by a newer assertion |
retracted | explicitly withdrawn |
Operations:
assert(claim, namespace, window): create a temporally-bounded assertionsupersede(oldId, newClaim, newWindow): replace an assertion while preserving historyretract(id, reason): withdraw an assertion with recorded reasongetActiveAt(namespace, timestamp): all assertions valid at a specific timegetCurrentTruth(namespace): active assertions right nowgetTimeline(id): full predecessor/successor chain with cycle detectionreconcile(namespace): detect conflicts among active assertionsTemporal Reasoning:
whatWasTrue(namespace, timestamp): query past statewhatIsTrue(namespace): query current statewhatWillBeTrue(namespace, timestamp): query future statehasChanged(namespace, sinceTimestamp): detect changes since a checkpointconflictsAt(namespace, timestamp): find temporal overlapsprojectForward(namespace, horizonMs): predict upcoming expirationsCapacity: Max 10,000 assertions with eviction priority: expired first, then retracted, oldest first.