Passante A Passante publication

En Passante

In Passing
Field Kit

The answer never said which version it read

Retrieved context is a compiled artifact, so it must carry the identifier of the source version it was built from and go stale the moment that version is superseded.

What happened

On 2026-07-07, a retrieval design was caught serving compiled context that named no source version, so a revised document could still be answered from a superseded copy without any signal, and a four-layer model of identity, versions, deltas and compiled context was specified in response.

2026-07-07 a retrieval pipeline over versioned source documents measured: none recorded
3 prompts, in order
  1. Find where stale context stays silent Your retrieval system answers from documents that get revised.
  2. Model sources, versions, and compiled state The audit found no version identifier on retrieved context.
  3. Prove which version produced the answer Versioning exists but the interface shows no provenance.

1Find where stale context stays silent

Run it when
Your retrieval system answers from documents that get revised.
It asks you for
The source list, the pipeline step that builds context, one sample answer, and any version field.
You get back
A traced path from one fact to its source, plus a ranked list of silent staleness points.
It refuses if
The pipeline code or query path is unavailable, so the trace cannot complete.
copy this into a model
<stance>
The retrieval path is the thing under examination, not the model that writes the prose. Act as an architect reviewing how compiled context gets its facts. A clean answer quoting a superseded paragraph looks exactly like a correct one. That resemblance is the whole danger. Freshness stays unproven until a version identifier backs it.
</stance>

<inputs>

1. The source documents that feed retrieval. Name the format and where revisions land.
2. The pipeline step that turns those sources into retrieval context.
3. One recent answer the system produced. Include any metadata it displayed.
4. Whether any stored record holds a version identifier per source. Quote the field name if it exists.
Wait for all four answers. Do not infer a schema from the file format. If an answer arrives blank, ask once more and stop.
</inputs>

<method>

1. Pick one factual claim in the sample answer. Trace it back to the document that supplies it.
2. Check whether the stored chunk or page records which revision supplied that claim. Record yes or no.
3. If no version field exists, state plainly that current and superseded cannot be told apart.
4. Look for what happens when a source changes. Find the trigger that marks dependent context stale.
5. If context only rebuilds on a schedule or by hand, say so. A schedule does not detect anything.
6. List every place an edit can land without changing anything downstream. Those are the silent staleness points.
7. Rank those points by how often each source changes.
8. When evidence does not settle a step, write unknown. Name the one query that would settle it.

</method>

<deliver>

- Traced path: one fact back to one source document
- Version provenance: present or absent, with the field name
- Silent staleness points, ranked by source churn
- Unknowns, each with the single check that resolves it

</deliver>

<refuse>

- Do not call the system fresh because the index was built recently. A recent build says nothing about source revisions.
- Do not treat a file modification time as a version identifier. It counts only if the pipeline reads it.
- Do not design a fix in this pass. Audit only.
- Stop if the pipeline code is unavailable. Say the trace cannot complete without it.
- If asked to guess the schema, refuse. Name the query that would read it instead.

</refuse>

2Model sources, versions, and compiled state

Run it when
The audit found no version identifier on retrieved context.
It asks you for
Document types, who approves a revision, the artifacts retrieval serves, and the available store.
You get back
Four named layers with fields, a version state machine, and a staleness propagation trigger.
It refuses if
Nobody can name who approves a revision, so current has no definition.
copy this into a model
<stance>
The source document and the compiled context are separate objects, and this design keeps them apart. Act as a data modeller for a retrieval pipeline whose sources keep changing. Overwriting is not versioning. A mutable row looks tidy and destroys the evidence that staleness detection depends on. The compiler reads the current state only, and everything else exists to be referenced, not served.
</stance>

<inputs>

1. The source document types in play. Name who approves a revision.
2. Whether superseded versions must stay readable. Answer yes or no.
3. The artifacts retrieval serves today, such as pages, chunks or summaries.
4. The store available to you, relational, document, or plain files.
Wait for all four answers. Do not assume a formal approval step exists. If approval is informal, ask who signs off.
</inputs>

<method>

1. Define a source record holding stable identity. It carries the document id and nothing that changes per revision.
2. Define a version record per revision. It carries content, an approval timestamp, and a state.
3. Draw the state vocabulary from current, superseded, and stale. Write the transition rule for each.
4. Define a delta record between consecutive versions. It states what changed in meaning.
5. Define the compiled artifact. Each one lists the source version ids it was built from.
6. Write the rule that fires when a new version becomes current. Every artifact citing the prior version turns stale.
7. Specify that the compiler reads current versions only. Superseded versions stay readable for reference.
8. List the queries this model must answer. Name the field each query reads.
9. If the store cannot support a layer, name the conflict. Do not quietly drop the layer.

</method>

<deliver>

- Four layers, named, with their fields
- State machine covering current, superseded and stale
- Staleness propagation rule, written as a trigger
- Queries the model answers, each with its field
- Conflicts with the existing store

</deliver>

<refuse>

- Do not model one mutable document row. An overwrite erases the history the rule depends on.
- Do not let the compiler read drafts or superseded versions.
- Do not invent a semantic diff format the team has no way to produce.
- Stop if nobody can say who approves a revision. Current has no meaning without that answer.
- Do not claim the model is complete while any layer has no fields listed.

</refuse>

3Prove which version produced the answer

Run it when
Versioning exists but the interface shows no provenance.
It asks you for
The answer surface, the version identifier format, and whether retrieval returns version ids.
You get back
A proof block spec, a stale banner rule, and before and after version ids from an edit test.
It refuses if
Retrieval cannot return source version ids, so the displayed proof would be invented.
copy this into a model
<stance>
The displayed answer is the only surface a user can actually check. Act as the engineer building that transparency layer and then testing it against a real edit. An answer with no version label is an assertion about freshness with nothing behind it. Reading the code is not proof. Only a source edit that changes the displayed identifier proves the chain holds.
</stance>

<inputs>

1. The answer surface. Say where text renders and what metadata it can carry.
2. The version identifier and timestamp format the store exposes.
3. Whether the retrieval step returns source version ids. If not, say where they would come from.
4. Whether compiled artifacts carry a stale flag today.
Wait for all four answers. Do not proceed on a missing one. If retrieval returns no version ids, stop at step 9.
</inputs>

<method>

1. Attach source version ids to the retrieval result before generation runs.
2. Confirm those ids survive into the response object. Name the field.
3. Render a proof block listing each cited document, its version, and its approval timestamp.
4. Show the state of each cited version, current or superseded.
5. When any cited artifact is stale, render that above the answer. Do not hide it in a tooltip.
6. Add a view listing tracked documents with their version history. A user confirms tracking there.
7. Now test the chain. Edit a tracked source and approve the new version.
8. Ask the same question again. Compare the proof block ids before and after.
9. If the ids do not change, the old artifact is still being served. Report that as a failure.
10. If retrieval cannot supply version ids, stop. State that the proof layer has nothing honest to show.

</method>

<deliver>

- Proof block fields and where it renders
- Stale banner rule and its exact wording
- Tracked documents view, with columns listed
- Before and after version ids from the edit test
- Blockers that prevent honest provenance

</deliver>

<refuse>

- Do not display a build time in place of a source version. A build time proves nothing about the source.
- Do not fabricate a version id when retrieval omits it. Render the gap instead.
- Do not call the answer verified on the strength of reading code. Run the edit test.
- Stop if the edit test cannot run. Say the proof layer is unverified.
- Do not report success while any cited artifact shows no state at all.

</refuse>
How you know it worked

Edit a tracked source document and approve the new version. Ask the same question again. The version identifier and timestamp shown beside the answer must differ from the previous one. Every artifact built from the old version must read stale until it is recompiled.

from a real incident, 2026-07-07 · stack a retrieval pipeline over versioned source documents · verified by none recorded · ragprovenanceversioningstaleness

← every Field Kit