Your Context Pipeline Needs a Freshness SLA
Your agent answered a customer's billing question with last quarter's pricing, and the postmortem will blame the model. It shouldn't. The prompt was assembled correctly, the retrieval scored well, the model reasoned soundly over everything it was given — and everything it was given was true three days ago. Somewhere between the CRM export, the docs sync, and the vector index rebuild, "current state of the world" quietly became "state of the world as of Tuesday," and nothing in your stack was measuring the difference.
Data engineers solved this class of problem years ago. A downstream dashboard consuming ten upstream tables gets lineage, freshness checks, and an on-call rotation that pages when the nightly job slips. The context window your agent consumes is the same thing — a materialized view joined from docs, tickets, code, CRM, and memory — except nobody owns the join, nothing measures its staleness, and when it serves yesterday's truth the failure gets filed as "the model hallucinated."
The Context Window Is a Materialized View
Strip away the AI vocabulary and look at what context assembly actually does. At request time, an orchestrator gathers rows from several upstream systems — a chunk of documentation from a vector store, the customer's record from the CRM, recent tickets from the support system, a summary of prior conversation from a memory store — joins them into a single denormalized blob, and serves it to a consumer. That is a materialized view. It has sources, a refresh schedule (or the absence of one), and a consumer that trusts it completely.
The database analogy isn't decorative; it's diagnostic, because every failure mode of materialized views shows up in context pipelines:
- Stale reads. The view was refreshed before the source changed. Your docs were re-embedded Sunday night; the pricing page changed Monday morning.
- Inconsistent joins. Different sources reflect different moments in time. The CRM record says the customer upgraded; the usage data predates the upgrade. The agent reasons over a world state that never actually existed.
- Broken lineage. A source system reorganized its schema — someone restructured the docs site, renamed a Confluence space — and the view silently serves fragments that no longer resolve to anything.
- Nobody owns the refresh. The docs team owns the docs. The platform team owns the vector store. The agent team owns the prompt. The join in the middle — the thing the model actually reads — belongs to no one.
Databases handle these with refresh policies, snapshot isolation, and dependency tracking. Context pipelines mostly handle them with hope.
Staleness Is Structurally Invisible to Your Retriever
Here's what makes this worse than an ordinary data quality problem: the retrieval layer is blind to time. Semantic similarity does not decay when facts do. An embedding of a deprecated API reference scores exactly as high as the current one — often higher, because older docs have had more time to be linked, duplicated, and paraphrased into the corpus. A policy document from last quarter retrieves ahead of this quarter's update if its phrasing happens to sit closer to the query.
This means staleness doesn't degrade your system gracefully. It fails silently and confidently. There is no error log entry, no retrieval miss, no confidence drop. The agent that closed forty support tickets with wrong answers on day one — a real incident pattern, caused by an index that hadn't refreshed in three days after the source docs were reorganized — was reasoning perfectly over broken context. Every observability tool in the stack reported green.
And the problem compounds with scale. A knowledge base of a thousand documents can maintain sub-hour freshness with naive full rebuilds. At a hundred thousand documents, the same architecture is running half-day-stale. At a million, rebuilds take long enough that multi-day staleness is the steady state. The architecture that worked in the pilot is the one quietly rotting in production.
The uncomfortable reframe: a meaningful fraction of what gets triaged as "hallucination" is nothing of the sort. The model faithfully reported what the context store told it. The context store served yesterday's truth. Blaming the model for that is like blaming the dashboard for the ETL job that didn't run.
Steal the Data Engineering Playbook
None of this requires inventing new discipline. Analytics teams have spent a decade building exactly the machinery context pipelines are missing. Four pieces transfer directly.
Lineage: know what feeds the window
For every class of context your assembler can inject, you should be able to answer: which source system does this come from, when was it last synced, and what transformation sits in between? If the agent quoted a price, you should be able to trace that token back through the chunk, the embedding job, and the source page — with timestamps at each hop. Most teams can't do this today, which is why context postmortems take days: the root cause is rarely one broken thing, but a confluence of a slightly stale index, a reorganized source, and a prompt that never anticipated either.
- https://www.conduktor.io/glossary/data-freshness-monitoring-sla-management
- https://www.getdbt.com/blog/data-slas-best-practices
- https://www.acceldata.io/blog/how-data-contracts-guarantee-pipeline-reliability-data-quality-slas
- https://zylos.ai/research/2026-03-17-dynamic-context-assembly-projection-llm-agent-runtimes
- https://streamkap.com/resources-and-guides/why-ai-agents-wrong-answers
- https://ragaboutit.com/the-knowledge-decay-problem-how-to-build-rag-systems-that-stay-fresh-at-scale/
- https://redis.io/blog/context-orchestration/
- https://tacnode.io/post/from-context-engineering-to-context-infrastructure
