- contents table: distinct texts stored once, zlib, SHA-256 keyed; wire copy dedups across outlets; measured 12.2MB -> 6.3MB on the real corpus - custody_log/custody_items hash chain over every ingest/reference batch; migration chains the backlog as genesis; heads served at /custody - tiltmeter audit: re-hash everything + walk chain; tamper tests go through a raw non-FK connection (the realistic attacker path) - outlets dimension table, verbatim byline capture, HTML-stripped summaries, URL canonicalization (tracking params removed, original kept if different) - transactional v1->v2 auto-migration preserving fingerprints verbatim: all published manifests stay verifiable; WAL mode - METHODOLOGY D11 + ADR-0004; glossary + plain-language docs updated
4.9 KiB
How tiltmeter works
This page explains the whole system in plain language. No math. Every claim here links to the technical spec, METHODOLOGY.md, which has the full details and sources. Words in italics are defined in the glossary.
The problem
Some news outlets lean left. Some lean right. Companies already sell ratings that say which is which. But those ratings come from panels of people voting behind closed doors. You cannot check their work. You just have to trust them.
tiltmeter is different. It is a measuring tool. Anyone can run it, check every step, and get the same numbers. If you think a rating is wrong, you can look at the exact news stories behind it and see for yourself.
The idea: a seating chart for the news
Picture every big news event of the month as a party. Not every outlet shows up to every party. Each outlet picks which stories it covers. Those picks are choices, and choices reveal leanings.
tiltmeter watches those choices. Outlets that keep covering the same kinds of stories get seated near each other on a map. Outlets that make very different picks sit far apart. That map is built from the outlets' own behavior. Nobody votes on it. (D3)
One question is left: which side of the map is "left" and which is "right"? We do not decide that by opinion either. We compare the language of each side of the map to speeches from Congress. One pole will sound more like Democrats. The other will sound more like Republicans. Party membership is a public fact, not a rating. So the whole map is anchored to public records. (D5)
The steps
- Collect. Several times a day, tiltmeter reads the public article feeds of 20 US outlets, from far left to far right. It saves each new article with a fingerprint — a code that proves the text has not been changed. (D9)
- Group. Articles about the same event are grouped into one story. Now we can see which outlets covered each story and which stayed silent.
- Map. The pattern of "covered it / skipped it" choices places each outlet on the seating chart.
- Label the sides. Speeches from Congress tell us which end of the chart is left and which is right.
- Score. Each outlet gets a number from −1 (left) to +1 (right), plus an honest error range. Lean can drift, so every score has a date. There are no permanent labels. (D6)
How we check ourselves
We compare our numbers to the big commercial ratings. If our order of outlets is close to theirs, the method works. If not, we fix the method — in public, with a written record of what changed and why. One thing worth knowing: the commercial raters often disagree with each other. So matching them exactly is not even the goal. (D7)
We also publish "what if" checks. What if we group stories a bit differently? What if we use a different time window? If small choices like these swing the scores a lot, you deserve to know. (D7)
What tiltmeter does not do
- It does not rate truth or quality. A score near zero does not mean "good". It means "picks stories like the middle of Congress talks". (D2)
- It does not use AI models to judge the news. Studies show those models have leans of their own. (D8)
- It does not let anyone — including us — nudge a rating by hand. There is no hand. (D1)
How we guard the data
Every article we save gets a fingerprint from its exact text. Each batch of
new articles also gets a line in a logbook. Each line is locked to the line
before it. If anyone changes or removes an old article — even us — the
fingerprints stop matching and the logbook breaks at that spot. One command,
tiltmeter audit, checks every fingerprint and every line. So the data set
does not ask for trust. It carries its own proof.
Check our work
Every published score links to an evidence page: the real headlines that drove it, the outlets that sat nearest, the error range, and the exact data batch used. And anyone can rerun the whole thing with three commands and get the same file, byte for byte. (D10)
That is the whole point. Do not trust us. Check.