Methodology: How the Sudan / ICC Security Council Readout Was Produced

Subject
Method behind the readout of the ICC Deputy Prosecutor's 43rd report on Darfur under Resolution 1593
Source event
Security Council 10,197th meeting, 15 July 2026 (S/PV.10197)
Purpose
A reproducible record of how the source transcript was obtained, treated, analysed, quote-verified, and published
Source is UN ASR, not an official record. This readout is built from the automatic-speech-recognition (ASR) transcript published on the UN transcripts portal (transcripts.un.org). ASR transcripts are not official UN records. Unlike earlier readouts, every position-critical quote here was audio-verified against the meeting recording before publication — 29 quotes in total, checked against the UN Web TV recording (English channel): nine on 16 July 2026 and a further 20 covering the fault-line plot's scoring evidence on 29 July 2026, all matching. Quotes in the evidence panel beyond those 29 are verbatim from the ASR transcript but have not been individually audio-checked (see Stage 4). Names, figures and dates elsewhere are treated as provisional against the ASR text; Sudanese place names (El Fasher, El Geneina, El Obeid) and personal names have been normalised to standard English spellings, which the ASR mangles.
Overview & Purpose

This document records how the Sudan / ICC Security Council readout was produced. The readout summarises the Security Council's 10,197th meeting of 15 July 2026, at which the ICC Deputy Prosecutor delivered the Office of the Prosecutor's 43rd report on the Darfur situation under Resolution 1593.

It exists for two reasons:

  • Replication. This is the first delivered readout in the security-council track, and the Sudan/Darfur thread within it is expected to recur. The same treatment will be applied to later Sudan sessions, so this is a concrete runbook.
  • Provenance. If a reader asks how the conclusions were reached and where the information came from, this document answers that directly.

Like the UN80 readouts, the source transcript was obtained from the UN transcripts portal rather than captured and transcribed locally. The portal supplies a speaker-attributed ASR transcript, which removes the recording and speech-to-text stages but adds a dependency on machine transcription.

This readout is the first to run under the pipeline's mandatory quote-verification stage: the nine position-critical quotes on the page were checked, sentence by sentence, against the meeting audio before publication rather than left flagged as provisional. That stage is described in full at Stage 4 and codified as a reusable step in pipeline/quote-verification.md.

The work moved through six stages: the meeting was discovered on the portal, its transcript fetched and converted to attributed markdown, analysed into delegation positions, its quotes verified against the recording, synthesised into a structured briefing, and published as a single interactive HTML page with this methodology record. Every stance on the readout traces to a verbatim passage in the transcript. Where a delegation did not state a position on a coded dimension, it is marked silent rather than guessed (the project's no-fabrication rule).

Pipeline at a Glance
Stage 1
Discover
Find the meeting on transcripts.un.org
Stage 2
Fetch + convert
Portal JSON → attributed markdown
Stage 3
Analyse
Extract + code positions on two axes
Stage 3b
Score
Rank intensity within each camp, quote by quote
Stage 4
Verify quotes
Audio-check every quote vs. the recording
Stage 5
Synthesise
Consensus, fault lines, stance grid
Stage 6
Publish
One interactive HTML readout

Each stage produces a named file on disk, so any claim on the readout can be walked back to its source. The transcript, the source-analysis notes, and the HTML all live under the project's transcripts/security-council/ and readouts/ folders.

Tools Used

The transcript came from the UN's own portal, so this readout needed no recording or first-pass speech-to-text tooling to produce the source text. Quote verification, however, does download the meeting audio and run a local speech-to-text model to check the ASR text — those tools are named below alongside the fetch, analysis and build.

StageToolWhat it isRole here
Discover / fetch / convert fetch_un_transcripts.py Purpose-built Python script (stdlib only) Queried the portal, downloaded the meeting JSON, and converted it to speaker-attributed markdown.
Source transcripts.un.org Official UN transcripts portal (ASR) Supplied the raw transcript with built-in speaker attribution (name, country, function) and per-sentence timestamps.
Verify — audio UN Web TV / Kaltura VOD Official UN video archive (Kaltura partner 2503451) The recording against which every position-critical quote was audio-verified. English audio flavor pulled via an unauthenticated widget session.
Verify — slice ffmpeg Audio/video toolkit Cut a short window from the MP4 around each quote's JSON timestamp for transcription.
Verify — transcribe whisper.cpp (large-v3-turbo) Local CUDA speech-to-text (projects/whisper-local/) Independently transcribed each sliced window so the quote could be compared against a second speech-to-text pass, not just the portal ASR.
Analyse + orchestrate + build Claude Code (Opus 4.8) AI analysis and coding assistant Extracted and coded positions, ran the verification workflow, drafted the briefing, and rendered the HTML.

How Claude Code was used

Claude Code read the full attributed transcript, extracted each delegation's stated position verbatim, coded those positions consistently on the readout's two axes, ran the quote-verification workflow end to end, drafted the structured briefing, and rendered it into the interactive HTML page — reusing the design system established by the UN80 readouts. Opus 4.8 was chosen because this is a dense multi-camp session (17 speakers) where attribution and the stance-toward-the-Court nuance matter. The substantive judgements — what each delegation meant, where it sits on each axis, the briefing wording — are the analyst's; the assistant did the extraction, the verification runs, the consolidation and the build. The division of labour is spelled out in the limitations section: the human's only gate is reading the final HTML.

Stage 1 — Discovery

The UN transcripts portal carries ASR transcripts for the preceding 365 days. The Security Council meeting was located on the portal (asset sc/10197), corresponding to the 10,197th meeting record S/PV.10197. Its companion video sits on UN Web TV as Kaltura asset k1w/k1w95ycgte.

Why title / record-scoped, not full-text. Full-text keyword search over-returns badly — it matches any meeting where a phrase was merely uttered in passing. Discovery by meeting record (S/PV number) or a date-range query surfaces the exact session; full-text search is used only to confirm a theme's presence.
Stage 2 — Fetch & Convert

The meeting was fetched into the security-council track and converted to attributed markdown:

python pipeline/fetch_un_transcripts.py fetch sc/10197 --silo security-council
python pipeline/fetch_un_transcripts.py convert transcripts/security-council/2026-07-15_10197.json

The portal's JSON nests the useful fields — title and summary under metadata, the statements under transcript.data, and per-sentence word timestamps under each statement's paragraphs[].sentences[]. The conversion script reads those and emits 2026-07-15_10197_attributed.md: one heading per speaker turn, each carrying the portal's attribution and a timestamp, followed by that speaker's text.

For this meeting the conversion produced 53 statements across 21 speaker labels, covering 17 substantive speakers: the ICC Deputy Prosecutor, all 15 Council members, and Sudan (invited under Rule 37 as the party concerned). The chaired, sequential-statement format matches the pipeline's calibration assumption, so no panel adaptation was needed.

Dropped as procedural noise. The opening ~15 minutes of "can you hear us?" microphone testing (statements 1–19), the President's per-speaker "I give the floor to…" hand-offs, and the Deputy Prosecutor's one-line closing thanks (statement 52) carry no substantive position and were deliberately not rendered.
Stage 3 — Analysis & Coding

With the attributed transcript in hand, each delegation's stated position was extracted verbatim and sorted into comparable positions. The working notes are kept in readouts/sudan-icc-briefing-2026-07-source.md, which records the consensus points, the fault lines, the outliers, and the per-delegation coding, each anchored to a quote.

How positions were coded

Each delegation was placed on two axes drawn directly from what it said (see the note on the analytical frame for why these axes and not a condemn-the-atrocities spectrum):

  • Stance toward the ICC (X): defend the Court and its independence (defender) → conditional, sovereignty-first support (sovereign) → delegitimise and remove it from Sudan (rejector). Sudan, the invited party, sits off this axis — neither defending the institution abstractly nor attacking it, but demanding it act faster (party) — and is placed in the "defend" column of the plot via a small mapping function.
  • Selectable Y: mandate scope — widen the ICC remit beyond the 2005 Darfur referral (expand) vs. hold to the 2003 situation (confine) vs. neutral; or enforcement urgency — how hard a delegation presses for arrests and new warrants now (high / mid / low).

Camps are coloured by stance, not geography: defender (Denmark, France, UK, Greece, Latvia, Panama, Colombia), sovereign (China, Pakistan, Somalia, Bahrain), rejector (United States, Russian Federation), African / regional (Liberia, DRC — pro-Court but kept visually distinct from the P3-adjacent cluster), party (Sudan), and ICC / briefer (Deputy Prosecutor Khan). Where a delegation did not state a position on a dimension in this meeting, it was marked silent rather than assigned a guess; here all 15 members plus Sudan spoke on the record.

Camp membership fixes which column a delegation sits in. Where it sits inside that column is a separate, scored judgement — see position scoring below.

Stage 3b — Position Scoring (how the plot is ordered)

A reader of the first version of this readout pointed out that the cluster map appeared to show the DRC and Liberia as stronger supporters of the ICC than Denmark, France and the United Kingdom — which does not reflect what those delegations actually said. The reader was right, and the cause was structural.

What was wrong. The plot sorts delegations into three categorical columns. Within a column, each dot's horizontal position was generated from a hash of the delegation's name — decorative jitter whose only job was to stop dots overlapping. But readers reasonably read left-to-right placement as meaning something. Within-camp position was noise being presented as signal.

The fix. Within-camp ordering is now part of the analytical claim rather than an accident of layout. Each delegation's full statement was scored against a seven-indicator rubric, and dots are placed inside each cell in ascending score order, weakest to strongest, left to right. Every point awarded cites a verbatim quote from this meeting; the absence of a marker is recorded as not stated, never inferred from bloc membership or from what a delegation said at other meetings. Clicking any two dots in the plot opens the two breakdowns side by side, so the reader can audit the ordering rather than take it on trust.

The rubric

The defining divide is support for the ICC — the same one the executive summary names. Each delegation is scored on two mirrored rubrics of seven indicators: one for the case it made for the Court, one for the case it made against. Both sum to 100, and most delegations score on only one of them.

Until August 2026 there was a single rubric, and opponents of the Court were handled by flat deductions. That failed in two ways. The seven indicators — mandate expansion, warrant specificity, cooperation framing — only score if a delegation wants more Court, so they measure one pole rather than the divide: a delegation arguing the other way scored zero everywhere and carried a penalty. And a zero became ambiguous. Bahrain scoring 0 on independence meant it did not raise the subject; Russia scoring 0 on the same indicator meant it attacked the Court's independence at length. Same number, opposite meanings. The counter-rubric gives the second delegation somewhere to score.

IndicatorMaxWhat earns points
A. Institutional endorsement20Emphatic support of the Court as an institution ("unwavering" / "absolute support") 15–20 · formulaic or qualified 8–14 · thanks-only or silent 0–7
B. Independence / integrity defense10Defends the Court against interference, sanctions or threats 7–10 · generic independence mention 3–6 · silent 0
C. Mandate expansion call15Explicit call to extend ICC jurisdiction to all of Sudan 15 · silent 0
D. Warrant specificity15Names suspects plus an arrest/surrender demand 12–15 · generic warrants demand 7–11 · mention without demand 3–6 · silent 0
E. Cooperation framing15Obligation framing 14–15 · calls on all states to cooperate 11–13 · welcomes / encourages 6–10 · takes note 2–5 · silent or critical 0
F. Material commitments10Reparations / Trust Fund / prosecutor-resources call 7–10 · welcomes progress on these 3–6 · silent 0
G. Speech-act tonality15Dominant verb register toward the Court and accountability: demand / urge / must 11–15 · call / ensure 6–10 · welcome / encourage 3–5 · take-note 0–2

The counter-rubric

Each indicator mirrors its counterpart above at the same weight. A delegation scores here for the case it puts on the record against the Court, so the rows show what it argued rather than what it failed to say.

IndicatorMaxWhat earns points
A′. Counter-endorsement20Rejects the Court's standing outright 15–20 · asserts sovereignty or complementarity as the governing principle 8–14 · passing mention 0–7
B′. Performance / integrity critique10Attacks the Court's record or internal conduct — conviction count, delay, politicisation, scandal 7–10 · generic criticism 3–6 · silent 0
C′. Maximal counter-ask15The strongest concrete demand on this side anywhere in the debate: withdraw the file, or dismantle the Court 15 · silent 0
D′. Specificity of the counter-case15Named resolutions, jurisdictional grounds, named alternative fora 11–15 · named doctrines 6–10 · generic sovereignty talk 0–5
E′. Non-obligation framing15Cooperation framed as optional, conditional on consent, or excluded from the process 13–15 · national process preferred 8–12 · silent 0
F′. Material counter-commitment10Named action taken or demanded against the Court — campaigns, withdrawal, defunding 7–10 · silent 0
G′. Counter-pole speech-act register15Dominant verbs toward the Court: reject / dismantle / withdraw 11–15 · warn / insist 6–10 · note concerns 3–5 · silent 0–2

A counter-marker must constrain the Court's reach. Criticism that the Court is moving too slowly is pressure to do more, so it scores on indicator G above, never here — negative sentiment is not a counter-marker. One fragment scores once: a withdrawal call is C′ or F′, never both.

Two display rules

  • Horizontal position is what a delegation put on the record, not which side it took. A dot's column is the two rubrics added together, so France (94 for) and the United States (75 against) both sit in the right-hand column: both argued at length, in opposite directions. Direction is read from the vertical axis and the camp colour. The two are added rather than netted because netting makes a delegation that argued both ways cancel toward the middle — China put 41 points of material on the record and would have plotted at 17, reading as though it had barely spoken. An earlier version scored the sign into the horizontal axis, which placed the delegations arguing hardest against the Court on the far left; the floor rule that made Russia and Bahrain both display 0 is retired with it.
  • The claim is ordinal. An additive tally of evidence supports "stronger than", not interval precision. Dots are rank-ordered with even spacing; the exact numbers belong in the evidence panel as an audit trail, not as a measurement.

Anti-anchoring

Delegations were scored one at a time against the rubric's anchors, without reference to other delegations' totals, to the earlier camp coding, or to any expected ordering. Only afterwards was the result compared with the reader's expectation. Where the two disagree, the disagreement is reported rather than tuned away — and one such disagreement turned out to be the most interesting finding of the exercise (below).

What the scoring found

The reader's core objection is confirmed with large margins: France 94 and Denmark 92 against Liberia 43 and the DRC 25. The surprise sits elsewhere. The United Kingdom (43) ties Liberia (43) — not because either was mis-scored, but because they support the Court in different registers at similar intensity. The UK statement is institutionally warm and procedurally cool: strong support for the Court and its independence, but no expansion call, no named-warrant demand and no material commitment. Liberia carries no institutional layer at all and reaches the same total through enforcement pressure — warrants "cannot remain unenforced indefinitely", the Council "must move beyond expressions of support". A categorical camp map cannot show that; the scored plot can, and the side-by-side comparison view is where it becomes legible.

Corrections

6 August 2026 — Sudan, 38 → 42. Sudan carried a −4 negative marker for "This delay causes serious concern and sends a negative message to the victims". The line presses the Court to move faster, which is the same claim already credited +13 under indicator G, and it constrains the Court's reach in no way. It was matched on negative sentiment rather than on position — the only marker in the dataset that did not restrain the Court. The marker is removed and the counter-rubric now states the test explicitly.

6 August 2026 — the counter-rubric, and what it changed. Seven delegations were rescored against the new A′–G′ indicators, from their full statements in the transcript rather than from the existing markers. The flat markers had under-recorded the counter-camp badly: Russia delivered the second-longest statement of the meeting, 198% of the median, and was represented by three fragments. Re-reading it found four further argued positions that had never been scored — the Court's conviction record over two decades, the limits Resolution 1593 places on the referral, immunities and sovereign equality, and an institutional-integrity case. One ordering changed as a result: the United States now scores above Russia on the counter-rubric (75 to 70), reversing the old flat-marker order. Under the deductions Russia ranked lower because it accumulated three markers to the United States' two. Scored on indicators, the United States carries a named material commitment — an active campaign, with allies, to dismantle the Court — that Russia does not; Russia's case is argumentatively richer but stops at asking the Council to consider withdrawal. Kept as scored, under the anti-anchoring rule.

The brevity marker

The rubric rewards breadth: a delegation that spoke at length had more opportunities to hit indicators. That is a real bias and it is disclosed rather than corrected, because correcting it would mean inferring what a delegation would have said. Every delegation's statement was measured in words, and any delegation under 70% of this meeting's median (567 words) carries a brief chip beside its name everywhere the name appears. Here that marks the United Kingdom (376 words, 66%), Pakistan (344, 61%) and Bahrain (253, 45%).

The chip's claim is about speaker behaviour, not about the quality of our data. At a Security Council briefing every delegation is expected to take a roughly comparable turn, so choosing to say little is itself a finding — the score simply rests on less material. Two rules keep it honest: the threshold is computed for every speaker before any scores are read, so it can never become a hedge deployed only where a result disappoints expectation; and it is relative to each meeting's own median rather than a fixed word count, since a General Assembly debate and a Council briefing have different norms.

Word count, not speaking time. Liberia held the floor for 7 minutes 56 seconds — third-longest by the clock — but spoke at about 73 words per minute against a room average near 130, delivering only median words. Measured by duration it would have looked expansive.

Behind the page sits a full scoring sheet holding the rubric anchors, every delegation's per-indicator evidence with its quotes, a pairwise consistency log comparing each adjacent pair in the largest camp, and the verbatim spot-check results. The scoring procedure itself is written up as a reusable method so later readouts in this series are scored the same way rather than re-argued from scratch. Both are working records kept with the project rather than published documents; the evidence they contain is what the click-to-compare panel exposes on the readout itself.

Stage 4 — Quote Verification (audio)

This is the stage that distinguishes this readout from the earlier ones. The portal transcript is machine ASR, so every quote destined for the page — talking points, tooltips, the executive summary — was checked against the actual meeting audio before publication rather than flagged as provisional. This is now a mandatory pipeline stage, not an optional pre-publication nicety. The full method, escalation ladder and run log live in pipeline/quote-verification.md; the summary follows.

The method

  1. Resolve the recording. A baseEntry/get on the live UN Web TV entry 1_w95ycgte returned the recorded VOD entry 1_c3icpgx0. getPlaybackContext enumerated the flavors; the English-audio flavor is 1_1jj8elbu (flavorParamsId 100). No API key is needed — an unauthenticated widget session gives access (documented in pipeline/webtv-download.md).
  2. Download the English audio. The 160 MB English-audio MP4 was pulled via the Kaltura playManifest URL for that flavor.
  3. Slice each quote's window. For each of the nine quotes, ffmpeg cut a short window centred on the sentence's JSON start timestamp (padded ±3s to begin with).
  4. Transcribe independently. Each window was run through whisper-cli.exe (large-v3-turbo, flags -mc 0 -tp 0.0 -nf -nt) so the quote could be compared against a second, independent speech-to-text pass — not just re-read from the portal ASR.
  5. Compare and judge. The whisper output was compared to the ASR quote text; a match confirms the quote, a mismatch triggers a correction and a re-slice.
The interpretation-drift escalation ladder. Three of the nine windows (both France quotes and Russia's closing line) came out misaligned on the first ±3s slice, because interpreted-speaker segments carry JSON timestamps that drift 10–20 seconds from the audio — the interpreter lags behind the floor speaker. The fix was to widen the window: re-slice at ±15–20s, and for the worst case (France's "extend the jurisdiction" line) a 100-second probe window. This heavier interpretation load is a real, recurring characteristic of Security Council sessions relative to the mostly-English GA briefings, and is written up as the escalation ladder (step 6) in the verification method.

Why the English flavor, never "Interlingua"

The English audio flavor (paramsId 100) is always the verification target. It is the channel the portal ASR actually transcribes — floor audio for English speakers, the English interpreter for everyone else — so it is the like-for-like comparison. Using raw floor / original-language audio would not match the ASR text for a non-English speaker.

The result: 9 of 9 quotes matched

All nine position-critical quotes matched the recording; no corrections were needed. The readout, source notes and track index were updated from "not yet audio-verified" to verified with timestamps.

Second round, 29 July 2026 — the scoring evidence. Adding the scored plot put a much larger body of quotes on the page, so the check was run again against the same recording. First a mechanical sweep confirmed that all 114 evidence fragments behind the 16 scored delegations appear verbatim in the transcript. Then the 20 quotes that carry the ordering claim — the top-of-scale anchors, both sides of the UK/Liberia tie, the four delegations that outscore the UK, and the negative markers that push Bahrain, Pakistan, China and Somalia to the floor — were audio-checked. All 20 matched; no corrections. Sixteen hit on a first-pass slice; two needed a wider window; two needed a long probe. France drifted about 55 seconds from its transcript timestamp, against 10–20 seconds for the same speaker in round one — a reminder that interpretation drift is not a fixed per-speaker offset. Quotes in the evidence panel beyond these 20 remain ASR-verbatim without an individual audio check, which the readout states on the panel itself.
Third round, 6 August 2026 — the counter-rubric quotes. The mirrored A′–G′ rubric added 34 new evidence fragments across seven delegations. A mechanical sweep confirms that all 34 appear verbatim in the attributed transcript; two were corrected during the sweep, where an ellipsis had been used to join text that is in fact contiguous in the source, making the quote non-verbatim as displayed. These fragments have not been individually audio-checked against the recording — they are ASR-verbatim only, at the same standard as the majority of the original evidence panel.
SpeakerQuote (opening)AudioResult
Dep. Prosecutor Khan"…crimes may be about to take place in El Obeid. We cannot say we did not know."645smatch
Dep. Prosecutor Khan"This is a paradigm shift. It is a breakthrough."934smatch
United States"…withdraw from this power-hungry institution."2614smatch
United States"…importantly exclusive of the ICC."2770smatch
Russian Federation"…withdrawal of the Darfur file, as well as the Libyan file."3682smatch
Russian Federation"the Hague pseudo-court is merely an obvious obstacle."3754smatch
France"cooperation with the Court is an obligation, it's not an option."4681s drift ~10smatch
France"…extend the jurisdiction of the ICC to the entire territory of Sudan."4878s drift ~20smatch
Sudan"Justice delayed is justice denied… issuing arrest warrants… has become a necessity."6425smatch

Because these are the position-critical quotes for the two rejectionist camps (US, Russia) and the two sharpest defenders (France) plus the briefer and the invited party, verifying them anchors the readout's central fault line — defend the Court vs. delegitimise it — directly to the recording.

Stage 5 — Synthesis & Briefing

The coded, verified positions were collapsed into a single structured briefing following the locked seven-section house format:

  • Executive summary — what happened plus the defining divide, broken into a skimmable bullet list of poles so the two-minute reader gets the whole map.
  • What the Deputy Prosecutor reported — the 43rd report's substance (El Obeid early warning, the Ali Kushayb conviction, SGBV priority, RSF non-cooperation), since this meeting is a briefing, not only a debate.
  • Areas of consensus — the points cutting across all camps (El Obeid must not become another El Fasher; SGBV a priority; reparations must follow; RSF non-cooperation violates 1593).
  • Fault lines — the single analytical home of every position: defend vs. delegitimise the Court; mandate scope; who is arming the war; what the thin enforcement record means. Each names its poles, who anchors them, and one anchor quote per side; outliers box at the end.
  • Fault-line plot covering every speaker, with a selectable Y-axis.
  • Talking points drawn from the audio-verified verbatim statements — the single verbatim home of the key quotes; body prose paraphrases them.
  • A stance reference grid — the per-delegation detail layer.

This briefing maps directly onto the sections of the final HTML. Two structural rules keep it brief: each position appears once in prose (a delegation is named at most once in the fault-lines section, with full detail only in the reference cards), and the page opens with only the executive summary and the report-summary section expanded — a two-to-five-minute read for a high-level reader, with everything deeper collapsed behind an expand-all control for analysts.

Stage 6 — Publication (HTML)

The briefing was rendered as a single self-contained HTML page — a static file with inline CSS and JS, no build step, no external dependencies.

Interactive elements

  • Fault-line plot. A two-axis scatter where the horizontal axis is fixed to stance toward the ICC (defend → delegitimise) and the vertical axis toggles between "mandate scope" and "enforcement urgency." Each dot is one speaker, coloured by stance camp, labelled with a fixed country code, and carrying its score and profile on hover. Sudan, off the main axis, is mapped into the defend column via a small X_FOR() function. Within each cell dots are ordered by evidence score, weakest to strongest, left to right — a faint gradient bar marks any cell holding more than one dot. Placement is fully deterministic; there is no randomness left in the plot.
  • Click-to-compare evidence panel. Clicking a dot opens its full scoring breakdown — every indicator, the points awarded and the verbatim quote that earned them, with "not stated" rows shown explicitly rather than hidden. A second click fills the other slot so two delegations sit side by side; the ⇄ control chooses which one the next click replaces.
  • Scores at a Glance. A collapsible section below the plot ranking every delegation with its argument intensity, its signed net, and a one-line profile of what the score is made of. Ties are shown as "7=" rather than broken arbitrarily.
  • Camp colour on every delegation name. A delegation's camp colour follows its name through the whole page — executive summary, consensus, fault lines, outliers, talking-point attributions and reference cards — and matches its dot in the plot exactly. Readouts are reference documents and get read by scanning rather than straight through, so a reader tracking one delegation, or looking for "who was in the delegitimise camp", can find it by colour without parsing the sentence. A colour key sits under the executive summary, the first block where the colours appear.
  • Searchable reference grid. A card per delegation, filterable by stance camp and free-text-searchable across names and summaries.
  • Chip filters. Camp chips isolate a stance (for example "Delegitimise" isolates the US and Russia).

Accessibility choices

  • A skip-to-content link and visible keyboard focus outlines.
  • Collapsible sections with an expand-all / collapse-all control.
  • A sticky table of contents that tracks the reader's position.

This methodology page reuses the same design system, so the readout and its method read as one family.

Browser verification. The rendered page was served locally and driven with a headless browser to confirm it works: all 17 dots placed with zero orphans in the fault-line plot, the Y-axis toggle re-renders correctly, the "Delegitimise" chip correctly isolates the US and Russia, the executive summary is open on load, and there are zero JavaScript console errors.
A Note on the Analytical Frame

This is nominally a report on atrocities in Darfur, and there is a near-universal consensus layer on the atrocities themselves — the El Obeid risk, sexual and gender-based violence, RSF non-cooperation, reparations. Coding delegations on "do you condemn the atrocities" would produce a uniform field with no signal; every speaker condemns them.

The live tension is the legitimacy of the ICC as the vehicle for accountability. The session doubles as a proxy fight over the Court itself. So the X-axis is stance toward the ICC — defend and expand it, support it conditionally on sovereignty grounds, or delegitimise and remove it — and the Y-axis captures the two second-order disputes that were actually live: how wide the Court's mandate should run, and how hard to press enforcement now. This choice is itself an analytical judgement, disclosed here so a reader can weigh it. The coding table in the source notes shows the quote behind each placement; a different analyst might draw the axes differently, and the underlying transcript is the check. The same reasoning was used for the UN80 round-1 readout, where "supports UN80" was likewise universal and non-diagnostic.

Provenance & Traceability

This is the short answer to "how do you know?" Each type of claim on the readout traces to a specific source.

Claim typeTraces toHow
Verbatim quotes in talking points and tooltips Portal ASR transcript, audio-verified against the recording Reproduced from the ASR text, then checked sentence-by-sentence against the Kaltura English-audio VOD (Stage 4). All nine matched.
Who said what (speaker attribution) Portal metadata + chair handover cues Attribution supplied by the portal, cross-read against the President's handover lines in the transcript.
Stance / scope / urgency coding per delegation sudan-icc-briefing-2026-07-source.md Extracted from the transcript; each row anchored to a quote; unstated positions marked, not guessed.
Intensity scores and within-camp dot ordering research/sudan-icc-position-scores-2026-07.md Each indicator's points cite a verbatim fragment from the transcript; "not stated" is recorded rather than inferred. The sheet also carries the pairwise consistency log and the word counts behind the brief marker.
Consensus points, fault lines, outliers, stance grid sudan-icc-briefing-2026-07-source.md Synthesis of the coded positions into a structured briefing.
Section text and visualisations on the page The readout HTML file Rendered directly from the briefing; no new facts introduced at this stage.
Limitations & Honesty Notes

The method is transparent about where error can enter. None of the steps below were hidden; each was managed.

  • The transcript is machine ASR, not an official record. Portal ASR mishears names, acronyms and figures, especially where live interpretation overlays the original speaker. The quotes on the readout are mitigated by the Stage 4 audio check, which passed 9/9; but non-quoted ASR text (place-name spellings, figures) remains provisional. The source notes carry an ASR-flag list — El Fasher, El Geneina and El Obeid each have several ASR spelling variants, as do the Deputy Prosecutor's and Ali Kushayb's names, all normalised to standard spellings in the readout.
  • Interpretation drift is real. For interpreted speakers the JSON timestamps lag the audio by 10–20 seconds. This was handled by widening the verification window (the escalation ladder), but it means a naive slice at the raw timestamp will miss the quote — a documented gotcha for the next Security Council session.
  • Speaker attribution is the portal's. It is cross-read against the President's handover cues but not independently re-derived from the audio. The chair made a couple of on-record self-corrections (a misread resolution number, a misread date), noted in the source file.
  • Summarisation can flatten nuance. Reducing a multi-minute statement to one line drops detail. The verbatim quotes are retained alongside the summaries so a reader can go back to the wording.
  • Coding is interpretive, not official. The stance / scope / urgency axes are an analytical reading, disclosed in the frame note, not a UN classification. Positions not stated are marked, not inferred.
  • The scores are ordinal, and they carry a length bias. The scores that order the dots support "argued more than", not interval precision, and a delegation that spoke longer had more chances to hit an indicator. This now applies to both rubrics: Russia spoke at 198% of the meeting's median length, and its counter-rubric score reflects that as well as its content. Neither is corrected: the numbers are shown as an audit trail rather than a measurement, and short statements carry the brief marker. See position scoring.
  • The two rubrics measure how much was argued, not whether the positions are equivalent. Scoring the case against the Court on its own rubric means a delegation opposing the Court can score as highly as one defending it, and the plot places them in the same column. That is a claim about the volume and specificity of what each put on the record. It is not a claim that defending an international court and arguing for its dismantling are equivalent positions, and the bars in the evidence panel are scaled within each rubric rather than across them so that the two are not read as a single contest.
  • Not every scored quote has been audio-verified. Twenty-nine quotes have been checked against the recording — the nine in the readout body and the twenty behind the ordering claim. The evidence panel holds more than that, and those remaining quotes are confirmed verbatim against the transcript but not individually against the audio. Since the transcript is machine ASR, a quote in that remainder could in principle carry an ASR error.
  • The camp palette carries meaning, so it was checked under colour-vision deficiency. Because a delegation's colour now follows its name through the prose as well as the plot, the palette was simulated under deuteranopia and protanopia on 29 July 2026 and two colours were changed: African / regional moved from amber to teal, which had been too close to the sovereignty gold once both appeared as running text, and the ICC briefer's purple was shifted away from the defenders' blue, the pair that separated worst under simulation. The closest remaining pair sits at roughly twice the separation of the worst pair in the original palette. Colour is never the only carrier in any case — every dot prints its country code, camp is also column position, and the colour key names each group in words.

What was automated versus human-checked

  • Automated Portal discovery, transcript fetch, JSON-to-markdown conversion, first-pass position extraction, and the entire quote-verification workflow (VOD download, ffmpeg slicing, whisper transcription, comparison) — Claude runs this end to end without the human in the loop.
  • Human-checked The reading of the transcript for meaning; the coding judgements; the briefing wording. The human's only gate is reading the final HTML — by design, per the pipeline's division of labour.
Replication Runbook

To repeat this for the next Sudan session in the security-council track, or any other portal-sourced chaired meeting. All commands run from the project folder so the relative transcripts/ paths resolve. See pipeline/un-transcripts.md for the fetcher guide and pipeline/quote-verification.md for the full verification method.

1. Discover the meeting

Find the session on the portal by its meeting record (S/PV number) or a date-range query; avoid full-text keyword search for finding a specific session. Note both the transcript asset slug (sc/<n>) and the UN Web TV / Kaltura asset for later verification.

2. Fetch and convert

python pipeline/fetch_un_transcripts.py fetch sc/<n> --silo security-council
python pipeline/fetch_un_transcripts.py convert transcripts/security-council/<file>.json

Produces <date>_<n>_attributed.md and updates transcripts/security-council/INDEX.md. Drop the procedural noise (mic-test statements, "I give the floor to…" hand-offs).

3. Analyse and code

  1. Extract each delegation's stated position verbatim.
  2. Code each on the two axes (stance toward the ICC; scope / urgency); mark unstated positions silent.
  3. Save the working notes as <readout-slug>-source.md, one coding row per delegation with an anchor quote, plus an ASR-flag list.

4. Verify quotes against the audio (mandatory, do not skip)

  1. Resolve the VOD entry (baseEntry/get on the live entry) and the English audio flavor (getPlaybackContext; paramsId 100). Check the flavors — do not assume paramsId 100 exists for a differently-configured entry.
  2. Download the English-audio MP4 via the Kaltura playManifest URL.
  3. For each position-critical quote, ffmpeg-slice a window at the JSON sentence timestamp and transcribe it with whisper large-v3-turbo.
  4. Compare to the ASR quote; on misalignment, widen the window (the escalation ladder — interpreted speakers drift 10–20s).
  5. Update the readout, source notes and INDEX from "unverified" to verified with timestamps once all quotes match.

Full step-by-step method, escalation ladder and run log: pipeline/quote-verification.md.

5. Synthesise the briefing

Collapse the coded, verified positions into the seven-section house structure: executive summary (headline plus a bullet breakdown of the defining divide), what the principal(s) reported, areas of consensus, fault lines (poles + anchors + one quote per side; outliers box, no separate camp sections), the fault-line plot, audio-verified talking points, and the full stance reference grid.

Three rules keep the readout brief. One prose home per position: a delegation is named at most once in the fault-lines section; anything more belongs in its reference card. Quotes live once: talking points hold the verbatim text; body prose paraphrases with a pointer. Tiered opening: only the executive summary and the report-summary section are expanded on load.

6. Publish

Render the briefing into one HTML page, reusing the design system and the fault-line plot data structure (one entry per speaker with an ICC-stance, scope, urgency, and bloc field). Name it sudan-icc-briefing-<YYYY-MM>.html (or the appropriate topic slug) and cross-link it with a methodology page built from this one. The canonical structural example is readouts/un80-briefing-2025-05.html.

File-naming chain. portal <slug>.json → <date>_<n>_attributed.md → <readout-slug>-source.md → the readout HTML page → this methodology page.