Methodology

How we discover, verify, structure, and publish human events. Full transparency on every step.

🎯Core Principles

The Event is the Central Object

An article is only a presentation layer around an event. The event itselfβ€”structured, sourced, versionedβ€”is the primary data entity.

No Number Without Provenance

Every figureβ€”deaths, injuries, participants, displacedβ€”must trace to one or more source records. We never store a number without its evidence chain.

AI is a Tool, Not a Source

AI-generated statements are never evidence. AI assists with classification, extraction, clustering, and synthesisβ€”but never invents facts or fills missing numbers.

Traceable Claims

Every factual claim links to a source quote, a source URL, and a confidence assessment. You can always verify what we say.

Uncertainty Over False Precision

We distinguish: reported, verified, corroborated, disputed, estimated, unknown. We never turn uncertain information into false precision.

πŸ“‘Source Acquisition

Layer 1: Broad Discovery (GDELT)

We use the Global Database of Events, Language, and Tone (GDELT) for global, multilingual news discovery across 65+ languages. GDELT provides structured event records, article URLs, and metadata for initial candidate detection.

Why GDELT: Unparalleled global coverage, structured output, free access. Limitations: Noisy, requires heavy filtering, not a verified source itself.

Layer 2: Structured Datasets

  • UCDP (Uppsala Conflict Data Program): Authoritative conflict event data, battle-related deaths
  • ReliefWeb / UN OCHA: Humanitarian reports, displacement figures, disaster data
  • ACLED: Armed Conflict Location & Event Data (when available)
  • UNHCR / IOM: Official displacement and refugee statistics
  • WHO: Health emergency and disease outbreak data

Layer 3: RSS & Official Feeds

Configurable source registry (sources.yaml) with global/regional news, government feeds, NGO reports, and UN agencies. Each source has priority, poll interval, and robots.txt compliance.

Principle: Respect robots.txt, rate limits, copyright. Prefer RSS and public APIs. Never scrape indiscriminately. Store metadata and link to original.

βš™οΈDiscovery & Processing Pipeline

Automated Pipeline Stages

  1. 1.DISCOVER – Fetch from GDELT, RSS, datasets
  2. 2.FETCH METADATA – Title, URL, date, source
  3. 3.NORMALIZE URL – Canonicalize, deduplicate
  4. 4.DEDUPLICATE – Exact URL, content hash, title similarity
  5. 5.EXTRACT CANDIDATE FACTS – LLM-structured extraction (Gemini)
  6. 6.CLASSIFY EVENT – Type, location, date, severity
  7. 7.CLUSTER RELATED ARTICLES – Multi-source β†’ single event
  8. 8.CREATE EVENT CANDIDATE – Structured event with claims
  9. 9.VERIFY & SCORE – Cross-source corroboration, importance scoring
  10. 10.PUBLISH DECISION – Auto-publish / Auto-publish with warning / Hold
  11. 11.GENERATE – Event page, map marker, summary, share card

πŸ”—Event Clustering (Multi-Source β†’ Single Event)

Ten news articles describing one protest become ONE event with multiple sources.

Clustering Signals

  • βœ“ Exact URL canonicalization
  • βœ“ Title similarity (fuzzy matching)
  • βœ“ Named entity overlap (actors, organizations)
  • βœ“ Location proximity (within 50km)
  • βœ“ Temporal proximity (within 48 hours)
  • βœ“ Semantic similarity (embeddings)

Example Cluster

  • Reuters: "Protests in Paris over pension reform"
  • AP: "French unions mobilize against retirement age"
  • Le Monde: "Manifestations Γ  Paris : 15 000 selon la CGT"
  • Gov statement: "Ministry confirms 7 arrests"
  • GDELT: Event code 1401, Paris, 2026-10-08
  • β†’ ONE EVENT with 5 sources

πŸ€–AI Role & Constraints

AI Performs

  • βœ“ Event classification
  • βœ“ Entity extraction (actors, locations, dates)
  • βœ“ Fact/claim extraction with quotes
  • βœ“ Event clustering assistance
  • βœ“ Importance & novelty scoring
  • βœ“ Source comparison & conflict detection
  • βœ“ Summary & headline generation
  • βœ“ Daily brief & social card copy

AI Must NOT

  • βœ— Invent facts or casualty figures
  • βœ— Fill missing numbers
  • βœ— Pretend verification
  • βœ— Merge incompatible numbers
  • βœ— Create fake citations
  • βœ— Publish unsourced claims
  • βœ— Generate content without structured output

Structured Output Only

We never ask for free-form prose. We request JSON with strict schema validation (Pydantic). Malformed output is rejected and retried.

{"event_type": "PROTEST", "claims": [{"type": "participants", "min": 10000, "max": 20000, "source_id": "..."}], "confidence_score": 82}

πŸ“ŠScoring & Publishing Policy

Interestingness Engine (Event Score)

Weighted formula (configurable in scoring.yaml):

score =
  0.25 Γ— importance
+ 0.20 Γ— human_impact
+ 0.15 Γ— novelty
+ 0.15 Γ— corroboration
+ 0.10 Γ— velocity
+ 0.10 Γ— public_interest
+ 0.05 Γ— unusualness
βˆ’ penalties (duplicate, low confidence, single source, old event)

Three-Tier Publishing

βœ… AUTO-PUBLISH

  • High confidence
  • Multiple independent sources
  • Clear location & date
  • No major contradictions

⚠️ AUTO-PUBLISH WITH WARNING

  • Sources disagree on numbers
  • Early/developing reports
  • Page clearly states: "Reports differ"

πŸ”΄ HOLD

  • Single weak source
  • Location/date uncertain
  • Major contradictions
  • Possible misinformation

πŸ’”Human Cost Metrics

We never combine incompatible datasets. Each metric specifies exactly what is counted, by whom, and when.

Supported Metric Types

  • reported_deaths
  • reported_injuries
  • civilian_deaths
  • combatant_deaths
  • displaced_people
  • reported_airstrikes
  • reported_attacks
  • reported_missiles

Every Metric Includes

  • value + unit
  • source + source date
  • methodology
  • confidence level
  • cumulative vs period-specific
  • geography scope

πŸ”„Revision & Contradiction Handling

Event Revisions

Events evolve. We store historical claims, never overwrite.

10:00 β†’ Report: 5 killed (Source A)
12:00 β†’ Official: 8 killed (Source B)
15:00 β†’ UN: 7 killed (Source C)

UI shows: "Earlier reports: 5 (A), 8 (B). Latest: 7 (UN)."

Contradiction Engine

Detects conflicting reports and flags them explicitly.

Source A: 23 deaths (UN)

Source B: 21 deaths (Gov)

System: value_min=21, value_max=23, status=conflicting_reports

πŸ› οΈTechnology Stack

Backend (Python)

  • httpx – Async HTTP client
  • feedparser – RSS/Atom parsing
  • BeautifulSoup – HTML parsing
  • Pydantic – Data validation
  • RapidFuzz – String similarity
  • Google Generative AI – Gemini API
  • Tavily – Search API (optional)

Frontend (Astro)

  • Astro – Static site generation
  • MapLibre GL JS – Interactive maps
  • Tailwind CSS – Styling
  • ECharts – Visualizations
  • TypeScript – Type safety

Deployment (Free Tier)

  • GitHub Actions – Scheduled ingestion
  • Cloudflare Pages – Static hosting
  • Cloudflare D1 – Database (later)
  • GitHub Secrets – API keys

Data Storage (MVP)

  • Local JSON – Events, sources, claims
  • Generated JSON – Map, timeline, stats
  • Static files – Event pages, briefs
  • β†’ Migrate to D1 when JSON becomes cumbersome

⏰Schedule & Resource Budget

Autonomous Schedule

  • Every 5 min: Best-effort source discovery, processing, and publishing
  • Every minute: Open news feeds check for newly published data; source ingestion runs on its own schedule
  • Every 2–4 hrs: Recheck developing stories, update casualties
  • Every 6 hrs: Rebuild daily summaries, refresh rankings
  • Daily: Historical aggregation, sitemap, cleanup

Economic Model (Free Tier)

1000 discovered articles
β†’ 200 candidates (deterministic filter)
β†’ 50 meaningful events (clustering)
β†’ 20 verified (LLM extraction)
β†’ 5–15 published

Gemini: 80% extraction, 15% verification, 5% editorial. Tavily: only high-interest cases.

🚫What We Don't Do (Yet)

  • No chatbot, no mobile app, no user accounts
  • No comments, no social network, no subscriptions
  • No AI-generated images or videos
  • No full-text news republishing (copyright)
  • No paid APIs, paid scraping, paid LLMs (unless required later)
  • No browser extensions, no premium features

Focus: Prove that autonomous event discovery + verification + visualization + SEO + publication creates useful traffic.

Open Source & Transparent

This methodology is a living document. Code, configuration, and data pipelines are open source.