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

CLAUDE

Project context — Fact-check of How to Sell a Genocide

Read 00 - Fact-Check MOC.md first. This file is orientation for picking the project up cold.

What this is

Independent verification of Adam H. Johnson, How to Sell a Genocide: The Media’s Complicity in the Destruction of Gaza (Pluto Press, 2026). Checking whether the book’s quantitative claims reproduce from published data, whether citations support what they are cited for, and whether the conclusions follow from the evidence.

This is an audit, not a prosecution and not a defense. The subject is actively contested politically; the scope here is methodology, not adjudicating the underlying conflict.

Vault conventions

  • No emojis anywhere, including notes and formatted output.
  • Every callout gets an explicit title: > [!note] Title here.
  • Always an empty > line after the callout header before body content.
  • Callouts only for genuinely standout content. Regular markdown for everything else.
  • Note types in use here: MOC, Source, Permanent, Project.

State as of 2026-08-04

Done:

  • Book text extracted; 476 endnotes parsed; outlet distribution mapped.
  • Both underlying datasets located and stored under data/. Neither is mentioned in the book.
  • Ten discrepancies logged, nine confirmed and one unresolved (05 - Findings Register.md). Findings 1, 2, 3 and 10 carry the quoted passage behind them, checked against the PDF on 2026-08-04.
  • Finding 10 found 2026-08-04: the 100-day “Hamas-run” count is given as CNN 277 / MSNBC 146 in Ch. 2 and as CNN 247 / MSNBC 137 in Ch. 7, with Ch. 7 explicitly citing Ch. 2. May be a broad-versus-narrow term family presented as one figure.
  • One entry was logged and withdrawn the same day; the error was ours, not the book’s. Kept in the register under Withdrawn.
  • Discovered the published Nation CSVs are partial exports and cannot reproduce the published counts. Verification must re-run GDELT queries, not recompute from spreadsheets.
  • Ran the event-type vs victim-identity test live against GDELT: 98 queries, zero errors. Mixed result (04 - Results Stage 1.md).
  • Shifted from whether the counts are right to what was counted. Produced the commensurability audit (07 - Query Design Audit.md) and the claim-by-claim table (08 - Search Terms and Their Allegations.md). Central pattern: the measurement is a frequency and the claim attached is often a universal.
  • Confirmed the Chapter 7 civilians comparison is a design error, not a typo, inflating a headline effect by roughly 40 percent toward the argument (09 - The Civilians Query Problem.md). First finding that runs that direction.

Pending:

  • Full Intercept dataset requested from Othman Ali ([email protected]), 2026-08-01. Awaiting reply.
  • Manual coding pass — blocks reporting of any stage-1 number.
  • Citation integrity pass across all 476 endnotes.

The book

How to Sell a Genocide - The Media's Complicity in the -- Johnson, Adam H.pdf, in this folder as of 2026-08-04. Also on the NAS at Library/Israel-Palestine/. 257 pages, clean text layer.

Page offset, verified 2026-08-04: book page + 15 = PDF page. Introduction p. 1 is PDF 16; Ch. 2 opens at book p. 25 / PDF 40; Ch. 7 at book p. 122 / PDF 137; the Notes section at book p. 205 / PDF 220. Front matter is roman-numbered and runs to p. xiii.

Linking to it

The notes use PDF++ links. The anchor is the physical page, the display text is the book page:

<span class="fg-file-unavailable">p. 27 <small>(file not included in this release)</small></span>

The PDF has correct embedded page labels (/S /r for the front matter, /S /D from physical page 16), so PDF++ renders {{pageLabel}} as the book page and the two agree. Inside a Markdown table the pipe must be escaped as \|.

Always cite book pages in prose and convert only in the anchor. To find a page, extract the text once with pdftotext -layout, split on form feeds, and index — physical page = list index + 1, book page = index − 14.

Technical notes

GDELT TV API, free, no key: https://api.gdeltproject.org/api/v2/tv/tv

  • mode=timelinevol returns percentage of airtime per bucket. timelinevolraw is NOT valid and errors.
  • mode=clipgallery returns clip-level records with snippets, capped at 50 per request — paginate for exact counts above that.
  • Params: query, mode, format=json, STARTDATETIME, ENDDATETIME, maxrecords.
  • Station filter goes inside the query string: station:CNN.
  • Requests take 2–3 seconds. Keep concurrency around 4 and add a short delay.

scripts/gdelt_event_type_test.py runs the full test. It was written for an environment with network access to GDELT; the results in data/gdelt_stage1_summary.csv were produced by the equivalent queries.

Files

  • 00–10 — the audit notes. Start with 00 - Fact-Check MOC.md, then 10 - Session Log.md for how the work unfolded including two reversals.
  • data/nation-tv-dataset/ — Nation TV study, 11 CSVs. Emotive-words files need skiprows=3; civilian files need skiprows=2.
  • data/intercept-print-dataset/ — Intercept print study, basic set only.
  • data/endnotes_parsed.csv — all 476 endnotes parsed into section, number, citation. Input for the citation-integrity pass.
  • data/gdelt_stage1_summary.csv — results of the 98-query event-type test.
  • scripts/gdelt_event_type_test.py — reruns that test. Needs network access to GDELT.
  • scripts/extract_book.sh — regenerates data/book.txt from your own PDF. The book text is deliberately not bundled.

Standing rules for this project

  1. A verification claim requires a quoted supporting passage with a locator. No quote means unverifiable, never confirmed.
  2. Automated term counts are screens, not results. Anything depending on who a term refers to, or whether it was editorial voice versus quoted, requires manual coding first.
  3. Record the direction of every error, not just its existence.
  4. Write interpretation rules before looking at results.
  5. Where a judgment is interpretive rather than factual, run it both framings and treat disagreement as the signal.