One simulated week of English Bluesky (Sep 18–25, 2026). Three losses, each at two timescales. Lower is better.
Likes scored once on the whole week; followers scored day by day.
The same three losses on every 2-day stretch of the week (days 1–2, 2–3, … 6–7), averaged over the six stretches.
One week of English Bluesky, Sep 18–25, 2026 (days 1–7 are UTC days, day 1 = Sep 18). Everything the held-out accounts did that week and real news-account posts are copied into the simulation at the real moment; the rest of the network is simulated, with no required number of runs: each loss scores the chances and counts an entry reports. Older entries report averages over 8 runs, which adds some sampling noise. Three losses: who liked each post (Loss 1), how many followers each account gained and lost (Loss 2), and how many likes each post got (Loss 3). Each is reported at its headline timescale and again on 2-day windows, so every entry has six numbers. Lower is better, 0 is perfect, none is capped.
For every held-out post: did each person like it, and how sure was the simulation? Scored once per post at the end of the week.
Reading it: 0 = every liker right with full certainty · 1.12 = named no one · 2.25 = right count, all the wrong people.
Why squared: plain distance \(|p-y|\) is minimised by rounding every person to 0 or 1, which throws away the uncertainty. Squaring charges a full 1 for confidently wrong and 0.09 for saying 30% to someone who didn't like it, so the best report is the true chance. Why divide by \(c_g\): each group is its own test of the simulation, and groups of large accounts would otherwise outweigh the rest. One number per group puts the tests on one scale and divides nothing away inside a group, so missing every liker on a 2,000-like post costs 400 times as much as on a 5-like post. \(c_g\) comes from before the week and is the same for every entry, so the best report stays the true chance, apart from a small effect of groups being partly defined by the week's likes.
For every held-out account and day: how many followers it gained and lost, split by the follower's size. The exact person is not scored (under 1% per person, too rare to score); the kind of account is.
Reading it: stays in log units · 0 = every daily count exactly right · 0.69 ≈ typically off by 2× · 2.3 ≈ off by 10×. When all counts agree, CRPS is plain \(|x-y|\).
Why subtract half the spread: the first term alone is minimised by collapsing all counts onto one value. Subtracting half the spread makes a forecast shaped like reality the best one; subtracting all of it would let a scattered forecast score below zero. Why log, not percent: percent error is lopsided and caps at 1, so a 10× miss and a 1,000× miss look the same; log keeps counting, which is where the growth accounts live.
For every held-out post: how many likes did it get, against the simulation's expected count? Loss 1 checks who liked; this checks how many. Scored once per post at the end of the week.
Reading it: 0 = every post's expected count exactly right · for a post at the group's usual level, ≈ 0.61 = predicted 2× too many, ≈ 0.39 = predicted half as many · ≈ 13 = 10× too many, ≈ 2.8 = a tenth as many.
Why Poisson deviance: it is the Poisson log-likelihood shifted so a perfect count scores 0, and its best report is the true expected count, so a simulator cannot gain by shading its counts up or down. It is the count companion to Loss 1: a simulation that gives a post the right number of likes from the wrong people does well here and badly there. Why divide by \(c_g\): deviance grows with the size of the count, so groups of large accounts would otherwise outweigh the rest; inside a group, a bad miss on a big post still costs more than on a small one. As in Loss 1, the best report stays the true expected count, apart from the same small effect.
Every loss is also scored on 2-day windows of the same forecast and averaged over the windows. Seven days give six windows, one starting on each of days 1–6, so no day is dropped: \(W_1\) = days 1–2, \(W_2\) = days 2–3, …, \(W_6\) = days 6–7. Days 2–6 fall in two windows, days 1 and 7 in one. The headline likes losses only look at the week's totals; the 2-day versions also check when the likes came. The headline follower loss looks at single days; the 2-day version forgives a follow landing a day early or late but still checks the 2-day totals.
Bar height is \(e^{-\text{loss}}\): 1.0 for perfect, 0.5 at a loss of 0.69, 0.25 at 1.39. Entries are ordered by the average of \(e^{-\text{loss}}\) over all six numbers, \(\tfrac{1}{6}\sum_{i=1}^{3}\big(e^{-L_i} + e^{-L_i^{\text{2d}}}\big)\), highest first. Entries submitted before Sep 30, 2026 have only \(L_1\) and \(L_2\) at the headline timescale, with \(L_1\) divided by each post's real likes; they are listed after the complete entries, ordered by \(\tfrac{1}{2}\big(e^{-L_1} + e^{-L_2}\big)\). Their \(L_1\) is marked * and drawn faded, and left out of the best Liker Brier; naming no one scores 0.600 that way and 1.12 now.