Chapter 143 · Interface and adoption
Showing sources so an answer can be checked
A citation nobody opens has done nothing. The four-second rule, what belongs in the expanded panel, the freshness stamp that changes behaviour, and how to present a source the reader cannot open.
7 min read
Chapter 62 built citations and measured that expanding them in place took click-through from 4% to 31%. This chapter is the rest of that design, because a citation is the only part of the interface whose job is to let someone doubt the answer.
The standard to hold it to: a reader must be able to verify a claim in under four seconds. Past that, nobody does, and an unverified answer from a system that can be wrong is just a confident sentence.
The four-second budget
// Where four seconds goes, measured by watching people do it.
const BUDGET = {
noticeTheCitation: 0.3,
decideToCheck: 0.5,
openIt: 0.2, // ⚠️ a new tab costs 2-4 s here, and the budget is gone
findTheClaim: 1.5, // a highlighted span costs 0.3; a 40-page PDF costs forever
confirm: 1.0,
}Two line items decide everything. Opening in a new tab is a context switch that blows the budget by itself, and finding the claim inside the source is where chapter 62's span-level extraction pays for itself.
// Inline, expanding in place. No navigation, no modal — a modal covers
// the answer, and the reader is comparing the two.
<Claim>
Damaged goods may be returned within 30 days of delivery
<CitationChip n={1} onClick={toggle} />
</Claim>
{expanded && <SourcePanel citation={1} />}What goes in the panel
// Seven elements, in this order. The order is the design: the reader is
// establishing provenance, then checking, then deciding whether to act.
<SourcePanel>
<Breadcrumb>Returns and Credits Policy › Returns › Damaged goods</Breadcrumb>
<Freshness updatedAt="2026-09-14" />
<Excerpt highlight={{ start, end }}>
…Damaged goods may be returned within 30 days of delivery, provided…
</Excerpt>
<Warning kind="ocr" /> {/* only when applicable */}
<DeepLink href={sourceHref}>Open in the document store ›</DeepLink>
<Scope>Visible to: Sales, Operations</Scope>
<Report onClick={flag}>This doesn't support the claim</Report>
</SourcePanel>// Two that are easy to omit and earn their place.
// Scope. Telling the reader who else can see this source answers the
// question they ask before forwarding an answer to a customer, and it
// prevented a measurable class of mistake: forwarding internal margin
// commentary that happened to be in a cited passage.
// Report. Chapter 145's feedback loop needs a path at the exact moment
// doubt occurs. A thumbs-down on the whole answer cannot say WHICH
// claim was unsupported; this can.The freshness stamp
// A date is not enough. The useful signal is the date relative to how
// often this kind of document changes — chapter 19's per-source
// freshness expectations, surfaced.
<Freshness updatedAt="2024-03-02" expectedCadence="quarterly" />
// renders: "Last updated 2 Mar 2024 — this policy is usually revised
// quarterly, so this may be out of date."Atlas's measurement of this one component:
| Plain date | Date with cadence | |
|---|---|---|
| Users who opened the source | 31% | 33% |
| Users who flagged a stale document | 0.4% | 4.1% |
| Stale documents found per month | 2 | 19 |
Ten times the stale-document reports, from one sentence of context. The users always knew the price list should be current; what they could not know was whether this one was recent by its own standards. Chapter 110 found 4.8% of answers grounded-and-wrong because the corpus was stale — this is the interface finding them.
Sources the reader cannot open
// A common case and badly handled by default: the citation resolves to
// a document the reader may see IN THIS CONTEXT but cannot open in the
// source system, because the source system's permissions are coarser.// Three honest options, and Atlas picked the third.
// a. Hide the citation -> the answer becomes uncheckable
// b. Show a broken link -> the reader blames the system
// c. Show the passage, no link, and say why
<SourcePanel>
<Excerpt>…</Excerpt>
<Note>This passage is from the 2026 supply agreement. You can read the
relevant section here; opening the full contract needs access from
Legal.</Note>
</SourcePanel>The passage is already in the answer's context, so showing it discloses nothing new. Naming who grants access turns a dead end into a next step, which is the same principle chapter 111 measured for refusals: naming a next step halved the rephrase rate.
Multiple sources for one claim
// When three chunks support a claim, showing three citation chips is
// noise. Collapse, and order by what helps verification.
const ordered = chunks.sort((a, b) =>
score(b) - score(a) || // best supporting passage first
b.updatedAt - a.updatedAt // then most recent
)
// Render [1] with "+2 more", expanding to all three.// ⚠️ With one exception: if the sources DISAGREE, never collapse.
// Two documents giving different payment terms is the single most
// valuable thing the system can surface, and hiding it behind "+1 more"
// buries it.
if (sourcesConflict(chunks)) return <ConflictPanel chunks={chunks} />Atlas surfaces conflicts explicitly — "two documents give different answers; the 2026 agreement supersedes the 2024 one" — and that panel has been the origin of eleven document cleanups in a year. The system's most useful output turned out to be noticing that the company disagrees with itself.
When there are no sources
// An answer with no citations is either a refusal, a clarification, or
// a bug. The interface should make the third impossible to mistake for
// the first two.
{answer.citations.length === 0 && answer.kind === 'answer' && (
<Warning tone="high">
This answer is not based on a document from your company's files.
Treat it as a suggestion rather than a policy.
</Warning>
)}That banner fires on 2.6% of answers — chapter 110's ungrounded-and-correct bucket, answers coming from the model's training rather than the corpus. Marking them is the difference between a useful general answer and an unmarked one that will eventually be wrong about this specific company.
Key points
- A reader must be able to verify a claim in under four seconds. Past that nobody does.
- Opening a new tab costs 2-4 seconds and consumes the whole budget. Expand in place, and never in a modal that covers the answer.
- The panel carries seven elements: breadcrumb, freshness, highlighted excerpt, any warning, a deep link, the scope, and a report control.
- Show who else can see the source. It answers the question people ask before forwarding an answer to a customer.
- Put a report control at the citation. A thumbs-down on the answer cannot say which claim was unsupported.
- A date alone is not a freshness signal. Adding the expected revision cadence took stale-document reports from 2 a month to 19.
- For a source the reader cannot open, show the passage and name who grants access. It discloses nothing new and turns a dead end into a next step.
- Collapse multiple supporting sources, except when they disagree. Atlas's conflict panel has driven eleven document cleanups in a year.
- Mark uncited answers explicitly. 2.6% of answers come from training rather than the corpus, and unmarked they will eventually be wrong about this company.
Next: designing the failure state — the screens that decide whether people come back.