Scoreboard
A verdict is one forecast held to account: the score we gave a spot N hours ahead, against the bucket a wave buoy says the sea actually reached — re-scored through the same scorer, so the two numbers are comparable. Misses are published too; a hits-only ledger is marketing. Buoy-verified inputs only — no cam or human verdicts yet.
Published verdicts
124465
since 29 Aug → 1 Nov (UTC)
Exact hit rate
67%
Same bucket as the buoy, on the nose.
Within one bucket
84%
Off by at most one step of the five.
Spots covered
17
Breaks with at least one published verdict.
Same verdicts, same buoy, one difference in how the observed sea is scored.
Strict (Tm substituted)
publishedPeriod fallback
period_fallback_v1The fallback keeps the forecast's own period on the 48032 rows where the buoy's mean period fell under the spot's floor while its peak period did not (windsea days); those rows then test height and direction only.
7215 verdicts turn from miss to hit under the fallback and 1111 the other way. The published number above is still the strict one.
How far ahead the call was made. Longer lead, thinner ice.
| Lead (h) | n | Exact | ±1 | Bias (buckets) | Hs bias (m) | Period bias (s) | Dir error (°) |
|---|---|---|---|---|---|---|---|
| 6 | 21352 | 68% | 84% | -0.24 over-called | +0.26 | -0.38 | 5.8 |
| 12 | 21258 | 68% | 84% | -0.23 over-called | +0.26 | -0.37 | 6.0 |
Method & caveats
The observed bucket is this site's own scorer re-run with the buoy's sea substituted into the forecast's dominant partition, scaled by that partition's share of the total. The period substituted is the buoy's TOTAL-spectrum MEAN period (Tm), because Open-Meteo's swell_wave_period — what the scorer was tuned on — is also a mean period; on a windsea day Tm can sit under the scorer's hard period floor while the peak period is comfortably above it, which disqualifies the re-score rather than the forecast. Those rows are counted as rescore_disqualified, never silently dropped.
period_fallback_v1 changes exactly one thing about the strict re-score: when the buoy's TOTAL-spectrum MEAN period (Tm) falls under the spot's period floor while its PEAK period (Tp) does not, the substitution keeps the FORECAST's own partition period instead of substituting Tm. Those are windsea days — a long groundswell under a short local sea — where Tm is dragged under the floor by waves that are not the ones the break works on, so the strict re-score records observed = flat for a definitional reason rather than an observed one (live 2026-09-01: 757 of 759 period_below_min rows had Tp >= 6 s AND a forecast partition period >= 6 s). The forecast's period is used rather than Tp because Tp is the peak of a mixed spectrum and is biased high by several seconds against the mean period the scorer was tuned on, whereas the forecast period is unbiased against Tm (-0.6 s live); substituting a Tp would invent a better sea than the buoy saw. Keeping the forecast's own period means the variant tests HEIGHT and DIRECTION only on those rows, and says so.
46115 of the published verdicts read "flat" because the scorer disqualified the observed sea rather than scored it. Most of those are a period problem, not a forecast problem: the buoy publishes a total-spectrum mean period (Tm) which we substitute for the forecast swell period, and on a windsea day Tm is dragged below the scorer's hard floor while the actual peak swell period is fine. Those rows count as misses against us; we show the number rather than hide it.
12228 zero-hour nowcasts are held back. A 0 h "forecast" is scored from the same hour it is checked against, so it measures the model's agreement with the buoy, not our ability to see ahead — it stays a private control rather than a published hit rate.
Data attribution
| 24 |
| 21054 |
| 68% |
| 84% |
| -0.23 over-called |
| +0.27 |
| -0.33 |
| 6.2 |
| 48 | 20664 | 68% | 84% | -0.22 over-called | +0.29 | -0.39 | 7.1 |
| 72 | 20279 | 68% | 84% | -0.22 over-called | +0.30 | -0.36 | 7.7 |
| 120 | 19858 | 62% | 80% | +0.08 under-called | +0.38 | -0.06 | 5.5 |
Rows are what we said, columns are what the buoy saw. Shading is the share of the row; the outlined diagonal is agreement.
| Predicted \ observed | Flat | Poor | Fair | Good | Epic |
|---|---|---|---|---|---|
| Flat | 38113 | 595 | 2523 | 1805 | 155 |
| Poor | 4769 | 4135 | 1594 | 980 | 109 |
| Fair | 9358 | 858 | 20014 | 5780 | 201 |
| Good | 5044 | 62 | 3731 | 19464 | 1766 |
| Epic | 283 | 0 | 21 | 1224 | 1881 |
A break is only as verified as the buoy it borrows.
| Spot | Buoy | Distance (km) | n | Exact | ±1 | Hs bias (m) |
|---|---|---|---|---|---|---|
| Bengello Beach | WAVEBAB | 14.3 | 7113 | 59% | 82% | +0.15 |
| Bondi Beach (south) | WAVESYD | 17.2 | 7555 | 73% | 88% | +0.54 |
| Broulee Beach | WAVEBAB | 14.2 | 7113 | 75% | 84% | +0.15 |
| Collaroy | WAVESYD | 11.0 | 7555 | 63% | 78% | +0.66 |
| Congo Point | WAVEBAB | 23.5 | 7113 | 86% | 92% | +0.20 |
| Durras Main Beach | WAVEBAB | 6.8 | 7113 | 64% | 82% | +0.19 |
| Malua Bay | WAVEBAB | 14.2 | 7113 | 61% | 78% | +0.15 |
| Maroubra | WAVESYD | 25.2 | 7555 | 70% | 87% | +0.34 |
| Moruya Breakwall | WAVEBAB | 14.3 | 7113 | 59% | 72% | +0.15 |
| North Bondi | WAVESYD | 17.2 | 7555 | 69% | 88% | +0.54 |
| North Cronulla | WAVESYD | 45.3 | 7563 | 65% | 87% | +0.14 |
| North Durras | WAVEBAB | 6.8 | 7113 | 59% | 78% | +0.19 |
| North Narrabeen | WAVESYD | 5.2 | 7555 | 61% | 74% | +0.47 |
| Palm Beach | WAVESYD | 14.1 | 7555 | 54% | 82% | +0.62 |
| Pink Rocks (Broulee Island) | WAVEBAB | 14.2 | 7113 | 99% | 100% | +0.15 |
| Surf Beach (Batemans Bay) | WAVEBAB | 14.2 | 7113 | 61% | 81% | +0.15 |
| Wanda Beach | WAVESYD | 45.3 | 7555 | 66% | 87% | +0.14 |
The last few, newest first. Times are the spot's own local time — hover for UTC.