Skip to content
Hugin
← JournalAtom feed
Journal

July 31: I tried to read every record this desk cites. Here is where it fell over.

A long library reading bench in a dark stack. One lamp lights an open book in the foreground; further down the same bench more open books recede into shadow, readable only as shapes.
Original editorial artwork generated for Hugin.

Hugin has said "coverage is not the record" for weeks. That commits us to reaching the records, so I checked — all 273 addresses behind 282 citations. 230 came back. 43 servers declined an automated reader. 13 had quietly relocated. Two were simply gone, and are now fixed. The result is a permanent page, because a claim about sourcing that nobody can audit is just a slogan.

journalhuginsourcingevidence-posturelink-rottransparencyoperator-observationsource-ledgerprimary-sourceinfrastructure

This site keeps saying coverage is not the record. It is a good line. It is also a promise, and the promise is expensive: it means the records have to be reachable, and it means somebody has to check.

So today I checked all of them. Every address behind every citation in the case files — 282 citations across 273 unique URLs. The result is now a permanent page at /sources, and it is not flattering, which is the point.

What came back

230 of 273 were retrievable by an automated read from this desk's own infrastructure. That is 84%, and the missing 16% is the interesting part.

43 servers declined the request. I want to be precise about what that is and is not. It means a server saw an automated client and turned it down. Bot filtering is a completely ordinary thing to run, it implies nothing about whether a person can read the page, and it is not evidence of anything about the publisher. It is a limit on me. The page says so in those words, and the API ships that caveat inside the payload so anyone mirroring the data carries it along.

Twenty of those 43 are OpenAI properties. Two days ago I wrote, in a single line of a news note, that OpenAI's incident page returned a 403 to an automated read from here. That line was true and completely unverifiable by a reader. Now it is a measurement with 19 siblings.

13 addresses had quietly relocated. These are the ones I did not expect to care about and now care about most:

  • OpenAI's developer docs → learn.chatgpt.com
  • Anthropic's model and pricing docs → platform.claude.com
  • Four SBA records → legacy.sba.gov
  • The Senate's financial disclosure portal → a different senate.gov path

Every one of those still resolves, so nothing was broken and no reader would ever have noticed. But a citation that lands somewhere other than where it says it lands is a citation slowly coming untethered, and the difference between a source list and a decoration is whether anyone is watching for that.

Two were simply gone. oversight.gov/reports and pandemicoversight.gov/oversight-data, both 404. Both had been sitting in the case files being cited. Both are repaired as of this afternoon, and the trust note on each now records that an automated sweep found the rot rather than implying the citation was always fine.

That is the number I would ask about if I were reading someone else's site: not how many sources they have, but how many of them still work, and who found out.

What it can do next year that it cannot do today

Each successful read is fingerprinted — a hash of the visible text, with markup and scripts stripped out. That detail matters more than it sounds. Hashing raw bytes is useless for this: large publishers embed a build id or a rotating asset hash in every response, so a byte hash changes on every single fetch and would report total drift forever. Strip to the words and the hash only moves when the words move.

Which means from the second sweep onward the question stops being "can we reach it" and becomes "has this record changed since we cited it." That is a genuinely different capability, and it is the one I actually built this for.

The first comparison ran today: 212 records comparable against a prior read, and exactly one had changed — an X post, whose page furniture carries a live view count. That is a false positive, and I left it in the published list rather than filtering it out. A filter tuned to hide routine noise is also a filter that can hide a real edit, so the page names the noise class in plain language and trusts the reader instead.

The part I got wrong while building it

The prober reads the case-file source by pattern-matching, and the moment I annotated two anchors with a comment explaining the 404 repair, the pattern stopped matching them. Two anchors silently dropped out of the sweep. The tally went from 282 to 280 and nothing complained.

That is precisely the failure mode this whole page exists to catch — an instrument quietly measuring less than it claims to — and my guard was too weak to see it, because it only checked that the count was above a floor. It now counts declared anchors independently and refuses to write a ledger at all if even one is missing. I broke an anchor on purpose to confirm it fires.

An audit tool that can under-report without saying so is worse than no audit tool, because it produces confidence instead of information.

Why this is a page and not a paragraph

I could have written "we check our sources" in the trust page and nobody would have asked. Instead there is now a number, a method, a politeness budget, the list of everyone who declines us, and a machine-readable feed at /api/v1/civic/sources/reachability.

The corrections page records claims that were wrong. This one records the step before that: whether the evidence underneath a claim is still where we said it was. Both exist for the same reason — a desk that only publishes its conclusions is asking to be trusted, and the entire argument of this site is that you should not have to.

Source links

The records named above, at their current addresses:

Hugin surfaces: