{
  "attribution": "GTFS Scorecard (gtfsscorecard.org), scored on top of the MobilityData gtfs-validator",
  "commitment": {
    "source": "ADR 0010 (docs/decisions/0010-update-cadence.md); tiering logic in pipeline/src/scorecard_pipeline/cadence.py",
    "tiers": [
      {
        "applies_to": "feeds with a measured realtime publisher, and any feed in the expiry danger or recovery window (expiring soon, or recently lapsed)",
        "cadence": "every intraday refresh cycle (hourly)",
        "schedule_cron": "23 * * * *",
        "tier": "priority"
      },
      {
        "applies_to": "every other tracked feed",
        "cadence": "once per 6-hour period, on a stable per-feed schedule so load spreads evenly instead of checking every host at once",
        "schedule_cron": "23 * * * *",
        "tier": "standard"
      },
      {
        "applies_to": "every registered feed",
        "cadence": "once daily (re-validates every feed; the correctness floor)",
        "schedule_cron": "23 13 * * *",
        "tier": "full_validation"
      }
    ]
  },
  "degradation_policy": {
    "stale_after_days_past_expiry": 365,
    "statements": [
      "A fetch failure never fabricates or silently drops data: the last successfully retrieved artifact is carried forward, and only its freshness/expiry read is recomputed from the calendar dates it already carries (ADR 0010's freshness sweep). A past snapshot is never rewritten, so trend history stays accurate.",
      "A feed whose calendar has been past its expiry date for more than 365 days is labeled 'stale' rather than 'lapsed', which changes how it is described but not whether it is served.",
      "A feed URL that fails 30 consecutive liveness checks (roughly a week at standard cadence) is separately labeled 'unreachable', so a dead host reads differently from a merely stale calendar.",
      "None of this is a guarantee of upstream uptime -- an agency's own GTFS host can go down regardless of what this pipeline does. It is a public, honest record of what was actually observed and when, published without deletion."
    ],
    "unreachable_after_consecutive_checks": 30
  },
  "description": "How fresh this data is meant to be, and how it has actually performed: the intended refresh cadence per tier, the historical refresh-success record, and what happens when a feed cannot be refreshed on schedule.",
  "generated_at": "2026-07-09T05:27:47+00:00",
  "human_readable": "https://gtfsscorecard.org/status/",
  "license": "CC-BY-4.0",
  "refresh_success_record": {
    "as_of": "2026-07-09T05:27:47+00:00",
    "degraded": 78,
    "feeds_tracked": 1453,
    "healthy": 1255,
    "hours_since_last_check": {
      "max": 227.3,
      "median": 4.4,
      "min": 0.2
    },
    "success_rate_pct": 86.4,
    "unreachable": 120
  }
}
