How to show me the source
Use this guide when a finding, a score, a draft sentence or an agent’s message carries a citation marker ([n])
and you want the page behind it, or when it carries none and you want one. You start at the claim; you end with
the evidence panel open on the passage, figure or table, or with a Source proposed for the program and accepted
by you. Reading needs program.documents.read (every program persona); gathering needs
program.documents.manage. Every surface here carries the status word
designed until the R4 gates pass.
An agent’s claim without a citation renders hollow and can only be recorded as an assumption. Nothing the
agent writes becomes an observation because it was accepted; accepting a proposed source records a
human-origin suggestion in your name.
Prerequisites
- A claim with a citation marker, in a thread, a finding, a hypothesis, a draft or a skill output; or a claim without one that you want sourced.
program.documents.managefor Gather, andevidence.agents.usefor Find the source (both held by the scientist, the lead and the owner).
Choose the marker
Choose [n] or Show me the source in the inline strip under the claim. The evidence panel opens docked on
the right (a full-width stacked view with a back control on a phone) and scrolls to the cited passage, with
?source=<id> in the address. The panel never covers the composer or the decision buttons; Escape closes it and
returns focus to the marker or strip control you opened it from. Fact (verified in
web/components/console/thread-view.tsx:96, 147, 384): the thread records the activating control when the panel
opens and passes it to the docked panel as returnFocusTo | Consequence: the focus return is built.
Read what the licence allows
The chip tells you what you are looking at (reference):
- “public domain” or “open access (CC BY)”: the passage in context, figures and tables from the article’s own files, a page viewer for the PDF, and an attribution line on every figure and table;
- “share-alike”: the same, with a share-alike line on derived tables;
- “open access, no derivatives”: the cited quote in context, the metadata and Open at publisher; no figure, no thumbnail, no PDF;
- “metadata and link”: title, authors, journal, year, DOI and Open at publisher, with a locator for the cited passage but never its text;
- “internal”: the notebook entry or SOP text, to program members only.
A flag “corrected” or “retracted” on the marker means the weekly watch found a notice; the flag links to it.
Gather the files of a source you already have
For an open-access article that shows no figures yet, choose Gather in the strip. The web app calls
POST /programs/{program_id}/documents/{document_id}/gather under program.documents.manage; the API answers
202 with the pending successor copy of the document and audits document.gather. The worker normalises the
full text, extracts figures, tables and supplementary files as assets, mirrors the files into the program’s
storage and re-chunks tables one row per line with the header and unit. Nothing you have already cited moves:
capture runs on the successor, and the panel switches to it when it is ready. Gather is offered only for
cc0, cc_by and cc_by_sa: publisher-copyright, non-commercial, no-derivatives, unknown and internal sources
skip capture, the strip says so instead of offering it, and the API refuses a direct call for any other code with
422 licence_locator_only and a third-party-suspected document with 422 third_party_content (contract 12.3,
2026-09-16). Fact (verified in api/app/services/documents_assets.py:441-446): request_gather refuses a
third-party-suspected document first, then any code outside the redistributable set, then a document that is not
ready | Consequence: both refusals are built and hold against direct calls.
Find a source for a claim that has none
Choose Find the source. A bounded reader run (search, then one fetch) looks for the passage and proposes one
Source inline under the claim. The sentence “best of N results; N-1 not shown” and the link to the search render
only from two fields the proposal carries, candidates_count (N, the number of results the search returned) and
search_href (the link to the search), both input fields of evidence.propose_source; when either is missing
the card reads “<n> searches run; the number of results was not recorded with this proposal”, counted from the
run’s search calls, and never derives N from anything else. Fact (verified in api/app/tools/catalogue.py:463,
api/app/tools/handlers.py:998-1000, api/app/services/interrupts.py:62 and
agent/trovensa_agent/fake_console.py:606): the tool accepts both fields, the handler checks
candidates_count, the interrupt payload carries them and the reader run writes them from its search | Consequence:
the fixed sentence is built and renders whenever a proposal carries the two fields; the honest line remains for a
proposal without them. Read the proposed passage first: Accept stays focusable but cannot act until you have
opened the evidence panel for it, and the line under it reads “Open the evidence panel for the proposed passage
before accepting.” (verified in web/components/console/approval-card.tsx:183, 461). Accepting registers the Source under evidence.sources.manage
and records a human-origin suggestion assertion linking the claim to it. Declining needs a reason.
What the panel shows for an agent’s own claim
When the claim was written by an agent a minute ago, the same strip applies. A cited claim opens on the passage
the agent read; an uncited one renders hollow, is tagged assumption, and offers Find the source. Skill
outputs show “Method: <name> (<guidance>, retrieved <date>), version n” and a “How this was computed”
section; each cited input opens in the panel like any other citation.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The panel shows only metadata and a link | the licence code is cc_by_nc, publisher_copyright or unknown | that is what the licence allows; Find the source may propose an open-access copy of the same work |
| Gather is missing | the source’s licence does not allow capture, or you lack program.documents.manage | for a quote-only or locator-only licence the strip says so in place of the control; without the key the control is not shown (verified in web/components/console/citation-marker.tsx:41-42, 56-60) |
| “image not available under this licence” on a figure card | the file could not be mirrored from the article’s open-access files | the caption stays; open the article at the publisher |
| Accept is disabled on a proposed source | you have not opened the panel on the proposed passage yet | choose the proposal’s marker, read it, then accept or decline with a reason |
| A claim shows a hollow marker | the agent gave no citation | it can only be an assumption; use Find the source or supply one yourself |
Related
Source: PRODUCT-CONTRACT.md sections 12.3, 12.7 and 12.10; PRODUCT-PLAN.md Part 9 sections 3.4 to 3.7; api/app/services/documents.py (the three rendering groups); api/app/auth/permissions.py (program.documents.read | manage, evidence.agents.use, evidence.sources.manage); decisions/0028-abstract-excerpt-and-manuscript-display.md; decisions/0034-inline-interaction-no-popups.md