{"id":52019118,"url":"https://github.com/ChelseaKR/gtfs-scorecard","last_synced_at":"2026-08-20T13:00:34.769Z","repository":{"id":369385885,"uuid":"1288847801","full_name":"ChelseaKR/gtfs-scorecard","owner":"ChelseaKR","description":"Daily, plain-language GTFS quality scorecards for small transit agencies: see the current grade, the three things to fix, and why each one matters.","archived":false,"fork":false,"pushed_at":"2026-08-15T21:01:32.000Z","size":465579,"stargazers_count":1,"open_issues_count":20,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-08-15T22:16:18.035Z","etag":null,"topics":["accessibility","civic-tech","data-quality","duckdb","github-actions","gtfs","gtfs-realtime","gtfs-validator","i18n","mcp-server","mobilitydata","ntd","open-data","public-transit","python","read-api","small-transit-agencies","static-site","supply-chain-security","transit-data"],"latest_commit_sha":null,"homepage":"https://gtfsscorecard.org","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ChelseaKR.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"docs/support.md","governance":"docs/governance-ledger.md","roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"claude":"CLAUDE.md","gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null},"funding":{"ko_fi":"T6T6GMYTU"}},"created_at":"2026-07-04T03:26:18.000Z","updated_at":"2026-08-15T21:01:45.000Z","dependencies_parsed_at":"2026-08-15T22:20:56.620Z","dependency_job_id":null,"html_url":"https://github.com/ChelseaKR/gtfs-scorecard","commit_stats":null,"previous_names":["chelseakr/gtfs-scorecard"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/ChelseaKR/gtfs-scorecard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChelseaKR%2Fgtfs-scorecard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChelseaKR%2Fgtfs-scorecard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChelseaKR%2Fgtfs-scorecard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChelseaKR%2Fgtfs-scorecard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ChelseaKR","download_url":"https://codeload.github.com/ChelseaKR/gtfs-scorecard/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChelseaKR%2Fgtfs-scorecard/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36791762,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-20T02:00:06.210Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility","civic-tech","data-quality","duckdb","github-actions","gtfs","gtfs-realtime","gtfs-validator","i18n","mcp-server","mobilitydata","ntd","open-data","public-transit","python","read-api","small-transit-agencies","static-site","supply-chain-security","transit-data"],"created_at":"2026-08-01T01:00:35.767Z","updated_at":"2026-08-20T13:00:34.762Z","avatar_url":"https://github.com/ChelseaKR.png","language":"HTML","funding_links":["https://ko-fi.com/T6T6GMYTU"],"categories":["Producing Data","Projects Powered by DuckDB"],"sub_categories":["GTFS","Web Clients (WebAssembly)"],"readme":"# GTFS Scorecard\n\n\u003e Daily, plain-language GTFS quality scorecards for small transit agencies:\n\u003e see the current grade, the three things to fix, and why each one matters.\n\n[![CI](https://github.com/ChelseaKR/gtfs-scorecard/actions/workflows/ci.yml/badge.svg)](https://github.com/ChelseaKR/gtfs-scorecard/actions/workflows/ci.yml)\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)\n[![GitHub Marketplace](https://img.shields.io/badge/Marketplace-GTFS%20Scorecard%20gate-2ea44f?logo=github)](https://github.com/marketplace/actions/gtfs-scorecard-gate)\n[![Live site](https://img.shields.io/badge/live-gtfsscorecard.org-2ea44f)](https://gtfsscorecard.org)\n\n[![GTFS Scorecard: plain-language GTFS quality and prioritized fixes](https://gtfsscorecard.org/og.png)](https://gtfsscorecard.org)\n\nGTFS Scorecard is a daily data-quality service for small transit agencies and\nthe program staff, maintainers, and vendors who support them. It publishes\ndated grades, prioritized fixes, history, program views, practitioner tools,\nand open data. It does not implement a competing GTFS validator. Correctness\nfindings come from MobilityData's canonical validator.\n\n## Where it fits\n\nGTFS Scorecard is the evidence and triage layer:\n\n1. [Mobility Database](https://mobilitydatabase.org/) and\n   [Transitland](https://www.transit.land/) help identify public feeds and\n   their sources or versions.\n2. The [MobilityData GTFS validator](https://github.com/MobilityData/gtfs-validator)\n   supplies canonical specification findings.\n3. An agency, vendor, editor, or support program changes and publishes the\n   feed through its existing workflow.\n4. A 90-day GTFS Scorecard pilot is testing the final handoff: link an accepted\n   action to the intended feed, run a comparable recheck, and preserve the\n   result.\n\nThe [California GTFS Quality Dashboard](https://reports.dds.dot.ca.gov/)\ninspired the project's daily scorecard and support-program framing. GTFS\nScorecard is independent and is not an official compliance determination.\n\nPilot agencies: [Unitrans](https://unitrans.ucdavis.edu) (ASUCD / City of\nDavis) and [Yolobus](https://yolobus.com) (Yolo County Transportation\nDistrict). Beyond the pilots, the registry contains more than 2,100 curated\nfeed records, mostly in the United States and Canada, plus reviewed canaries\nacross Europe, Asia-Pacific, and South America. Scoring is scheduled daily for\nevery registered feed, and the public status page reports the exact current\nconfigured and published counts along with when the latest run completed. Read\nthe published total there rather than from this repository: automation stopped\ncommitting generated data at the S3 cutover (see\n[docs/follow-ups.md](docs/follow-ups.md)), so what git carries is a fallback\nsnapshot that moves only when it is deliberately re-materialized from the live\ncorpus (last refreshed 2026-08-07),\nwith more than 2,100 numeric scorecards published. CI can only gate the\nsnapshot figure, because `make verify` runs offline. A feed record is not\nalways a distinct transit agency: regional feeds, modal variants, and retired\naliases are counted separately while the identity registry is reconciled.\n\n**Live:** [gtfsscorecard.org](https://gtfsscorecard.org/) — with the latest\ncompleted-run evidence at [gtfsscorecard.org/status](https://gtfsscorecard.org/status/).\n\n**Status:** Beta. The public scorecards and daily evidence service are live.\nThe remediation workflow is being tested and is not yet a proven service.\nRealtime quality is scored only when a usable realtime feed is configured and\nmeasured; otherwise it is shown neutrally as not yet measured. Any agency can\nbe added through `registry/intake.yaml`.\n\n## Use, adopt, or contribute\n\n- **Check a feed:** browse\n  [gtfsscorecard.org](https://gtfsscorecard.org/), or\n  request a [one-off score](https://github.com/ChelseaKR/gtfs-scorecard/issues/new?template=score-a-feed.yml).\n- **Track an agency:** use the\n  [self-serve submission form](https://gtfsscorecard.org/submit.html), or follow\n  the [repository walkthrough](docs/add-your-agency.md) to open a pull request.\n- **Gate a feed in CI:** add the\n  [GTFS Scorecard Marketplace Action](https://github.com/marketplace/actions/gtfs-scorecard-gate)\n  to a feed repository.\n- **Test what happens after the scorecard:** read\n  [the remediation pilot request](https://github.com/ChelseaKR/gtfs-scorecard/issues/185)\n  if you can take a finding through an accepted request and same-feed recheck.\n- **Contribute:** choose a\n  [bounded open issue](https://github.com/ChelseaKR/gtfs-scorecard/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22)\n  or read [CONTRIBUTING.md](CONTRIBUTING.md). Feed corrections, accessibility\n  review, and practitioner feedback are useful without changing scoring code.\n- **Get help, or fund the work:** [SUPPORT.md](SUPPORT.md) is the front door for\n  both. Scoring is free for every agency and stays that way; the\n  [support page](https://gtfsscorecard.org/support/) explains what running the\n  service costs, what sponsorship would pay for, and what it never buys.\n\n## Quickstart\n\nRequires Python 3.12+, [uv](https://docs.astral.sh/uv/), and Java 17+\n(the validator jar is downloaded automatically on first run).\n\n```sh\ncd pipeline\nuv sync\nuv run scorecard run --all\n```\n\nThis fetches today's snapshot of every current configured feed, validates and\nscores it, and writes artifacts to `data/artifacts/\u003cagency\u003e/\u003cdate\u003e.json` plus a\n`latest.json` and a cross-agency `index.json`. Retired aliases are excluded\nfrom the batch; an explicit historical rescore writes a dated record without\nrecreating mutable current files. Re-running a day is idempotent. Checks (from\nthe repo root; mirrors the CI gate):\n\n```sh\nmake verify\n```\n\n### Run the web app locally\n\nThe frontend reads the JSON artifacts over HTTP. Serve the repo root and open\nthe page through `http://`, not by double-clicking the file:\n\n```sh\ncd ..            # repo root, so data/artifacts/ is reachable\npython3 -m http.server 8000\n# then open http://localhost:8000/web/index.html\n```\n\nOpening `web/index.html` as a `file://` URL leaves the page stuck on\n\"Loading scorecards…\": browsers block ES module loading and `fetch` over\n`file://`, so the app never runs. Any static server works; the only requirement\nis that `data/artifacts/` sits one level above `web/`, which the\n`../data/artifacts` fallback in `web/src/app.js` expects.\n\n## What an agency gets\n\n- An overall grade from the categories that can be measured: correctness,\n  freshness, rider experience completeness, and, when available, realtime\n  quality.\n- \"Top 3 things to fix\", in plain language with effort hints. Findings are\n  framed as fixes, never as failures.\n- For U.S. agencies only, an NTD GTFS-readiness read (published, valid,\n  current, and `agency_id` present) plus a neutral check of whether `agency_id`\n  happens to equal the five-digit NTD ID. Equality is optional; RY2026 presence\n  and the P-50 crosswalk are not.\n- Trend history, one JSON artifact per agency per day.\n- An embeddable grade badge (`\u003cagency\u003e/badge.svg`) the agency can put on its\n  own developer page.\n\nThe scoring methodology, with citations to the California Transit Data\nGuidelines v4.0 and the validator's rule taxonomy, is in\n[docs/rubric.md](docs/rubric.md). Methodology changes are governed: a\nvalidator-version bump must attach the shadow-run impact report from\n`scorecard canary` before it lands (rubric.md, \"Governed upgrades\").\nThe grade, weights, thresholds, and fix order are GTFS Scorecard policy choices,\nnot an official MobilityData grade or a universal quality standard.\nFeed sources and licenses are in\n[docs/feeds.md](docs/feeds.md). Forward planning is split in two: the\ninfrastructure and scaling plan is in [docs/roadmap.md](docs/roadmap.md), and\nwhat the product becomes for its users is in\n[docs/product-roadmap.md](docs/product-roadmap.md).\n\n## What's on the site\n\nEach agency gets a scorecard page, plus three companion pages written for the\ndifferent seats at an agency check-in: a board one-pager\n(`/agency/\u003cid\u003e/board/`), a call-prep brief (`/brief/`), and, when comparable\nfinding-clearance records exist, a clearance log (`/fixes/`). Around those sit:\n\n- **Coverage views** — the coverage overview (`/pulse/`), most common problems\n  (`/problems/`), realtime reliability (`/realtime/`), optional-feature\n  adoption and accessibility data coverage (`/adoption/`), a consumer feature\n  finder with translation-language and accessibility filters\n  (`/app/#/?view=features`), and worldwide\n  agency and route maps (`/map/`, `/routes/`). U.S.-specific NTD readiness\n  (`/ntd/`) and equity (`/equity/`) stay available as regional modules.\n- **Program pages** (`/program/\u003cstate\u003e/`) for 46 states plus DC and named\n  cohorts from [`rollups.yaml`](rollups.yaml), each with the fixes shared\n  across the group.\n- **Practitioner tools** — request a one-off score through GitHub or run it\n  locally (`/try.html`), check a feed before publishing (`/check/`), compare two agencies (`/compare/`),\n  query the dataset with SQL in the browser (`/query/`), and put feed quality\n  in a vendor contract (`/procurement/`).\n- **Board-ready outputs** — each agency has a printable one-pager; see the\n  [live Unitrans example](https://gtfsscorecard.org/agency/unitrans/board/), or\n  generate a self-contained, custom-branded offline report with the\n  [board-report tool](docs/board-report.md).\n- **A fix knowledge base** (`/fix/\u003crule\u003e/`, one plain-language page per common\n  validator finding) and the standards crosswalk (`/crosswalk/`).\n- **Machine-readable surfaces** — the versioned read API\n  ([docs/api.md](docs/api.md)), a Parquet table for bulk SQL, per-agency\n  badges and conformance marks, Atom change feeds, monthly citable dataset\n  releases, and a read-only MCP server ([docs/mcp.md](docs/mcp.md)).\n\nThe country controls describe only the current covered set. They are not a\ncensus of a country or region. The live evidence and readiness result for a\nbounded European GTFS beta are on the\n[status page](https://gtfsscorecard.org/status/#global-coverage); the release\ngate and scope limits are in [docs/global-expansion.md](docs/global-expansion.md).\n\n## Use it in CI\n\nGate your own pipeline on feed quality with the published action. It scores the\nfeed, prints the grade and the top fixes in the job log, and fails the build if\nthe feed drops below `min-grade` or expires within `min-days-to-expiry`:\n\n```yaml\n- uses: ChelseaKR/gtfs-scorecard@v1\n  with:\n    feed-url: https://your-agency.example/google_transit.zip\n    country: CA\n    min-grade: C\n    min-days-to-expiry: 14\n```\n\n`country` is the feed's assigned ISO 3166-1 alpha-2 code; it defaults to `US`\nfor existing workflows. Both thresholds are optional; leave one blank to skip that check. Full input\nreference and a complete workflow are in [docs/ci-action.md](docs/ci-action.md).\n\n## Operating at scale\n\nBeyond `run`, the CLI carries the commands the rollout plan needs:\n\n```sh\nscorecard sync --country US --state California   # propose keyless, untracked\n                                                 # Mobility Database entries\nscorecard shards --count 4                        # JSON fan-out plan for CI\nscorecard reindex                                 # rebuild index.json from disk\nscorecard rollups                                 # publish program rollup artifacts\nscorecard render-site                             # crawlable static pages + sitemap\nscorecard alerts --out digest.md                  # expiry/regression digest\nscorecard notify                                  # per-subscriber digest (dry run)\n```\n\nAdd `--source-metadata-out \u003cpath\u003e` to `scorecard sync` for a source receipt\nthat accounts for every recognized Mobility Database Schedule row as excluded,\nfiltered, already tracked, duplicate, conflicted, or proposed for review. It\nnever edits the registry and does not treat a catalog proposal as permission to\nrepublish.\n\n`notify` builds a feed-health email for each opt-in subscriber in\n[`subscriptions.yaml`](subscriptions.yaml), containing only the agencies they\nfollow and only when one needs attention. It prints the emails by default; the\ndaily workflow sends them via SES once an operator verifies a sender, applies\nthe SES grant in `infra/artifacts`, and sets the `SES_FROM` repo variable.\n\nThe daily workflow fans agencies out across a parallel matrix and can mirror\nartifacts to a CloudFront-backed S3 bucket once `infra/artifacts` is applied\n(ADR 0002). Program rollups are configured in [`rollups.yaml`](rollups.yaml) as\nnamed cohorts (a liaison's own agencies, a district, the whole state) and shown\nat `#/programs`; an agency \"needs attention\" when its feed is expiring or its\ngrade regressed, not merely when it scores below a B. The published JSON is a\ndocumented read API ([docs/api.md](docs/api.md)); a flat catalog of every agency\n(grade, score, feed URL, days-to-expiry, top fix) is served at `/catalog.json`\nand `/catalog.csv` so a consumer needs one request, not one per agency.\n\n### Roadmap status: built vs deployed\n\nThe [roadmap](docs/roadmap.md) plans the path from two pilot feeds to a\nworldwide-capable service. The Year 1 software is built, tested, and mostly deployed; the\n[deploy runbook](docs/deploy.md) walks through the AWS stacks and carries the\ncurrent deployment status.\n\n| Roadmap piece | In the repo | State |\n| --- | --- | --- |\n| Mobility Database sync | `scorecard sync` (`mobilitydb.py`) | run on demand |\n| Scheduled scoring run | `scorecard shards` + CI matrix | daily schedule live in Actions; observed completion is on `/status/` |\n| Expiry/regression alerts | `scorecard alerts`, `notify --send`, `infra/alerts` | applied and live; SES sender verified, digest sends daily |\n| Artifacts on S3 + CloudFront | `infra/artifacts` | applied and live; daily mirror on, site still serves from Pages |\n| Self-serve submission form | `web/submit.html`, `infra/submit` | applied and live; submissions open reviewable pull requests |\n| Instant scoring | `web/try.html`, `infra/instant-score` | built; falls back to the issue-form path until applied (ADR 0029) |\n| Fan-out compute (Year 2) | `infra/compute` (SQS + worker) | built; apply when the daily run outgrows the Actions matrix |\n\nThe cohort drafted from the Mobility Database has grown well past the first\nCalifornia pass: the manifest-backed [`registry`](registry/README.md) now\ncarries more than 2,100 curated feed records, mostly across the US and Canada,\nwith a 528-record reviewed European cohort across 26 countries.\nIt now includes a geographically diverse reviewed canary cohort, scored daily\n(a 2026-07 dedupe pass removed ~350 records that duplicated an already-listed\nfeed).\n\n## Add your agency\n\nAny agency with a public GTFS feed can be added with one YAML block in\n[`registry/intake.yaml`](registry/intake.yaml) and a pull request; the walkthrough is\n[docs/add-your-agency.md](docs/add-your-agency.md). The live web form at\n[`web/submit.html`](web/submit.html) does the same without YAML through the\ndeployed `infra/submit` endpoint; every submission still opens a pull request\nfor human review before publication.\n\n## Support and services\n\nThe public scorecards, data, API, local pre-publish check, and request-backed\none-off scoring remain free. The [support page](https://gtfsscorecard.org/support/)\nexplains the project's infrastructure needs and accepts sponsorship inquiries;\nit does not advertise a payment rail that is not ready.\n\nPrograms and agencies that want a facilitated audit, workshop, or implementation\nhelp can review the current [consulting services and pricing](https://chelseakr.com/consulting/).\nPaid help is separate from scoring and never changes a grade or removes anything\nfrom the free tier.\n\n## Standards conformance\n\nThis repo is governed by the shared portfolio standards vendored at\n[`docs/standards/`](docs/standards/) (pinned to a tag — never edited locally;\nsee the integrity note in that directory's history). Per\n`docs/standards/README.md`'s conformance rule, every applicable standard is\ndeclared here; none is silently skipped.\n\n| Standard | Applies? |\n|---|---|\n| [Code Quality](docs/standards/CODE-QUALITY-STANDARD.md) | Applies (Python; TS/Node N/A — `web/` is no-build vanilla JS) |\n| [Security \u0026 Supply-Chain](docs/standards/SECURITY-AND-SUPPLY-CHAIN-STANDARD.md) | Applies (ASVS L1 shape: no auth, no PII store) |\n| [CI/CD](docs/standards/CI-CD-STANDARD.md) | Applies |\n| [Observability](docs/standards/OBSERVABILITY-STANDARD.md) | Applies — Tier B (frontend) + Tier C (batch pipeline); see [ADR 0031](docs/decisions/0031-observability-tier.md) |\n| [Accessibility](docs/standards/ACCESSIBILITY-STANDARD.md) | Applies fully — civic content, self-declared WCAG 2.2 AAA (see [docs/accessibility.md](docs/accessibility.md), [docs/vpat.md](docs/vpat.md)) |\n| [Internationalization](docs/standards/INTERNATIONALIZATION-STANDARD.md) | Applies — civic transit data, public-facing; exemption path unavailable |\n| [Performance](docs/standards/PERFORMANCE-STANDARD.md) | Applies — the static frontend has blocking Lighthouse budgets on code changes; the scheduled data-refresh path retains its documented advisory exception |\n| [AI Evaluation](docs/standards/AI-EVALUATION-STANDARD.md) | N/A — no LLM/model component: no model inference in any user-facing or decision-making path (`AI-EVALUATION-STANDARD` §0); the MCP server (`server.json`) is read-only data retrieval, no LLM SDK. Flips to APPLIES on first LLM SDK use. |\n| [AI Development Measurement](docs/standards/AI-DEVELOPMENT-MEASUREMENT-STANDARD.md) | Applies — delivery and quality-debt outcomes are measured at repository level; local AI-tool telemetry is never a merge gate |\n| [Quality \u0026 Metrics](docs/standards/QUALITY-AND-METRICS-STANDARD.md) | Applies (data-quality/lineage named for this repo explicitly) |\n| [Documentation](docs/standards/DOCUMENTATION-STANDARD.md) | Applies |\n| [Release \u0026 Versioning](docs/standards/RELEASE-AND-VERSIONING-STANDARD.md) | Applies — reusable Action tags (`v1`/`v1.5.0`), monthly dataset releases; the MCP server manifest is written but not published to the registry (see Versioning) |\n| [Responsible-Tech Framework](docs/standards/RESPONSIBLE-TECH-FRAMEWORK.md) | Applies (audits A-F; AI-governance rows N/A — no AI system) |\n| [Incident Response](docs/standards/INCIDENT-RESPONSE-STANDARD.md) | Applies — deployed static site and scheduled pipeline; incidents use the shared severity, label, postmortem, and secret-leak conventions |\n| [Data Governance](docs/standards/DATA-GOVERNANCE-STANDARD.md) | Applies — public civic datasets, feed provenance, licenses, retention, and publication lineage are core product concerns |\n\nOpen gaps per standard, as of the most recent conformance audit, are tracked\nin [docs/standards-conformance-gaps.md](docs/standards-conformance-gaps.md)\nrather than restated here.\n\n## Observability\n\n**Tier B (frontend) + Tier C (batch pipeline)** — not the\n`OBSERVABILITY-STANDARD`'s default Tier-A mapping for this repo's class;\nsee [ADR 0031](docs/decisions/0031-observability-tier.md) for why. In short:\nthe deployed system is a scheduled Actions batch job plus a static site, not\na long-lived hosted service (`infra/compute`, the piece that would make this\nTier A, is built but not applied). Tier C's health/tracing/SLO controls are\nN/A (no network surface to probe). For Tier B, every fresh site build passes a\nblocking structural SEO check. Lighthouse gates code changes, and a weekly\nsynthetic run checks representative production routes. Build-time SEO reports\nare retained for 14 days and production Lighthouse reports for 90 days.\nThe public site has no analytics loader, visitor-tracking code, or real-user\nmonitoring beacon. Search Console ownership verification and sitemap submission\nremain external domain-owner tasks; this repository stores no Search Console\ncredentials or configuration. See the ADR and [deploy runbook](docs/deploy.md).\n\n## Versioning\n\nSemVer. The public API surface is the published JSON schema\n(`schema_version`), the GitHub Action's inputs (`action.yml`), and the CLI\n(`docs/api.md`). `pipeline/pyproject.toml`'s `[project].version` is the single\nsource of truth; `CITATION.cff` and `server.json` mirror it, and\n`pipeline/scripts/check_versions.py` fails `make verify` if they drift.\nSupported-version policy: latest major only — this is a single-deployment\ncivic tool, not a library with multiple consumers pinned to old majors.\n\nThis repo also **produces releases**: the marketplace GitHub Action (tagged\n`v1`) and monthly citable dataset releases (`dataset-release.yml`). It also\ncarries an MCP server manifest (`server.json`), which is **not** published to\nthe MCP Registry — publishing needs an interactive operator login and the\nmanifest still has no `packages[]` entry, so `io.github.chelseakr/gtfs-scorecard`\ndoes not resolve there. [docs/mcp.md](docs/mcp.md) has the install recipe that\ndoes work and the reason the packages entry was removed.\n\n## Run your own instance\n\nA state DOT, national RTAP, or country program can fork this repo and stand\nup its own branded instance — own domain, own agency registry, own\norganization name — from config and a deploy, no code change:\n[docs/fork-quickstart.md](docs/fork-quickstart.md).\n\n## Layout\n\n```\nregistry/       manifest-backed agency shards; add yours to intake.yaml\ninstance.example.yaml   fork branding template; copy to instance.yaml to rebrand\nrollups.yaml    program rollups (portfolio views across many agencies)\npipeline/       Python pipeline: fetch -\u003e validate -\u003e score -\u003e publish\nweb/            static frontend; reads only published JSON\ninfra/          Terraform: artifacts CDN, submission function, fan-out compute\ndocs/           feeds, rubric, roadmap, api, fixes/ (KB), decisions/ (ADRs)\ndata/           raw snapshots (ignored) and published artifacts (committed)\n```\n\n## Guardrails\n\nThree rules hold everywhere in this project: every metric is published with a\nplain-language explanation of what it means; accessibility (WCAG 2.2 AAA) is\nnon-negotiable in the web app; and an agency without a realtime feed is shown\nneutrally, never shamed. Contributor and agent-facing build rules live in\n`CLAUDE.md`; current direction beyond the shipped roadmap is worked in the\nopen as labeled notes in [docs/ideation/](docs/ideation/).\n\n## Maintainer\n\nBuilt and maintained by [Chelsea Kelly-Reif](https://chelseakr.com), starting\nfrom the transit systems in Davis, California. Contributions and corrections are\nwelcome; agencies can ask to be added or removed under the\n[listing and removal policy](docs/listing-policy.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FChelseaKR%2Fgtfs-scorecard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FChelseaKR%2Fgtfs-scorecard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FChelseaKR%2Fgtfs-scorecard/lists"}