forked from ChelseaKR/gtfs-scorecard
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
207 lines (195 loc) · 17.2 KB
/
Copy pathindex.html
File metadata and controls
207 lines (195 loc) · 17.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Status | GTFS Scorecard</title>
<meta name="description" content="What this pipeline commits to for refresh cadence and uptime, the historical refresh-success record, and evidence from the latest recorded run: shard outcomes, unreachable feeds, and catalog freshness.">
<link rel="canonical" href="https://gtfsscorecard.org/status/">
<meta property="og:type" content="website">
<meta property="og:title" content="Status | GTFS Scorecard">
<meta property="og:description" content="What this pipeline commits to for refresh cadence and uptime, the historical refresh-success record, and evidence from the latest recorded run: shard outcomes, unreachable feeds, and catalog freshness.">
<meta property="og:url" content="https://gtfsscorecard.org/status/">
<meta property="og:image" content="https://gtfsscorecard.org/og.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://gtfsscorecard.org/og.png">
<link rel="stylesheet" href="/src/styles.css">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ccircle cx='16' cy='16' r='13' fill='%23204e3a'/%3E%3Ccircle cx='16' cy='16' r='5' fill='%23f2f3ee'/%3E%3C/svg%3E">
<script>
/* Apply the saved theme before first paint to avoid a flash (WCAG 1.4.8). */
try {
var t = localStorage.getItem("scorecard-theme");
if (t && ["light", "contrast", "dark"].indexOf(t) >= 0)
document.documentElement.setAttribute("data-theme", t);
} catch (e) {}
</script>
<script src="/src/theme.js" defer></script>
<script src="/src/nav.js" defer></script>
<noscript><style>
/* Without JS the menu button cannot expand the collapsed nav, so show the
stacked nav permanently and hide the button (content stays operable
without scripting). nav.js never runs here, so nothing double-toggles. */
@media (max-width: 1040px) {
.nav-menu-btn { display: none !important; }
.nav-cluster { display: flex !important; position: static; }
}
</style></noscript>
</head>
<body>
<a class="skip-link" href="#main">Skip to main content</a>
<header class="site-header"><div class="wrap"><a class="brand" href="/"><span class="brand-mark" aria-hidden="true"></span><span class="brand-name">GTFS Scorecard</span></a><button class="nav-menu-btn" type="button" aria-expanded="false" aria-controls="nav-cluster"><span aria-hidden="true">☰</span> Menu</button><div class="nav-cluster" id="nav-cluster"><nav class="nav-stops" aria-label="Primary"><a class="nav-stop" href="/agencies/"><span class="pip" aria-hidden="true"></span>Find an agency</a><a class="nav-stop" href="/pulse/"><span class="pip" aria-hidden="true"></span>Coverage</a><a class="nav-stop" href="/focus/"><span class="pip" aria-hidden="true"></span>Focus areas</a><a class="nav-stop" href="/tools/"><span class="pip" aria-hidden="true"></span>Tools</a><a class="nav-stop" href="/how-to-read/" aria-current="page"><span class="pip" aria-hidden="true"></span>How it works</a><a class="nav-stop" href="/about/"><span class="pip" aria-hidden="true"></span>About</a></nav><div id="theme-control"></div></div></div></header>
<main id="main" class="wrap" tabindex="-1">
<nav class="breadcrumb" aria-label="Breadcrumb"><ol itemscope itemtype="https://schema.org/BreadcrumbList"><li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"><a itemprop="item" href="/"><span itemprop="name">Home</span></a><meta itemprop="position" content="1"></li><li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"><span itemprop="name" aria-current="page">Status</span><meta itemprop="position" content="2"></li></ol></nav>
<a class="backlink" href="/">← Home</a>
<h1 class="page-title">Status.</h1>
<p class="page-lede">"Refreshed daily" is a claim; this page is the record. Above is what
we commit to for refresh cadence and uptime; below is evidence from the latest recorded run.
Machine-readable at <a href="/api/v1/status.json">/api/v1/status.json</a> and
<a href="/api/v1/run-status.json">/api/v1/run-status.json</a>.</p>
<div class="route-rule" role="presentation"><span class="stopdot"></span><span class="seg"></span><span class="stopdot"></span><span class="seg"></span><span class="stopdot"></span><span class="seg"></span><span class="stopdot"></span></div>
<h2 class="section-title" id="commitment-h">What we commit to</h2>
<p>"Refreshed daily" is a claim; this is the record. Here is how often we intend to
refresh each feed, how that has actually gone, and what happens when a feed cannot be
refreshed on schedule — so you can decide whether to depend on this data before you
build on it. Machine-readable at
<a href="/api/v1/status.json">/api/v1/status.json</a>.</p>
<section aria-labelledby="cadence-h"><h3 class="section-title" id="cadence-h">Intended refresh cadence</h3>
<p>Every feed is assigned to one of two cadence tiers (ADR 0010); a full re-validation
of every feed is scheduled daily regardless of tier. The latest-run section below shows
when that work actually completed.</p>
<div class="table-wrap"><table><thead><tr><th scope="col">Tier</th><th scope="col">Cadence</th>
<th scope="col">Applies to</th></tr></thead><tbody><tr><td>Priority</td><td>every intraday refresh cycle (every 3 hours)</td><td>feeds with a measured realtime publisher, and any feed in the expiry danger or recovery window (expiring soon, or recently lapsed)</td></tr><tr><td>Standard</td><td>once per 6-hour period, on a stable per-feed schedule so load spreads evenly instead of checking every host at once</td><td>every other tracked feed</td></tr><tr><td>Full Validation</td><td>once daily (re-validates every feed; the correctness floor)</td><td>every registered feed</td></tr></tbody></table></div></section>
<section aria-labelledby="record-h"><h3 class="section-title" id="record-h">Historical refresh-success record</h3>
<p>As of 2026-07-14T10:23:13+00:00, this pipeline is tracking liveness on
<strong>1128</strong> feeds:
<strong>954</strong> checking in clean (no failed check in a row),
<strong>32</strong> with at least one recent failed check but not yet
flagged, and <strong>142</strong> flagged unreachable
(see the degradation policy below). Time since each feed's last liveness check ranges from
85.5 to 129.3 hours, with a median of
89.1 hours.</p>
<p>Overall clean-check rate: <strong>84.6%</strong>.</p></section>
<section aria-labelledby="degradation-h"><h3 class="section-title" id="degradation-h">Degradation policy</h3>
<p>What happens, and what you see, when a feed cannot be refreshed on schedule:</p>
<ul><li>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.</li><li>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.</li><li>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.</li><li>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.</li></ul></section>
<p class="fineprint">This commitment is generated fresh with every site build from the same
liveness state the intraday refresh keeps, so it cannot say anything the pipeline did not
actually observe.</p>
<div class="route-rule" role="presentation"><span class="stopdot"></span><span class="seg"></span><span class="stopdot"></span><span class="seg"></span><span class="stopdot"></span><span class="seg"></span><span class="stopdot"></span></div>
<h2 class="section-title" id="evidence-h">Latest run evidence</h2>
<p>What the latest published run summary recorded, including when it ran: shard outcomes,
feeds it could not reach, and how stale the current catalog is now. No part of this page
requires trusting the maintainer's word. Machine-readable at
<a href="/api/v1/run-status.json">/api/v1/run-status.json</a>.</p>
<section class="feed-details"><h3 class="section-title">Latest recorded run</h3>
<p><span class="pill-ok">Healthy</span>
Generated 3 days ago (2026-07-10 15:54 UTC),
across 12 shards, 1488
feed records attempted. The current published catalog has
1128 feed records.</p>
<dl>
<dt>Scored (fresh data this run)</dt><dd>229</dd>
<dt>Reused (feed unchanged since last check)</dt><dd>1213</dd>
<dt>Unreachable in that run (all attempted records)</dt><dd>46</dd>
<dt>Currently published and unreachable in that run</dt><dd>7</dd>
<dt>Fell back to the Mobility Database mirror</dt><dd>192</dd>
<dt>Validator cache hits</dt><dd>203</dd>
</dl>
</section>
<section class="feed-details"><h3 class="section-title">Per-shard breakdown</h3>
<div style="overflow-x:auto"><table class="trend-table">
<caption class="visually-hidden">Outcome counts by CI shard</caption>
<thead><tr><th scope="col">Shard</th><th scope="col">Scored</th>
<th scope="col">Reused</th><th scope="col">Unreachable</th><th scope="col">Mirrored</th>
<th scope="col">Cache hit</th><th scope="col">Wall clock</th></tr></thead>
<tbody><tr><td>0</td><td>21</td><td>99</td><td>4</td><td>17</td><td>20</td><td>396s</td></tr><tr><td>1</td><td>17</td><td>105</td><td>2</td><td>12</td><td>14</td><td>724s</td></tr><tr><td>10</td><td>14</td><td>107</td><td>3</td><td>14</td><td>14</td><td>263s</td></tr><tr><td>11</td><td>21</td><td>100</td><td>3</td><td>17</td><td>19</td><td>692s</td></tr><tr><td>2</td><td>21</td><td>98</td><td>5</td><td>20</td><td>20</td><td>305s</td></tr><tr><td>3</td><td>18</td><td>105</td><td>1</td><td>14</td><td>15</td><td>237s</td></tr><tr><td>4</td><td>22</td><td>97</td><td>5</td><td>19</td><td>20</td><td>330s</td></tr><tr><td>5</td><td>23</td><td>98</td><td>3</td><td>19</td><td>20</td><td>317s</td></tr><tr><td>6</td><td>18</td><td>99</td><td>7</td><td>14</td><td>14</td><td>355s</td></tr><tr><td>7</td><td>19</td><td>103</td><td>2</td><td>16</td><td>17</td><td>308s</td></tr><tr><td>8</td><td>20</td><td>99</td><td>5</td><td>16</td><td>16</td><td>353s</td></tr><tr><td>9</td><td>15</td><td>103</td><td>6</td><td>14</td><td>14</td><td>286s</td></tr></tbody>
</table></div>
</section>
<section class="feed-details"><h3 class="section-title">Feed records unreachable this run</h3>
<p>The pipeline could not fetch or validate these currently published feeds in that run;
each continues to show its last successful scorecard. A feed host outage is one possible
cause, but this evidence does not diagnose why a check failed.</p>
<ul><li><a href="/agency/elk-grove-transit/">Elk Grove Transit</a></li><li><a href="/agency/lakes-region-explorer/">Lakes Region Explorer</a></li><li><a href="/agency/monterey-salinas-transit-mst/">Monterey-Salinas Transit (MST)</a></li><li><a href="/agency/selah-transit/">Selah Transit</a></li><li><a href="/agency/the-rapid/">The Rapid</a></li><li><a href="/agency/transit-authority-of-river-city-tarc-2662/">Fixed Route</a></li><li><a href="/agency/university-of-michigan-transit-services/">University of Michigan Transit Services</a></li></ul><p class="fineprint">39 additional records were in the prior run but are outside the current published catalog, so they are counted in the historical run totals without being named or linked here.</p>
</section>
<section class="feed-details"><h3 class="section-title">Catalog freshness</h3>
<p>Age of the scored snapshot behind every tracked feed scorecard, right now
(not just this run -- a feed scored successfully days ago still counts here if nothing
has re-triggered a fetch since).</p>
<figure class="bucket-chart staleness-chart" style="--bins:4"><figcaption><span class="service-chart-title">Snapshot age distribution</span><span class="service-chart-note">All 1128 tracked feed scorecards, grouped by snapshot age.</span></figcaption><ol class="bucket-bars"><li class="bucket-bar" style="--height:0"><span class="bucket-value">0</span><span class="bucket-column" aria-hidden="true"><span></span></span><span class="bucket-label">under 1 day</span></li><li class="bucket-bar" style="--height:0"><span class="bucket-value">0</span><span class="bucket-column" aria-hidden="true"><span></span></span><span class="bucket-label">1-2 days</span></li><li class="bucket-bar" style="--height:36.9"><span class="bucket-value">304</span><span class="bucket-column" aria-hidden="true"><span></span></span><span class="bucket-label">3-7 days</span></li><li class="bucket-bar" style="--height:100"><span class="bucket-value">824</span><span class="bucket-column" aria-hidden="true"><span></span></span><span class="bucket-label">over 7 days</span></li></ol></figure>
<details class="viz-data"><summary>Show the table</summary>
<div style="overflow-x:auto"><table class="trend-table">
<caption class="visually-hidden">Feed scorecard count by snapshot age</caption>
<thead><tr><th scope="col">Snapshot age</th><th scope="col">Feed scorecards</th></tr></thead>
<tbody><tr><td>under 1 day</td><td>0</td></tr><tr><td>1-2 days</td><td>0</td></tr><tr><td>3-7 days</td><td>304</td></tr><tr><td>over 7 days</td><td>824</td></tr></tbody>
</table></div></details>
</section>
<p class="fineprint">Built from <a href="/api/v1/run-status.json">the run-status API</a>,
refreshed after each completed scoring run. See <a href="/how-to-read/">how to read a scorecard</a> for what
the grades themselves mean.</p>
</main>
<footer class="site-footer">
<div class="wrap">
<div class="footer-intro">
<a class="footer-brand" href="/">GTFS Scorecard</a>
<p>An open-source data quality tool for small and rural transit agencies.</p>
</div>
<nav class="footer-grid" aria-label="Footer">
<section aria-labelledby="footer-find-h">
<h2 id="footer-find-h">Find a scorecard</h2>
<ul>
<li><a href="/agencies/">Agency directory</a></li>
<li><a href="/app/">Interactive search</a></li>
<li><a href="/map/">Agency map</a></li>
<li><a href="/routes/">All routes</a></li>
<li><a href="/compare/">Compare two agencies</a></li>
</ul>
</section>
<section aria-labelledby="footer-improve-h">
<h2 id="footer-improve-h">Improve a feed</h2>
<ul>
<li><a href="/fix/">GTFS errors & fixes</a></li>
<li><a href="/check/">Check before publishing</a></li>
<li><a href="/try.html">Request a one-off score</a></li>
<li><a href="/subscribe.html">Feed-health alerts</a></li>
<li><a href="/submit.html">Add an agency</a></li>
<li><a href="/claim/">Correct or claim a listing</a></li>
<li><a href="/procurement/">Procurement language</a></li>
</ul>
</section>
<section aria-labelledby="footer-explore-h">
<h2 id="footer-explore-h">Explore the data</h2>
<ul>
<li><a href="/pulse/">Coverage overview</a></li>
<li><a href="/problems/">Common problems</a></li>
<li><a href="/realtime/">Realtime quality</a></li>
<li><a href="/adoption/">What feeds publish</a></li>
<li><a href="/focus/">Focus areas</a></li>
<li class="footer-subhead">United States tools</li>
<li><a href="/ntd/">U.S. NTD readiness</a></li>
<li><a href="/equity/">U.S. equity</a></li>
<li><a href="/query/">Query the dataset</a></li>
<li><a href="/data/">Open data</a></li>
</ul>
</section>
<section aria-labelledby="footer-project-h">
<h2 id="footer-project-h">Project</h2>
<ul>
<li><a href="/about/">About</a></li>
<li><a href="/status/">Status</a></li>
<li><a href="/support/">Get help or sponsor</a></li>
<li><a href="/how-to-read/">How to read a scorecard</a></li>
<li><a href="/how-to-read/#glossary">Glossary</a></li>
<li><a href="/crosswalk/">Standards crosswalk</a></li>
<li><a href="/press/">For reporters</a></li>
<li><a href="/accessibility/">Accessibility</a></li>
<li><a href="https://github.com/ChelseaKR/gtfs-scorecard/blob/main/CONTRIBUTING.md">Contribute</a></li>
<li><a href="https://github.com/ChelseaKR/gtfs-scorecard/blob/main/docs/listing-policy.md">Listing & removal policy</a></li>
</ul>
</section>
</nav>
</div>
</footer>
</body>
</html>