Common Good Intelligence

Bellwether

Supply-chain disruption monitoring for mid-market manufacturers. A global risk index tells you the world is on fire. Bellwether tells you that the one plant you single-source your castings from is in the part of it that's burning.

Signals are generic. Exposure isn't.

A disruption signal is scoped to a region and sometimes a commodity. It reaches a supplier of yours only if both match. What turns that into a number is three things about your position, not the world's.

Accumulation

Independent risks combine noisy-OR — two moderate problems in one region are worse than either alone, but never more than certain.

Dependence

Weighted by how much that input actually matters to you; a critical input carries its exposure at full weight, a marginal one at half.

No fallback

Single-sourced with no qualified alternate amplifies the score by 25% — the same event costs you more when you have nowhere else to go.

Risk bands

criticalscore ≥ 0.75
elevatedscore ≥ 0.50
watchscore ≥ 0.25
normalbelow 0.25

Alerts fire on the crossing, not the level. A supplier that sits at elevated for three weeks alerts once, when it gets there. That's the difference between a monitoring product people keep and one they mute.

Where the signals come from

GDELT's global news index — free, keyless, and the low-risk starting feed. Per region, Bellwether counts recent articles matching disruption vocabulary (ports, strikes, floods, sanctions, shortages, blockades, tariffs, closures) and normalises to intensity, saturating at 20 articles in the window. GDELT asks for at most one request every five seconds and Bellwether honours that, which is why live fetches are key-gated rather than open. Bring your own curated feed instead and the scorer takes it unchanged.

Try the scorer

/score is open and stateless — post a supplier list and a set of signals, get the ranked exposure back. Nothing stored, nothing fetched.

$ curl -s https://bellwether.forthecommongood.ai/score \
  -H 'content-type: application/json' -d '{
    "suppliers": [
      { "supplier_id": "s1", "name": "Kaohsiung Fab", "country": "Taiwan",
        "commodity": "semiconductors", "criticality": 0.9, "single_source": true },
      { "supplier_id": "s2", "name": "Ohio Stamping", "country": "United States",
        "commodity": "steel", "criticality": 0.4 }
    ],
    "signals": [
      { "source": "static", "category": "geopolitical", "region": "Taiwan",
        "commodity": null, "intensity": 0.6, "summary": "shipping lane disruption" }
    ]
  }'

Returns every supplier ranked by score, with the band it lands in and the signals that drove it — worst driver first.

Endpoints

POST /scorerank exposure, stateless
GET /bandsthe thresholds
GET /suppliersthe monitored portfolio · key
GET /alertscrossings, newest first · key
POST /suppliersadd to the portfolio · key
POST /signalslive GDELT read · key
POST /rungather, score, alert · key