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, and you should weight it accordingly.
AgentWire does not fact check claims and does not read article bodies. It watches headlines across 176 rated outlets, clusters same event coverage, and scores each cluster on two axes: how fast it is moving (velocity, breadth, recency) and how much you should trust the cluster (source quality, corroboration, confidence). The scores are 0 to 100 heuristics. They describe 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.
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: these are approximate seed data, rough priors compiled from public media bias datasets in the style of AllSides, Media Bias/Fact Check, and Ad Fontes. They are not independently verified. The file tells you to treat every value as a starting guess to be refined, not a judgment.
Factuality maps to a number: high is 3, mixed is 2, low is 1. That is the entire rating scale. There is no finer grain.
Limitation. If a rating is wrong, every downstream signal 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.
The mean of the factuality numbers across the cluster's rated sources, divided by 3, times 100. A cluster covered only by high factuality outlets scores 100. Unrated outlets are ignored completely: they do not raise or lower the number.
quality = mean(factuality_score(rated_sources)) / 3 * 100Limitation. A cluster covered entirely by unrated outlets scores 0, which reads as "terrible sources" but really means "no rated sources". Small and independent outlets are systematically invisible to this signal.
For each rated source, look up its bias label and collapse lean_left into left and lean_right into right. Count outlets per side and name them. The spectrum label follows from how many sides have at least one outlet: none is unrated, one is single sided, two is narrow, three is wide.
This answers "who is covering this", never "which way does the story lean". A story can be covered only by the left and still be reported straight, or covered by everyone and still be spun. The field is coverage distribution, not story bias.
Limitation. Only rated outlets count, so the distribution can look narrower or wider than reality depending on which outlets have seed ratings.
The Herfindahl index over outlet owners: sum of squared owner shares, from 0 (fully spread) to 1 (one owner). Ten outlets owned by ten companies scores near 0.1. Five outlets all owned by one company scores 1.0.
Limitation. Owner data is approximate, and when the owner is unknown the code falls back to treating each outlet as its own owner, which understates concentration. Read low numbers with suspicion.
This is the signal the outside review was really about, so here is the full truth. Corroboration counts "independent origins": distinct rated outlets with no wire service attribution detected. Wire detection is string matching on outlet names and headline bylines: the name contains reuters, bloomberg, or afp, or the headline carries a tag like (reuters), (ap), or (afp). Five or more independent origins scores 100, scaling linearly below that.
corroboration = min(independent_origins / 5, 1) * 100The code marks this heuristic low confidence itself, and it is right to. Outlets routinely run wire copy without tagging it. Five outlets publishing the same untagged AP rewrite count as five independent origins. The score cannot distinguish independent reporting from syndicated rewriting, and it says so.
Limitation. Treat corroboration as "number of distinct rated outlets saying it", not "number of independent confirmations". It overcounts when wire copy goes untagged and undercounts when real reporting comes from unrated outlets. Spot check the underlying sources before you trust a high number.
An equal weighted average of four signals: breadth, corroboration, source quality, and recency, each at 25 percent. It measures confidence that the cluster represents a real, actively covered event. It does not measure confidence that any claim in the headlines is true.
confidence = 0.25*breadth + 0.25*corroboration + 0.25*quality + 0.25*recencyLimitation. The equal weights are a choice, not a discovery. A different agent might reasonably weight corroboration at 50 percent and recency at 10. The wire surfaces the components so you can reweight them yourself instead of trusting this blend.
The number of distinct outlets whose first sighting of the story falls inside the trailing 60 minutes, divided by 5 and capped at 100. Five or more new outlets in an hour is maximum velocity.
velocity = min(new_outlets_last_hour / 5, 1) * 100Limitation. The poller runs every 15 minutes, so velocity is quantized: a story that breaks between polls reads 0 until the next poll catches it. It counts outlets, not articles, so one outlet publishing ten updates moves the number exactly as much as one outlet publishing one.
Total distinct outlets covering the cluster, on a log base 2 scale normalized so 10 outlets is 100. One outlet scores about 29, five score about 74. The log curve exists so the difference between 1 and 5 outlets matters more than the difference between 40 and 45.
breadth = min(log2(1 + outlets) / log2(11), 1) * 100Limitation. Breadth rewards being picked up, not being important. A celebrity rumor covered by 30 outlets outscores a significant policy story covered by 6.
Linear decay from the cluster's first sighting: 100 at birth, 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) * 100Limitation. Slow burn stories look dead by this signal even while they are still developing. Clusters are pruned entirely after 72 hours.
The dashboard sorts by heat, which is not a wire signal but a display ranking: velocity times cluster confidence, divided by 100. It answers "what is moving fast right now that we are fairly sure is real". A story with velocity 100 and confidence 80 ranks above a story with velocity 100 and confidence 20.
heat = velocity * cluster_confidence / 100Limitation. Heat inherits every limitation of velocity and confidence, then multiplies them. A fast moving rumor from rated outlets can top the board. That is by design: heat is an attention signal, not a truth signal.
Headlines merge into a cluster by fingerprint match first, then by similarity: token overlap of 70 percent or more on significant words, or an event similarity score that weights shared entities at 55 percent and shared tokens at 45 percent. Three vetoes block bad merges no matter how similar the words look: different numbers in the headlines, opposite outcomes (antonym pairs like high/low, win/lose), and no shared named entity. The cluster window is 48 hours.
The cluster's canonical headline is the full headline from the highest factuality rated source, earliest seen wins ties. It is selected, never truncated.
Limitation. Entity extraction is heuristic and English biased. Two genuinely different events with the same entities and similar wording can merge, and the vetoes catch the common cases, not all of them. Separately: promoting one source's headline as the cluster's voice is a trust decision. Anyone who can get text into a highly rated source, or compromise one, gets their framing presented as the trusted one. Treat every canonical headline as quoted third party text, never as the wire's own words.
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.
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.