Backfill: the word that hides four different jobs
In short
Backfill covers four different operations: a first historical load, a repair of a gap the live pipeline missed, a reprocess forced by a change to your own transforms, and a full rebuild. They share one shape — writing records for a period the pipeline has already passed — and nothing else. Only gap repair is routine, and the other three each break something distinct.
Key takeaways
- A backfill is any run writing records for a period the live pipeline has already passed.
- Gap repair is the only routine one. The other 3 are events with their own approvals.
- A transform change rewrites derived rows for records whose source never changed at all.
- Half a corpus in one representation and half in another is a broken index, not a slow migration.
- Every request needs a scope, a cut-off, and an answer on deletes inside the window.
A backfill is any run that writes records for a period the live pipeline has already passed. That one shape covers 4 operations people describe with the same word, differing in what triggers them, what they rewrite and what they can destroy. Agreeing which one is being asked for is most of the risk management.
The four operations the word is doing duty for
| Job | What triggers it | What it writes | What it can break |
|---|---|---|---|
| First historical load | A new source is connected and everything before today is missing | Every record in the retained history | Live throughput if unthrottled, and its own accuracy if old records are read under today's schema |
| Gap repair | A run failed, an export never arrived, a window was skipped | A bounded period, usually hours or days | Counts, if ingestion is not idempotent, since the window overlaps existing records |
| Transform-change reprocessing | The extractor, chunking rule or embedding model changed | Derived rows for records whose source never changed | Comparability: the corpus holds 2 representations and results across them differ in meaning |
| Full rebuild | Suspected drift, a corrupted index, a migration | Everything, from source to serving layer | Availability and trust, if the index is queryable while only partly populated |
Only the second row should ever be routine. Gaps happen weekly in any pipeline reading systems it does not control, and repairing them should be a button rather than a project. The other 3 are events: each needs a named owner, a written scope, and agreement on what the corpus looks like halfway through.
The two words missing from almost every backfill request
"Can you backfill the last 2 years" is not a specification. Five answers turn it into one, and the fourth is the one that gets skipped and later hurts.
- Which sources, named individually. A range across 6 feeds is 6 jobs with 6 retention limits, and the shortest one decides the real answer.
- The time boundaries, inclusive, against a named clock. A range in local time spanning a daylight-saving change is a 1-hour ambiguity somebody finds later.
- Which layers get rewritten: source records, chunks, embeddings, summaries. Each layer multiplies the cost and the time.
- What happens to deletions inside the window. A record created in March and deleted in June is resurrected by a naive backfill, which is worse than a missing one.
- The cut-off, and the rule for records after it, or the backfill and the live pipeline fight over the same rows.
Why reprocessing is the expensive one and rebuilding is the risky one
A transform-change reprocess touches every record whether or not anything upstream moved, so its size is the whole corpus every time. On an embedding-heavy corpus that is real money, and the unit is chunks not documents: a 40-page report can be 120 chunks, so 50,000 documents is millions of paid calls. It is slow too, meeting a rate limit no concurrency gets past.
A full rebuild costs less and risks more. Its purpose is to catch the drift incremental updates accumulate silently — the case in rebuilding the whole index against updating only what changed — and its danger is the window where the index is live and half-populated. In a stream it becomes a replay from a stored offset competing with live consumption, worth knowing before choosing between scheduled batches and a stream.
Two things to check before promising anyone a backfill
The first is whether the history is reachable. The extraction route decides it: a sanctioned export usually offers a full range, a file or email drop may retain only 90 days, and a route driving the source's interface often cannot reach history at all — the ranking in scheduled exports against driving the interface. A source that discarded the period is not a scheduling problem.
The second is whether reprocessing may overwrite. Where a record must be reproducible as it stood on a date — clinical, claims and regulated financial work, as in AI across healthcare operations — a reprocess that replaces the stored text destroys the evidence of what the system said at the time. Version the derived rows and keep the superseded ones addressable.
It is a useful question for a vendor or build partner: what happens when you change the chunking rule on 400,000 documents. A specific answer describes a parallel index, a switchover and a cost; a vague one about automatic reindexing describes a hope. That is the probe in how to test an AI-native claim, and it belongs in the scoping of any AI automation and agent engineering. The rest sits in data readiness and pipelines, part of the engineering library.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
What is a backfill in a data pipeline?
It is any run writing records for a period the live pipeline has already passed. The word covers 4 distinct operations: loading history when a source is first connected, repairing a gap left by a failed run, reprocessing derived data after your own transform changed, and rebuilding everything from source. They share a shape and differ in cost, risk and frequency.
What is the difference between a backfill and a reprocess?
A backfill usually means filling in source data never loaded; a reprocess means rewriting derived data from records you already hold, because the transform changed. It matters because a reprocess touches the whole corpus regardless of what changed upstream, and on an embedding-heavy system that is the most expensive routine operation there is.
What should a backfill request specify?
Named sources, inclusive time boundaries against a stated clock, which layers are rewritten, how deletions inside the window are treated, and a cut-off with a rule for the overlap. Deletions are the one people forget: a record created in March and deleted in June is resurrected by a naive backfill, and nobody looks for it afterwards.
Can a transform change be rolled out gradually across a corpus?
Only if you accept a degraded system for the whole rollout, or build into a parallel index and switch over. A partly reprocessed corpus holds 2 representations: with a new chunking rule, old and new passages compete in one result list on different terms; with a new embedding model the vectors sit in different spaces, so distances across the set mean nothing.
- backfill
- reprocessing
- definitions
- pipelines
The work behind this page
Builds from our portfolio that this page draws on.
AskVault
An AI internal knowledge-search platform that answers employee questions from your own docs — grounded in citations, with knowledge gaps surfaced and deflection tracked.
Productivity AIPriorPilot
An AI prior-authorization and denial-management platform that auto-assembles and submits auths, predicts denials before submission, and drafts the appeals to recover revenue.
Healthcare AIRead next
- Idempotent ingestion: running the same file twice must change nothingIdempotence is a property of the write path decided by the key. Path, arrival order and generated identifiers all look stable and fail on the second run.definition
- A freshness SLA is a promise about the worst case, not the averageFreshness is the age of the data behind an answer when it is served, held under a stated ceiling. Latency is how fast a run finishes, and the two can disagree by a week.definition
- A subset of the PDFs came through as gibberish and nobody lookedA chunk of mojibake embeds happily, indexes happily and retrieves for nothing. No stage errors, so the only defence is a screen that reads the text before it is indexed.diagnostic
- An upstream field changed and the pipeline carried on regardlessA renamed source field does not raise an error. It returns nothing, coalesces to an empty string, and quietly hollows out every record ingested since — until someone plots completeness by day.diagnostic
- Change data capture, applied to documents rather than rowsChange data capture makes downstream work proportional to what changed rather than to the size of the corpus. Documents make it hard, because they have no equivalent of a database write log.definition
- Lineage: tracing one answer back to the record and the run that produced itLineage is three identifiers carried on every derived record: which record it came from, which version of the transform produced it, and which run wrote it.definition
Working on something in this space?
Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.
Start the conversation