Control Room/MSI/Methodology

Transparency · methodology

How the MSI is computed

The MSI — the Monitoring Situation Index — is one live number from 0.0 to 10.0 for how much is happening in the world right now. This page documents exactly what the computation does: its inputs, its weights, the scale, the cadence, the history it keeps, and — just as important — what the number does not claim. It is written against the live code, so it describes the endpoint as it actually runs.

Reflects the live computation as of 2026-08-21.

The formula

The MSI is a weighted sum of three signals. Each signal is normalised to a 0–1 range, multiplied by a fixed weight, summed, and scaled to a 0–10 score. The weights are fixed in the code and sum to 1.0.

MSI = 10 × (
    0.40 · market     // avg |BTC, ETH 24h %| / 8   (CoinGecko)
  + 0.35 · seismic    // M4.5+ quakes in 24h / 40    (USGS)
  + 0.25 · velocity   // drift vs trailing baseline  (own history)
)                     // formula v2 — 2026-08-21

The result is rounded to one decimal place. Every component is clamped to 0–1 before it is weighted, so no single signal can push the score outside 0.0–10.0.

The three inputs

Market

weight 0.40

Input: CoinGecko — 24h % change of BTC and ETH

average(|BTC 24h %|, |ETH 24h %|) / 8, clamped to 0–1. An average absolute move of 8% or more reads 1.0.

Seismic

weight 0.35

Input: USGS — M4.5+ earthquakes in the last 24h

quake_count / 40, clamped to 0–1. Forty or more magnitude-4.5-or-greater events in 24 hours reads 1.0; an ordinary day (12–20) reads 0.3–0.5.

Velocity

weight 0.25

Input: Recent MSI history vs the current live base

The score the two live inputs alone imply (10 × (0.40·market + 0.35·seismic) / 0.75, so it sits on the same 0–10 scale as stored scores) is compared against the trailing average of the oldest ten stored samples; the drift is mapped to 0–1 with ±5 points saturating. Neutral (0.5) until at least three samples exist.

What the live index reads today

To keep this page honest, we document only the feeds the live /api/msi endpoint actually queries when it recomputes:

  • CoinGecko — the 24h percentage move of Bitcoin and Ethereum (used, in absolute terms, for the market signal).
  • USGS — the count of magnitude-4.5-or-greater earthquakes in the last 24 hours.

The velocity signal is derived from the index's own stored history, not a separate feed. All inputs are free, public, commercial-use-OK sources. We list only what the current endpoint queries — no private data, no opinions, and no news feed.

Changelog

v2.1 — 2026-08-22

Seismic calibration: the divisor moved from 10 to 40 events per 24 hours. USGS records roughly 12–20 M4.5+ events on an ordinary day, so the v2 transform saturated on a quiet planet (first live reading: 9.1 "intense" with 25 quakes). The fetch cap was raised from 50 to 200 events so the count cannot clip.

v2 — 2026-08-21

Formula v1 weighted a news feed (GDELT) at 0.70 of the score — headline volume, source spread and tone, plus a velocity derived from volume. That feed was retired for reliability: chronic rate limiting and timeouts left the index unmeasurable most of the time, and an index that cannot be measured is not an index. No replacement news source was added. v2 reads two feeds — CoinGecko and USGS — at 0.40 and 0.35, with velocity at 0.25 derived from the index's own stored history.

History recorded before 2026-08-21 was computed under v1 and is not like-for-like with v2 readings. The stored series was kept rather than wiped, so a chart spanning the change shows a real discontinuity, not a world event.

Cadence and history

Scale

0.0 – 10.0

Rounded to one decimal

Cadence

≤ 1 / 60s

Server + CDN cache TTL

History

Rolling 24h

1,440 samples, then trimmed

The reading is recomputed at most once every 60 seconds: each value is cached server-side for 60s, and the CDN serves it with a matching 60-second freshness window. That 60s is a ceiling, not a heartbeat — no cron computes the index, so a reading is taken when one is requested and the cache has lapsed, and no requests means no readings. Each measured reading — one where every input answered — is appended to a rolling history capped at 1,440 samples, the most 24 hours could hold, after which the oldest are trimmed. A pass with a missing input is not appended at all, so the series pauses rather than recording a partial number. In production the history is persisted in Redis so it survives cold starts; in local development it falls back to an in-memory store.

0–2 · Calm

Nothing unusual happening.

2–4 · Background

Normal activity. Minor stories.

4–6 · Active

Meaningful events developing.

6–8 · Escalating

Multiple concurrent active situations.

8–10 · Intense

Major unfolding event(s) dominating signals.

What the MSI does not claim

  • It is not a forecast. It reads the present from public signals; it does not predict what happens next.
  • It is not advice — not financial, legal, or betting advice, and not a recommendation to take any action.
  • It does not price or rate any single market, asset, or event. It is one aggregate reading of public signals.
  • It is not a sentiment score, and since 2026-08-21 it is not a measure of news coverage. The market input is the size of a price move, not an opinion about any market.
  • When an upstream feed is unavailable, the endpoint returns the last cached reading or a neutral mid-band value so the display never breaks. That fallback is a display safeguard, not a measurement.

Common questions

What is the MSI?

The MSI (Monitoring Situation Index) is a single observable number from 0.0 to 10.0 that summarises how much is happening in markets and the physical world right now. Since formula v2 (2026-08-21) it is a weighted sum of three normalised signals — crypto market volatility, significant seismic activity, and velocity against the index's own recent history — each scaled to a 0–1 range and combined into a 0–10 score.

What data does the live MSI actually read?

The live /api/msi endpoint queries two public feeds each time it recomputes: CoinGecko (the 24h percentage move of Bitcoin and Ethereum) and USGS (the count of magnitude-4.5-or-greater earthquakes in the last 24 hours). Velocity is derived from the index's own stored history rather than a separate feed. It reads no news feed: the headline inputs used by formula v1 were retired on 2026-08-21.

How often is it recomputed, and how far back does it go?

The value is recomputed at most once every 60 seconds — the server caches each reading for 60s and the CDN serves it with a 60-second freshness window. That is a ceiling, not a heartbeat: no scheduled job computes the index, so a reading is taken when one is requested and the cache has lapsed. Each measured reading — one where every input answered — is appended to a rolling history capped at 1,440 samples, the most 24 hours could hold, and older samples are trimmed. A pass with a missing input is not appended, so the series pauses instead of recording a partial number. History is persisted in Redis in production, with an in-memory fallback in local development.

What is the 0–10 scale?

0.0 means nothing unusual; 10.0 means a major event is dominating the signals. The score is bucketed into five bands: 0–2 calm, 2–4 background, 4–6 active, 6–8 escalating, and 8–10 intense. The final score is rounded to one decimal place.

What does the MSI NOT claim?

It is not a forecast, a prediction, or advice. It reads the present from public signals; it does not predict the future, price any market, or recommend any action. It is not a measure of any single asset or event, not a sentiment score, and — since 2026-08-21 — not a measure of news coverage at all. If an upstream feed is unavailable, the endpoint falls back to the last cached reading or a neutral mid-band value so the display never breaks — that fallback is a display safeguard, not a measurement.

Related

The MSI is an observable index of public signals · information, not advice