{
  "schema_version": 1,
  "study_id": "world-cities-week-2026-09-21",
  "station": "KJFK",
  "location": "New York JFK",
  "metric": "24-hour rainfall amount",
  "observation_snapshot_utc": "2026-09-30T14:10:00Z",
  "source_sha256": "bb4f3a24d4e45daa8baeb16af12afdcdcf7b8e333468182219435dd13570ae46",
  "forecast_cases_per_api": 14,
  "distinct_measured_days": 7,
  "wet_days": 4,
  "dry_days": 3,
  "lead_hours_before_period_start": {
    "minimum": 11.845277777777778,
    "maximum": 23.84888888888889
  },
  "excluded_capture_cases": {},
  "scores": [
    {
      "provider": "Apple Weather",
      "provider_id": "weatherKit",
      "cases": 14,
      "mae_inches": 0.10843082114735658,
      "signed_bias_inches": 0.03344488188976379,
      "wet_day_mae_inches": 0.18774114173228346,
      "dry_day_mae_inches": 0.0026837270341207352,
      "by_lead": {
        "about 12 hours": {
          "cases": 7,
          "mae_inches": 0.07771934758155229
        },
        "about 24 hours": {
          "cases": 7,
          "mae_inches": 0.13914229471316086
        }
      }
    },
    {
      "provider": "MET Norway",
      "provider_id": "metNorway",
      "cases": 14,
      "mae_inches": 0.1477334083239595,
      "signed_bias_inches": -0.0690044994375703,
      "wet_day_mae_inches": 0.2549409448818898,
      "dry_day_mae_inches": 0.00479002624671916,
      "by_lead": {
        "about 12 hours": {
          "cases": 7,
          "mae_inches": 0.170607424071991
        },
        "about 24 hours": {
          "cases": 7,
          "mae_inches": 0.12485939257592801
        }
      }
    },
    {
      "provider": "Visual Crossing",
      "provider_id": "visualCrossing",
      "cases": 14,
      "mae_inches": 0.19034659730033748,
      "signed_bias_inches": 0.07441240157480318,
      "wet_day_mae_inches": 0.3292384350393701,
      "dry_day_mae_inches": 0.005157480314960631,
      "by_lead": {
        "about 12 hours": {
          "cases": 7,
          "mae_inches": 0.12078796400449947
        },
        "about 24 hours": {
          "cases": 7,
          "mae_inches": 0.25990523059617554
        }
      }
    },
    {
      "provider": "Pirate Weather",
      "provider_id": "pirateWeather",
      "cases": 14,
      "mae_inches": 0.19563544713160852,
      "signed_bias_inches": 0.06030482283464567,
      "wet_day_mae_inches": 0.34236203248031494,
      "dry_day_mae_inches": 0.0,
      "by_lead": {
        "about 12 hours": {
          "cases": 7,
          "mae_inches": 0.1059474971878515
        },
        "about 24 hours": {
          "cases": 7,
          "mae_inches": 0.2853233970753655
        }
      }
    },
    {
      "provider": "Open-Meteo",
      "provider_id": "openMeteo",
      "cases": 14,
      "mae_inches": 0.24666479190101243,
      "signed_bias_inches": 0.05442069741282342,
      "wet_day_mae_inches": 0.4316633858267717,
      "dry_day_mae_inches": 0.0,
      "by_lead": {
        "about 12 hours": {
          "cases": 7,
          "mae_inches": 0.15361079865016877
        },
        "about 24 hours": {
          "cases": 7,
          "mae_inches": 0.33971878515185605
        }
      }
    }
  ],
  "observed_periods": [
    {
      "start_utc": "2026-09-22T11:51:00Z",
      "end_utc": "2026-09-23T11:51:00Z",
      "nominal_end_utc": "2026-09-23T12:00:00Z",
      "observed_inches": 0.0,
      "basis": "24 complete dry AO2 hourly reports with no gauge outage",
      "hourly_reports": 24,
      "trace_hours": 0
    },
    {
      "start_utc": "2026-09-23T11:51:00Z",
      "end_utc": "2026-09-24T11:51:00Z",
      "nominal_end_utc": "2026-09-24T12:00:00Z",
      "observed_inches": 0.0,
      "basis": "24 complete dry AO2 hourly reports with no gauge outage",
      "hourly_reports": 24,
      "trace_hours": 0
    },
    {
      "start_utc": "2026-09-24T11:51:00Z",
      "end_utc": "2026-09-25T11:51:00Z",
      "nominal_end_utc": "2026-09-25T12:00:00Z",
      "observed_inches": 0.0,
      "basis": "24 complete dry AO2 hourly reports with no gauge outage",
      "hourly_reports": 24,
      "trace_hours": 0
    },
    {
      "start_utc": "2026-09-25T11:51:00Z",
      "end_utc": "2026-09-26T11:51:00Z",
      "nominal_end_utc": "2026-09-26T12:00:00Z",
      "observed_inches": 0.96,
      "basis": "ASOS 24-hour 7dddd total, checked against 24 hourly reports",
      "hourly_reports": 24,
      "trace_hours": 3
    },
    {
      "start_utc": "2026-09-26T11:51:00Z",
      "end_utc": "2026-09-27T11:51:00Z",
      "nominal_end_utc": "2026-09-27T12:00:00Z",
      "observed_inches": 1.1,
      "basis": "ASOS 24-hour 7dddd total, checked against 24 hourly reports",
      "hourly_reports": 24,
      "trace_hours": 8
    },
    {
      "start_utc": "2026-09-27T11:51:00Z",
      "end_utc": "2026-09-28T11:51:00Z",
      "nominal_end_utc": "2026-09-28T12:00:00Z",
      "observed_inches": 1.12,
      "basis": "ASOS 24-hour 7dddd total, checked against 24 hourly reports",
      "hourly_reports": 24,
      "trace_hours": 7
    },
    {
      "start_utc": "2026-09-28T11:51:00Z",
      "end_utc": "2026-09-29T11:51:00Z",
      "nominal_end_utc": "2026-09-29T12:00:00Z",
      "observed_inches": 0.03,
      "basis": "ASOS 24-hour 7dddd total, checked against 24 hourly reports",
      "hourly_reports": 24,
      "trace_hours": 7
    }
  ],
  "boundary_sensitivity": {
    "description": "Move forecast integration from 11:51Z to nominal 12Z; keep observed totals fixed.",
    "scores": [
      {
        "provider": "Apple Weather",
        "provider_id": "weatherKit",
        "cases": 14,
        "mae_inches": 0.10524184476940379,
        "signed_bias_inches": 0.03456692913385825,
        "wet_day_mae_inches": 0.18220472440944877,
        "dry_day_mae_inches": 0.002624671916010499,
        "by_lead": {
          "about 12 hours": {
            "cases": 7,
            "mae_inches": 0.0731383577052868
          },
          "about 24 hours": {
            "cases": 7,
            "mae_inches": 0.1373453318335208
          }
        }
      },
      {
        "provider": "MET Norway",
        "provider_id": "metNorway",
        "cases": 14,
        "mae_inches": 0.1449493813273341,
        "signed_bias_inches": -0.06740157480314961,
        "wet_day_mae_inches": 0.2502165354330709,
        "dry_day_mae_inches": 0.004593175853018373,
        "by_lead": {
          "about 12 hours": {
            "cases": 7,
            "mae_inches": 0.16824521934758158
          },
          "about 24 hours": {
            "cases": 7,
            "mae_inches": 0.12165354330708662
          }
        }
      },
      {
        "provider": "Visual Crossing",
        "provider_id": "visualCrossing",
        "cases": 14,
        "mae_inches": 0.1899100112485939,
        "signed_bias_inches": 0.07273903262092236,
        "wet_day_mae_inches": 0.3284005905511811,
        "dry_day_mae_inches": 0.005255905511811024,
        "by_lead": {
          "about 12 hours": {
            "cases": 7,
            "mae_inches": 0.12016872890888634
          },
          "about 24 hours": {
            "cases": 7,
            "mae_inches": 0.25965129358830147
          }
        }
      },
      {
        "provider": "Pirate Weather",
        "provider_id": "pirateWeather",
        "cases": 14,
        "mae_inches": 0.19069797525309334,
        "signed_bias_inches": 0.057397075365579316,
        "wet_day_mae_inches": 0.33372145669291337,
        "dry_day_mae_inches": 0.0,
        "by_lead": {
          "about 12 hours": {
            "cases": 7,
            "mae_inches": 0.10250112485939257
          },
          "about 24 hours": {
            "cases": 7,
            "mae_inches": 0.27889482564679413
          }
        }
      },
      {
        "provider": "Open-Meteo",
        "provider_id": "openMeteo",
        "cases": 14,
        "mae_inches": 0.24725534308211475,
        "signed_bias_inches": 0.05627671541057367,
        "wet_day_mae_inches": 0.4326968503937008,
        "dry_day_mae_inches": 0.0,
        "by_lead": {
          "about 12 hours": {
            "cases": 7,
            "mae_inches": 0.15209223847019127
          },
          "about 24 hours": {
            "cases": 7,
            "mae_inches": 0.34241844769403823
          }
        }
      }
    ],
    "same_winner": true
  },
  "method": {
    "weighting": "Each saved forecast/day case has equal weight; every API uses the same cases.",
    "observation_source": "NOAA Aviation Weather Center METAR archive, latest corrections before the frozen cutoff.",
    "window": "24 hours between consecutive routine 12Z METARs, observed at 11:51Z.",
    "boundaries": "Prorate the first and last forecast hour by overlap, assuming uniform rainfall within each boundary hour.",
    "missing_data": "Exclude incomplete periods for every provider; never fill a missing forecast hour or gauge outage.",
    "trace": "P0000 is trace, not 0.005 inch. Wet-day reference uses the encoded 24-hour total, not decoded hourly trace placeholders.",
    "dry_zero": "Require all 24 routine AO2 reports, no measurable or trace P groups, and no gauge outage.",
    "units": "Provider hourly quantities are millimeters; divide by 25.4 for inches. Pirate SI mm/hour is integrated for one hour.",
    "scope": "Seven JFK observation days; two forecasts per day are not independent weather events. Amount only, not probability or onset timing.",
    "nws_exclusion": "The saved NWS hourly endpoint includes rain probability but no rainfall quantity."
  }
}
