• v0.63.0 0ed4ad1930

    v0.63.0 Stable

    joeyr released this 2026-09-24 10:16:54 -05:00 | 27 commits to main since this release

    Every weather tool takes units and timezone, and get_model_run gains UV. An
    answer can now be used as it arrives, with no °F↔°C or UTC→local conversion left to
    the caller. Breaking for existing callers: the default is now metric, and every
    field that carried a unit in its name was renamed. Tool descriptions changed, so the
    connector needs a reconnect after the deploy.

    Added

    • units on all eleven tools: metric (C, km/h, mm, m, hPa) or imperial (F, mph,
      in, ft, mb). When a call omits it, WEATHER_DEFAULT_UNITS decides, and that defaults
      to metric. A misspelled value refuses to boot rather than quietly serving the default.
    • timezone on all eleven tools: local (the coordinate's own zone, the default),
      utc, or an IANA name. Every timestamp in the answer is rendered in that zone with an
      explicit offset, including those inside sentences. An unknown name is refused rather
      than read as UTC.
    • applied on every response: the units and zone used, and where the zone came from
      (nws_points, open_meteo_auto, caller, or fallback when no lookup answered and
      the answer is in UTC).
    • A uv block on get_model_run, with the hourly UV index and clear-sky index, a
      daily maximum per local day, and the model named. It comes from gfs_global on its
      own request. Measured across eleven models, GFS was the only one supplying UV, and
      best_match returned GFS's values without naming a model. A failed UV request costs
      the UV block only.
    • A units block wherever a response carries measured quantities without one:
      get_hourly_forecast, get_taf, list_stations, normals, and distances.
    • Local time-zone lookup outside the US. Open-Meteo's timezone=auto answers with
      the zone name alone, and the answer is cached for 30 days like /points.

    Changed

    • Field renames, so no name claims a unit: temperature_f → temperature,
      dewpoint_f → dewpoint, wind_speed_mph → wind_speed, wind_speed_high_mph →
      wind_speed_high, wind_gust_mph → wind_gust, distance_miles → distance,
      elevation_feet → elevation, model_cell_elevation_feet → model_cell_elevation
      (with model_cell_elevation_unit), searched_miles_north_south →
      searched_north_south (with searched_north_south_unit), the normals'
      normal_high_f/normal_low_f/normal_mean_f → normal_high/normal_low/
      normal_mean, median_precipitation_in → median_precipitation,
      normal_total_precipitation_in → normal_total_precipitation, a sky layer's base_ft
      → base, and the sun block's date_utc → date.
    • Five tools reported "timezone": "UTC" for a US coordinate. get_model_run,
      get_taf, get_observations, get_observation_history and get_outlook now answer in
      the coordinate's zone like the rest.
    • Offset-less start and end are read in the answer's zone, on get_observations
      and get_observation_history, and get_outlook counts days from the coordinate's
      today. All three used the server's TZ before.
    • Sunrise and sunset are filed under local days. Open-Meteo requests name the zone
      and ask for epoch seconds, because given a zone it applies one fixed offset to the whole
      request. Measured across 2025-11-02, its local time strings run an hour off after a
      DST change. A daily row's date is taken from the response's own offset, so the day
      after a change is not labelled with the previous date.
    • Metric Open-Meteo requests omit the unit parameters, which is its default, and the
      answer is checked against a metric echo table recorded on 2026-09-24. Metric
      /forecast/hourly is asked for units=si, so wind_speed_text reads in km/h.

    Removed

    • from_time_local and to_time_local on wind-shift hits, and issued_local on the
      forecast discussion.
      Every time is now in the answer's zone, so each was a second
      copy of the field beside it.

    Notes

    • Two premises of the plan were wrong, and both were caught by measuring before
      building.
      The raw grid was not losing precision: its Celsius values are exact
      conversions of whole Fahrenheit, so they convert back to whole numbers. And
      Open-Meteo's heights and visibility were already in feet under precipitation_unit=inch,
      so converting them for imperial would have converted them twice.
    • The DST change cannot be checked live until late October, because the forecast
      endpoint reaches only 16 days ahead. The suite pins it against recorded fixtures, and
      docs/operations.md carries the live check with its date.
    • WEATHER_DEFAULT_UNITS=imperial in the stack file restores the previous numbers
      without a rebuild. The field renames stay either way.
    • 33 new tests, 1895 in all. Nine new guards were proved by breaking them: the
      source skip, the daily-date offset, refusing an unknown zone, omitting metric unit
      parameters, units=si, UV isolation, the boot refusal, the one rendering pass, and
      reading the window in the answer's zone.
    Downloads