Compliance · Data Governance
The Answer Depends on the Date
As-at queries and the difference between a knowledge base and a defensible record. Real organizational questions are frequently not about now — and a system that only knows the current policy will answer the past with full confidence and total wrongness.
📚 Read the full field guide
The full field guide: as-at queries, the RAG stale-outranking failure mode, and the bitemporal spec for a defensible record. The Answer Depends on the Date →
TL;DR
- “Was this claim compliant when it was lodged in 2024?” is not a question about the current policy. It must be answered against the version that applied then — often v19, not the v21 sitting at the top of the folder.
- A knowledge base optimises for truth-now. A defensible record also knows when each thing was true, by walking supersedes edges to the version whose validity window covers the date.
- RAG fails this structurally: it returns whichever chunk scores highest on similarity. A stale version can outrank the correct one and still arrive with full confidence — no temporal disambiguation at all.
Here is a question that quietly breaks most knowledge systems: Was this claim compliant when it was lodged in 2024?
Notice it is not a question about now. It is a question about a specific past moment, judged by the rules that applied then. A system that only knows the current state does not merely fail to answer it — it answers wrongly, confidently, by checking a 2024 lodgement against a 2026 rulebook. In a regulated vertical, that confident-wrong compliance verdict is the kind of mistake that ends careers.
We have spent two years stuffing policies, SOPs, and contract playbooks into retrieval systems and calling the result “institutional knowledge.” The marketing promise is always the same: ask in plain English, get the answer. The unspoken assumption underneath is worse: that the answer is always about now.
Real organizational questions are frequently not about now. The answer depends on the date.
Currency is not applicability
Most document stores and chat-over-docs products optimise for one property: currency. Which file is latest? Which chunk has the newest embedding? Which policy PDF has the highest version number in the filename?
Compliance questions need a different property: applicability. Which version governed the world on a particular day? Which SOP bound the team on the day of the incident? Which claims checklist was in force when the form was lodged?
Currency and applicability only agree when nothing has changed since the date that matters. The moment policy moves — and in a living organisation it always does — “give me the current document” becomes a systematic way to falsify the past.
This is not exotic data science. The BI world spent decades formalising the same problem as slowly changing dimensions (SCDs): dimension attributes that are mostly stable but change unpredictably over time.1 Type 2 SCD practice is blunt and correct — when a value changes, you insert a new row with effective dates rather than overwriting the old one, so you can still query history as it stood.2 Soft data (policies, SOPs, playbooks, wiki claims) needs the same discipline. Overwrite is operationally convenient and legally toxic.
Walk the chain: one as-at query, three versions
Here is the minimum mechanism that makes past-tense questions answerable. Call the query type as-at: given a logical document (or claim) and a business date D, return the version whose validity window covers D.
Suppose a claims checklist lives as three successive versions in a governed knowledge graph — not as three sibling files in a folder, but as a chain the ingest process recorded as it happened:
valid: 2023-03-01 → 2024-08-31
superseded_by → v20
claims_checklist v20
valid: 2024-09-01 → 2025-11-30
supersedes → v19
superseded_by → v21
claims_checklist v21
valid: 2025-12-01 → present
supersedes → v20
(current tip of the chain)
A claim was lodged on 12 June 2024. In 2026 a regulator asks: was that lodgement compliant at the time it was made?
As-at walk, end to end
- Question type: as-at (not “current”, not “latest”, not “best match”).
- Logical entity:
claims_checklist. - Business date D: 2024-06-12 (lodgement).
- Start at the tip: v21 is current, but its validity window starts 2025-12-01 — D is outside the window.
- Walk supersedes backward: v20 covers 2024-09-01 → 2025-11-30 — D is still earlier.
- Land on v19: validity 2023-03-01 → 2024-08-31 — D falls inside. Stop.
- Answer against v19: evaluate the 2024 lodgement against the checklist that was actually in force on that day. Return the compliant / not-compliant result as it stood then, with provenance: which version, which window, which edge said v19 was succeeded by v20.
That is the whole mechanism. No Git restore. No hope that someone archived the right PDF. No “I think we were on version nineteen.” The succession was witnessed at ingest and stored as structure; the walk is deterministic.
Key insight
The system doesn’t just know what’s true. It knows when each thing was true — the difference between a knowledge base and a defensible record.
A now-only system, asked the same question, answers against v21 and produces a confidently wrong compliance verdict. The more fluent the model, the more dangerous that verdict becomes.
How RAG fails this with full confidence
Now put the same three versions into the substrate most organisations actually ship: a vector index over document chunks.
There is no validity window in the ranking function. There is cosine similarity, maybe a recency boost if someone remembered to add one, maybe metadata filters if someone remembered to maintain them. The retriever’s job is to return the top-k chunks that look like the question. Structured succession is not a first-class object; GraphRAG-style work exists precisely because baseline RAG is weak on questions that require relationships across a corpus, not just local text match.34
Construct the failure explicitly:
RAG failure mode (constructed)
Query: “What evidence is required for a lodged claim under the checklist?” — asked in the context of a 2024 lodgement review, but the user does not spell out “as of June 2024” because they assume the system knows what “compliant then” means.
- v19 text (correct for 2024-06-12): requires documents A, B, and a wet-ink declaration. Slightly older phrasing; embedding is a bit off the modern query language.
- v20 text (wrong for this date; covers late 2024–2025): rewritten in snappier “AI-ready” language after a process redesign. Mentions evidence packs and digital attestation. Scores highest on similarity to the modern wording of the question.
- v21 text (current tip; also wrong for 2024): another rewrite; shorter; different mandatory set. Might rank second or third depending on the day.
What the system returns: v20’s chunk, confidently, often with a citation that looks official. The model answers with full assurance that digital attestation was required — a rule that did not exist on the lodgement date. Nobody in the loop sees a validity window, because the substrate never had one.
That is not a model quality problem. It is a substrate problem. A filesystem holds versions as sibling files with no semantics; RAG retrieves whichever chunk scores highest, with v20’s text happily outranking both the current tip and the historically correct version — a stale answer with full confidence.
Worse, confidence can be decorated. Research on RAG attributions finds that a large share of generated citations are unfaithful even when the surface answer looks right — post-rationalised “support” that did not actually drive the answer.5 Temporal wrongness plus citation theatre is a compound failure: wrong version, wrong warrant, executive-ready tone.
Two clocks (for readers who already speak warehouse)
What makes this precise rather than hand-wavy is bitemporal history: two independent time axes. Martin Fowler, following Snodgrass and the SQL:2011 standard, names them valid time (also: actual time) and transaction time (also: record time).6 SQL:2011 itself exposes the pair as application-time and system-versioned periods; tables with both are bitemporal.7
| Axis | Question it answers | Soft-data analogue |
|---|---|---|
| Valid time | When was this fact true in the world? | As-at over supersedes / validity windows (this article) |
| Transaction time | When did the system record it? | What the knowledge base said on a given day (system audit / Git-rewind of the store) |
Fowler’s payroll scenario is the intuition pump. An employee rate is known as $100/day from 1 January. Payroll runs on 25 February. On 15 March we learn the rate actually changed to $211/day effective 15 February. What was the rate for 25 February?8 By valid time, it was $211. By transaction time — what the system knew when it ran payroll — it was $100. Both answers are correct for different questions. A compliance audit that cannot ask each clock separately is not an audit; it is a shrug.
In our published work, those two clocks already have different jobs. The Model Is Not the Memory owns the transaction-time problem: reconstruct what the agent observed as of a past instant. This piece owns valid time: what was true in the world during a window, retrieved by walking today’s chain — no restore required. Together they are bitemporal modelling. Name the pair; claim the pair.
For BI readers: this is SCD Type 2 logic arriving in the soft-data warehouse. In BI for Soft Data we argued that organisational exhaust can be compiled into a navigable warehouse of claims and edges. As-at is the temporal dimension of that warehouse — free, if the ingest agent records succession as edges instead of overwriting the page and calling it hygiene.
Supersedes, in one paragraph
A supersedes edge is not a synonym for “delete the old thing.” It is a typed succession: version B replaces version A as the default for new work, while A remains addressable with its validity window intact. Deprecated-but-binding is a real organisational status — old contracts still run on old rules — and it is unworkable without a walk that can find the binding version for a past date. That is all the edge grammar this article needs; the rest of the trust stack (clickable receipts, two-click audits of where an answer came from) lives next door in Trust Is a Link. This article audits when.
What to specify instead of “put it in the knowledge base”
If you are buying, building, or governing an AI knowledge layer for policies and procedures, the as-at requirement is concrete enough to put in a brief:
Minimum specification
- Version identity for each logical policy / SOP / checklist (not just filenames).
- Validity window on every version (business-effective from / to — valid time).
- Supersedes / superseded-by edges recorded at ingest, when succession is witnessed.
- As-at as a first-class query type: entity + business date → version whose window covers the date.
- Default honesty: if the user asks a past-tense compliance question without a date, require one — do not silently answer against the tip.
- Answer payload: not only the text, but version id, window, and the succession edges used. That is what makes the answer a record rather than a vibe.
Related pieces in this series name the rest of the stack lightly: decision attestation packages as the portable proof object that can carry those page versions as-of an instant; the missing memory tier as the substrate that can hold typed edges at all. None of those substitute for the validity walk. They lean on it.
FAQ
Isn’t “always use the latest policy” good enough?
For training and for work that starts today, often yes. For audits, disputes, incident reviews, and any contract still bound to older terms, latest is the wrong default. The high-stakes questions are disproportionately past-tense.
Can’t we just filter RAG by document date?
A date filter is a patch, not a model of succession. It does not encode “v20 supersedes v19,” does not handle overlapping windows cleanly, and still ranks by similarity inside the filter. As-at is a walk over structure, not a hope about metadata hygiene.
Is this the same as Git history?
Git (or any system-time history of the store) answers what the system recorded when. That is transaction time — essential for “what did the agent see at 9:17am?” It is not the same as “what rule bound the business on the lodgement date?” You need both clocks.
Do we need a full data warehouse for policies?
No. You need validity windows and succession edges on the soft-data graph you already claim is your knowledge base. The warehouse analogy is conceptual: SCD Type 2 discipline, not a mandatory star schema for PDFs.
Close
A knowledge base that only knows now will keep winning demos and failing audits. The fix is not a cleverer prompt. It is a first-class recognition that the answer depends on the date — and a substrate that can walk to the version whose validity window covers the day that mattered.
Build that once, and every past-tense question stops being a career risk dressed up as a chatbot reply. That is the bar for a defensible record.
Next step
Pick one policy chain you already version in practice (even if only by filename). Write the three-version table — windows and supersedes — and run one as-at question against a real past lodgement or incident date. If your current stack cannot return the historically correct version with its window attached, you do not have a defensible record yet. You have a knowledge base that is good at now.
More at leverageai.com.au — Scott Farrell, LeverageAI.
References
- [1]Wikipedia. “Slowly changing dimension.” en.wikipedia.org/wiki/Slowly_changing_dimension — “A slowly changing dimension (SCD) is a dimension that stores data which, while generally stable, may change over time, often in an unpredictable manner.”
- [2]Microsoft Fabric documentation. “Slowly changing dimension type 2.” learn.microsoft.com/en-us/fabric/data-factory/slowly-changing-dimension-type-two — Type 2 tracks changes by inserting new rows rather than overwriting, preserving historical state with effective dating.
- [3]Edge et al. “From Local to Global: A Graph RAG Approach to Query-Focused Summarization.” arxiv.org/abs/2404.16130 — Baseline RAG fails on questions requiring synthesis across many documents; similarity retrieval optimises local match, not structured relationships.
- [4]Microsoft Research. “GraphRAG: Unlocking LLM discovery on narrative private data.” microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/ — RAG retrieves chunks by similarity; typed relationships between entities are not native to the baseline substrate.
- [5]Wallat, Heuss, de Rijke & Anand. “Correctness is not Faithfulness in RAG Attributions.” arxiv.org/abs/2412.18004 — Up to 57% of studied RAG citation attributions lack faithfulness even when answers appear correct.
- [6]Martin Fowler. “Bitemporal History.” martinfowler.com/articles/bitemporal-history.html — “The terminology of valid time and transaction time comes from Snodgrass, and is also used in the SQL:2011 standard… we started to use actual/record instead.”
- [7]Kulkarni & Michels / SQL:2011 temporal features; PostgreSQL wiki “SQL2011Temporal.” wiki.postgresql.org/wiki/SQL2011Temporal — Application time (valid time) tracks history in the world; system time (transaction time) tracks history of the database; both together are bitemporal.
- [8]Dataversity (quoting Fowler). “Bitemporal Data Modeling: How to Learn from History.” dataversity.net/articles/bitemporal-data-modeling-learn-history — Payroll scenario: rate known as $100/day, later learned to have been $211/day effective Feb 15; what was the rate for Feb 25?
Discover more from Leverage AI for your business
Subscribe to get the latest posts sent to your email.
Previous Post
How to Read a YouTube Video