{
  "question": "How do I prove an AI-generated report or summary cited sources that actually said what it claims?",
  "slug": "how-to-prove-an-ai-generated-report-cited-sources-that-actually-said-what-it-claims",
  "url": "https://www.rightshold.com/answers/how-to-prove-an-ai-generated-report-cited-sources-that-actually-said-what-it-claims",
  "short_answer": "Capture the evidence at the moment the report is written, because the sources won't wait. For every claim, keep the exact bytes of the source the model was given (not just its URL), a SHA-256 of those bytes, the quoted passage and where it sits in the source, and a support verdict for the claim: supported, partly supported or not supported, and who or what judged it. Seal that grounding manifest together with the report's hash, so anyone holding the report and the saved sources can later recompute the hashes and re-read each passage next to its claim. This matters because citations from generative systems often don't support what they're attached to: in Stanford's 2023 audit of four generative search engines, only 51.5% of generated sentences were fully supported by their citations and only 74.5% of citations supported their sentence. And a link checked later may show something else: Pew Research found 38% of webpages that existed in 2013 were no longer accessible a decade later. On Rightshold, record_ai_run signs the report's hash with your grounding manifest's hash (as params) onto a public ledger, and verify_ai_run lets a reader check the report against the receipt for free.",
  "checklist": [
    "Save each source exactly as the model received it: the retrieved text, PDF or HTML bytes, with the URL, the retrieval time and the HTTP status. For web pages, a WARC capture (the web archive format standardized as ISO 28500) keeps the response and its headers together.",
    "Hash each saved source with SHA-256 and keep the bytes somewhere durable. A hash with no copy of the source proves nothing to a reader who can't get the original.",
    "Split the report into claims (a sentence is the usual unit) and map each claim to the source and passage that backs it: source hash, quoted text, and character offsets or page numbers.",
    "Check each quote mechanically: the quoted passage must appear in the saved source byte for byte. If you use Anthropic's citations feature, its cited_text is extracted from your documents, so the pointer is valid by construction. That still only shows the passage exists, not that it supports the claim.",
    "Judge support per claim, separately from existence: supported, partly supported or not supported. Record who judged it (a named reviewer role, or the checker model and its version) and send unsupported claims back before the report goes out.",
    "Put the claim map, source hashes, verdicts and judge into one grounding manifest, serialize it canonically (sorted keys) and hash it.",
    "Seal the report hash and the manifest hash together at release time with an independent timestamp, so a manifest written after a complaint can't pass for one written before.",
    "Write down what the record can't show: that the sources themselves are true, that a claim with no citation was checked, or that the judge was right."
  ],
  "sections": [
    {
      "heading": "Why a link isn't evidence",
      "points": [
        "A URL points at whatever the server returns today. Pew Research Center's May 2024 study of Common Crawl samples found that a quarter of pages that existed between 2013 and 2023 were gone by October 2023, and 38% of pages from 2013. Pew counted only pages that no longer exist; pages whose content changed at the same address weren't measured, and those are the harder case, because the link still works and shows a different text.",
        "Memento (RFC 7089) is the web's standard way to ask an archive for a page as it was at a given time, and it helps when a public archive happened to capture the page. It can't help with sources it never saw, such as search results, paywalled pages, internal documents or the chunks your retrieval step pulled from a vector store. For those, your own saved copy is the only record of what the model was shown."
      ]
    },
    {
      "heading": "What to check per claim, and what each check proves",
      "points": [
        "Existence: the cited source is one the model actually received in this run. Prove it by matching the citation to a saved source hash, not by re-fetching the URL.",
        "Quote accuracy: the passage quoted or pointed to is really in that source. This is a string match against the saved bytes and can be fully automated.",
        "Support: the passage backs the claim it's attached to. This is the part that fails most. Liu, Zhang and Liang define citation recall (share of statements fully supported by their citations) and citation precision (share of citations that support their statement); their human audit of Bing Chat, NeevaAI, perplexity.ai and YouChat found averages of 51.5% and 74.5%, and responses rated more useful tended to have less accurate citations. Support needs a reader, human or model, and the record should say which."
      ]
    },
    {
      "heading": "Sealing the grounding record with the run",
      "points": [
        "The report hash ties the record to one exact text: change a word and it no longer matches. The manifest hash ties that text to the specific sources, passages and verdicts you had at release. Sealing both in one signed, timestamped receipt shows the check existed before anyone disputed the report.",
        "With record_ai_run, put the manifest's SHA-256 and summary counts in params. Rightshold stores params as params_sha256 over sorted-key canonical JSON, so keep the exact params object; a reader recomputes its hash and compares it with the receipt.",
        "Send the report as output and add a contains check listing every citation marker you expect (for example [1] to [14]). Rightshold signs whether each marker appeared in the text. It doesn't open the sources or judge support; those results are yours, sealed as you sent them."
      ]
    }
  ],
  "checks": [],
  "ask_rightshold": {
    "start": "https://www.rightshold.com/start?ref=seo",
    "mcp_endpoint": "https://www.rightshold.com/mcp",
    "ask": "Seal this AI-written market summary with its grounding check: 14 citations, 13 supported and 1 partly supported, with the hash of my grounding manifest (claim map, source hashes, verdicts), so a client can check later what was cited and checked before it went out.",
    "mcp_call": {
      "tool": "record_ai_run",
      "arguments": {
        "model": "claude-sonnet-4-5-20250929",
        "provider": "anthropic",
        "prompt_sha256": "<sha256 of the exact request, including the retrieved source text>",
        "output": "<the final summary text with its [1]..[14] markers>",
        "params": {
          "grounding_manifest_sha256": "<sha256 of canonical(grounding manifest)>",
          "sources": 9,
          "citations": 14,
          "supported": 13,
          "partly_supported": 1,
          "unsupported": 0,
          "judge": "analyst review + quote string match"
        },
        "checks": [
          {
            "type": "contains",
            "all": [
              "[1]",
              "[2]",
              "[3]",
              "[4]",
              "[5]",
              "[6]",
              "[7]",
              "[8]",
              "[9]",
              "[10]",
              "[11]",
              "[12]",
              "[13]",
              "[14]"
            ]
          }
        ],
        "ran_at": "2026-11-07T22:00:00Z"
      }
    },
    "also": [
      "Needs an API key. Output text is hashed on arrival and never stored; only its SHA-256 and the check results go into the signed receipt, which is written to Rightshold's append-only ledger and anchored to Bitcoin through OpenTimestamps.",
      "verify_ai_run is free and needs no key: a client sends the receipt id and the summary text to confirm it's the version that was recorded, then hashes the canonical params object you share to match params_sha256, and hashes the manifest you share to match grounding_manifest_sha256 inside it.",
      "In recorded mode the receipt is marked reported_by caller: it proves what you recorded and when, not that your verdicts are right. Keep source copies and the manifest yourself; Rightshold doesn't hold them."
    ],
    "scope": "Rightshold doesn't fetch, store or read your sources, and doesn't judge whether a passage supports a claim. It signs and timestamps the hashes, parameters and deterministic text checks you send, and lets anyone verify them later. Not legal advice."
  },
  "sources": [
    {
      "title": "Liu, Zhang and Liang: Evaluating Verifiability in Generative Search Engines (arXiv 2304.09848)",
      "url": "https://arxiv.org/abs/2304.09848"
    },
    {
      "title": "Pew Research Center: When Online Content Disappears (May 17, 2024)",
      "url": "https://www.pewresearch.org/data-labs/2024/05/17/when-online-content-disappears/"
    },
    {
      "title": "RFC 7089: HTTP Framework for Time-Based Access to Resource States (Memento)",
      "url": "https://www.rfc-editor.org/rfc/rfc7089"
    },
    {
      "title": "Library of Congress: WARC, Web ARChive file format (ISO 28500)",
      "url": "https://www.loc.gov/preservation/digital/formats/fdd/fdd000236.shtml"
    },
    {
      "title": "Anthropic docs: Citations (cited_text and citation locations)",
      "url": "https://platform.claude.com/docs/en/build-with-claude/citations"
    },
    {
      "title": "RFC 8785: JSON Canonicalization Scheme (JCS)",
      "url": "https://www.rfc-editor.org/rfc/rfc8785"
    },
    {
      "title": "Verified AI Runs on Rightshold",
      "url": "https://www.rightshold.com/verified-ai-runs"
    }
  ],
  "related": [
    {
      "title": "How to check AI-generated citations for hallucinations",
      "url": "https://www.rightshold.com/answers/how-to-check-ai-generated-citations-for-hallucinations"
    },
    {
      "title": "How to prove which model version, prompt and settings produced an AI output",
      "url": "https://www.rightshold.com/answers/how-to-prove-which-model-version-prompt-and-settings-produced-an-ai-output"
    },
    {
      "title": "How to check that an AI agent's delivered file matches the output hash recorded for its run",
      "url": "https://www.rightshold.com/answers/how-to-check-that-an-ai-agents-delivered-file-matches-the-output-hash-recorded-for-its-run"
    },
    {
      "title": "How to prove what an AI model said at a specific time",
      "url": "https://www.rightshold.com/answers/how-to-prove-what-an-ai-model-said-at-a-specific-time"
    }
  ],
  "computed_from": "Curated guidance; license verdicts computed from Rightshold's license profiles at render time. Not legal advice.",
  "updated": "2026-11-07"
}