Scoreboard
A live, tamper-evident record of daily M-class forecasts, resolved in public against the official flare list — with climatology and persistence on the same board.
Live
Live board — this repo's own measurement
Every day the filter issues one forecast; at the day's close it is resolved against the official flare list and the running scores update. The board is append-only and hash-chained: a wrong entry is corrected by a later dated entry, never edited.
Running record on 5 resolved day(s): 0 verified M-class day(s), an observed base rate of 0.000, and a forecaster Brier of 0.037.
| baseline | days it could issue for | its Brier | forecaster Brier, same days | its BSS vs this epoch's reference |
|---|---|---|---|---|
| logistic on daily counts (record v46) | 5 | 0.007 | 0.037 | — |
A cheap competitor that sees nothing but the daily M-class count history, with coefficients pinned from the sealed upstream record and never refitted here — a baseline that learned from the days it scores would not be a baseline. On that record's held-out tail it beat the calibrated forecaster this site ships, which is precisely why it is on the board rather than left off it. Its Brier and the forecaster's are computed over the same days, because two scores over two different day sets are not a comparison. Where the count history has a hole the feature window carries forward past it rather than inventing a quiet day, so across a gap its trailing windows reach further back than their names suggest.
Too few days for a skill score. A skill score divides by a reference Brier estimated from the same handful of days, so on a short board it measures which days happened to land in the sample rather than the forecast. This board prints no BSS — against climatology, against persistence, or against anything else — until it has thirty resolved days. The count, the hits, the base rate and the Brier above are the whole of what a board this short can honestly say. The verification board, folded below, still shows the shape of the forecasts — reliability, sharpness, and where the Brier score comes from — because those describe these days rather than score them against a reference.
| forecast day (UTC) | score epoch | P(M-class, next 24 h) | resolved | M-class events |
|---|---|---|---|---|
| 2026-09-03 | 0 | 0.431 | no flare | 0 |
| 2026-09-04 | 0 | 0.353 | no flare | 0 |
| 2026-09-05 | 0 | 0.464 | no flare | 0 |
| 2026-09-06 | 0 | 0.520 | no flare | 0 |
| 2026-09-07 | 0 | 0.413 | no flare | 0 |
| 2026-09-08 | 0 | 0.353 | no flare | 0 |
| 2026-09-09 | 0 | 0.310 | no flare | 0 |
| 2026-09-10 | 1 | 0.223 | no flare | 0 |
| 2026-09-11 | 1 | 0.204 | no flare | 0 |
| 2026-09-12 | 1 | 0.189 | no flare | 0 |
| 2026-09-13 | 1 | 0.176 | no flare | 0 |
| 2026-09-14 | 1 | 0.166 | no flare | 0 |
| 2026-09-15 | 1 | 0.156 | pending | — |
How this board is referenced — what it is scored against, and what it will be
- This epoch's scored reference is the verification-period constant, p = 0.144 — the M-class-day frequency of the sealed record's held-out tail. It is fixed for the life of the epoch. Days already scored under it are never re-scored under anything else.
- Why the fixed reference flatters the model near cycle maximum. That p = 0.144 is the average of a held-out tail that spans a deep minimum as well as an active stretch. The Sun is not at that average now. A constant that under-forecasts the current rate is itself a badly calibrated forecast, so its reference Brier is large — and skill measured against a large reference Brier looks impressive without the forecaster doing anything. Conditioning the climatology on where the cycle actually is puts the reference at p = 0.298: the M-class-day frequency over the sealed fifty-year flare series, restricted to the months whose smoothed sunspot number sat in the same decile as today's. That is roughly twice the fixed constant, and it is a far harder thing to beat. It is not swapped in mid-epoch — changing the scored reference is exactly what starts a new epoch, which is why it is pre-registered above instead.
- Sunspot numbers: source WDC-SILSO, Royal Observatory of Belgium,
Brussels (CC BY-NC 4.0), vendored and checksum-pinned; the cycle-conditioned constant is derived
by
tools/cycle_climatology.mjsand pinned incontracts/scoreboard.pins.json.
For the verification reader — reliability, sharpness, the Murphy decomposition, discrimination, and the month-by-month strips
Every figure below is computed from the same committed ledger days as the scores, with the same functions the sealed backtest strip uses. It is a live board: it is expected to look thin, and it is shown thin rather than waited out.
Where the Brier score comes from
| term | value | what it is |
|---|---|---|
| reliability (REL) | 0.037 | the calibration penalty — how far each bin's outcome frequency sits from the probability the bin promised. Lower is better; zero is perfect calibration. |
| resolution (RES) | 0.000 | how far the bins' outcome frequencies move away from the overall base rate — the useful part, the discrimination the forecaster adds. Higher is better. |
| uncertainty (UNC) | 0.000 | the base rate's own variance over these days. Nothing a forecaster does changes it; it is the difficulty of the sample. |
| REL − RES + UNC | 0.037 | equals the Brier score above — the identity is the check that this decomposition is of this board and not of something else. |
Discrimination
Sweeping a yes/no decision threshold across the issued probabilities (the ROC sweep) gives a peak true skill statistic — but that is a skill score, and this board is below its minimum: too few days for a skill score. It appears once the board has thirty resolved days.
Month by month
| month (UTC) | resolved days | M-class days | base rate | Brier |
|---|---|---|---|---|
| 2026-09 | 5 | 0 | 0.000 | 0.037 |
No skill score is shown per month: every month is far below the minimum this board requires before it prints one.
Backtest
BACKTEST (sealed v26 — a 20-year held-out tail, walked forward in state only)
The sealed record's own out-of-sample test: a fixed-parameter causal filter, walked forward in state only, over a 20-year held-out tail (7,305 days, ≈2005–2025) of the fifty-year GOES/XRS record, trained on the leading 60%. It is a backtest, kept on its own strip and never merged with the live board above; on that tail the cascade filter scores Brier 0.0816.
| forecaster / baseline | BSS vs training climatology | 95% CI on that BSS | BSS vs verification climatology | peak TSS |
|---|---|---|---|---|
| cascade filter — record v26 | +0.589 | [0.521, 0.667] | +0.338 | 0.621 |
| cascade filter, calibrated — record v45 | +0.605 | — | +0.365 | 0.621 |
| persistence — record v26 | +0.576 | [0.504, 0.662] | +0.317 | 0.633 |
| cycle-timescale rate — record v26 | +0.507 | [0.427, 0.601] | +0.205 | — |
The cascade forecaster leads the cycle-timescale rate baseline and edges recency persistence on point estimates, within overlapping confidence intervals; persistence has the higher peak TSS. The cycle-timescale rate is named as what it is — a slow rate baseline — never as a win over the published forecaster.
On that same tail the calibrated re-seal of these forecasts scores Brier 0.0784 — the row above, labelled by its own record.
What the calibrated re-seal is, and what it did not fix
The second forecaster row is the same sealed forecasts, calibrated — a two-parameter map fitted on the record's training block alone and applied to the probabilities — sealed as its own record beside the raw one, never merged with it and never with the live board. Calibration is a strictly increasing map, so it moves no ranking at all: the peak true skill statistic is unchanged, and recency persistence keeps the higher one. It moves the probabilities, which is the defect it repairs. The record's own pre-registered reliability target was not met even so: the worst calibrated bin still misses the diagonal by more than the target allowed, and the residual error sits in the sparse high-probability bins. On that record, calibration bought skill — not a flat reliability diagram.
Record v45 —
the calibrated re-seal of these same forecasts (no refit, no new observations). Sealed upstream and
vendored here with a pinned SHA256 checksum
(vendor/fenocosm/v45_calibration_anchor.json); no deposit has been minted for it yet,
so it is cited by record id and pin rather than by a DOI it does not have.
Backtest
BACKTEST (sealed v49 — the same frozen filter read days ahead, h-matched field)
The sealed record reads the same frozen filter further ahead: for each lead time from one to fourteen days it issues the day's flare probability from counts up to the day minus the lead, against a field matched to the same information cut — recency persistence, the cycle-timescale rate, and a count-only logistic, each frozen at the matching lag. Same 7,305-day held-out tail as the strip above, scored against the verification-period climatology (p = 0.144 — the live board's convention), with paired block-bootstrap intervals throughout. The no-peeking property is measured, not assumed: at every lead the record probes that bumping a future day's count moves no earlier forecast, and at one day of lead the curve reproduces the sealed daily forecast trace exactly. A backtest, on its own strip, never merged with the live board.
| lead time | cascade BSS | cascade BSS, calibrated | persistence BSS | cascade − persistence, 95% CI |
|---|---|---|---|---|
| one day | +0.338 | +0.365 | +0.317 | +0.021 [+0.012, +0.029] |
| two days | +0.253 | +0.297 | +0.223 | +0.030 [+0.018, +0.042] |
| three days | +0.200 | +0.259 | +0.159 | +0.041 [+0.026, +0.057] |
| five days | +0.133 | +0.212 | +0.068 | +0.066 [+0.045, +0.090] |
| seven days | +0.112 | +0.201 | +0.040 | +0.072 [+0.045, +0.103] |
| fourteen days | +0.082 | +0.184 | -0.004 | +0.086 [+0.052, +0.123] |
The edge over persistence is at its smallest where the headline strip measures it (one day: +0.021 [+0.012, +0.029]) and widens with lead (fourteen days: +0.086 [+0.052, +0.123]): recency decays far faster than the filter — by fourteen days persistence scores below the climatology itself while the cascade still holds skill. Recalibration is worth more the further out the forecast is issued: the training-block map adds +0.026 at one day and +0.102 at fourteen.
Two results cut the other way, and are stated with the same prominence. The h-matched count-only logistic beats the cascade at every lead time — calibrated against calibrated, the paired difference is -0.009 [-0.017, -0.002] at one day and -0.029 [-0.053, -0.007] at fourteen — the same cheap competitor the live board carries as a baseline. And past roughly three days the raw filter's edge over the cycle-timescale rate is gone: their paired difference covers zero at three days and is negative from five (-0.100 [-0.147, -0.063] at fourteen) — at long lead, most of what the raw filter knows is cycle tracking, which is also why the calibrated form is the one worth reading there.
The record scores the recent bridge window separately and never pools it with this tail; on that short, unusually active window only the one-day lead stays positive against the window's own base rate, and the record quotes it as such. No lead-time forecast is issued live: the live board above is a one-day board, and this strip is the sealed record's measurement, not this repository's.
Verify this ledger yourself — the commands, from a clean clone, with no network and no build
The ledger is the audit trail — not the job's logs, which expire and are not content-addressed. Every line carries the hash of the line before it, so any edit to history breaks the chain.
git clone <repo> && cd <repo> && npm ci node tools/verify_ledger.mjs --anchor-state ledger/state.json # chain, structure, published anchor python3 tools/verify_ledger.py ledger/scoreboard.jsonl # an independent re-implementation node tools/sign_tail.mjs --verify # the signed tail, once signed node --test tests/ledger/*.test.ts # re-derives the scores from the ledger and cross-checks them
The verifier ships as a standalone public artifact — the ledger plus verify_ledger.mjs,
carrying no engine or coupling code — so the chain is third-party-checkable even while the main
repository is private. A silently edited line, or a broken link, is rejected: the
committed tamper fixtures are the demonstrated failure mode. A full re-seal that recomputes every
following hash is caught against an external anchor — the append-only history, each published state
file's recorded chain tail, the signed tail, and an OpenTimestamps proof of that tail taken at
issue, which commits it to the Bitcoin blockchain and so is the one anchor not written by us. The
second command above is a standard-library-only Python re-implementation of the same canonical
form: two independent verifiers agreeing on the committed ledger is what makes the specification,
not our code, the thing you have to trust. Resolution runs at each window's close plus six hours,
against the pinned official flare list.
References
Retrospective numbers mirror a deposited record; they never first-publish here (SPECS §7). The three founding deposits are published and every DOI below resolves (launch gate G2, cleared); the later sealed records (v45 and after) are cited by sealed record id and commit, their deposits pending.
-
Paper F — Hidden multi-state structure versus the piecewise-Poisson flare rate on 50 years of GOES/XRS solar flares (Paper F). the skill numbers, the two-reference climatology table, and the span-selection reading (§7.1–7.2).
https://doi.org/10.5281/zenodo.22180473 -
record v26 — Fenocosm record v26 — the now-cast construction (deterministic causal filter, frozen fitted ladder). the sealed backtest aggregate: Brier, both-reference BSS, the reliability diagram, the held-out-tail window.
https://doi.org/10.5281/zenodo.22180495 -
record v25 — Fenocosm record v25 — the full-record fit. the fitted ladder the instrument's cascade dial settings are derived from (§6).
https://doi.org/10.5281/zenodo.22180493 -
record v45 — Fenocosm record v45 — the calibrated re-seal (Platt map fitted on the training block; paired block-bootstrap differences). the calibrated Brier and both-reference BSS, the paired cascade-minus-persistence intervals, the sealed map the live forecast applies.
sealed 2026-09-09 · Fenocosm out/v45/p103_nowcast_calibration.json @ ae5ab048179e · Zenodo deposit pending -
record v46 — Fenocosm record v46 — the cheap-challenger tournament (a logistic regression on the same counts, the two-EWMA GLM, the stack). the paired calibrated-cascade-minus-logistic interval, and the logistic baseline the epoch-one board carries.
sealed 2026-09-09 · Fenocosm out/v46/p104_nowcast_challengers.json @ ae5ab048179e · Zenodo deposit pending -
record v47 — Fenocosm record v47 — the hierarchical-vs-flat ablation in forecast metrics (ladders of one to six layers; free Poisson-HMMs of two to six states). the paired intervals showing four layers, or a free five-state HMM, forecast as well as the sixty-four-state ladder once calibrated.
sealed 2026-09-09 · Fenocosm out/v47/p105_nowcast_ablation.json @ ae5ab048179e · Zenodo deposit pending -
record v49 — Fenocosm record v49 — the per-horizon flare skill curve (the frozen filter read at one to fourteen days of lead, against an h-matched field, with paired intervals). every number on the lead-time backtest strip: the per-horizon skill of the cascade raw and calibrated, h-matched persistence, cycle-rate and logistic baselines, and the paired differences.
sealed 2026-09-10 · Fenocosm out/v49/p107_nowcast_horizon.json @ 117a258a5966 · Zenodo deposit pending -
record v50 — Fenocosm record v50 — the real-label X-class re-run (five hundred sixty-eight real X-class flares; the per-state fraction read from the frozen filter's belief, calibrated). the X-class tile's read-out: its per-state fraction rule, its calibration map, and the paired evidence that it beats X-class persistence.
sealed 2026-09-10 · Fenocosm out/v50/p108_nowcast_xclass.json @ 117a258a5966 · Zenodo deposit pending -
record v52 — Fenocosm record v52 — the marked flare channel (does the latent activity regime set flare size, or only flare rate?). the X tile's mechanism: the sixty-four-state belief carries X-relevant information only through the rate — one constant flare-level X fraction on the M-class rate reproduces v50's X-day skill, and the calibrated paired difference covers zero.
sealed 2026-09-11 · Fenocosm out/v52/p110_flare_marks.json @ 8047648d8363 · Zenodo deposit pending