Method
How the Sun is turned into a forecast, a sound, and a score — in plain language, every number traceable to a deposited record.
The ladder
The flare record is read as a cascade: a small stack of coupled layers, slow to fast, each either quiet or active. A slow layer holds a mood for weeks; a fast layer flickers day to day. The stack this record's likelihood prefers has six layers — a slow pair, a middle pair, a fast pair. It is a way of describing the record's multi-state structure, not a claim about the Sun's physical machinery.
This instrument's cascade controls are dial settings derived from a hierarchical cascade fitted to 50 years of solar flares (record v25). A fitted span is the ladder this record's likelihood prefers — a model-selection quantity, not a recovered physical hierarchy (Paper F §7.1–7.2).
The filter
A deterministic causal filter carries a belief over every combination of the six layers — sixty-four states in all — and updates it once per closed day from that day's count of M-class flares. Since the forecast began reading the Sun's active regions (record v70), every state's flare rate is also multiplied by a link on three inputs: a region index built from the day's Solar Region Summary — each region's McIntosh class, Mount Wilson type and area — the number of regions that are new, and the previous day's count of C-class-and-above flares. The belief is carried forward from the record's first day with those inputs, in January 1996: today's forecast is a function of a belief accumulated over three decades, not of the last few days alone.
Nothing is re-fitted live: the ladder, the link and the map applied to the filter's output are frozen, sealed constants from the upstream record (record v70), and this site only runs the filter against them. This ladder's six layers switch on timescales from about two and a half days to about seventeen — a narrower span than the count-only filter's, whose slowest layer held for years — so its belief is confidently settled less often, and the instrument's pins, which read it, engage only in clearly active spells. The count-only filter that made this site's forecast before (record v26's frozen ladder, with record v45's map) is kept running beside it for one purpose: the X-class tile is read from its belief. The separate full-record fit named above (record v25) is what the instrument's dial settings derive from; neither forecast uses it.
What it reads, and when
- NOAA's official flare list — the day's M-class flares, and its C-class-and-above flares, from the same list the forecast is scored on. The counts are on the scale that list reports (GOES-R) throughout: the record rescales the older satellites' readings by the published factor (Hudson et al. 2024), so a flare means the same thing in every year the filter has read.
- NOAA SWPC's Solar Region Summary, issued at 00:30Z every day: each numbered active region's area, McIntosh class and Mount Wilson type, as they stood at 24:00Z the day before. The forecast for a day reads the summary issued that day. It is the one input published after the forecast window has opened — half an hour into it — and it describes only the time before the window opened, so the forecast still sees nothing that happened inside the day it is scored on. If the live text is missing, the same regions are read from NOAA's region list, which carries them as observed the day before; if neither is there when the forecast is due, the forecast stands down for the day: a gap on the board, never the previous summary carried forward.
- Every summary the forecast reads is kept in
ledger/srs_captures.jsonl, append-only and hash-chained like the ledger, with NOAA's archive filling any day the job did not capture live — so any issued number can be recomputed from the committed files alone. The flare list and the Solar Region Summary are NOAA's (U.S. Government works, public domain).
The forecast
From the belief after the last closed day, the filter issues a one-step-ahead now-cast: the probability of at least one M-class flare in the next 24 hours. It is issued once per UTC day, the first run after the day's data has settled; every other hourly run only refreshes the flux reading and the clock — it never moves the forecast. A missed day is recorded as a visible gap, never back-dated — and so is a day the forecast stands down for want of that morning's region summary.
Two choices made for the early-warning forecast — where this site departs from the record's pre-registered rule, and why
The upstream record pre-registered a rule for which of its candidates a port should take, and the rule chose a logistic regression on the same inputs, with a map refitted on each trailing year. This site serves the cascade with the same link instead, with its static map. The cascade has a belief for the instrument to play, which a logistic regression does not; on the record's own test decade the two are not separable, and the trailing-year map's edge over the static one covers zero there and on the bridge — the honesty box gives both intervals. The static map carries no trailing-window state to bootstrap, resume or verify. Both choices were the owner's, made before the port, and both are recorded with the score epoch they begin.
When it is published, and how you can tell
A UTC day's forecast is scheduled for about 03:07Z — three hours into the very window it forecasts, and roughly twenty-one hours before that window closes. Those three hours are the settle margin: the official flare list is still receiving late reports for the day that just ended, and issuing before it settles would mean forecasting from an incomplete count. The forecast is computed only from observations made before 00:00Z — it never sees a minute of the day it will be scored on. The one input released after 00:00Z is the Solar Region Summary of 00:30Z, and it describes the Sun at 24:00Z the day before.
That time is the schedule, not yet the record. Until an on-time trigger for the issuing run is in place, the scheduler the job runs on has started it late — often several hours into the window. The issue timestamp inside each day's ledger line is the record of when that forecast was actually published. A late issue changes when a forecast is published, never what it knows: it is still computed only from days that closed before 00:00Z.
Publishing a few hours into the window is a real compromise, stated plainly rather than smoothed over, and the timing does not have to be taken on trust.
How the issue time is made checkable — the ledger line, the signed tail, the external timestamp, and the commands
- The issue timestamp is inside the ledger line and is hashed with it, so it cannot be moved afterwards without breaking the chain.
- The chain tail is signed — an Ed25519 signature over the tail hash, the line
count and the signing time, under the published production key
ff-pack-2026-09, whose public half ships in this repository's trust set. - The tail is timestamped externally. An OpenTimestamps proof commits it to public calendars and thence to the Bitcoin blockchain — the one anchor here that is not our own word. It is taken at issue, hours before the window closes and longer still before it is resolved, which is exactly the claim a forecast written after the fact could not survive.
node tools/verify_ledger.mjs --anchor-state ledger/state.json node tools/sign_tail.mjs --verify # the signed tail (once the production key has signed one) node tools/verify_ledger.mjs --ots # optional, networked: upgrade and verify the timestamp proof
What “certified” means here — the anchor gate, the append-only ledger, the mirror rule, and the stated ceiling
- Reproduces the seal. The forecast is the sealed record's construction, run live. The running code is a port, admissible only while it reproduces the sealed record's own day-by-day forecast to that record's re-derivation tolerance — an anchor gate checked on every change, with a deliberately-broken fixture proving it can fail.
- Scored in public, append-only. Every daily forecast is written to a hash-chained ledger and resolved against the official flare list. A wrong entry is corrected by a later dated entry, never edited; anyone can re-verify the whole chain from a clean clone.
- Mirrors, never first-publishes. Retrospective skill numbers appear here only after their deposit exists (the References below). The live forecast and its running score are this site's own first publication, and the two are never shown as one.
- States its ceiling. Most of the predictive information for M- and X-class flares lives in photospheric magnetograms this filter never sees; the Solar Region Summary it now reads is the forecasters' daily digest of them, not the field itself. The claim is skill from the event record and that digest — a cheap baseline, not a replacement for operational space-weather guidance.
The honesty box
The measured skill, stated once, with its caveats attached — verbatim, the same wording as the sealed records' own citation-gated sentence. Every number links to its deposit or its sealed record.
What is published is the early-warning filter's forecast passed through its sealed map, fitted on the training block alone (record v70); the map moves the probability only, never the belief the instrument plays. Before the change (score epochs zero and one) it was the count-only filter's forecast through record v45's map, and the box keeps that record too.
The M-class 24-h forecast published here now also reads NOAA's daily Solar Region Summary — its active regions' McIntosh and Mount Wilson classes and areas, and how many regions are new — and yesterday's C-class flares (record v70): the same six-layer cascade, its state rates multiplied by a link on those inputs, through a sealed two-parameter map. On the 2015–2024 test decade it scores Brier 0.0800 and BSS +0.464 against the decade's own M-day frequency — +0.046 [+0.028, +0.070] over the calibrated count-only cascade refitted on the same years, +0.051 [+0.028, +0.083] over the forecast this site served before it — and is better than NOAA's official next-day probability on the days both exist (Brier lower by 0.0063 [0.0022, 0.0106]); on the 2025–2026 bridge its margin over the refitted cascade is +0.051 [+0.012, +0.086]. The gain is largest after quiet spells, where a history-only forecast is blind (+0.121 [+0.086, +0.159] on the days after ten M-free days), but it is not a promise: on 2026-10-05 the morning's regions were small, and this forecast gives that day 3%. Two choices depart from that record's pre-registered rule and are stated with the same prominence: the rule chose a logistic regression on the same inputs, which has no belief for the instrument to play, and this site serves the cascade instead — the two are not separable (paired ΔBSS +0.004 [-0.005, +0.011] on the test decade); and the rule chose a map refitted on each trailing year, where this site keeps the static map fitted once on the training block — the refitted map's edge covers zero (+0.003 [-0.002, +0.007] on the test decade, -0.003 [-0.021, +0.021] on the bridge). The labels are on the GOES-R scale throughout: the pre-2017 irradiances × 1.43 (Hudson et al. 2024), the scale the live feed resolves on. The forecast is only as live as the Solar Region Summary: a day without that morning's summary is a gap, and the board says so. The flare list and the Solar Region Summary are NOAA's (U.S. Government works, public domain); no non-commercial series enters this forecast. Its six layers switch on timescales of days to weeks rather than days to years, so the instrument's pins, read from its belief, now engage only in confidently active spells. Until this forecast began (score epochs zero and one), the forecast published here was the count-only filter's, and the rest of this box is that record. On the 20-year held-out tail — a fixed-parameter causal filter, walked forward in state only — the M-class 24-h forecast published here was the sealed filter's forecast passed through a sealed two-parameter recalibration fitted on the training block alone (record v45), and it scores Brier 0.0784. Against the training-period climatology the sealed records use (a constant p = 0.419) that is BSS +0.605; against the verification period's own climatology (p = 0.144 — the reference a space-weather reader will assume) the same forecasts give +0.365. Before recalibration the identical filter scored Brier 0.0816 (+0.589 [0.521, 0.667] / +0.338) and over-issued in every reliability bin; the map moves probabilities only, never the belief the instrument plays. The ordering is identical under both references: the calibrated forecast leads a cycle-timescale rate baseline (+0.507 / +0.205) and recency persistence (+0.576 / +0.317), and the edge over persistence is a paired, interval-separated win (ΔBSS +0.029 [+0.020, +0.038] against the training reference; +0.047 [+0.035, +0.061] against the verification reference), while persistence keeps the higher peak TSS (0.633 vs 0.621). Two results cut the other way and are stated with the same prominence: a logistic regression on the same seven days of counts scores slightly better than the calibrated cascade (+0.373 against the verification reference; paired ΔBSS -0.009 [-0.017, -0.002], record v46), and once calibrated a four-layer ladder or a free five-state hidden Markov model forecasts as well as the sixty-four-state ladder (paired intervals cover zero, record v47) — the depth is not what buys the skill. Read at longer leads the same honesty holds: against an h-matched field the count-only logistic still scores better at every lead measured, one to fourteen days, and past about three days of lead the cycle-timescale rate overtakes the uncalibrated filter (record v49). The live board scores each epoch against its pinned reference and prints the training constant, the verification constant and the realised in-window base rate beside every score, so the live strips and the backtest strip stay comparable. The X-class tile beside the forecast is still read from the count-only belief, kept running for the tile alone, and carries a caveat of the same kind: that sixty-four-state belief carries X-relevant information only through the rate — one constant flare-level X fraction applied to the M-class rate reproduces the tile's skill, and the calibrated paired difference between the two covers zero (record v52). Most M/X predictive information lives in magnetograms these forecasts never see — the Solar Region Summary is the forecasters' daily digest of them, not the field itself. Research demonstration and baseline layer — not operational space-weather guidance. Only the M-class forecast is scored; the X-class tile is a display of the sealed real-label re-run, not a scored product.
Why two climatologies — which baseline a skill score is measured against, and why each score epoch pins its own
A skill score compares the forecast to a naive baseline, and the answer depends on which baseline. The sealed record uses the training-period climatology it was built on; a space-weather reader will instead assume the verification period's own base rate, which is lower because solar activity declined across the cycles in the tail. Both are shown, because quoting only the larger number beside a live board scored on the smaller one would make the two strips numerically incomparable — on a site whose whole thesis is comparability.
The live board scores each epoch against its pinned reference. Epoch zero is scored against the verification-period convention; epoch one, which begins with the first day issued under the recalibrated model (record v45), against a cycle-conditioned climatology, because a fixed reference from a quieter period flatters near cycle maximum; epoch two, which begins with the first day issued under the early-warning model (record v70), against the same cycle-conditioned rule counted on the scale the live flare list reports — pinned before its first day. Every epoch keeps its reference forever, and the board prints the training constant, the verification constant and the realised in-window base rate beside every score, so every strip can be read on the same scale. Changing a reference starts a new score epoch — a stated, owner-confirmable choice, never a silent one.
Sunspot numbers: source WDC-SILSO, Royal Observatory of Belgium, Brussels
(CC BY-NC 4.0), vendored and checksum-pinned; the cycle-conditioned constants are derived by
tools/cycle_climatology.mjs and pinned in contracts/scoreboard.pins.json.
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.
-
record v70 — Fenocosm record v70 — the label-harmonised, region-informed, recalibrated M-class now-cast (the early-warning cascade: NOAA's Solar Region Summary and yesterday's C-class flares, on the live GOES-R label scale). the forecast this site now publishes — its ladder, its link and static map, the sealed per-day forecast the anchor gate reproduces from 1996 on, the test-decade and bridge scores and every paired interval in the honesty box's early-warning sentences.
sealed 2026-10-11 · Fenocosm out/v70/p117_ew_nowcast.json @ b0634efcbd54 · Zenodo deposit 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