Skip to content
Read • Question • ConnectAnthony’s notes & researchReturn with a new question
Anthony’s NotesA personal field guide
From the notebook

Audit Log

Adam H. Johnson (Pluto Press, 2026)

Fact-Check Audit — How to Sell a Genocide

Internal-consistency checks on the book’s own figures, plus the discovery that the published CSVs cannot be the count basis.

Independent verification of the quantitative claims in Adam H. Johnson, How to Sell a Genocide: The Media’s Complicity in the Destruction of Gaza (Pluto Press, 2026). 257 pages, 476 endnotes.

Scope of this pass: figure-linked numerical claims only. Citation integrity and claim-source fidelity are separate workstreams.

Data sources located

SourceLocationCoversStatus
Nation study (TV)github.com/nationmag/Gaza-Media-BiasCNN, MSNBC11 CSVs, downloaded
Intercept study (print)github.com/theintercept/gaza-media-biasNYT, WaPo, LAT3 CSVs, downloaded, basic set only
Book’s own year-long surveyNot published anywhere8 print outlets, Oct 2023 – Oct 2024Not located

Neither repository is mentioned in the book. The book contains no data availability statement, no methodology appendix, and four URL-like strings in 257 pages, none of them a data link.

Full Intercept dataset requested from Othman Ali, 2026-08-01. Pending.

Findings requiring no external data

These are internal to the book and independently checkable by anyone holding a copy.

A. Three mutually inconsistent totals in one sentence (Ch. 2, p. 27)

The passage gives per-term counts for print media over the 100-day survey:

TermIsraeli victimsPalestinian victims
massacre3440
barbaric140
savage160
slaughter1201
Sum4941

The component figures sum correctly to 494 on the Israeli side. The sentence then states the total as “494 to 0, or a ratio of 531-to-3.”

Three problems in a single clause:

  1. The Palestinian total is given as 0, but the same sentence states slaughter was used once for Palestinians. The components sum to 1, not 0.
  2. 531 does not match 494 and is not derivable from any stated component.
  3. The Palestinian figure of 3 matches neither 0 nor 1.

Most likely a stale figure surviving from an earlier draft with different term counts. The direction of the error is not obviously self-serving — 531:3 is a smaller ratio than 494:0 — but it is an unambiguous defect.

B. Figure 2.1b caption contradicts its own body text

The caption reads “during the first 100 days of the conflict on TV.” The body text two paragraphs later says “Narrowing our scope to the first 30 days of each conflict for cable news,” and the underlying Nation study explicitly uses a 30-day window for the emotive-terms finding. The figure’s numbers match the Nation study’s 30-day counts exactly. The caption is wrong.

This matters beyond typography: Figure 2.1a (print) genuinely is 100 days, and the two figures sit on facing pages inviting direct comparison. As captioned, they imply a like-for-like comparison across different survey windows.

C. Figure 2.1a contradicts the text on Palestinian “slaughter”

The chart shows zero for Palestinian victims across all seven outlets for both terms. The body text says “slaughter” was used “only once for Palestinians.” One of the two is wrong.

D. Verified as internally consistent

Per-outlet figures in Figure 2.1a sum correctly to the totals stated in the text:

  • massacre, Israeli victims: 80 + 43 + 12 + 33 + 124 + 50 + 2 = 344
  • slaughter, Israeli victims: 18 + 14 + 3 + 5 + 53 + 25 + 2 = 120

Figure 2.1b’s TV counts match the source Nation study exactly (MSNBC massacre 177, barbaric 46, savage 23, slaughter 102; CNN 225, 56, 13, 79). The book drops “brutal,” which the Nation study included as a fifth term.

Methodological discovery — the CSVs are not the count basis

This changes the verification method

The published Nation CSVs cannot reproduce the published counts, and it is not because the counts are wrong. The CSVs are partial exports, not the data the numbers were computed from.

The emotive-words file covers 14 of the 30 survey days — every row falls between 2023-10-07 and 2023-10-20, with the file stopping dead mid-window. 663 usable rows.

Within that partial window, term counts fall well short of the published figures, and non-uniformly:

TermCSV, 14 daysPublished, 30 days
massacre (MSNBC)130177
slaughter (MSNBC)65102
barbaric (MSNBC)446
savage (MSNBC)323

The massacre and slaughter shortfalls are consistent with a truncated window. The barbaric and savage shortfalls are not — those terms clustered in the days immediately after October 7, which the file does cover, so 4 of 46 and 3 of 23 is anomalous.

Checks performed to rule out artifacts of my own method:

  • Snippet truncation: rejected. 661 of 663 snippets (100%) visibly contain a matched search term, so the snippet field is a reliable basis for counting.
  • Station mislabeling: 12 rows carry a station value of 0 and two are stray Pal/UKR rows; excluded, immaterial to the gap.

Three explanations remain open, and public materials cannot distinguish them:

  1. The export was row-capped by GDELT and the published counts come from GDELT’s aggregate summary endpoint, which counts clips the export never returned. Most likely.
  2. The published counts come from separate per-term queries rather than the single combined query recorded in the CSV header.
  3. An error in the published counts.

Explanation 1 would mean the counts are fine and the CSVs are illustrative evidence only. This is the first question to put to Ali.

Consequence for job 1

Recomputing from the published CSVs is not a valid verification method. The counts derive from GDELT’s TV Explorer aggregate endpoint, so verification requires re-running the queries against GDELT directly, using the search strings recorded in the CSV headers.

The upside is that this is free. GDELT’s Internet Archive TV corpus is a public API, the exact query strings are preserved in the CSV headers, and every row carries an archive.org URL and timestamp.

Open item — asymmetric query strings

The recorded search strings for the genocide/war-crime comparison are not symmetric:

  • Gaza file: ("war crime" OR "war crimes" OR "genoicde" OR "genocidal")
  • Ukraine file: ("war crime" OR "war crimes" OR "genocide" OR "genocidal")

“Genocide” is misspelled on the Gaza side only. If the header records the query actually executed, the Gaza count omits every clip using “genocide” without also using “genocidal” or “war crime(s)” — bearing directly on the study’s claim that these terms appeared 17.2 times more often for Ukraine.

Not yet a finding. The header may be a hand-typed label describing a correctly-run query. Resolvable by re-running both spellings against GDELT and comparing. Note the direction: if real, it understates the Gaza side, and correcting it would narrow the reported gap.

Calibration note

Two discrepancies found so far bear on the strength of the book’s own case, and both run against it. The Intercept article’s 16x mention-rate ratio is a rounding artifact — 9.03 rounded down to 8, 0.476 rounded up to 0.5, then multiplied — where the unrounded figure from the published summary file is 19.0x. The “genoicde” query, if real, undercounts Gaza.

This is worth tracking as the audit proceeds. A pattern of errors that consistently understate would suggest sloppiness rather than motivated reasoning; a pattern running the other way would suggest the opposite. Neither conclusion is available yet on a sample of two.

Next actions

  1. Re-run the GDELT queries from the CSV headers and compare against published counts. Free, scriptable, resolves the largest open question.
  2. Extract every remaining figure-linked number in the book into a claim table (Figures 1.1, 1.2, 2.2a/b, 2.3, 2.4, 4.1, 6.1, 7.1) and run the same internal-consistency checks that produced findings A through D.
  3. On receipt of the full Intercept dataset, audit the victim-attribution coding against the sentence text.
  4. Locate the source for the book’s year-long, eight-outlet print survey. Not covered by either repository.