Common Good Industries

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 the plan calls for. Per region, Bellwether counts recent articles matching disruption vocabulary (ports, strikes, floods, sanctions, shortages, blockades, tariffs, closures) and normalizes 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
GET /alertscrossings, newest first
POST /suppliersadd to the portfolio · key
POST /signalslive GDELT read · key
POST /rungather, score, alert · key