All writing

Build log

A URL in the fetch log is not a citation

My web-research harness gave every answer a green GROUNDED stamp if it had fetched the cited page. The stamp measured retrieval, not support — and the gap was enormous.

Key findings

  • The old harness stamped an answer GROUNDED whenever a cited URL appeared in its own fetch log — that proves the page was fetched, not that it supports the claim.
  • A strict re-audit put fabricated-citation rates at 89%, 87%, and 42% across the local-model conditions the stamp had been happy with.
  • Blank blind rubrics and missing supports-claim verdicts leave the whole run non-qualifying regardless of prose quality — it measures a failure mode, not a model ranking.

My benchmark harness stamped answers GROUNDED whenever a cited URL appeared in its own fetch log. A strict re-audit priced that stamp: up to 89% of the citations were fabricated.

The design was not exotic. Every "sources" footer under an AI answer makes two separate claims: this page was retrieved, and this page backs the sentence beside it. Most citation tooling I have seen, mine included, checks only the cheap one.

Fetched is not cited: the hollow GROUNDED stamp versus the supports-claim check One URL, two different claims OLD HARNESS Answer cites a URL URL appears in the harness's own fetch log? Stamped GROUNDED proves fetching, nothing more CORRECTED RULE Fetch-provenance check: page really retrieved? Supports-claim check: does the page back the claim? Only then: cited no verdict = non-qualifying Run 4: supports-claim verdicts exist for passes 1–2 only; blind rubrics blank; recorded as non-qualifying.
The old lane awards GROUNDED for fetch-log membership alone; the corrected lane requires a fetch-provenance check plus a supports-claim check before "cited" is earned. Diagram source: this page; maps 1:1 to the run-4 supports-claim verdict files (present for passes 1–2, absent for 3–4).

What was the harness actually checking?

The setting is run 4 of my model lab's web-research benchmark: a preregistered four-pass test, meaning the tasks, grading rules, and pass criteria were frozen and signed before any model ran. Local models answered research questions through a caller-controlled search/fetch loop. My harness, not the model, executed every search and every fetch, and it kept the full trail: exact queries, the result menus the model saw, each fetch attempt, and the text that actually came back.

That trail is real value. It gives every answer complete fetch provenance — a verifiable record of where each retrieved page came from. The mistake was what I did with it next. The grader took each URL a model cited and looked for it in the harness's own fetch log. If the URL was there, the answer got stamped GROUNDED (grounding is the trade's word for tying an answer back to real sources).

Read that check again. It proves the model cited pages from inside the loop rather than inventing URLs outright. It says nothing about whether any cited page supports the claim sitting next to it.

How bad was it under the green stamp?

Bad. A stricter re-audit of the same receipts counted fabricated citations — cited sources that do not genuinely support the claim they decorate. One local model hit 89% with its "thinking" mode on and 87% with thinking off. A second model came in at 42%. The stamp had been content with all of it.

Two boundaries on those numbers, both deliberate. They measure a failure mode, not a model ranking: I am not naming the models, and the run cannot rank anything anyway, for reasons below. And they are historical: the runtime version the receipts bind to is no longer the one installed, so nothing here describes any current setup.

The critical judgment lands on me, not the models. The check was lazy in the most seductive way: it verified the part that was cheap to verify and let the green label imply the rest.

What does a citation actually have to prove?

The lab's correction became a terminology rule, not a patch. URL presence proves fetch provenance only. Before an answer earns the word "cited," a separate supports-claim check must verify three more things: the page actually backs the adjacent claim, the source is authoritative, and the model read it correctly. A search snippet is a lead, not evidence. Two models agreeing does not help either — correlated models repeat the same error, so agreement is not proof.

The receipt folder shows the gap in its own filenames. Supports-claim verdict files exist for passes one and two; for passes three and four they were never produced. The human blind rubrics (score sheets a person fills in with model identities hidden) sit blank. So the run is recorded as non-qualifying, no matter how fluent the answers looked. Failing the zero-fabricated-evidence gate is decisive on its own; prose quality never gets a vote.

Why keep a run you can't use?

Because it measures one failure mode precisely, and that is worth keeping. The frozen receipts show that local models can drive a caller-run search/fetch loop, and they show exactly how hollow a self-awarded green label can be. This is the same shape I keep finding elsewhere: a green check sitting on top of missing records asserts less than its name implies, and nobody reads the fine print until it burns them.

What the run does not do: rank models, prove any local route reliable, or approve anything for production. The live-fetch runner itself is now execution-blocked, partly because a search query can carry private context out of the workspace. Any future attempt starts from an operator-curated, pre-fetched packet of public pages, with the supports-claim check wired in before the first answer is graded. The work sits in the same lab as my local-model cost accounting, and it feeds the standing question behind how I know my AI is right: what does this green label actually assert?

So: if your pipeline prints sources under its answers, go read the code that awards that badge. Mine checked membership in a log and called it grounding. What, exactly, does yours check?


Method & data

Method: the model lab's web-research benchmark records — the findings summary, the run-4 receipt index with its grade files and supports-claim verdicts, and the domain status ledger, generalized
Data: patterns and methods only; no names, dollar figures, addresses, case identifiers, or confidential content · Last checked: 2026-08-14

How this was made

AI-drafted, adversarially checked, human-directed. My AI assistant wrote this from the system's own records — the web-research findings summary, the run-4 receipt index (grade files, load checks, and the supports-claim verdict files that exist only for passes one and two), and the model-lab status ledger. A separate AI session then tried to break every claim against those records, and automated privacy and readability gates ran before publish. I direct this pipeline, own every boundary in it, and audit published pages on a rolling basis — if you find an error, tell me and it goes in the corrections log, dated, never silent.

I'm Ali — I run real life-and-work admin on AI agents, then check their work in the open. More at /about.

Published under my standards. Found an error? Tell me — corrections go in the corrections log, dated, never silent.

Cite this

@online{ali2026fetchednotcited,
  author = {Ali},
  title  = {A URL in the fetch log is not a citation},
  date   = {2026-08-14},
  url    = {https://alidoes.ai/fetched-is-not-cited/}
}

Caught something I got wrong? Send it directly. Confirmed corrections go in the corrections log.