This is not a flat manual but documentation in four layers, for four readers: who uses it, who wants to understand the idea, who builds it, and who wants to go further. Each layer carries a label saying how long it lasts.
Layer 1 — for the user1What you do with it moves with the code
/conflictThe four gauges
- One page with four gauges side by side: armament (per year), trade (per quarter), conflict events (per week) and news tone (per day). Each gauge shows a half arc from 0 to 100 with the needle on the score (50 = the median of 2000–2013, red above 60), the state as a word — loading, holding, discharging or rest — the trend in points, the latest raw value, and a line of the score over recent years, coloured per state.
- With armament the series in constant prices (SIPRI, bn USD) is shown informationally — not scored, but shown because % GDP rises when GDP shrinks (2009, 2020). The daily briefing shows the synchrony: how many layers and sub-theatres load at the same time — a reading, not a layer: a run-up runs in step, a series of incidents does not. Under each gauge: what exactly is measured, the base period with the number of base points, a link to the full series (
/api/conflict/reeks?laag=…) and the source. There is no total figure: the four layers are not added up. - The fifth gauge, hybrid (since 17 Sept 2026, monthly): the share of cyber incidents by Russia/Belarus against Europe in the whole EuRepoC register, over twelve months. This gauge has a different scale: not 0–100 but the surprise against the 2000–2013 base share in decibans (dB), without a ceiling — 13 ≈ a probability of 5%, 20 = 1% (red above that), every further 10 a factor of ten less likely; the arc stretches with the highest value of the series. Below the gauge the share with its count (k / N), the base share p₀, and informationally the physical incidents (sabotage, arson, reconnaissance) from Schuurman's register (Leiden) — not scored, because that series starts in 2022. The register appears as a release and runs to the end of 2024: once the last point is older than 500 days the gauge says "no current state". The scores of this gauge are not comparable with those of the other four.
- Top right NL·EN; the theme button bottom right. The page refreshes nothing itself; the sources are topped up at night.
/conflictThe daily briefing and todayat the top
- One line per layer: the state, the score, the change since yesterday, since a week and since a month (in points, red up, blue down), and how many days, weeks, quarters or years the layer has been in this state.
- Today, provisional: from the GDELT 2.0 quarter-hour files, updated hourly and counted on arrival — the number of theatre events, the conflict share and the tone of today so far. This is not a layer and does not count in the states; the states run on complete days.
/conflictThe sub-theatresbelow the gauges
- The two GDELT layers per part of the theatre — Baltic & North, Black Sea & Ukraine, Central Europe, West & South — each with score, state, trend and a line, against its own 2000–2013 base. Armament and trade are EU-wide and cannot be split. This shows where it loads while the whole stands still.
/conflictChanges and alertsRSS without an account, mail after confirmation
- The list of state changes per layer and per sub-theatre, in the order booked (date, layer, from → to, score). Booked at night after topping up and every hour with the hourly tick; stale layers book no change.
- RSS at
/api/conflict/wissels.xml, without an account. Mail: enter your e-mail address and click send confirmation mail; after the click in the mail you get one message at every change — at most one per layer per six hours, never a reminder, unsubscribe link in every mail. A change is a fact (state A → state B on a date), not an alarm and not advice.
/conflictThe action loopladder · register · scoring
- The ladder says in advance which state opens which room for action (rest → observe; holding → presence, communication; loading → reinforce, sanction, diplomacy, resilience; discharging → verify, de-escalate, record). It is an example ladder: doctrine belongs to the user; every version is kept with sha256 and never rewritten. Below it: what the current states per layer and sub-theatre open now.
- The register: date, layer or sub-theatre, kind from the ladder, what was done, who. On recording, the state and score of that moment are kept; historical dates are allowed (then from the blind series).
- The scoring after 90 days: score down by ten or more is ‘discharged’, up is ‘further loaded’, otherwise ‘level’, next to the base rate that the layer in that state would drop without any action. Per kind of action: count, share discharged, base rate. Historical examples (sanction packages 2014 and 2022, Minsk, NATO reinforcement, Finland and Sweden) are marked as demonstration. The plan of the loop is hashed (
plan-actielus.md).
/conflictThink along — human against machinethe forecasting panel
- Enter a panel name, pick a layer or sub-theatre, set with the slider your probability that the state changes within 30 days and click lock in. The model locks in its own probability at the same moment: the historical change frequency of that layer since 2014 (bounded between 1% and 99%). One open forecast per person per layer.
- After 30 days — or earlier, once a change is booked — the night loop scores it with the Brier score (square of probability minus outcome; lower is better), you next to the model. The panel shows per name the number of forecasts, how many scored, and both Brier means; below it the open and the scored forecasts. No account: the panel name is the key (kept in your browser). No advice — a calibrated ledger, also on offer for a pilot with analysts.
/conflictThe evidencethe events behind the number
- The conflict events Russia/Belarus ↔ Europe of the latest day with events: who against whom, the kind (force posture, reduce relations, coerce, assault, fight, mass violence), the source as a link, the number of articles and the tone. From the daily files (complete) and, for today, from the quarter-hour files (provisional). The source URL is the receipt.
/conflictThe blind backtestat the bottom of the same page
- Per layer a strip with the state per month from January 2014 to the last full month, in the four colours, with the two markers February 2014 (Crimea) and February 2022 (invasion) as a black line.
- Per marker: how many of the six months before said "loading", and the state at the marker itself. Per layer: how often "loading" occurred over the whole period — the alarm rate. It says what stands; the word prediction is not used.
- Test against ground truth. Below the backtest every layer lies next to Uppsala's death series (UCDP GED, battle deaths per month in Ukraine, Georgia and Moldova, to 2024): the onsets from the data (2008-08, 2014-04, 2022-02) with the states in the six months before, the lead-lag (does the layer run ahead of the deaths or behind — then it is a mirror), and the alarm precision and sensitivity of ‘loading’ against ≥ 200 deaths within three months. A report; changes nothing.
- The page says honestly what v1 is: from day one the current charge per layer from real sources; the predictive claim hangs on this backtest and on what is still to come.
Layer 2 — for the thinker2The idea & the rules lasting
A conflict loads long and discharges short. Armament, trade, behaviour and tone are four different clocks carrying the same tension, each at its own pace: the year, the quarter, the week, the day. Hence four layers and no index: a sum of four clocks is no longer a time.
The yardstick is frozen: the period 2000–2013 (for trade 2002–2013) is the reference against which everything after is read, and that reference never moves. A score of 50 means "like the median of then", 100 "above everything that occurred then". This is the same principle as the business climate in Financial Weather and the reference F in Support: a gauge that keeps its own zero even when the world shifts.
The four states come from level and trend: loading when the score rises ten points or more within the window, discharging at ten or more of fall, otherwise holding above 60 and rest below. This rule is the same level-plus-trend rule that failed in phase 0 on the HRV data on 14 Sept 2026. Here it gets its own test. The plan with all sets and thresholds was hashed before a single state after 2013 was computed, and is not adjusted afterwards — if the rule fails, that is booked.
The fifth layer and the scale without a ceiling. The outcome of v1 showed that a clipped quantile scale saturates as soon as the world comes to lie outside the base. The hybrid layer (17 Sept 2026, own plan, own hash) counts rare events — eight theatre incidents out of 420 in the base — and therefore reads not the rank but the surprise: how improbable is this count, given the share of then? That scale has no ceiling. The states keep the same form (trend ±10 = a factor of ten in probability; holding from 20 = 1%). The blind test is booked: failed as an alarm (the layer runs three months behind the deaths), but the scale discriminates within the new regime where the quantile scale was stuck. Biases noted in advance: the register codes in retrospect, attention for Russia rose after 2022, the tail of every release undercounts. We attribute nothing ourselves.
What the gauge deliberately is not: a sanction counter as a layer (that count is zero without spread in the base, so unmeasurable on this yardstick — the packages stand as markers on the trade gauge), policy advice, or a composite "conflict index".
Layer 3 — for the builder3How it works — sources, yardstick & API moves with the code
Context under the-maze like the bank and the Passage: maze/conflict/ — conflict.mjs (core), route.mjs (HTTP), bronnen.mjs (Eurostat trade and gas, World Bank fallback), sipri.mjs (SIPRI xlsx), gdelt.mjs (one daily file, zip via zlib), gdelt-backfill.mjs (the historical aggregation 2000–now, local, resumable, output data/gdelt-dag.csv), maatlat.mjs (smoothing, quantile, trend, state), theater.mjs (the frozen country sets), plan.md + plan.sha256. Tables cw_reeks (armament, trade, gas), cw_gdelt (daily counters theatre), cw_gdelt_land (daily counters per European country → sub-theatres, theater.mjs DEELTHEATERS), cw_event (top-15 conflict events per day with source URL, from 2015), cw_vandaag (GDELT 2.0, provisional, per arrival day), cw_v2_bestand, cw_gdelt_bestand, cw_import; alerts in alerts.mjs: cw_stand (last booked state per layer/part), cw_wissel (the changes, with gemaild_op), cw_abonnee (e-mail, token, confirmed, unsubscribed) — mail via Brevo (bank/mail.mjs, BREVO_API_KEY + MAIL_FROM on the-maze); the action loop in actie.mjs: cw_ladder (versions, hashed), cw_actie (date, part, layer, kind, description, who, horizon, state/score at, outcome, delta, base rate; example flag), scoring rekenActiesAf() in the night loop; the panel in panel.mjs: cw_voorspelling (name, layer, part, probability, model probability, deadline, outcome, brier, model_brier), scoring rekenAf() in the night loop against cw_wissel. The backfill writes three CSVs (day, country, events) imported at startup.
Layers. Armament: Russia milex % GDP and European NATO Σ milex USD / Σ GDP USD (SIPRI file, sheets "Current US$" and "Share of GDP", GDP = milex / share; World Bank MS.MIL.XPND.* as fallback; layer score = mean of the two sub-scores; 3-year trend). Trade: Russia's share of extra-EU trade (Eurostat ext_st_eu27_2020sitc, TRD_VAL, TOTAL, IMP+EXP), quarterly mean, inverted; sanction packages from a hand table as markers. Conflict events: dyadic events Actor1↔Actor2 between {RUS, BLR} and Europe (EU27 + GBR NOR ISL CHE UKR MDA GEO ALB MNE MKD SRB BIH), share with CAMEO root code 15–20, per week, 4-week smoothed. News tone: AvgTone of the same events weighted by NumArticles, per day, 30-day smoothed, inverted.
Fifth layer (hybrid). hybride-bouw.mjs (one operation, local: EuRepoC eurepoc_dyadic_dataset_0_1.csv → data/eurepoc-maand.csv with month, N, k; Schuurman xlsx → data/sabotage-maand.csv), hybride.mjs (the reader and the yardstick: p₀ = Σk/ΣN over 2000–2013; score = −10·log₁₀ P(X ≥ k | N, p₀), binomial, summed in log space so there is no underflow and hence no ceiling; 12-month window, point on the last day of the month; state: trend ±10, holding ≥ 20), plan-hybride.md + plan-hybride.sha256, uitkomst-hybride.md. The layer is the fifth in LAGEN (maatlat: "deciban", horizon 500 days) and therefore runs along by itself in the backtest, the test against UCDP, the changes, the panel and the action loop. A new release of the register = run the script again and commit the CSV. EuRepoC licence: CC BY-NC 4.0.
Yardstick. Score = 100 × quantile rank in the base distribution (mid-rank, outside the range 0 or 100). Trend = score(t) − score(t − 90 days) (year layer: 3 years). τ = 10. Backtest: state per month = the state of the last point on or before the last day of that month.
Known limits. GDELT's source base grew strongly in 2013 and 2015; the share and tone measures damp that, but it is a break inside the blind period. The year layer has 14 base points and moves in steps of ~7. Eurostat's trade series starts in 2002. SIPRI publishes in April; the file is found via the database page (sipri.mjs, zip + XML without dependencies). Gas imports from Russia (Eurostat nrg_ti_gasm, from 2014) are shown informationally with the trade gauge and are not scored: the series lies outside the base.
Layer 4 — for the connector4Links, sources & further moves with the code
- the gaugemaze.swarp.nl/conflict · the frozen plan · memo for Defence (Dutch): a weighing layer, not a fusion layer · outcome v1 (booked 16 Sept 2026, Dutch)
- sourcesSIPRI Military Expenditure Database · World Bank MS.MIL.XPND · Eurostat ext_st_eu27_2020sitc · GDELT Project · EU sanctions against Russia
- familyFinancial Weather (the same discipline: frozen yardstick, loading, no index) · Support (reference F and recovery index R) · the Passage
- theoryloading and discharge as the two layers of the net — see the loading and discharge simulation (Dutch); the failure of the four-state rule on HRV is in
maze/fase0-standen/uitkomst.md - honestyplan hashed before the blind run; states never adjusted; two markers are not statistics; no policy advice