RADICAL HONESTY

HOW THE SCORES WORK

Every signal on the wire, how it is computed in the actual code, and where it can mislead you. Nothing here is verified truth. It is coverage dynamics measured with rough heuristics. Weight it accordingly.

00 // The one paragraph version

NewsLiar does not fact check claims and does not read article bodies. It watches headlines from its feeds, checks each headline's outlet against a file of 176 rated outlets, clusters same event coverage, and scores each cluster on momentum: breadth (how many distinct outlets are covering it), velocity (how many picked it up in the last hour), and recency (how fresh it is). Next to the score it shows trust context: the political spread of the rated outlets, their average factuality, and how concentrated their ownership is. The score runs 0 to 1. It describes coverage, not reality.

Limitation. A confident looking number with an opaque method is worse than no number. That criticism was fair, which is why this page exists.

01 // Where the outlet ratings come from

Every outlet in the rating file carries three fields: a bias label (left, lean_left, center, lean_right, right), a factuality label (high, mixed, low), and an owner (the ultimate parent company where known). The file's own header says it plainly: approximate seed data, rough priors compiled from public media bias datasets in the style of AllSides, Media Bias/Fact Check, and Ad Fontes. Not independently verified. Treat every value as a starting guess to be refined, not a judgment.

Factuality maps to a number for averaging: high is 3, mixed is 2, low is 1. That is the entire scale. There is no finer grain.

Limitation. If a rating is wrong, every downstream number that touches it is wrong in the same direction. Ratings improve only when someone curates them, and right now that curation is the seed file.

02 // What the wire watches

Six pollers, headlines and links only. Google News RSS (top stories plus topic feeds), BBC RSS feeds, Hacker News top stories, the GDELT DOC API (eight topics: economy, technology, politics, climate, health, sports, cryptocurrency, artificial intelligence; trailing 24 hours, English only), and Polymarket (top active events by volume, matched to clusters locally as a rough "money thinks this matters" signal). No poller opens an article. Nothing on this page requires reading a single article body.

Limitation. If a story breaks somewhere none of these feeds watch, the wire is blind to it until a watched feed picks it up. Coverage of a story means coverage by these feeds, not coverage by the world.

03 // How clusters form

A headline joins a cluster by exact fingerprint match first (normalized headline plus extracted entities), otherwise by token overlap of 70 percent or more on significant words, checked against clusters from the last 48 hours. The cluster keeps the first headline it ever saw. It is never rewritten, and the wire never picks a "best" source's version. Clusters older than 72 hours are pruned.

There is no summary writer. The summary field is the headline.

Limitation. Entity extraction is heuristic and English biased. Two different events with similar wording and the same entities can merge, and a story that resurfaces after the 48 hour window starts over as a new cluster.

04 // Breadth

The number of distinct outlets in the cluster. Raw count, no opinions. Inside the momentum score it runs through a log base 2 curve, so the jump from 1 to 5 outlets matters more than the jump from 40 to 45. One outlet scores about 0.29, five about 0.74, ten hits 1.0.

breadth_n = min(log2(1 + breadth) / log2(11), 1)

Limitation. Breadth rewards being picked up, not being important. A celebrity rumor on 30 outlets outscores a significant policy story on 6.

05 // Velocity

The number of distinct outlets whose first sighting of the story falls inside the trailing 60 minutes. Inside the momentum score it is divided by 5 and capped: five or more new outlets in an hour maxes the component.

velocity_n = min(velocity / 5, 1)

Limitation. The number updates each poll cycle, so a story that breaks between polls reads 0 until the next cycle catches it. It counts outlets, not articles: one outlet publishing ten updates moves it exactly as much as one outlet publishing one.

06 // Recency

Linear decay from the cluster's first sighting. It reads 1 at birth and 0 at 24 hours old. Age is measured from when the wire first saw the story, not when the event happened.

recency = max(0, 1 - age_hours / 24)

Limitation. Slow burn stories look dead by this number while they are still developing.

07 // Legs, the ranking

The wire sorts by legs, a 0 to 1 momentum composite rounded to three decimals. It is pure momentum: the trust fields stay separate so you can combine momentum and trust however you want instead of trusting one blend.

legs = 0.45 * breadth_n + 0.35 * velocity_n + 0.20 * recency

Limitation. The weights are a choice, not a discovery. And the caps are easy to hit: a big story maxes breadth and velocity fast, so the top of the board piles up near the ceiling with no separation. That saturation is a known weakness, not a verdict on the stories.

08 // Trust: bias, factuality, ownership

Three context fields ride next to every cluster, computed from the rated outlets only.

Bias is a raw count across five buckets: left, lean_left, center, lean_right, right. The wire does not collapse them and does not label the spectrum. It answers "who is covering this", never "which way does the story lean".

Factuality is the mean of the 3 / 2 / 1 factuality numbers across rated sources, snapped to the nearest label: high, mixed, or low. With no rated sources it reads "unknown".

Ownership concentration is the Herfindahl index over outlet owners: the sum of squared owner shares, 0 for fully spread, 1 for a single owner, rounded to three decimals. Two more counts come along, rated_sources and total_sources, so you can see how much of the cluster the ratings actually cover.

Limitation. Unrated outlets are invisible to this math. A cluster carried entirely by small independent outlets gets an "unknown" factuality and a bias spread of zeros, which reads as no signal and really means no rated signal. When the owner is unknown the code treats each outlet as its own owner, which understates concentration. Read low numbers with suspicion.

09 // What the wire does not do

It does not read article bodies, verify claims, interview sources, or correct the record. It does not know whether a story is true. It knows how many outlets are carrying it, how fast that is changing, how the covering outlets rate on rough prior scales, and whether the coverage spans the political spectrum. That is the whole product. Anything beyond that is your agent's job, using the source links the wire hands it.

IF A SCORE LOOKS TOO CONFIDENT, IT PROBABLY IS

These signals are heuristics built from seed priors and string matching, not measurements from verified instruments. Use them to triage attention, then open the sources. The wire gives you the links for exactly that reason.