Methodology Updated 2026-05-06
How we determined each Palo Alto Caltrain station's SB 79 tier
The official Bay Area SB 79 tier map will come from ABAG/MTC in mid-2026. But the inputs are public — Caltrain's GTFS feed and HCD's threshold definitions — so we don't have to wait. Here's the working.
TL;DR
| Station | Avg trains / weekday | Verdict |
|---|---|---|
| Palo Alto / University Ave Caltrain | 104 | Tier 1 |
| California Avenue Caltrain | 90 | Tier 1 |
| San Antonio Caltrain | 90 | Tier 1 |
1. What the law actually requires
SB 79 sorts transit stops into Tier 1 and Tier 2 based on service level. For commuter rail (which is what Caltrain is), the HCD MPO advisory of March 20, 2026 spells out the math:
"Very high frequency commuter rail" = a commuter rail service operating an average of at least 72 trains per weekday across all directions at any point in the past three years.
"High frequency commuter rail" = at least 48 trains per weekday, not meeting the very-high-frequency standard.
"The average is the sum of the number of scheduled stops at a station for a commuter rail service for all weekdays, divided by five weekdays."
A passenger rail station "occupying one physical location counts as a single station, even if multiple rail services utilize the station."
So:
- ≥72 → Tier 1
- 48–71 → Tier 2
- <48 → not a TOD stop on rail-frequency grounds (could still qualify via bus service, but not relevant here)
Per the HCD advisory's typology table (p.9), Caltrain is classified as commuter rail, not heavy rail. So the per-station train count is what determines tier.
2. Where the data comes from
Caltrain publishes its schedule in GTFS format (General Transit Feed Specification — the standard Google maps and most transit apps use). The feed is a zip of CSV files describing stops, trips, schedules, and calendars. It's free and public.
- Source: data.trilliumtransit.com/gtfs/caltrain-ca-us/caltrain-ca-us.zip (Trillium Solutions hosts the feed for Caltrain)
- Feed version: UTC 29-Jan-2026 22:42 — the post-electrification schedule, effective Jan 31, 2026 through Aug 31, 2026
- Cross-check: the Bay Area regional GTFS hub at 511.org
- Discoverable from: caltrain.com/developer-resources
3. The methodology, step by step
- Download the GTFS zip. 165 KB.
- Find the matching stops. Each Palo Alto Caltrain station has a parent stop (e.g.
palo_alto) and two child stops, one per direction (e.g.70171Northbound and70172Southbound). Per HCD: one physical location = one station, so we sum across both directions. - Identify the weekday service. Caltrain's
calendar.txthas one weekday-active service ID —c_71742_b_86200_d_31("Year Round starting 1/31/2026 (Weekday)") — running Monday through Friday for the feed's full date range. - List weekday trips. 112 trips total in
trips.txtbelong to that weekday service ID (this is roughly 56 northbound + 56 southbound). - Count scheduled stops at each station. Stream
stop_times.txt(5,414 rows). For each row, if the stop ID is one of our targets and the trip is in the weekday set, increment the per-day counter for each weekday the service is active (Mon–Fri). - Sum per station, divide by 5. That's the "average trains per weekday across both directions" the HCD advisory asks for.
- Apply thresholds. ≥72 → Tier 1. 48–71 → Tier 2. <48 → below threshold.
4. The numbers
| Station | GTFS stop_ids | Mon–Fri total | ÷ 5 | Threshold | Tier |
|---|---|---|---|---|---|
| Palo Alto / University Ave | 70171 + 70172 |
520 | 104.0 | ≥ 72 | Tier 1 |
| California Avenue | 70191 + 70192 |
450 | 90.0 | ≥ 72 | Tier 1 |
| San Antonio | 70201 + 70202 |
450 | 90.0 | ≥ 72 | Tier 1 |
Why University Ave gets 104 and the other two get 90: post-electrification, Caltrain runs a mix of all-stop "local" trains and "limited" trains that skip some stops. University Ave is a major stop where every train stops; California Ave and San Antonio are local-pattern stops where ~14 trains skip in each direction. All three still clear the Tier 1 bar.
5. Verdict per station
Palo Alto / University Ave — 104 trains/weekday. Comfortably above the 72-train Tier 1 floor. Within ½ mile of the station, SB 79 sets the height floor at 65 ft (about 5–6 stories), 75 ft within ¼ mile (about 7), and 95 ft adjacent (about 9–10).
California Avenue — 90 trains/weekday. 18 trains above the Tier 1 floor. Same envelopes as above apply within the half-mile band around the station.
San Antonio — 90 trains/weekday. Same as Cal Ave. The half-mile band straddles the Palo Alto / Mountain View boundary, so the density implications also reach into Mountain View's parcels.
6. Caveats
- Past-3-years rule. The HCD advisory says a station qualifies as Tier 1 if it met the threshold "at any point in the past three years." We computed against the current (post-electrification) schedule, which is the highest service Caltrain has ever run. A pre-electrification schedule would have shown lower service, so it doesn't flip any verdict — it can only make a station that's now below threshold qualify based on past service. None of our three stations are below threshold, so this is academic.
- Future schedule changes. Once a station qualifies, it stays qualified — the HCD advisory's "any point in the past three years" rule means a service cut wouldn't immediately downgrade a station's tier.
- The official map. ABAG/MTC will publish the regional SB 79 tier map in mid-2026. That map carries a rebuttable presumption of validity for project applicants and local governments. This page is our best read of the same input data; if ABAG's numbers differ from ours, theirs are the legal anchor.
- Stop counting. We count
stop_times.txtentries regardless ofpickup_type. Some commuter rails mark certain stops as drop-off-only or pickup-only; HCD's definition says "scheduled stops at a station" with no exclusion, so we include them all. - Calendar exceptions. One-off cancellations in
calendar_dates.txt(e.g. for holidays) are not subtracted from the typical-week count.
7. Reproduce this yourself
The computation is packaged as a reusable skill at ~/.claude/skills/sb79-tier-determination/ — designed to work for any California transit station with a published GTFS feed.
$ git clone https://github.com/<your-fork>/sb79palo
$ cd sb79palo
$ node ~/.claude/skills/sb79-tier-determination/compute-tiers.mjs \
--config scripts/compute-tiers.config.json
$ cat assets/data/station-tiers.json
The script:
- Pulls Caltrain's GTFS zip from Trillium
- Parses
stops.txt,calendar.txt,trips.txt, andstop_times.txt - Applies the HCD math
- Writes the JSON this page reads from
No npm install needed — pure Node ≥18 plus the system unzip. Anyone can rerun it and get the same numbers (until Caltrain publishes a new schedule).
Sources
- HCD MPO advisory (PDF, March 20, 2026) — the threshold definitions
- SB 79 bill text — Gov. Code §§65912.155–65912.162
- Caltrain GTFS feed (Trillium)
- Caltrain developer resources
- 511.org Bay Area transit data
- GTFS reference
- station-tiers.json — the raw output of the script