# Separate fact time from record time ## Intent I want to keep the date of a fact’s effect separate from the dates of observation and recording. ## Wrong form and why it stays silent ```text title="Incorrect form" evidence Doc: Record { status verified; observed_at @2026-09-03; } ``` On an assertion the observed/recorded fields allow Date. On evidence the observed_at/recorded_at fields require Instant: neighbouring carriers have different contracts. ## Correct form ```law language "law.core" version "0.2"; package recipes.d.r08 version "0.1.0"; namespace "urn:recipe:d-evidence:08"; entity Person; entity Record; relation eligible(p: Person); assert eligible(entity_ref("urn:recipe:d-evidence:08:p")) { id "urn:recipe:d-evidence:08#entry"; origin external_snapshot; valid [@2026-09-01, @2026-09-10); observed @2026-09-03; recorded @2026-09-12; } ``` ## Frozen execution scene In the table P and Q are different entities of the page, C is a case; full identifiers are pinned in the scenes. | Input on 13.09.2026 (a different date is named in the scene) | Question | Answer | |---|---|---| | before the start | `truth(eligible(P))` | `NEITHER` / `COMPUTED` | | inside the window | `truth(eligible(P))` | `TRUE_ONLY` / `COMPUTED` | | excluded right bound | `truth(eligible(P))` | `NEITHER` / `COMPUTED` | | knowledge cut before recording | `truth(eligible(P))` | `TRUE_ONLY` / `COMPUTED` | ```law test "before validity window gives neither" { given { context { legal_time @2026-08-31; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } } evaluate truth(eligible(entity_ref("urn:recipe:d-evidence:08:p"))); expect truth_status == NEITHER; expect evaluation_status == COMPUTED; expect issue(ASSERTION_OUTSIDE_VALID); } ``` ```law test "inside validity window establishes" { given { context { legal_time @2026-09-05; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } } evaluate truth(eligible(entity_ref("urn:recipe:d-evidence:08:p"))); expect truth_status == TRUE_ONLY; expect evaluation_status == COMPUTED; } ``` ```law test "excluded right bound rejects" { given { context { legal_time @2026-09-10; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-13T09:00:00Z; timezone "UTC"; } } evaluate truth(eligible(entity_ref("urn:recipe:d-evidence:08:p"))); expect truth_status == NEITHER; expect evaluation_status == COMPUTED; expect issue(ASSERTION_OUTSIDE_VALID); } ``` ```law test "early knowledge cut keeps established truth" { given { context { legal_time @2026-09-05; decision_time @2026-09-13T09:00:00Z; knowledge_time @2026-09-04T09:00:00Z; timezone "UTC"; } } evaluate truth(eligible(entity_ref("urn:recipe:d-evidence:08:p"))); expect truth_status == TRUE_ONLY; expect evaluation_status == COMPUTED; } ``` ## Counterfactual Diagnostic mutation (lower-case) — LDC-E1307. Original fragment: ```law relation eligible(p: Person); ``` Replacement: ```law relation eligible(p: Person); case Bad { evidence Doc: Record { status verified; observed_at @2026-09-03; } } ``` The paired scenes above pin the change of outcome. ## Boundary On this path ingest filters valid by legal_time; observed/recorded are kept for audit, but themselves do not cut an assertion by knowledge_time. A historical snapshot is chosen by the supplier; explicit available for documents is shown in [Accept admissible evidence](/recipes/d-evidence/admissible-evidence/). We do not promise an automatic bitemporal filter where there is none. Date in evidence is checked by lowering the case (`lower-case`): a single check still does not execute transport. The refusal form in the sidecar places the document in case Bad. An ordinary assertion carries only a weak bound on knowledge time; availability of policy documents has a separate executable slot. ## Pitfall On an assertion the observed/recorded fields allow Date; on evidence the observed_at/recorded_at fields require Instant: neighbouring carriers have different contracts.