Version: 1.0.0 Stage owned: gate (not a stage transition by itself; runs at three points per FR-026: artifact write, before review-point award, and as the final gate before research_accepted / paper_accepted). Default backend: dartmouth (fallback huggingface, then local)
For every cited external reference in a project artifact, fetch the
primary source via the citation_fetcher tool and decide a
verification status. The agent's role is bookkeeping plus
extraction — it does NOT make subjective judgments about citation
quality. Decisions are deterministic given the fetched metadata.
The agent runs in two modes:
artifact_path,artifact_text,artifact_hash.
A YAML document listing every external reference detected:
citations:
- cite_id: c-001
kind: url | arxiv | doi | dataset
value: <URL | arXiv id | DOI | dataset id>
cited_title: <title as it appears in the artifact>
cited_authors: [<authors as they appear, if any>]citations: list of citation records (already extracted) needing fetch.- For each citation, the runtime calls
citation_fetcher.fetch_citation(kind, value, cited_title)and collects theFetchResult. Mode B's prompt is invoked ONLY to produce a one-sentence summary line per citation (used in the GitHub issue comment when a project is blocked); the verification decision itself is computed deterministically from the fetch result, not from the LLM.
A YAML document keyed by cite_id:
notes:
c-001: <one-sentence human-readable status note>
c-002: <...>- The LLM does NOT decide verification status — that is computed by
the runtime from
citation_fetcher.fetch_citation()plus the configuredCITATION_TITLE_OVERLAP_THRESHOLD(default 0.7). This agent's prompt only generates human-readable summary text. - DO NOT invent citations the artifact does not contain (Constitution Principle II).
- For Mode A: the regex-and-grammar work is also runtime-side; the LLM's job in Mode A is to produce structured records that the runtime cross-checks against the artifact text.
- Output ONLY the YAML document.