{
  "schema_version": "fra-report-0.1",
  "template_version": "fra-report-0.1",
  "meta": {
    "run_id": "tampa-30nm",
    "name": "Tampa Bay → 30 nm W",
    "mode": "offshore",
    "date_local": "2026-09-13",
    "tz_offset_hours": -5,
    "generated_at": "2026-09-13T19:00:11.874Z",
    "window": {
      "start": "06:00",
      "end": "14:00"
    },
    "launch": {
      "lat": 27.7,
      "lon": -82.7,
      "label": "Tampa Bay entrance"
    },
    "destination": {
      "lat": 27.62,
      "lon": -83.2,
      "label": "30 nm W"
    },
    "distance_nm": 27,
    "bearing_deg": 260,
    "ladder_legs": 5,
    "weatheragent_mode": "keyed",
    "sources": [
      "ndbc",
      "nws"
    ],
    "source_count": 2,
    "multi_source": true,
    "cache_hits": 5,
    "upstream_legs": 0,
    "upstream_requests": 0,
    "batched": false,
    "batch_size": 0,
    "cycle_per_source": {
      "ndbc": {
        "cadence_minutes": 10,
        "cycle": "2026-09-13T19:00:00.000Z",
        "next": "2026-09-13T19:10:00.000Z",
        "seconds_to_next": 589
      },
      "nws": {
        "cadence_minutes": 60,
        "cycle": "2026-09-13T19:00:00.000Z",
        "next": "2026-09-13T20:00:00.000Z",
        "seconds_to_next": 3589
      }
    },
    "cycle_ttl_seconds": 589,
    "cycle": "ndbc@2026-09-13T19:00:00.000Z|nws@2026-09-13T19:00:00.000Z",
    "slug": "fra-01d8071f7dd1",
    "cell_id": "27.600:-83.200",
    "visibility": "public",
    "user_key": "_operator"
  },
  "verdict": {
    "call": "go",
    "zone": "offshore",
    "score": 8.09,
    "score_max": 10,
    "confidence": "high",
    "degraded": false,
    "degraded_reason": null,
    "offshore_leg": "Your spot · 27 nm W",
    "headline": "GO — the water is laid down and the whole run is on.",
    "why": "At the spot it is 1.6 ft at 3 seconds, with 4.5 kt of wind. Nothing in the ladder argues against the run you planned — take it.",
    "mode": "offshore",
    "drivers": [
      {
        "code": "light_wind",
        "weight": "medium",
        "text": "Light wind (4.5 kt) keeps the drift slow and the water clean."
      }
    ],
    "limits": [],
    "limit_nm": 27,
    "hazards": [],
    "inside_hazards": [],
    "help": {
      "label": "Go",
      "one_line": "Full run as planned.",
      "means": "The water and the wind support the run you planned, start to finish.",
      "do": "Take the run you planned. Watch the afternoon if the report flags a build."
    }
  },
  "ladder": [
    {
      "leg": "launch",
      "label": "Launch · Tampa Bay entrance",
      "nm": 0,
      "bearing_deg": 260,
      "point": {
        "lat": 27.7,
        "lon": -82.7
      },
      "station": {
        "id": "42098",
        "name": "Egmont Channel Entrance, FL (214)",
        "distance_km": 26,
        "supported_params": [
          "airTemperature",
          "waterTemperature",
          "waveDirection",
          "waveHeight",
          "wavePeriod"
        ],
        "missing_requested": [
          "windSpeed",
          "windGust",
          "windDirection",
          "pressure"
        ]
      },
      "repeat_of_previous_station": false,
      "wave_sources_n": 1,
      "notices": [
        "cloudCover, waterTemperature, waveDirection, waveHeight, wavePeriod, windDirection, windGust, windSpeed came from a single source — there is no cross-source spread to read for these parameters."
      ],
      "seas": {
        "height_ft": 1.64,
        "period_s": 3,
        "direction_deg": 163,
        "direction_compass": "SSE",
        "per_source": {
          "ndbc": 1.64
        },
        "spread": null,
        "basis": "window maximum height; period and direction read at that hour"
      },
      "wind": {
        "speed_kt": 6.3,
        "speed_max_kt": 7,
        "gust_kt": 9,
        "direction_deg": 290,
        "direction_compass": "WNW",
        "per_source": {
          "nws": 5
        },
        "spread": null,
        "basis": "mean sustained over the window; peak gust over the window"
      },
      "water": {
        "temp_f": 87.9,
        "per_source": {
          "ndbc": 88.2
        }
      },
      "score": 7.88,
      "sea_score": 6.720000000000001,
      "wind_score": 9.0375,
      "ride_read": {
        "read": "Small but stacked — bumpy, not dangerous. Beam sea — the least comfortable angle; quarter it rather than running across it.",
        "tone": "ok"
      },
      "sources": [
        "ndbc",
        "nws"
      ],
      "missing": [],
      "ok": true,
      "reason": null,
      "reads": {
        "seas": {
          "read": "Light. Easy ride at cruise; you will not take spray over the bow.",
          "tone": "good"
        },
        "period": {
          "read": "Steep and confused — the worst ride per foot of height.",
          "tone": "bad"
        }
      }
    },
    {
      "leg": "7nm",
      "label": "7 miles",
      "nm": 6.8,
      "bearing_deg": 260,
      "point": {
        "lat": 27.68,
        "lon": -82.825
      },
      "station": {
        "id": "42098",
        "name": "Egmont Channel Entrance, FL (214)",
        "distance_km": 14,
        "supported_params": [
          "airTemperature",
          "waterTemperature",
          "waveDirection",
          "waveHeight",
          "wavePeriod"
        ],
        "missing_requested": [
          "windSpeed",
          "windGust",
          "windDirection",
          "pressure"
        ]
      },
      "repeat_of_previous_station": true,
      "wave_sources_n": 1,
      "notices": [
        "cloudCover, waterTemperature, waveDirection, waveHeight, wavePeriod, windDirection, windGust, windSpeed came from a single source — there is no cross-source spread to read for these parameters."
      ],
      "seas": {
        "height_ft": 1.64,
        "period_s": 3,
        "direction_deg": 163,
        "direction_compass": "SSE",
        "per_source": {
          "ndbc": 1.64
        },
        "spread": null,
        "basis": "window maximum height; period and direction read at that hour"
      },
      "wind": {
        "speed_kt": 5.8,
        "speed_max_kt": 7,
        "gust_kt": 9,
        "direction_deg": 320,
        "direction_compass": "NW",
        "per_source": {
          "nws": 4
        },
        "spread": null,
        "basis": "mean sustained over the window; peak gust over the window"
      },
      "water": {
        "temp_f": 87.9,
        "per_source": {
          "ndbc": 88.2
        }
      },
      "score": 7.88,
      "sea_score": 6.720000000000001,
      "wind_score": 9.0375,
      "ride_read": {
        "read": "Small but stacked — bumpy, not dangerous. Beam sea — the least comfortable angle; quarter it rather than running across it.",
        "tone": "ok"
      },
      "sources": [
        "ndbc",
        "nws"
      ],
      "missing": [],
      "ok": true,
      "reason": null,
      "reads": {
        "seas": {
          "read": "Light. Easy ride at cruise; you will not take spray over the bow.",
          "tone": "good"
        },
        "period": {
          "read": "Steep and confused — the worst ride per foot of height.",
          "tone": "bad"
        }
      }
    },
    {
      "leg": "14nm",
      "label": "14 miles",
      "nm": 13.5,
      "bearing_deg": 260,
      "point": {
        "lat": 27.66,
        "lon": -82.95
      },
      "station": {
        "id": "42098",
        "name": "Egmont Channel Entrance, FL (214)",
        "distance_km": 8,
        "supported_params": [
          "airTemperature",
          "waterTemperature",
          "waveDirection",
          "waveHeight",
          "wavePeriod"
        ],
        "missing_requested": [
          "windSpeed",
          "windGust",
          "windDirection",
          "pressure"
        ]
      },
      "repeat_of_previous_station": true,
      "wave_sources_n": 1,
      "notices": [
        "cloudCover, waterTemperature, waveDirection, waveHeight, wavePeriod, windDirection, windGust, windSpeed came from a single source — there is no cross-source spread to read for these parameters."
      ],
      "seas": {
        "height_ft": 1.64,
        "period_s": 3,
        "direction_deg": 163,
        "direction_compass": "SSE",
        "per_source": {
          "ndbc": 1.64
        },
        "spread": null,
        "basis": "window maximum height; period and direction read at that hour"
      },
      "wind": {
        "speed_kt": 5.3,
        "speed_max_kt": 6,
        "gust_kt": 8,
        "direction_deg": 330,
        "direction_compass": "NNW",
        "per_source": {
          "nws": 4
        },
        "spread": null,
        "basis": "mean sustained over the window; peak gust over the window"
      },
      "water": {
        "temp_f": 87.9,
        "per_source": {
          "ndbc": 88.2
        }
      },
      "score": 8.09,
      "sea_score": 6.720000000000001,
      "wind_score": 9.45,
      "ride_read": {
        "read": "Small but stacked — bumpy, not dangerous. Beam sea — the least comfortable angle; quarter it rather than running across it.",
        "tone": "ok"
      },
      "sources": [
        "ndbc",
        "nws"
      ],
      "missing": [],
      "ok": true,
      "reason": null,
      "reads": {
        "seas": {
          "read": "Light. Easy ride at cruise; you will not take spray over the bow.",
          "tone": "good"
        },
        "period": {
          "read": "Steep and confused — the worst ride per foot of height.",
          "tone": "bad"
        }
      }
    },
    {
      "leg": "20nm",
      "label": "20 miles",
      "nm": 20.3,
      "bearing_deg": 260,
      "point": {
        "lat": 27.64,
        "lon": -83.075
      },
      "station": {
        "id": "42098",
        "name": "Egmont Channel Entrance, FL (214)",
        "distance_km": 15,
        "supported_params": [
          "airTemperature",
          "waterTemperature",
          "waveDirection",
          "waveHeight",
          "wavePeriod"
        ],
        "missing_requested": [
          "windSpeed",
          "windGust",
          "windDirection",
          "pressure"
        ]
      },
      "repeat_of_previous_station": true,
      "wave_sources_n": 1,
      "notices": [
        "cloudCover, waterTemperature, waveDirection, waveHeight, wavePeriod, windDirection, windGust, windSpeed came from a single source — there is no cross-source spread to read for these parameters."
      ],
      "seas": {
        "height_ft": 1.64,
        "period_s": 3,
        "direction_deg": 163,
        "direction_compass": "SSE",
        "per_source": {
          "ndbc": 1.64
        },
        "spread": null,
        "basis": "window maximum height; period and direction read at that hour"
      },
      "wind": {
        "speed_kt": 5,
        "speed_max_kt": 6,
        "gust_kt": 8,
        "direction_deg": 330,
        "direction_compass": "NNW",
        "per_source": {
          "nws": 4
        },
        "spread": null,
        "basis": "mean sustained over the window; peak gust over the window"
      },
      "water": {
        "temp_f": 87.9,
        "per_source": {
          "ndbc": 88.2
        }
      },
      "score": 8.09,
      "sea_score": 6.720000000000001,
      "wind_score": 9.45,
      "ride_read": {
        "read": "Small but stacked — bumpy, not dangerous. Beam sea — the least comfortable angle; quarter it rather than running across it.",
        "tone": "ok"
      },
      "sources": [
        "ndbc",
        "nws"
      ],
      "missing": [],
      "ok": true,
      "reason": null,
      "reads": {
        "seas": {
          "read": "Light. Easy ride at cruise; you will not take spray over the bow.",
          "tone": "good"
        },
        "period": {
          "read": "Steep and confused — the worst ride per foot of height.",
          "tone": "bad"
        }
      }
    },
    {
      "leg": "destination",
      "label": "Your spot · 27 nm W",
      "nm": 27,
      "bearing_deg": 260,
      "point": {
        "lat": 27.62,
        "lon": -83.2
      },
      "station": {
        "id": "42098",
        "name": "Egmont Channel Entrance, FL (214)",
        "distance_km": 27,
        "supported_params": [
          "airTemperature",
          "waterTemperature",
          "waveDirection",
          "waveHeight",
          "wavePeriod"
        ],
        "missing_requested": [
          "windSpeed",
          "windGust",
          "windDirection",
          "pressure"
        ]
      },
      "repeat_of_previous_station": true,
      "wave_sources_n": 1,
      "notices": [
        "cloudCover, waterTemperature, waveDirection, waveHeight, wavePeriod, windDirection, windGust, windSpeed came from a single source — there is no cross-source spread to read for these parameters."
      ],
      "seas": {
        "height_ft": 1.64,
        "period_s": 3,
        "direction_deg": 163,
        "direction_compass": "SSE",
        "per_source": {
          "ndbc": 1.64
        },
        "spread": null,
        "basis": "window maximum height; period and direction read at that hour"
      },
      "wind": {
        "speed_kt": 4.5,
        "speed_max_kt": 5,
        "gust_kt": 8,
        "direction_deg": 330,
        "direction_compass": "NNW",
        "per_source": {
          "nws": 4
        },
        "spread": null,
        "basis": "mean sustained over the window; peak gust over the window"
      },
      "water": {
        "temp_f": 87.9,
        "per_source": {
          "ndbc": 88.2
        }
      },
      "score": 8.09,
      "sea_score": 6.720000000000001,
      "wind_score": 9.45,
      "ride_read": {
        "read": "Small but stacked — bumpy, not dangerous. Beam sea — the least comfortable angle; quarter it rather than running across it.",
        "tone": "ok"
      },
      "sources": [
        "ndbc",
        "nws"
      ],
      "missing": [],
      "ok": true,
      "reason": null,
      "reads": {
        "seas": {
          "read": "Light. Easy ride at cruise; you will not take spray over the bow.",
          "tone": "good"
        },
        "period": {
          "read": "Steep and confused — the worst ride per foot of height.",
          "tone": "bad"
        }
      }
    }
  ],
  "spot": {
    "name": "Tampa Bay → 30 nm W",
    "lat": 27.62,
    "lng": -83.2,
    "launch": {
      "lat": 27.7,
      "lon": -82.7,
      "label": "Tampa Bay entrance"
    },
    "station": {
      "id": "42098",
      "name": "Egmont Channel Entrance, FL (214)",
      "distance_km": 27,
      "supported_params": [
        "airTemperature",
        "waterTemperature",
        "waveDirection",
        "waveHeight",
        "wavePeriod"
      ],
      "missing_requested": [
        "windSpeed",
        "windGust",
        "windDirection",
        "pressure"
      ]
    }
  },
  "conditions": {
    "wind": {
      "speed_kt": 4.5,
      "gust_kt": 8,
      "direction_deg": 330,
      "direction_compass": "NNW",
      "per_source": {
        "nws": 4
      },
      "spread": null
    },
    "air_temp_f": 85.8,
    "pressure_inHg": null,
    "pressure_trend_6h": null,
    "cloud_cover_pct": 46,
    "hourly": [
      {
        "time": "2026-09-13T16:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 340,
        "wave_height_ft": 1.64,
        "wave_period_s": 3
      },
      {
        "time": "2026-09-13T17:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 7,
        "wind_dir_deg": 0,
        "wave_height_ft": 1.31,
        "wave_period_s": 4
      },
      {
        "time": "2026-09-13T18:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 8,
        "wind_dir_deg": 330,
        "wave_height_ft": 0.98,
        "wave_period_s": 4
      },
      {
        "time": "2026-09-13T19:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 7,
        "wind_dir_deg": 330,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-13T20:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 7,
        "wind_dir_deg": 340,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-13T21:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 7,
        "wind_dir_deg": 330,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-13T22:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 330,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-13T23:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 320,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T00:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 5,
        "wind_dir_deg": 350,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T01:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 5,
        "wind_dir_deg": 320,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T02:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 5,
        "wind_dir_deg": 300,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T03:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 5,
        "wind_dir_deg": 290,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T04:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 5,
        "wind_dir_deg": 260,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T05:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 5,
        "wind_dir_deg": 270,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T06:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 280,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T07:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 5,
        "wind_dir_deg": 300,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T08:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 300,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T09:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 330,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T10:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 6,
        "wind_dir_deg": 300,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T11:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 7,
        "wind_dir_deg": 330,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T12:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 7,
        "wind_dir_deg": 320,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T13:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 7,
        "wind_dir_deg": 0,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T14:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 7,
        "wind_dir_deg": 20,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T15:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 7,
        "wind_dir_deg": 10,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T16:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 350,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T17:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 350,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T18:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 350,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T19:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 310,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T20:00:00.000Z",
        "wind_speed_kt": 4,
        "wind_gust_kt": 6,
        "wind_dir_deg": 310,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T21:00:00.000Z",
        "wind_speed_kt": 5,
        "wind_gust_kt": 7,
        "wind_dir_deg": 310,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T22:00:00.000Z",
        "wind_speed_kt": 6,
        "wind_gust_kt": 7,
        "wind_dir_deg": 320,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-14T23:00:00.000Z",
        "wind_speed_kt": 6,
        "wind_gust_kt": 7,
        "wind_dir_deg": 330,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T00:00:00.000Z",
        "wind_speed_kt": 6,
        "wind_gust_kt": 7,
        "wind_dir_deg": 350,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T01:00:00.000Z",
        "wind_speed_kt": 6,
        "wind_gust_kt": 8,
        "wind_dir_deg": 340,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T02:00:00.000Z",
        "wind_speed_kt": 6,
        "wind_gust_kt": 8,
        "wind_dir_deg": 10,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T03:00:00.000Z",
        "wind_speed_kt": 7,
        "wind_gust_kt": 9,
        "wind_dir_deg": 20,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T04:00:00.000Z",
        "wind_speed_kt": 8,
        "wind_gust_kt": 10,
        "wind_dir_deg": 30,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T05:00:00.000Z",
        "wind_speed_kt": 8,
        "wind_gust_kt": 10,
        "wind_dir_deg": 40,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T06:00:00.000Z",
        "wind_speed_kt": 8,
        "wind_gust_kt": 10,
        "wind_dir_deg": 50,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T07:00:00.000Z",
        "wind_speed_kt": 8,
        "wind_gust_kt": 10,
        "wind_dir_deg": 60,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T08:00:00.000Z",
        "wind_speed_kt": 8,
        "wind_gust_kt": 10,
        "wind_dir_deg": 70,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T09:00:00.000Z",
        "wind_speed_kt": 8,
        "wind_gust_kt": 10,
        "wind_dir_deg": 90,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T10:00:00.000Z",
        "wind_speed_kt": 8,
        "wind_gust_kt": 10,
        "wind_dir_deg": 100,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T11:00:00.000Z",
        "wind_speed_kt": 9,
        "wind_gust_kt": 11,
        "wind_dir_deg": 100,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T12:00:00.000Z",
        "wind_speed_kt": 10,
        "wind_gust_kt": 12,
        "wind_dir_deg": 100,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T13:00:00.000Z",
        "wind_speed_kt": 10,
        "wind_gust_kt": 12,
        "wind_dir_deg": 90,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T14:00:00.000Z",
        "wind_speed_kt": 11,
        "wind_gust_kt": 13,
        "wind_dir_deg": 90,
        "wave_height_ft": null,
        "wave_period_s": null
      },
      {
        "time": "2026-09-15T15:00:00.000Z",
        "wind_speed_kt": 12,
        "wind_gust_kt": 13,
        "wind_dir_deg": 80,
        "wave_height_ft": null,
        "wave_period_s": null
      }
    ],
    "reads": {
      "wind": {
        "read": "Calm to light air. Drift is slow; you will fish the anchor more than the drift.",
        "tone": "good"
      },
      "gust": {
        "read": "Steady air — gusts barely above the average.",
        "tone": "good"
      },
      "air": {
        "read": "86°F at the ramp — hot. Water, shade and sun protection are the kit today.",
        "tone": "ok"
      },
      "pressure": {
        "read": "Not available for this point.",
        "tone": "unknown"
      },
      "cloud": {
        "read": "Partly cloudy — good light, fish roam further off the structure.",
        "tone": "good"
      }
    }
  },
  "water": {
    "surface_temp_f": 87.9,
    "per_source": {
      "ndbc": 88.2
    },
    "reads": {
      "temp": {
        "read": "Hot. Fish push to deeper, cooler water — early and late matter most.",
        "tone": "ok"
      }
    }
  },
  "tides": {
    "station": {
      "id": "8726428",
      "name": "Tierra Verde",
      "lat": 27.68829917907715,
      "lng": -82.71829986572266,
      "distance_nm": 1.2
    },
    "datum": "MLLW",
    "units": "english",
    "date": "2026-09-12",
    "stage": "falling",
    "events": [
      {
        "time": "2026-09-12 01:40",
        "type": "high",
        "height_ft": 2.254
      },
      {
        "time": "2026-09-12 07:41",
        "type": "low",
        "height_ft": 0.565
      },
      {
        "time": "2026-09-12 14:05",
        "type": "high",
        "height_ft": 2.33
      },
      {
        "time": "2026-09-12 19:55",
        "type": "low",
        "height_ft": 0.853
      }
    ],
    "stage_read": {
      "read": "Falling — water draining off the flats; fish stack at the mouths.",
      "tone": "good"
    },
    "source": {
      "owner": "fishingreportagent",
      "source": "NOAA CO-OPS",
      "licence": "US Government work — public domain",
      "attribution_required": false
    }
  },
  "astro": {
    "date": "2026-09-13",
    "sun": {
      "rise": "06:15",
      "set": "18:38",
      "civil_twilight_begin": "05:52",
      "civil_twilight_end": "19:01",
      "legal_light_start": "05:52",
      "legal_light_end": "19:01"
    },
    "moon": {
      "phase": "Waxing Crescent",
      "illumination": "8%",
      "rise": "08:37",
      "set": "20:00",
      "upper_transit": "14:22",
      "lower_transit": null
    },
    "solunar": {
      "method": "Computed locally from public-domain USNO ephemeris: major +/-60 min around moon transit, minor +/-45 min around moonrise/moonset. An approximation of the solunar model, not a licensed solunar table.",
      "windows": [
        {
          "type": "major",
          "label": "Moon underfoot",
          "start": "01:47",
          "end": "03:47",
          "anchor": "02:47",
          "crossesMidnight": true,
          "strength": "Major",
          "in_trip_window": false,
          "read": "Major period (Moon underfoot) falls outside your trip window."
        },
        {
          "type": "minor",
          "label": "Moonrise",
          "start": "07:52",
          "end": "09:22",
          "anchor": "08:37",
          "crossesMidnight": false,
          "strength": "Minor",
          "in_trip_window": true,
          "read": "Inside your trip window — Moonrise. A secondary push, worth a pass."
        },
        {
          "type": "major",
          "label": "Moon overhead",
          "start": "13:22",
          "end": "15:22",
          "anchor": "14:22",
          "crossesMidnight": false,
          "strength": "Major",
          "in_trip_window": true,
          "read": "Inside your trip window — Moon overhead. This is the window to plan around."
        },
        {
          "type": "minor",
          "label": "Moonset",
          "start": "19:15",
          "end": "20:45",
          "anchor": "20:00",
          "crossesMidnight": false,
          "strength": "Minor",
          "in_trip_window": false,
          "read": "Minor period (Moonset) falls outside your trip window."
        }
      ]
    },
    "source": {
      "owner": "fishingreportagent",
      "source": "USNO Astronomical Applications API",
      "licence": "US Government work — public domain",
      "attribution_required": false,
      "solunar_note": "solunar windows computed locally, not a licensed solunar table"
    }
  },
  "ladder_collapse": {
    "total_legs": 5,
    "legs_with_station": 5,
    "distinct_stations": 1,
    "collapsed": true,
    "station_id": "42098",
    "distance_km": 27,
    "note": "All 5 sampled points resolve to the same station (42098). This is ONE sea-state reading shown against several coordinates — not 5 independent readings, and not a spatial gradient."
  },
  "notices": [
    "cloudCover, waterTemperature, waveDirection, waveHeight, wavePeriod, windDirection, windGust, windSpeed came from a single source — there is no cross-source spread to read for these parameters."
  ],
  "missing": [],
  "attribution": [
    "Contains data from NOAA (National Data Buoy Center buoy observations; National Weather Service gridpoint forecasts) — US Government work — public domain. Provided by The Weather Agent.",
    "Tides: NOAA CO-OPS (US Government work — public domain). Astronomy: USNO Astronomical Applications API (public domain). Solunar windows computed locally from USNO ephemeris — an approximation, not a licensed solunar table.",
    "Report generated by FishingReportAgent. The Weather Agent and FishingReportAgent are separate services; marine/weather normalization is The Weather Agent's, the fishing interpretation is ours."
  ],
  "disclaimer": "The Weather Agent relays and normalizes data from third-party upstream providers. Data is provided \"as is\", without warranty of any kind, and may be delayed, incomplete or inaccurate. It is NOT a substitute for official marine forecasts, notices to mariners, or your own judgment. Independently verify all data against official sources before acting on it — especially any decision affecting personal safety or navigation.",
  "provenance": {
    "per_field": {
      "marine_weather": {
        "owner": "weatheragent",
        "source": "ndbc, nws",
        "cycle": "2026-09-13T18:50:00.000Z",
        "fetched_at": "2026-09-13T19:00:13.643Z",
        "licence": "Per-upstream; NOAA public domain (others catalog-only today)",
        "attribution": "Contains data from NOAA (public domain) via The Weather Agent."
      },
      "tides": {
        "owner": "fishingreportagent",
        "source": "NOAA CO-OPS",
        "licence": "US Government work — public domain",
        "fetched_at": "2026-09-13T19:00:13.643Z"
      },
      "astro": {
        "owner": "fishingreportagent",
        "source": "USNO",
        "licence": "US Government work — public domain",
        "fetched_at": "2026-09-13T19:00:13.643Z"
      }
    }
  }
}