The numbers here are fetched, and everything derived from them is arithmetic. scripts/fetch_weather.sh pulls two keyless NOAA endpoints on each deploy, before Hugo runs: the Oceanic Niño Index from NOAA PSL, which mirrors the Climate Prediction Center's own oni.ascii.txt, and the National Hurricane Center's active-storms feed. The last completed season, the +0.5 °C run length, both record ranks and the storm list are computed from those two payloads by scripts/weather_parse.py. None of them is typed into a template, and none can be edited into agreement with anything.
This is a static page, so "fetched" means "as of the timestamp shown". The two stamps at the top are the moments each source was last read successfully — not the moment you loaded the page. Between deploys nothing refreshes, which is why each block carries its own expiry: seven days for the index, six hours for the storm list, both taken from how often NOAA itself republishes them. Past that the page stops asserting and tells you when it last knew.
Two of the dates are computed from a rule NOAA states, not copied from a list. CPC publishes that its long-lead outlooks go out on the third Thursday of the month, around 8:30 AM Eastern, so this page computes the third Thursday rather than storing dates. A stored list has a horizon and a horizon is how pages rot; a rule does not. The 4 dates a person did read off CPC's schedule page — 20 August 2026, 17 September 2026, 15 October 2026 and 19 November 2026 — are kept in scripts/data/weather_us_stated.json for one purpose: an automated check asserts the arithmetic reproduces all four, so if CPC ever changes the rule the check fails instead of the page inventing a date.
One date is stated by a human and carries its own expiry. Each ENSO diagnostic discussion names only its successor, so the next-discussion date has a one-month horizon by construction. It is stored with the date it was read and the date it expires, both taken from NOAA's own naming rather than estimated. Once that date passes, the card stops asserting it and says plainly that we have not yet read the new one — falling back to the second-Thursday cadence the last three discussions followed, labelled as precedent.
The flagship Winter Outlook date is a pattern and is never presented as a schedule. NOAA has not announced when the 2026–27 Winter Outlook lands. It has accompanied the October release for four years, which is precedent. The year-by-year working, including the one year we could not confirm from a noaa.gov timestamp, is in the winter forecast article and is deliberately not duplicated here.
Nothing here is a Drawpie forecast, and the probabilities are deliberately absent. This page prints no chance-of, no regional tilt and no snowfall figure. Those all come from a person reading CPC prose and map products, so each one lives in exactly one article, linked above. The hub prints only what it fetches or computes — which is also why a number cannot drift between this page and an article: they are not both allowed to say it.
What happens when the fetch fails. The script exits 0 unconditionally and the Netlify command fences it again, so a NOAA outage can never fail a deploy; the last-good committed data/weather_us.json ships unchanged. If one source fails, only that block is flagged — it keeps the timestamp of the last run that actually confirmed it, so a repeated outage cannot quietly re-date old data. A failed fetch and a genuinely quiet tropics are different states and are rendered differently, because an empty storm list from NOAA is a real answer and a timeout is not.