Skip to content
VerificationIn progress

Trestles 2026: forecasts locked before the call, scored after

A research verification in progress at Lower Trestles, California: a forecast lock hashed and committed before the day it calls — three locks so far, with the Sep 11–13 runs missed and recorded as missed — then scored against NDBC buoys and the public event record. So far the engine read the swell well and the wind badly, and the day it ranked first was the one shut down by wind.

A lock is written before the ocean answers

This research note follows a forecast that cannot be revised after the fact. The occasion is a world-tour surf contest whose waiting period runs Sep 11–20, 2026, taken from the organiser's site. For each day of the Lower Trestles waiting period a forecast lock is written: a JSON file holding every input, the ranking of the days in the period, the analyst call and the conditions that would invalidate it, hashed with sha256 and committed. Locks are append-only, and a lock is never edited whatever the ocean does next; corrections go into a separate verification file, and the scoring formula is fixed forward in its next revision.

The engine under test is the production AYON Wave signal engine, rules 1.0.0, compiled verbatim from the app repository. It is not a research build. Three locks exist so far: V1 on 2026-09-10 at 05Z, V2 the same day at 17Z, and V3 on 2026-09-13 at 17:41 PDT. The spot is Lower Trestles, San Onofre State Beach, California.

One separation has to be stated before any score: AYON scores ocean suitability only, while the event organiser's daily call also weighs logistics, broadcast and athlete factors that AYON does not model, and AYON is not affiliated with the WSL.

Every input carries an evidence label

Each input in a lock is labelled MODELED, MEASURED, DERIVED or OBSERVED. The swell partition is MODELED from Open-Meteo marine best_match at cell 33.375/-117.625, which at this cell is identical to MFWAM (maximum difference 0.0 over 233 hours), so the partition is single-source. The only independent wave check is ECMWF-WAM totals, with all partition fields null: mean absolute height difference 0.11 m, maximum 0.42 m. Winds come from GFS and ECMWF, which disagree on afternoon onset, with GFS windier.

Tide is DERIVED from NOAA station 9410580 at Newport Bay, about 25 km to the north as the lock records it. MEASURED data comes from NDBC buoys 46086 in the San Clemente Basin, offshore, and 46224 off Oceanside. Buoy 46242 is dead.

The formula's known weaknesses were written into lock V1 itself: size under-weighted, so that 0.3 m at 14.3 s outscored 0.8 m at 12.1 s; a window-length bonus that diluted wind quality; and an agreement term that is tautological because best_match equals MFWAM. V2 moved to formula v1.1, which drops the window-length bonus.

The V1 call: Sep 11 ranked first, with a named fragility

V1, at one-day lead, ranked Sep 11 first, window 07:00–11:00 PDT: 0.84 m at 12.1 s from 200°, dead-centre of the spot's 170–280° window; rising tide 0.8 to 1.6 m; light morning wind (GFS 2.4–4.3 m/s from the south, ECMWF lighter and ENE). Confidence HIGH. The named fragility was afternoon south wind, with GFS earlier and stronger than ECMWF.

Watch days #2 and #3 were the mornings of Sep 17 and 18, 07:00–11:00: a new long-period S pulse of 13.1–13.7 s from 192°, building from 0.3 to 0.6 m between Sep 15 and 18, glassy modeled mornings, LOW confidence at 7–9 day lead on a single partition model. Formula scores: Sep 17 = 69, Sep 18 = 66.

Sep 13–14 were called short-period W windswell, the poorest of the period. Sep 19–20 lay beyond the partition horizon and were not scored. Buoy 46086 at lock time read 1.2 m at 12.9 s from 191°, down from 2.1 m over 34 hours: the current south swell had peaked and was decaying.

V2 at 17Z kept Sep 11 first (v1.1 score 84, HIGH; top three unchanged at 11/17/18). Its window flipped to 14:30–18:30 PDT because of the method change, not a model change; the early window stayed valid but shrank to 07:00–09:30, ahead of a modeled midday south-wind peak. V2 also recorded a measurement: forerunners of the S pulse had already arrived on Sep 10, with 46086 stepping from 12.9 s to 16.0–17.4 s SSW/SW and 46224 reading 16.7 s, four to five days ahead of the modeled fill.

What buoy 46086 measured on Sep 11, and how V3 scored it

Buoy 46086, Sep 11 07:10–11:40 PDT: swell 1.3 rising to 1.6 m, period 14.8–16.0 s, direction SW/SSW, wind wave 0.3 m at 3.6–3.8 s. Size is not scored, deliberately: 0.84 m is modeled swell height at the Trestles cell and 1.3–1.6 m is offshore total height at a different location. They are different quantities, and comparing them would be a false comparison.

  • Swell arrival in the windowHit
    Called in V1
    S swell at 12.1 s running 07:00–11:00 PDT
    Measured, buoy 46086
    1.3–1.6 m long-period S/SW swell through the morning window
  • DirectionHit
    Called in V1
    200°
    Measured, buoy 46086
    SW/SSW, about 202–225°, inside 170–280°
  • PeriodMiss
    Called in V1
    12.1 s
    Measured, buoy 46086
    14.8–16.0 s; under-called by 3–4 s
  • SizeNot scored
    Called in V1
    0.84 m modeled swell at the cell
    Measured, buoy 46086
    1.3–1.6 m offshore total height: a different quantity
  • Sep 13–14 poor W windswellHit
    Called in V1
    Short-period W, poorest of the period
    Measured, buoy 46086
    Sep 13: 1.6–1.8 m at 7.1–8.3 s from 277–295°, most of it beyond the window's 280° edge

The same day, the wrong instrument: the corrected score

V3 scored the Sep 11 wind as a hit because 46086 read only a 0.3 m at 3.8 s wind wave through the morning. That was the wrong instrument. 46086 sits offshore in the San Clemente Basin and cannot observe local S–SE wind blowing across the beach at Lower Trestles. The water was clean offshore while the wind on the beach was bad enough to stop a heat.

The public event record, OBSERVED from the organiser's site and from Surfline, the event's official forecast provider: on Sep 11, opening day, competition started and was stopped during Round 1, Heat 2, by south winds; the event forecast had called "4–6 ft faces with S–SE wind likely for much of the day". On Sep 12, Round 1 was completed and "the winds cooperated" despite a high-tide hold. On Sep 13 there was no competition.

Rescored against that record, the V1 call for Sep 11 reads differently.

The honest summary in the verification file: the engine read the swell well and the wind badly, and wind decided both days.

  • Day and window, as a rankingMiss
    Called in V1
    Sep 11 ranked #1 of the period
    Measured or observed
    The one day so far that was shut down
  • Swell: direction, arrival, cleanlinessHit
    Called in V1
    0.84 m at 12.1 s from 200°
    Measured or observed
    Clean long-period S/SW swell present; the 3–4 s period under-call stands (buoy 46086)
  • WindMiss
    Called in V1
    S wind named as the fragility, placed in the afternoon
    Measured or observed
    S–SE for much of the day; stopped Round 1 Heat 2
  • Sep 12Miss
    Called in V1
    Not in the top 3 (V1 top 3 = 11 / 17 / 18)
    Measured or observed
    The day that ran clean

Three days missing from the record

There is a second failure, of cadence rather than physics. V2 was written on 2026-09-10 at 17Z; V3 is dated 2026-09-13. The runs for Sep 11, 12 and 13 were missed, and V3 states this itself. The gap cannot be backfilled, because a lock written after the day has passed is not a forecast, and it stays in the record.

What v1.2 changes, forward only

Three changes follow from the verification. None is applied to V1, V2 or V3; they take effect from the next revision of the formula.

  • Stop scoring local wind from an offshore buoy. The mission has no beach-level wind observation at all; that is the gap.
  • Wind onset timing gets its own uncertainty rather than a single onset hour; GFS-versus-ECMWF disagreement should down-weight the whole day.
  • Weight measured period over modeled period at short lead. The forerunners showed 16.0 s four to five days before the modeled fill, and the buoy was right.

A divergence locked before the standby, and what is scored next

V3, under v1.1, ranks Sep 16 first: score 84, HIGH, window 07:00–12:00 PDT, 0.66 m at 13.4 s from 190°, tide rising 0.83 to 1.43 m, no onshore onset before 18:00. Then Sep 15 at 79 (HIGH), Sep 17 at 79, Sep 18 at 77, Sep 19 at 64, Sep 20 at 57 and Sep 14 at 53. The Sep 17 and 18 windows close at 11:00, with onshore W/SW onset around 13:00. Buoys at V3 time: 46086 at 23:40Z read 1.5 m at 7.7 s WNW; 46224 at 23:56Z read 0.5 m at 13.3 s SSW against a modeled 0.56 m, a ratio of 1.12.

The organiser is on standby for Sep 15 at 07:30 PDT. V3 was locked before that standby was known. If Sep 15 runs and is mediocre while Sep 16 is better, that supports V3; if Sep 15 is good, the ordering was wrong. Either outcome is checkable, and the call is already on file.

Next to be scored: the Sep 15/16 ordering, then the Sep 16 call itself, against the buoys and the public event record. This article is updated in place as the locks resolve. The locks are never edited.

Evidence discipline

This is research. Estimates are models, not guarantees; a model is never an observation, and a machine estimate is never “confirmed” — only a human reviewing it in the field makes it verified. Nothing on this page is an operational-capability claim, a safety promise, or a prediction of a specific event at a specific place.

References & data

  1. 1.NDBC buoy 46086 — San Clemente Basin The offshore MEASURED record used for the Sep 11 swell score and for buoy state at each lock. It cannot observe beach-level wind at Lower Trestles.
  2. 2.NDBC buoy 46224 — Oceanside Offshore Second MEASURED buoy: forerunner period on Sep 10 (16.7 s) and the buoyTrack ratio at V3 (0.5 m measured against 0.56 m modeled).
  3. 3.Open-Meteo Marine API (MFWAM best_match, ECMWF-WAM) MODELED swell partition at cell 33.375/-117.625 (best_match, identical to MFWAM here) and ECMWF-WAM totals as the only independent wave check.
  4. 4.NOAA CO-OPS station 9410580 — Newport Bay Tide DERIVED for Trestles from this station, about 25 km to the north, as recorded in lock V1.
  5. 5.World Surf League — event schedule and daily calls OBSERVED event record: Sep 11 stopped in Round 1 Heat 2 by south winds; Sep 12 Round 1 completed; Sep 13 no competition; standby for Sep 15 07:30 PDT. The organiser's forecast provider, Surfline, is quoted from the same record. AYON is not affiliated with either.
  6. 6.AYON Wave repository — field-missions/trestles-2026 (locks V1–V3 with sha256, VERIFICATION-2026-09-13.md) FORECAST-LOCK-V1.json (2026-09-10T05:06Z, sha256 f540dfa6…), V2 (2026-09-10 17Z, c92968b2…), V3 (2026-09-14T00:41Z, 1e92c49d…); commits e74916b, e3062a8, a52b345.