{
  "contract_version": "v1",
  "generated_at": "2026-08-10T17:31:58.047Z",
  "_notes": {
    "freshness": "Every block carries a `provenance` with `as_of`, `origin`, `ttl_s` and `hard_ttl_s`. Derive state against your own clock; do not trust a stored state.",
    "tide": "PREDICTIONS only, station 8518934 Beacon. That station offers no water-level product and both nearby USGS river gauges are discontinued. There is no live river level for this corridor.",
    "weather": "The corridor spans two NWS forecast offices (ALY and OKX). Forecasts are per point; hazards are the union across points, deduplicated on properties.id.",
    "absent": "Shuttle arrivals, parking availability, crowding and on-trail counts are absent because no data source exists. They are not omitted by error.",
    "alignment": "Any geometry referenced from these records is an indicative alignment traced from published planning figures (FGEIS Jan 2026), not survey data."
  },
  "weather": {
    "provenance": {
      "source": "National Weather Service",
      "as_of": "2026-08-10T14:41:09+00:00",
      "fetched_at": "2026-08-10T17:23:51.914Z",
      "origin": "disk-cache",
      "ttl_s": 900,
      "hard_ttl_s": 21600,
      "degraded": true,
      "href": "https://www.weather.gov/documentation/services-web-api"
    },
    "state": "stale",
    "points": [
      {
        "id": "beacon",
        "label": "Beacon — north end",
        "office": "ALY",
        "grid": "72,10",
        "generated_at": "2026-08-10T14:41:09+00:00",
        "periods": [
          {
            "number": 1,
            "name": "Today",
            "startTime": "2026-08-10T10:00:00-04:00",
            "endTime": "2026-08-10T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 90,
            "temperatureUnit": "F",
            "precipProbability": 47,
            "windSpeed": "1 to 8 mph",
            "windDirection": "SW",
            "shortForecast": "Mostly Sunny then Slight Chance Showers And Thunderstorms",
            "detailedForecast": "A slight chance of showers and thunderstorms between 3pm and 4pm, then a chance of showers and thunderstorms between 4pm and 5pm, then a chance of showers and thunderstorms. Mostly sunny. High near 90, with temperatures falling to around 86 in the afternoon. Southwest wind 1 to 8 mph. Chance of precipitation is 50%. New rainfall amounts less than a tenth of an inch possible.",
            "iconToken": "sct"
          },
          {
            "number": 2,
            "name": "Tonight",
            "startTime": "2026-08-10T18:00:00-04:00",
            "endTime": "2026-08-11T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 70,
            "temperatureUnit": "F",
            "precipProbability": 41,
            "windSpeed": "3 to 7 mph",
            "windDirection": "SW",
            "shortForecast": "Chance Showers And Thunderstorms then Partly Cloudy",
            "detailedForecast": "A chance of showers and thunderstorms before 9pm. Partly cloudy. Low around 70, with temperatures rising to around 72 overnight. Southwest wind 3 to 7 mph. Chance of precipitation is 40%. New rainfall amounts less than a tenth of an inch possible.",
            "iconToken": "tsra_hi"
          },
          {
            "number": 3,
            "name": "Tuesday",
            "startTime": "2026-08-11T06:00:00-04:00",
            "endTime": "2026-08-11T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 87,
            "temperatureUnit": "F",
            "precipProbability": 3,
            "windSpeed": "3 to 8 mph",
            "windDirection": "W",
            "shortForecast": "Mostly Sunny",
            "detailedForecast": "Mostly sunny. High near 87, with temperatures falling to around 85 in the afternoon. West wind 3 to 8 mph.",
            "iconToken": "sct"
          },
          {
            "number": 4,
            "name": "Tuesday Night",
            "startTime": "2026-08-11T18:00:00-04:00",
            "endTime": "2026-08-12T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 65,
            "temperatureUnit": "F",
            "precipProbability": 3,
            "windSpeed": "0 to 7 mph",
            "windDirection": "NW",
            "shortForecast": "Partly Cloudy",
            "detailedForecast": "Partly cloudy, with a low around 65. Northwest wind 0 to 7 mph.",
            "iconToken": "sct"
          },
          {
            "number": 5,
            "name": "Wednesday",
            "startTime": "2026-08-12T06:00:00-04:00",
            "endTime": "2026-08-12T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 86,
            "temperatureUnit": "F",
            "precipProbability": 6,
            "windSpeed": "0 to 3 mph",
            "windDirection": "NW",
            "shortForecast": "Mostly Sunny",
            "detailedForecast": "Mostly sunny. High near 86, with temperatures falling to around 84 in the afternoon. Northwest wind 0 to 3 mph.",
            "iconToken": "sct"
          },
          {
            "number": 6,
            "name": "Wednesday Night",
            "startTime": "2026-08-12T18:00:00-04:00",
            "endTime": "2026-08-13T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 67,
            "temperatureUnit": "F",
            "precipProbability": 32,
            "windSpeed": "2 mph",
            "windDirection": "W",
            "shortForecast": "Partly Cloudy then Chance Showers And Thunderstorms",
            "detailedForecast": "A chance of showers and thunderstorms after 2am. Partly cloudy, with a low around 67. Chance of precipitation is 30%.",
            "iconToken": "sct"
          },
          {
            "number": 7,
            "name": "Thursday",
            "startTime": "2026-08-13T06:00:00-04:00",
            "endTime": "2026-08-13T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 86,
            "temperatureUnit": "F",
            "precipProbability": 32,
            "windSpeed": "1 to 9 mph",
            "windDirection": "W",
            "shortForecast": "Chance Showers And Thunderstorms then Slight Chance Showers And Thunderstorms",
            "detailedForecast": "A chance of showers and thunderstorms before 8am, then a slight chance of showers and thunderstorms. Mostly sunny, with a high near 86. Chance of precipitation is 30%.",
            "iconToken": "tsra_hi"
          },
          {
            "number": 8,
            "name": "Thursday Night",
            "startTime": "2026-08-13T18:00:00-04:00",
            "endTime": "2026-08-14T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 64,
            "temperatureUnit": "F",
            "precipProbability": 21,
            "windSpeed": "2 to 8 mph",
            "windDirection": "W",
            "shortForecast": "Slight Chance Showers And Thunderstorms then Partly Cloudy",
            "detailedForecast": "A slight chance of showers and thunderstorms before 8pm. Partly cloudy, with a low around 64.",
            "iconToken": "tsra_hi"
          }
        ]
      },
      {
        "id": "breakneck",
        "label": "Breakneck — mid-corridor",
        "office": "ALY",
        "grid": "73,7",
        "generated_at": "2026-08-10T14:41:09+00:00",
        "periods": [
          {
            "number": 1,
            "name": "Today",
            "startTime": "2026-08-10T10:00:00-04:00",
            "endTime": "2026-08-10T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 90,
            "temperatureUnit": "F",
            "precipProbability": 47,
            "windSpeed": "2 to 7 mph",
            "windDirection": "S",
            "shortForecast": "Mostly Sunny then Slight Chance Showers And Thunderstorms",
            "detailedForecast": "A slight chance of showers and thunderstorms between 3pm and 4pm, then a chance of showers and thunderstorms between 4pm and 5pm, then a chance of showers and thunderstorms. Mostly sunny. High near 90, with temperatures falling to around 86 in the afternoon. Heat index values as high as 95. South wind 2 to 7 mph. Chance of precipitation is 50%. New rainfall amounts less than a tenth of an inch possible.",
            "iconToken": "sct"
          },
          {
            "number": 2,
            "name": "Tonight",
            "startTime": "2026-08-10T18:00:00-04:00",
            "endTime": "2026-08-11T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 70,
            "temperatureUnit": "F",
            "precipProbability": 36,
            "windSpeed": "6 mph",
            "windDirection": "W",
            "shortForecast": "Chance Showers And Thunderstorms then Partly Cloudy",
            "detailedForecast": "A chance of showers and thunderstorms before 9pm. Partly cloudy, with a low around 70. West wind around 6 mph. Chance of precipitation is 40%. New rainfall amounts less than a tenth of an inch possible.",
            "iconToken": "tsra_hi"
          },
          {
            "number": 3,
            "name": "Tuesday",
            "startTime": "2026-08-11T06:00:00-04:00",
            "endTime": "2026-08-11T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 87,
            "temperatureUnit": "F",
            "precipProbability": 4,
            "windSpeed": "5 to 8 mph",
            "windDirection": "NW",
            "shortForecast": "Mostly Sunny",
            "detailedForecast": "Mostly sunny. High near 87, with temperatures falling to around 85 in the afternoon. Northwest wind 5 to 8 mph.",
            "iconToken": "sct"
          },
          {
            "number": 4,
            "name": "Tuesday Night",
            "startTime": "2026-08-11T18:00:00-04:00",
            "endTime": "2026-08-12T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 64,
            "temperatureUnit": "F",
            "precipProbability": 3,
            "windSpeed": "0 to 7 mph",
            "windDirection": "NW",
            "shortForecast": "Partly Cloudy",
            "detailedForecast": "Partly cloudy, with a low around 64. Northwest wind 0 to 7 mph.",
            "iconToken": "sct"
          },
          {
            "number": 5,
            "name": "Wednesday",
            "startTime": "2026-08-12T06:00:00-04:00",
            "endTime": "2026-08-12T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 86,
            "temperatureUnit": "F",
            "precipProbability": 6,
            "windSpeed": "0 to 3 mph",
            "windDirection": "NW",
            "shortForecast": "Mostly Sunny",
            "detailedForecast": "Mostly sunny. High near 86, with temperatures falling to around 84 in the afternoon. Northwest wind 0 to 3 mph.",
            "iconToken": "sct"
          },
          {
            "number": 6,
            "name": "Wednesday Night",
            "startTime": "2026-08-12T18:00:00-04:00",
            "endTime": "2026-08-13T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 67,
            "temperatureUnit": "F",
            "precipProbability": 31,
            "windSpeed": "0 to 3 mph",
            "windDirection": "NW",
            "shortForecast": "Partly Cloudy then Chance Showers And Thunderstorms",
            "detailedForecast": "A chance of showers and thunderstorms after 2am. Partly cloudy, with a low around 67. Chance of precipitation is 30%.",
            "iconToken": "sct"
          },
          {
            "number": 7,
            "name": "Thursday",
            "startTime": "2026-08-13T06:00:00-04:00",
            "endTime": "2026-08-13T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 86,
            "temperatureUnit": "F",
            "precipProbability": 31,
            "windSpeed": "1 to 8 mph",
            "windDirection": "W",
            "shortForecast": "Chance Showers And Thunderstorms",
            "detailedForecast": "A chance of showers and thunderstorms before 2pm, then a slight chance of showers and thunderstorms. Mostly sunny, with a high near 86. Chance of precipitation is 30%.",
            "iconToken": "tsra_hi"
          },
          {
            "number": 8,
            "name": "Thursday Night",
            "startTime": "2026-08-13T18:00:00-04:00",
            "endTime": "2026-08-14T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 64,
            "temperatureUnit": "F",
            "precipProbability": 22,
            "windSpeed": "2 to 7 mph",
            "windDirection": "W",
            "shortForecast": "Slight Chance Showers And Thunderstorms then Partly Cloudy",
            "detailedForecast": "A slight chance of showers and thunderstorms before 8pm. Partly cloudy, with a low around 64.",
            "iconToken": "tsra_hi"
          }
        ]
      },
      {
        "id": "cold-spring",
        "label": "Cold Spring — south end",
        "office": "OKX",
        "grid": "30,74",
        "generated_at": "2026-08-10T14:41:09+00:00",
        "periods": [
          {
            "number": 1,
            "name": "Today",
            "startTime": "2026-08-10T10:00:00-04:00",
            "endTime": "2026-08-10T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 91,
            "temperatureUnit": "F",
            "precipProbability": 48,
            "windSpeed": "2 to 7 mph",
            "windDirection": "S",
            "shortForecast": "Mostly Sunny then Chance Showers And Thunderstorms",
            "detailedForecast": "A chance of showers and thunderstorms between 2pm and 5pm, then a chance of showers and thunderstorms. Mostly sunny. High near 91, with temperatures falling to around 86 in the afternoon. Heat index values as high as 96. South wind 2 to 7 mph. Chance of precipitation is 50%. New rainfall amounts less than a tenth of an inch possible.",
            "iconToken": "sct"
          },
          {
            "number": 2,
            "name": "Tonight",
            "startTime": "2026-08-10T18:00:00-04:00",
            "endTime": "2026-08-11T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 70,
            "temperatureUnit": "F",
            "precipProbability": 48,
            "windSpeed": "6 mph",
            "windDirection": "W",
            "shortForecast": "Chance Showers And Thunderstorms then Partly Cloudy",
            "detailedForecast": "A chance of showers and thunderstorms before 11pm. Partly cloudy. Low around 70, with temperatures rising to around 72 overnight. West wind around 6 mph. Chance of precipitation is 50%. New rainfall amounts less than a tenth of an inch possible.",
            "iconToken": "tsra_hi"
          },
          {
            "number": 3,
            "name": "Tuesday",
            "startTime": "2026-08-11T06:00:00-04:00",
            "endTime": "2026-08-11T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 87,
            "temperatureUnit": "F",
            "precipProbability": 4,
            "windSpeed": "5 to 8 mph",
            "windDirection": "NW",
            "shortForecast": "Mostly Sunny",
            "detailedForecast": "Mostly sunny. High near 87, with temperatures falling to around 85 in the afternoon. Northwest wind 5 to 8 mph.",
            "iconToken": "sct"
          },
          {
            "number": 4,
            "name": "Tuesday Night",
            "startTime": "2026-08-11T18:00:00-04:00",
            "endTime": "2026-08-12T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 65,
            "temperatureUnit": "F",
            "precipProbability": 3,
            "windSpeed": "1 to 6 mph",
            "windDirection": "NW",
            "shortForecast": "Partly Cloudy",
            "detailedForecast": "Partly cloudy, with a low around 65. Northwest wind 1 to 6 mph.",
            "iconToken": "sct"
          },
          {
            "number": 5,
            "name": "Wednesday",
            "startTime": "2026-08-12T06:00:00-04:00",
            "endTime": "2026-08-12T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 86,
            "temperatureUnit": "F",
            "precipProbability": 6,
            "windSpeed": "3 mph",
            "windDirection": "N",
            "shortForecast": "Mostly Sunny",
            "detailedForecast": "Mostly sunny, with a high near 86. North wind around 3 mph.",
            "iconToken": "sct"
          },
          {
            "number": 6,
            "name": "Wednesday Night",
            "startTime": "2026-08-12T18:00:00-04:00",
            "endTime": "2026-08-13T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 67,
            "temperatureUnit": "F",
            "precipProbability": 31,
            "windSpeed": "2 mph",
            "windDirection": "W",
            "shortForecast": "Partly Cloudy then Chance Showers And Thunderstorms",
            "detailedForecast": "A chance of showers and thunderstorms after 2am. Partly cloudy, with a low around 67. Chance of precipitation is 30%.",
            "iconToken": "sct"
          },
          {
            "number": 7,
            "name": "Thursday",
            "startTime": "2026-08-13T06:00:00-04:00",
            "endTime": "2026-08-13T18:00:00-04:00",
            "isDaytime": true,
            "temperature": 87,
            "temperatureUnit": "F",
            "precipProbability": 31,
            "windSpeed": "2 to 8 mph",
            "windDirection": "W",
            "shortForecast": "Chance Showers And Thunderstorms",
            "detailedForecast": "A chance of showers and thunderstorms before 2pm, then a slight chance of showers and thunderstorms. Mostly sunny, with a high near 87. Chance of precipitation is 30%.",
            "iconToken": "tsra_hi"
          },
          {
            "number": 8,
            "name": "Thursday Night",
            "startTime": "2026-08-13T18:00:00-04:00",
            "endTime": "2026-08-14T06:00:00-04:00",
            "isDaytime": false,
            "temperature": 64,
            "temperatureUnit": "F",
            "precipProbability": 22,
            "windSpeed": "3 to 7 mph",
            "windDirection": "W",
            "shortForecast": "Slight Chance Showers And Thunderstorms then Partly Cloudy",
            "detailedForecast": "A slight chance of showers and thunderstorms before 8pm. Partly cloudy, with a low around 64.",
            "iconToken": "tsra_hi"
          }
        ]
      }
    ]
  },
  "observation": {
    "provenance": {
      "source": "National Weather Service — Newburgh/Stewart Airport, 6 mi W",
      "as_of": "2026-08-10T16:45:00+00:00",
      "fetched_at": "2026-08-10T17:23:51.923Z",
      "origin": "disk-cache",
      "ttl_s": 4500,
      "hard_ttl_s": 10800,
      "degraded": true,
      "href": "https://www.weather.gov/documentation/services-web-api"
    },
    "state": "saved",
    "data": {
      "stationId": "KSWF",
      "stationLabel": "Newburgh/Stewart Airport, 6 mi W",
      "timestamp": "2026-08-10T16:45:00+00:00",
      "textDescription": "",
      "temperatureF": 82,
      "heatIndexF": 85,
      "relativeHumidity": 62,
      "windMph": 9,
      "windGustMph": null,
      "visibilityMi": 10,
      "droppedForQc": []
    }
  },
  "hazards": {
    "provenance": {
      "source": "National Weather Service",
      "as_of": "2026-08-10T17:31:57.259Z",
      "fetched_at": "2026-08-10T17:31:57.259Z",
      "origin": "network",
      "ttl_s": 120,
      "hard_ttl_s": 1800,
      "degraded": false,
      "href": "https://www.weather.gov/documentation/services-web-api"
    },
    "state": "live",
    "data": []
  },
  "tide": {
    "provenance": {
      "source": "NOAA Tides & Currents — predicted",
      "as_of": "2026-08-10T14:41:09.282Z",
      "fetched_at": "2026-08-10T14:41:08.863Z",
      "origin": "disk-cache",
      "ttl_s": 86400,
      "hard_ttl_s": null,
      "degraded": true,
      "href": "https://tidesandcurrents.noaa.gov/stationhome.html?id=8518934"
    },
    "state": "saved",
    "station": "8518934",
    "predictions": [
      {
        "t": "2026-08-09T03:41:00-04:00",
        "ft": 0.44,
        "type": "L"
      },
      {
        "t": "2026-08-09T09:01:00-04:00",
        "ft": 2.674,
        "type": "H"
      },
      {
        "t": "2026-08-09T15:28:00-04:00",
        "ft": 0.019,
        "type": "L"
      },
      {
        "t": "2026-08-09T21:52:00-04:00",
        "ft": 4.012,
        "type": "H"
      },
      {
        "t": "2026-08-10T04:35:00-04:00",
        "ft": 0.221,
        "type": "L"
      },
      {
        "t": "2026-08-10T10:10:00-04:00",
        "ft": 2.846,
        "type": "H"
      },
      {
        "t": "2026-08-10T16:28:00-04:00",
        "ft": -0.082,
        "type": "L"
      },
      {
        "t": "2026-08-10T22:49:00-04:00",
        "ft": 4.101,
        "type": "H"
      },
      {
        "t": "2026-08-11T05:26:00-04:00",
        "ft": 0.01,
        "type": "L"
      },
      {
        "t": "2026-08-11T11:11:00-04:00",
        "ft": 3.078,
        "type": "H"
      },
      {
        "t": "2026-08-11T17:24:00-04:00",
        "ft": -0.151,
        "type": "L"
      },
      {
        "t": "2026-08-11T23:40:00-04:00",
        "ft": 4.136,
        "type": "H"
      },
      {
        "t": "2026-08-12T06:14:00-04:00",
        "ft": -0.16,
        "type": "L"
      },
      {
        "t": "2026-08-12T12:06:00-04:00",
        "ft": 3.307,
        "type": "H"
      },
      {
        "t": "2026-08-12T18:18:00-04:00",
        "ft": -0.162,
        "type": "L"
      },
      {
        "t": "2026-08-13T00:28:00-04:00",
        "ft": 4.09,
        "type": "H"
      },
      {
        "t": "2026-08-13T07:00:00-04:00",
        "ft": -0.268,
        "type": "L"
      },
      {
        "t": "2026-08-13T12:56:00-04:00",
        "ft": 3.489,
        "type": "H"
      },
      {
        "t": "2026-08-13T19:12:00-04:00",
        "ft": -0.109,
        "type": "L"
      },
      {
        "t": "2026-08-14T01:14:00-04:00",
        "ft": 3.958,
        "type": "H"
      },
      {
        "t": "2026-08-14T07:47:00-04:00",
        "ft": -0.307,
        "type": "L"
      },
      {
        "t": "2026-08-14T13:45:00-04:00",
        "ft": 3.602,
        "type": "H"
      },
      {
        "t": "2026-08-14T20:05:00-04:00",
        "ft": -0.004,
        "type": "L"
      },
      {
        "t": "2026-08-15T01:59:00-04:00",
        "ft": 3.751,
        "type": "H"
      },
      {
        "t": "2026-08-15T08:32:00-04:00",
        "ft": -0.276,
        "type": "L"
      },
      {
        "t": "2026-08-15T14:34:00-04:00",
        "ft": 3.641,
        "type": "H"
      },
      {
        "t": "2026-08-15T20:57:00-04:00",
        "ft": 0.142,
        "type": "L"
      },
      {
        "t": "2026-08-16T02:43:00-04:00",
        "ft": 3.494,
        "type": "H"
      },
      {
        "t": "2026-08-16T09:17:00-04:00",
        "ft": -0.177,
        "type": "L"
      },
      {
        "t": "2026-08-16T15:22:00-04:00",
        "ft": 3.612,
        "type": "H"
      },
      {
        "t": "2026-08-16T21:48:00-04:00",
        "ft": 0.322,
        "type": "L"
      },
      {
        "t": "2026-08-17T03:26:00-04:00",
        "ft": 3.212,
        "type": "H"
      },
      {
        "t": "2026-08-17T10:00:00-04:00",
        "ft": -0.023,
        "type": "L"
      },
      {
        "t": "2026-08-17T16:10:00-04:00",
        "ft": 3.532,
        "type": "H"
      },
      {
        "t": "2026-08-17T22:40:00-04:00",
        "ft": 0.518,
        "type": "L"
      }
    ]
  },
  "rail": {
    "stops": [
      {
        "id": "43",
        "code": "0CS",
        "name": "Cold Spring",
        "lat": 41.415283,
        "lon": -73.95809,
        "wheelchairBoarding": "accessible",
        "lifecycle": "in_service"
      },
      {
        "id": "44",
        "code": "0BK",
        "name": "Breakneck Ridge",
        "lat": 41.450181,
        "lon": -73.982449,
        "wheelchairBoarding": "not_accessible",
        "lifecycle": "closed",
        "lifecycleNote": "Closed for reconstruction since 21 April 2025, as part of the Breakneck Connector and Bridge project.",
        "expectedReopen": "2027-04-21",
        "alternative": {
          "stopId": "43",
          "name": "Cold Spring",
          "distanceMi": 2.4,
          "direction": "south"
        }
      },
      {
        "id": "46",
        "code": "0BC",
        "name": "Beacon",
        "lat": 41.504007,
        "lon": -73.984528,
        "wheelchairBoarding": "accessible",
        "lifecycle": "in_service"
      },
      {
        "id": "42",
        "code": "0GA",
        "name": "Garrison",
        "lat": 41.38178,
        "lon": -73.947202,
        "wheelchairBoarding": "accessible",
        "lifecycle": "in_service"
      },
      {
        "id": "40",
        "code": "0MN",
        "name": "Manitou",
        "lat": 41.332601,
        "lon": -73.970426,
        "wheelchairBoarding": "not_accessible",
        "lifecycle": "in_service"
      }
    ],
    "departures": {
      "43": {
        "provenance": {
          "source": "MTA Metro-North (GTFS-Realtime)",
          "href": "https://new.mta.info/developers",
          "as_of": "2026-08-10T17:31:49.000Z",
          "fetched_at": "2026-08-10T17:31:58.024Z",
          "origin": "network",
          "ttl_s": 20,
          "hard_ttl_s": 300,
          "degraded": false
        },
        "state": "live",
        "data": [
          {
            "train": "3167654",
            "route": "Hudson",
            "headsign": null,
            "direction": "north",
            "scheduled": "2026-08-10T17:56:00.000Z",
            "predicted": "2026-08-10T17:56:00.000Z",
            "delaySeconds": null,
            "status": "unknown",
            "track": null,
            "wheelchairAccessible": null,
            "basis": "realtime"
          },
          {
            "train": "3167683",
            "route": "Hudson",
            "headsign": null,
            "direction": "south",
            "scheduled": "2026-08-10T18:14:00.000Z",
            "predicted": "2026-08-10T18:14:00.000Z",
            "delaySeconds": null,
            "status": "unknown",
            "track": null,
            "wheelchairAccessible": null,
            "basis": "realtime"
          },
          {
            "train": "3167657",
            "route": "Hudson",
            "headsign": null,
            "direction": "north",
            "scheduled": "2026-08-10T19:05:00.000Z",
            "predicted": "2026-08-10T19:05:00.000Z",
            "delaySeconds": null,
            "status": "unknown",
            "track": null,
            "wheelchairAccessible": null,
            "basis": "realtime"
          },
          {
            "train": "3167685",
            "route": "Hudson",
            "headsign": null,
            "direction": "south",
            "scheduled": "2026-08-10T19:18:00.000Z",
            "predicted": "2026-08-10T19:18:00.000Z",
            "delaySeconds": null,
            "status": "unknown",
            "track": null,
            "wheelchairAccessible": null,
            "basis": "realtime"
          }
        ]
      },
      "44": {
        "provenance": {
          "source": "HHFT content — station lifecycle",
          "as_of": "2026-08-10T17:31:58.024Z",
          "fetched_at": "2026-08-10T17:31:58.024Z",
          "origin": "computed",
          "ttl_s": null,
          "hard_ttl_s": null,
          "degraded": false,
          "note": "Closed for reconstruction since 21 April 2025, as part of the Breakneck Connector and Bridge project."
        },
        "state": "live",
        "data": []
      },
      "46": {
        "provenance": {
          "source": "MTA Metro-North (GTFS-Realtime)",
          "href": "https://new.mta.info/developers",
          "as_of": "2026-08-10T17:31:49.000Z",
          "fetched_at": "2026-08-10T17:31:58.024Z",
          "origin": "network",
          "ttl_s": 20,
          "hard_ttl_s": 300,
          "degraded": false
        },
        "state": "live",
        "data": [
          {
            "train": "3167654",
            "route": "Hudson",
            "headsign": null,
            "direction": "north",
            "scheduled": "2026-08-10T18:04:00.000Z",
            "predicted": "2026-08-10T18:04:00.000Z",
            "delaySeconds": null,
            "status": "unknown",
            "track": null,
            "wheelchairAccessible": null,
            "basis": "realtime"
          },
          {
            "train": "3167683",
            "route": "Hudson",
            "headsign": null,
            "direction": "south",
            "scheduled": "2026-08-10T18:05:00.000Z",
            "predicted": "2026-08-10T18:05:00.000Z",
            "delaySeconds": null,
            "status": "unknown",
            "track": null,
            "wheelchairAccessible": null,
            "basis": "realtime"
          },
          {
            "train": "3167685",
            "route": "Hudson",
            "headsign": null,
            "direction": "south",
            "scheduled": "2026-08-10T19:10:00.000Z",
            "predicted": "2026-08-10T19:10:00.000Z",
            "delaySeconds": null,
            "status": "unknown",
            "track": null,
            "wheelchairAccessible": null,
            "basis": "realtime"
          },
          {
            "train": "3167657",
            "route": "Hudson",
            "headsign": null,
            "direction": "north",
            "scheduled": "2026-08-10T19:14:00.000Z",
            "predicted": "2026-08-10T19:14:00.000Z",
            "delaySeconds": null,
            "status": "unknown",
            "track": null,
            "wheelchairAccessible": null,
            "basis": "realtime"
          }
        ]
      }
    },
    "alerts": {
      "provenance": {
        "source": "MTA service alerts",
        "as_of": "2026-08-10T17:31:57.276Z",
        "fetched_at": "2026-08-10T17:31:57.276Z",
        "origin": "network",
        "ttl_s": 60,
        "hard_ttl_s": 900,
        "degraded": false,
        "href": "https://new.mta.info/developers"
      },
      "state": "live",
      "data": [
        {
          "id": "lmm:planned_work:33285",
          "type": "Reduced Service",
          "header": "The Hudson Line operates on a modified schedule, hourly between Grand Central and Beacon, and reduced to generally every two hours north of Beacon.",
          "description": "Make sure to plan your summer weekend travel on our TrainTime app or by visiting mta.info as our schedule has changed.  \n\nWhat's happening?\n\nSwitch replacement",
          "humanReadableActivePeriod": "Sat and Sun, 9:30 AM to 10:00 PM, Jul 25 - Sep 13",
          "startsAt": "2026-08-08T13:30:00.000Z",
          "endsAt": "2026-08-09T02:00:00.000Z",
          "severity": "minor"
        },
        {
          "id": "lmm:planned_work:32826",
          "type": "Station Notice",
          "header": "Riverdale station north end access is restricted at W 255 St. Build in extra travel time.",
          "description": "The closure of W. 255th Street for roadway construction is now in effect. \n\nAll AM and PM passenger pick-ups will now take place at the bus drop-off area. \n\nFor your safety, please use the platform stairs to access the new pick-up location and avoid walking on the roadway.",
          "humanReadableActivePeriod": "Jun 22 - Late Autumn 2026",
          "startsAt": "2026-06-22T04:00:00.000Z",
          "endsAt": "2026-11-15T05:00:00.000Z",
          "severity": "info"
        }
      ]
    }
  },
  "roads": {
    "provenance": {
      "source": "511NY (NYSDOT)",
      "href": "https://511ny.org/",
      "as_of": "2026-08-07T23:35:47.308Z",
      "fetched_at": "2026-08-07T23:35:47.308Z",
      "origin": "captured-sample",
      "ttl_s": 300,
      "hard_ttl_s": null,
      "degraded": true,
      "note": "Not live. 511NY requires a developer key registered in HHFT’s name — a five-minute client task we will not do on their behalf. This is the captured corridor sample, shown so the module can be reviewed now."
    },
    "state": "stale",
    "data": [
      {
        "id": "TRANSCOM-ORC32639409",
        "roadway": "NY 9D",
        "direction": "Southbound",
        "description": "Roadwork on NY 9D southbound between Coris Lane (Cold Spring) and Fair Street (Cold Spring) 2026084697290/30372609 - 24/7 S/B LANE CLOSURE - This work is weather permitting. Plan travel accordingly; delays may exist, Continuous Thursday April 30th, 2026 12:00 AM thru Tuesday September 29th, 2026 12:00 AM alternating traffic",
        "eventType": "roadwork",
        "eventSubType": "Roadwork",
        "severity511": "Unknown",
        "severity": "minor",
        "startsAt": "2026-04-30T04:00:00.000Z",
        "plannedEndAt": "2026-09-30T03:59:59.000Z",
        "lastUpdated": "2026-08-04T10:36:08.000Z",
        "lat": 41.443102,
        "lon": -73.977608,
        "nearTrailheads": [
          "breakneck",
          "little-stony-point"
        ],
        "distanceMi": 0.3
      },
      {
        "id": "TRANSCOM-ORO500044536",
        "roadway": "Hudson",
        "direction": "Both directions",
        "description": "Due to Construction both directions, Hudson bypassing Breakneck Ridge (Fishkill), Continuous Monday April 21st, 2025 12:00 AM thru Wednesday April 21st, 2027 11:59 PM bypassing",
        "eventType": "transitOperations",
        "eventSubType": "roadwork",
        "severity511": "Unknown",
        "severity": "minor",
        "startsAt": "2025-04-21T04:00:00.000Z",
        "plannedEndAt": "2027-04-22T03:59:00.000Z",
        "lastUpdated": "2025-04-14T15:42:22.000Z",
        "lat": 41.450181,
        "lon": -73.982449,
        "nearTrailheads": [
          "breakneck",
          "little-stony-point"
        ],
        "distanceMi": 0.4
      },
      {
        "id": "TRANSCOM-ORC32312209",
        "roadway": "NY 9D",
        "direction": "Southbound",
        "description": "Tunnel repairs on NY 9D southbound between Fair Street (Cold Spring) and Hartsook Lane (Cold Spring) D265238/32312209 - TEMPORARY SIGNAL IN PLACE - Plan travel accordingly; delays may exist, Monday August 10th, 2026 thru Monday August 31st, 2026, Monday thru Friday, 08:30 AM thru 03:00 PM, alternating traffic",
        "eventType": "roadwork",
        "eventSubType": "Tunnel repairs",
        "severity511": "Unknown",
        "severity": "minor",
        "startsAt": "2026-08-10T12:30:00.000Z",
        "plannedEndAt": "2026-09-01T03:59:59.000Z",
        "lastUpdated": "2026-08-04T10:59:00.000Z",
        "lat": 41.441285,
        "lon": -73.975961,
        "nearTrailheads": [
          "breakneck",
          "little-stony-point"
        ],
        "distanceMi": 0.4
      },
      {
        "id": "TRANSCOM-ORC32789309",
        "roadway": "I-84",
        "direction": "Both directions",
        "description": "Sign work on I-84 both directions between Exit 41 - NY 9D (Fishkill) and Exit 44 - NY 52 (Fishkill) Res 8-3 RW/32789309 - This work is weather permitting, Plan travel accordingly; delays may exist, Monday August 17th, 2026 thru Thursday August 20th, 2026 Monday/ Tuesday/ Wednesday/ Thursday, 10:00 AM thru 02:30 PM, various lane closures",
        "eventType": "roadwork",
        "eventSubType": "Sign work",
        "severity511": "Unknown",
        "severity": "minor",
        "startsAt": "2026-08-17T14:00:00.000Z",
        "plannedEndAt": "2026-08-21T03:59:59.000Z",
        "lastUpdated": "2026-08-05T15:08:06.000Z",
        "lat": 41.519025,
        "lon": -73.968245,
        "nearTrailheads": [
          "beacon"
        ],
        "distanceMi": 1.3
      },
      {
        "id": "TRANSCOM-ORC32789409",
        "roadway": "I-84",
        "direction": "Westbound",
        "description": "Mowing on I-84 westbound between Exit 41 - NY 9D (Fishkill) and Exit 50 - Lime Kiln Road NY 52 (East Fishkill) Res 8-3 RW/32789309 - This work is weather permitting, Plan travel accordingly; delays may exist, Monday August 10th, 2026 thru Friday August 14th, 2026, Monday thru Friday, 10:00 AM thru 02:30 PM, shoulder closure",
        "eventType": "roadwork",
        "eventSubType": "Mowing",
        "severity511": "Unknown",
        "severity": "minor",
        "startsAt": "2026-08-10T14:00:00.000Z",
        "plannedEndAt": "2026-08-15T03:59:59.000Z",
        "lastUpdated": "2026-08-06T12:27:14.000Z",
        "lat": 41.519724,
        "lon": -73.966843,
        "nearTrailheads": [
          "beacon"
        ],
        "distanceMi": 1.4
      }
    ]
  },
  "shuttle": {
    "hhft": {
      "ok": true,
      "enabled": false,
      "feedAgeSeconds": null,
      "source": "HHFT shuttle (not yet in service)",
      "note": "Configured and deliberately disabled: no shuttle service exists yet. Set the environment variables below to switch it on — no code change.",
      "configKeys": [
        "HHFT_SHUTTLE_GTFS_URL",
        "HHFT_SHUTTLE_GTFS_RT_TRIP_UPDATES",
        "HHFT_SHUTTLE_GTFS_RT_VEHICLE_POSITIONS",
        "HHFT_SHUTTLE_GTFS_RT_ALERTS"
      ]
    },
    "demonstration": {
      "note": "Acadia National Park, Maine. Present only to exercise the shuttle adapter against a live GTFS-Realtime feed. Not Hudson Valley data.",
      "provenance": {
        "source": "Acadia National Park — Island Explorer (GTFS-Realtime)",
        "href": "https://www.nps.gov/subjects/developer/gtfs.htm",
        "as_of": "2026-08-10T17:31:28.000Z",
        "fetched_at": "2026-08-10T17:31:57.476Z",
        "origin": "network",
        "ttl_s": 60,
        "hard_ttl_s": 3600,
        "degraded": false,
        "note": "This is Acadia National Park in Maine, read through the same adapter the Fjord Trail shuttle will use."
      },
      "vehicles": [
        {
          "id": "239",
          "routeId": "1",
          "tripId": "t528-bC9-slC",
          "lat": 44.41908645629883,
          "lon": -68.34676361083984,
          "bearing": 94,
          "timestamp": "2026-08-10T17:31:02.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "257",
          "routeId": "1",
          "tripId": "t514-bCB-slC",
          "lat": 44.4276008605957,
          "lon": -68.32447052001953,
          "bearing": 208,
          "timestamp": "2026-08-10T17:30:29.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "258",
          "routeId": "6",
          "tripId": "t523-b84-slC",
          "lat": 44.344669342041016,
          "lon": -68.24911499023438,
          "bearing": 190,
          "timestamp": "2026-08-10T17:30:43.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "260",
          "routeId": "10",
          "tripId": "t523-b52-slC",
          "lat": 44.36484146118164,
          "lon": -68.19813537597656,
          "bearing": 38,
          "timestamp": "2026-08-10T17:30:24.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "361",
          "routeId": "4",
          "tripId": "t4E2-b53-slC",
          "lat": 44.32004165649414,
          "lon": -68.18936920166016,
          "bearing": 204,
          "timestamp": "2026-08-10T17:31:18.000Z",
          "occupancyStatus": "FULL"
        },
        {
          "id": "363",
          "routeId": "4",
          "tripId": "t528-b29-slC",
          "lat": 44.37522506713867,
          "lon": -68.22505187988281,
          "bearing": 164,
          "timestamp": "2026-08-10T17:31:13.000Z",
          "occupancyStatus": "FULL"
        },
        {
          "id": "470",
          "routeId": "4",
          "tripId": "t4C4-b41-slC",
          "lat": 44.32060241699219,
          "lon": -68.25045776367188,
          "bearing": 94,
          "timestamp": "2026-08-10T17:30:59.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "471",
          "routeId": "6",
          "tripId": "t52D-b87-slC",
          "lat": 44.295982360839844,
          "lon": -68.27713012695312,
          "bearing": 152,
          "timestamp": "2026-08-10T17:30:16.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "473",
          "routeId": "2",
          "tripId": "t523-b9-slC",
          "lat": 44.39395523071289,
          "lon": -68.22347259521484,
          "bearing": 236,
          "timestamp": "2026-08-10T17:30:22.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "802",
          "routeId": "1",
          "tripId": "t514-b12-slC",
          "lat": 44.42931365966797,
          "lon": -68.25457763671875,
          "bearing": 114,
          "timestamp": "2026-08-10T17:30:58.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "864",
          "routeId": "1",
          "tripId": "t4D8-bCD-slC",
          "lat": 44.38652038574219,
          "lon": -68.21354675292969,
          "bearing": 164,
          "timestamp": "2026-08-10T17:30:26.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "887",
          "routeId": "3",
          "tripId": "t578-bD-slC",
          "lat": 44.3875732421875,
          "lon": -68.20551300048828,
          "bearing": 140,
          "timestamp": "2026-08-10T17:30:15.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "890",
          "routeId": "5",
          "tripId": "t532-bE-slC",
          "lat": 44.409034729003906,
          "lon": -68.24790954589844,
          "bearing": 84,
          "timestamp": "2026-08-10T17:30:29.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "945",
          "routeId": "1",
          "tripId": "t528-bCC-slC",
          "lat": 44.4090576171875,
          "lon": -68.24747467041016,
          "bearing": 88,
          "timestamp": "2026-08-10T17:31:13.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "973",
          "routeId": "3",
          "tripId": "t532-bC-slC",
          "lat": 44.3881950378418,
          "lon": -68.20449829101562,
          "bearing": 96,
          "timestamp": "2026-08-10T17:30:53.000Z",
          "occupancyStatus": "EMPTY"
        },
        {
          "id": "974",
          "routeId": "5",
          "tripId": "t52D-b10-slC",
          "lat": 44.3514289855957,
          "lon": -68.24364471435547,
          "bearing": 122,
          "timestamp": "2026-08-10T17:31:03.000Z",
          "occupancyStatus": "EMPTY"
        }
      ]
    }
  },
  "ingested_notices": [
    {
      "id": "notice-mta-lmm-planned-work-33285",
      "kind": "service_change",
      "severity": "minor",
      "access_impact": "caution",
      "title": "Metro-North: Reduced Service",
      "summary": "The Hudson Line operates on a modified schedule, hourly between Grand Central and Beacon, and reduced to generally every two hours north of Beacon.",
      "body": "Make sure to plan your summer weekend travel on our TrainTime app or by visiting mta.info as our schedule has changed.  \n\nWhat's happening?\n\nSwitch replacement",
      "instruction": null,
      "starts_at": "2026-08-08T13:30:00.000Z",
      "ends_at": "2026-08-09T02:00:00.000Z",
      "all_day": false,
      "timezone": "America/New_York",
      "recurrence": null,
      "review_by": null,
      "affects": {
        "segments": [],
        "trailheads": [],
        "amenities": [],
        "parking": [],
        "stations": [
          "sta-cold-spring",
          "sta-beacon",
          "sta-breakneck-ridge"
        ],
        "shuttle_stops": [],
        "programs": []
      },
      "geometry": null,
      "detour_geometry_ref": null,
      "modes_affected": [
        "rail"
      ],
      "source": "mta",
      "external_ref": "lmm:planned_work:33285",
      "external_last_seen": "2026-08-10T17:31:58.048Z",
      "display": {
        "site_alert_bar": false,
        "map": true,
        "planner": true,
        "homepage_hero": false,
        "email_digest": false
      },
      "status": "active",
      "published_at": "2026-08-08T13:30:00.000Z",
      "updated_at": "2026-08-10T17:31:58.048Z",
      "author": null,
      "version": 1,
      "revision_note": null
    },
    {
      "id": "notice-mta-lmm-planned-work-32826",
      "kind": "service_change",
      "severity": "info",
      "access_impact": "caution",
      "title": "Metro-North: Station Notice",
      "summary": "Riverdale station north end access is restricted at W 255 St. Build in extra travel time.",
      "body": "The closure of W. 255th Street for roadway construction is now in effect. \n\nAll AM and PM passenger pick-ups will now take place at the bus drop-off area. \n\nFor your safety, please use the platform stairs to access the new pick-up location and avoid walking on the roadway.",
      "instruction": null,
      "starts_at": "2026-06-22T04:00:00.000Z",
      "ends_at": "2026-11-15T05:00:00.000Z",
      "all_day": false,
      "timezone": "America/New_York",
      "recurrence": null,
      "review_by": null,
      "affects": {
        "segments": [],
        "trailheads": [],
        "amenities": [],
        "parking": [],
        "stations": [
          "sta-cold-spring",
          "sta-beacon",
          "sta-breakneck-ridge"
        ],
        "shuttle_stops": [],
        "programs": []
      },
      "geometry": null,
      "detour_geometry_ref": null,
      "modes_affected": [
        "rail"
      ],
      "source": "mta",
      "external_ref": "lmm:planned_work:32826",
      "external_last_seen": "2026-08-10T17:31:58.049Z",
      "display": {
        "site_alert_bar": false,
        "map": true,
        "planner": true,
        "homepage_hero": false,
        "email_digest": false
      },
      "status": "active",
      "published_at": "2026-06-22T04:00:00.000Z",
      "updated_at": "2026-08-10T17:31:58.049Z",
      "author": null,
      "version": 1,
      "revision_note": null
    },
    {
      "id": "notice-511ny-transcom-orc32639409",
      "kind": "service_change",
      "severity": "minor",
      "access_impact": "caution",
      "title": "NY 9D: Roadwork",
      "summary": "Roadwork on NY 9D southbound between Coris Lane (Cold Spring) and Fair Street (Cold Spring) 2026084697290/30372609 - 24/7 S/B LANE CLOSURE - This work is weather permitting. Plan travel accordingly…",
      "body": null,
      "instruction": null,
      "starts_at": "2026-04-30T04:00:00.000Z",
      "ends_at": "2026-09-30T03:59:59.000Z",
      "all_day": false,
      "timezone": "America/New_York",
      "recurrence": null,
      "review_by": null,
      "affects": {
        "segments": [],
        "trailheads": [],
        "amenities": [],
        "parking": [],
        "stations": [],
        "shuttle_stops": [],
        "programs": []
      },
      "geometry": null,
      "detour_geometry_ref": null,
      "modes_affected": [
        "car"
      ],
      "source": "nysdot_511ny",
      "external_ref": "TRANSCOM-ORC32639409",
      "external_last_seen": "2026-08-04T10:36:08.000Z",
      "display": {
        "site_alert_bar": false,
        "map": true,
        "planner": true,
        "homepage_hero": false,
        "email_digest": false
      },
      "status": "active",
      "published_at": "2026-04-30T04:00:00.000Z",
      "updated_at": "2026-08-04T10:36:08.000Z",
      "author": null,
      "version": 1,
      "revision_note": null
    },
    {
      "id": "notice-511ny-transcom-oro500044536",
      "kind": "service_change",
      "severity": "minor",
      "access_impact": "caution",
      "title": "Hudson: roadwork",
      "summary": "Due to Construction both directions, Hudson bypassing Breakneck Ridge (Fishkill), Continuous Monday April 21st, 2025 12:00 AM thru Wednesday April 21st, 2027 11:59 PM bypassing",
      "body": null,
      "instruction": null,
      "starts_at": "2025-04-21T04:00:00.000Z",
      "ends_at": "2027-04-22T03:59:00.000Z",
      "all_day": false,
      "timezone": "America/New_York",
      "recurrence": null,
      "review_by": null,
      "affects": {
        "segments": [],
        "trailheads": [],
        "amenities": [],
        "parking": [],
        "stations": [],
        "shuttle_stops": [],
        "programs": []
      },
      "geometry": null,
      "detour_geometry_ref": null,
      "modes_affected": [
        "car"
      ],
      "source": "nysdot_511ny",
      "external_ref": "TRANSCOM-ORO500044536",
      "external_last_seen": "2025-04-14T15:42:22.000Z",
      "display": {
        "site_alert_bar": false,
        "map": true,
        "planner": true,
        "homepage_hero": false,
        "email_digest": false
      },
      "status": "active",
      "published_at": "2025-04-21T04:00:00.000Z",
      "updated_at": "2025-04-14T15:42:22.000Z",
      "author": null,
      "version": 1,
      "revision_note": null
    },
    {
      "id": "notice-511ny-transcom-orc32312209",
      "kind": "service_change",
      "severity": "minor",
      "access_impact": "caution",
      "title": "NY 9D: Tunnel repairs",
      "summary": "Tunnel repairs on NY 9D southbound between Fair Street (Cold Spring) and Hartsook Lane (Cold Spring) D265238/32312209 - TEMPORARY SIGNAL IN PLACE - Plan travel accordingly; delays may exist, Monday…",
      "body": null,
      "instruction": null,
      "starts_at": "2026-08-10T12:30:00.000Z",
      "ends_at": "2026-09-01T03:59:59.000Z",
      "all_day": false,
      "timezone": "America/New_York",
      "recurrence": null,
      "review_by": null,
      "affects": {
        "segments": [],
        "trailheads": [],
        "amenities": [],
        "parking": [],
        "stations": [],
        "shuttle_stops": [],
        "programs": []
      },
      "geometry": null,
      "detour_geometry_ref": null,
      "modes_affected": [
        "car"
      ],
      "source": "nysdot_511ny",
      "external_ref": "TRANSCOM-ORC32312209",
      "external_last_seen": "2026-08-04T10:59:00.000Z",
      "display": {
        "site_alert_bar": false,
        "map": true,
        "planner": true,
        "homepage_hero": false,
        "email_digest": false
      },
      "status": "active",
      "published_at": "2026-08-10T12:30:00.000Z",
      "updated_at": "2026-08-04T10:59:00.000Z",
      "author": null,
      "version": 1,
      "revision_note": null
    },
    {
      "id": "notice-511ny-transcom-orc32789309",
      "kind": "service_change",
      "severity": "minor",
      "access_impact": "caution",
      "title": "I-84: Sign work",
      "summary": "Sign work on I-84 both directions between Exit 41 - NY 9D (Fishkill) and Exit 44 - NY 52 (Fishkill) Res 8-3 RW/32789309 - This work is weather permitting, Plan travel accordingly; delays may exist…",
      "body": null,
      "instruction": null,
      "starts_at": "2026-08-17T14:00:00.000Z",
      "ends_at": "2026-08-21T03:59:59.000Z",
      "all_day": false,
      "timezone": "America/New_York",
      "recurrence": null,
      "review_by": null,
      "affects": {
        "segments": [],
        "trailheads": [],
        "amenities": [],
        "parking": [],
        "stations": [],
        "shuttle_stops": [],
        "programs": []
      },
      "geometry": null,
      "detour_geometry_ref": null,
      "modes_affected": [
        "car"
      ],
      "source": "nysdot_511ny",
      "external_ref": "TRANSCOM-ORC32789309",
      "external_last_seen": "2026-08-05T15:08:06.000Z",
      "display": {
        "site_alert_bar": false,
        "map": true,
        "planner": true,
        "homepage_hero": false,
        "email_digest": false
      },
      "status": "active",
      "published_at": "2026-08-17T14:00:00.000Z",
      "updated_at": "2026-08-05T15:08:06.000Z",
      "author": null,
      "version": 1,
      "revision_note": null
    },
    {
      "id": "notice-511ny-transcom-orc32789409",
      "kind": "service_change",
      "severity": "minor",
      "access_impact": "caution",
      "title": "I-84: Mowing",
      "summary": "Mowing on I-84 westbound between Exit 41 - NY 9D (Fishkill) and Exit 50 - Lime Kiln Road NY 52 (East Fishkill) Res 8-3 RW/32789309 - This work is weather permitting, Plan travel accordingly; delays…",
      "body": null,
      "instruction": null,
      "starts_at": "2026-08-10T14:00:00.000Z",
      "ends_at": "2026-08-15T03:59:59.000Z",
      "all_day": false,
      "timezone": "America/New_York",
      "recurrence": null,
      "review_by": null,
      "affects": {
        "segments": [],
        "trailheads": [],
        "amenities": [],
        "parking": [],
        "stations": [],
        "shuttle_stops": [],
        "programs": []
      },
      "geometry": null,
      "detour_geometry_ref": null,
      "modes_affected": [
        "car"
      ],
      "source": "nysdot_511ny",
      "external_ref": "TRANSCOM-ORC32789409",
      "external_last_seen": "2026-08-06T12:27:14.000Z",
      "display": {
        "site_alert_bar": false,
        "map": true,
        "planner": true,
        "homepage_hero": false,
        "email_digest": false
      },
      "status": "active",
      "published_at": "2026-08-10T14:00:00.000Z",
      "updated_at": "2026-08-06T12:27:14.000Z",
      "author": null,
      "version": 1,
      "revision_note": null
    }
  ],
  "health": [
    {
      "ok": true,
      "enabled": true,
      "feedAgeSeconds": 9,
      "source": "MTA Metro-North (GTFS-Realtime)",
      "configKeys": [
        "HHFT_MTA_API_KEY (optional — endpoints are currently keyless)"
      ]
    },
    {
      "ok": true,
      "enabled": false,
      "feedAgeSeconds": null,
      "source": "HHFT shuttle (not yet in service)",
      "note": "Configured and deliberately disabled: no shuttle service exists yet. Set the environment variables below to switch it on — no code change.",
      "configKeys": [
        "HHFT_SHUTTLE_GTFS_URL",
        "HHFT_SHUTTLE_GTFS_RT_TRIP_UPDATES",
        "HHFT_SHUTTLE_GTFS_RT_VEHICLE_POSITIONS",
        "HHFT_SHUTTLE_GTFS_RT_ALERTS"
      ]
    },
    {
      "ok": true,
      "enabled": true,
      "feedAgeSeconds": 30,
      "source": "Acadia National Park — Island Explorer (GTFS-Realtime)",
      "note": "Reachable. This is Acadia in Maine, exercising the same adapter the Fjord Trail shuttle will use.",
      "configKeys": [
        "(none — public, keyless)"
      ]
    },
    {
      "ok": true,
      "enabled": true,
      "feedAgeSeconds": 10249,
      "source": "National Weather Service — forecast (2 offices: ALY, OKX)",
      "configKeys": [
        "(none — free, User-Agent only)"
      ]
    },
    {
      "ok": true,
      "enabled": true,
      "feedAgeSeconds": 1,
      "source": "National Weather Service — active alerts (union across 3 points)",
      "configKeys": [
        "(none — free, User-Agent only)"
      ]
    },
    {
      "ok": true,
      "enabled": true,
      "feedAgeSeconds": 2818,
      "source": "National Weather Service — observations (KSWF, 6 mi W)",
      "configKeys": [
        "(none — free, User-Agent only)"
      ]
    },
    {
      "ok": true,
      "enabled": true,
      "feedAgeSeconds": 10249,
      "source": "NOAA CO-OPS — predicted tide, station 8518934 Beacon",
      "note": "Predictions only. This station offers no water-level product, and both nearby USGS river gauges are discontinued.",
      "configKeys": [
        "(none — free, keyless)"
      ]
    },
    {
      "ok": true,
      "enabled": false,
      "feedAgeSeconds": 237371,
      "source": "511NY (NYSDOT) — corridor road events",
      "note": "Not live. 511NY requires a developer key registered in HHFT’s name — a five-minute client task we will not do on their behalf. This is the captured corridor sample, shown so the module can be reviewed now.",
      "configKeys": [
        "HHFT_511NY_KEY"
      ]
    },
    {
      "ok": true,
      "enabled": true,
      "feedAgeSeconds": 0,
      "source": "Sun and light — computed on device (suncalc)",
      "note": "No network request, and none is possible. Works with no signal.",
      "configKeys": [
        "(none)"
      ]
    }
  ]
}