Skip to content

Update min_transfer_time requirement for transfers - #668

Open
skalexch wants to merge 2 commits into
google:masterfrom
MobilityData:fix_min_transfer_time_req
Open

skalexch wants to merge 2 commits into
google:masterfrom
MobilityData:fix_min_transfer_time_req

Conversation

@skalexch

@skalexch skalexch commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

This proposal corrects the requirements for min_transfer_time, making the field forbidden when transfers are not possible (transfer_type=3), are in-seat transfers (transfer_type=4) or require re-boarding the same vehicle (transfer_type=5).

Describe the Problem

min_transfer_time is optional for all transfers where transfer_type is not 2. However, transfer_type = 3 and 4 are respectively "no transfers possible" and "in-seat transfer", which cannot be associated with any minimum time window.

EDIT: From conversation, I added transfer_type=5 to the types that forbid min_transfer_time. As the requirement to alight and re-board a vehicle is not associated with a minimum time needed to make that connection. (Based on the definition of min_transfer_time, it "should be sufficient to permit a typical rider to move between the two stops"

Proposed Solution

Forbid min_transfer_time when transfers are not possible (transfer_type=3), are in-seat transfers (transfer_type=4) or require re-boarding the same vehicle (transfer_type=5).

Type of change

GTFS Schedule

  • Functional Change
  • Non-Functional Change
  • Documentation Maintenance

Proposed Discussion Period

We will leave this PR open one week for discussion, one week for review (minimum per governance). Then we will raise a vote to adopt this fix.

Proposal Update Tracker

Date Update Description
(2026-10-19) (Raised proposal)
(2026-10-19) (Discussion period started)
(2026-10-26) (Review period started)
(2026-11-05) (Vote to adopt started)
(2026-11-06) (Vote to adopt cancelled, discussion period started)

Checklist

@skalexch

Copy link
Copy Markdown
Collaborator Author

Tagging @gcamp and @rudiejd for awareness since the last additions to min_transfer_time and transfer_type were #303 and #640

@skalexch

Copy link
Copy Markdown
Collaborator Author

I am initiating a review period of one week before starting the vote. The review period ends on 02-11-2026 at 23:59:59 UTC.

Please take a look and get your comments in before we start the vote.

@etienne0101 etienne0101 added GTFS Schedule Issues and Pull Requests that focus on GTFS Schedule Change type: Non-Functional Refers to important updates to the specification that do not significantly affect functionalities. Review Period The Community reviews the proposal for clarity, feasibility, and alignment with GTFS goals. labels Oct 28, 2026
@rudiejd

rudiejd commented Oct 30, 2026

Copy link
Copy Markdown
Contributor

This change looks good to me! Tagging in @jfabi to appprove officially on the MBTA's behalf once the vote has started

Comment thread gtfs/spec/en/reference.md Outdated
| `to_trip_id` | Foreign ID referencing `trips.trip_id` | **Conditionally Required** | Identifies a trip where a connection between routes ends.<br><br>If `to_trip_id` is defined, the transfer will apply to the departing trip for the given `to_stop_id`.<br><br>If both `to_trip_id` and `to_route_id` are defined, the `trip_id` must belong to the `route_id`, and `to_trip_id` will take precedence. <br><br>Conditionally Required:<br>- **Required** if `transfer_type` is `4` or `5`. <br>- Optional otherwise. |
| `transfer_type` | Enum | **Required** | Indicates the type of connection for the specified (`from_stop_id`, `to_stop_id`) pair. Valid options are:<br><br> `0` or empty - Recommended transfer point between routes.<br>`1` - Timed transfer point between two routes. The departing vehicle is expected to wait for the arriving one and leave sufficient time for a rider to transfer between routes.<br>`2` - Transfer requires a minimum amount of time between arrival and departure to ensure a connection. The time required to transfer is specified by `min_transfer_time`.<br>`3` - Transfers are not possible between routes at the location.<br>`4` - Passengers can transfer from one trip to another by staying onboard the same vehicle (an "in-seat transfer"). More details about this type of transfer [below](#linked-trips). <br>`5` - In-seat transfers are not allowed between sequential trips. The passenger must alight from the vehicle and re-board. More details about this type of transfer [below](#linked-trips). |
| `min_transfer_time` | Non-negative integer | **Conditionally Required** | Amount of time, in seconds, that must be available to permit a transfer between routes at the specified stops. The `min_transfer_time` should be sufficient to permit a typical rider to move between the two stops, including buffer time to allow for schedule variance on each route. <br><br>Conditionally Required:<br>- **Required** if `transfer_type` is `2`. <br>- Optional otherwise. |
| `min_transfer_time` | Non-negative integer | **Conditionally Forbidden** | Amount of time, in seconds, that must be available to permit a transfer between routes at the specified stops. The `min_transfer_time` should be sufficient to permit a typical rider to move between the two stops, including buffer time to allow for schedule variance on each route. <br><br>Conditionally Forbidden:<br>- **Forbidden** if `transfer_type` is `3` or `4`. <br>- **Required** if `transfer_type` is `2`. <br>- Optional otherwise. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a scenario when this field might be useful when transfer_type is 5? If not, should we forbid it as well?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jfabi a transfer_type = 5 is one where thew riders have to re-board. Even if it's the same vehicle, there might be a case where a min_transfer_time is helpful. Maybe a train carriage being decoupled or coupled and it takes a specific amount of time. I think the major benefit is to forbid for cases that are clear contradictions.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that's not what we want?

If you set the min_transfer_time of a transfer_type=5 transfer to the time it takes to couple and decouple, a real-time update that moves arrival and departure closer to each other will break the transfer. A routing engine would not produce the transfer despite it being viable.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@felixguendling I guess the only reason to add it is to describe a minimum theoretical time it takes to do the coupling and decoupling. But for now I don't see all the possible situations (that are guaranteed to happen in real-life) that make us allow min_transfer_time for transfer_type=5. So I'm afraid that I might forget one and end up restricting the spec.

That's why I am okay with keeping it for now (as optional) just because I don't want to prematurely forbid it. I know that for cases 3 and 4 there's absolutely no possibility for changing the vehicle (because the transfer is either impossible or in-seat) so there's no min_transfer_time to bound that transfer with.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess the only reason to add it is to describe a minimum theoretical time it takes to do the coupling and decoupling.

That's an operational process and not rider-facing though? What implications do you see from "coupling / decoupling takes at least N minutes" to "which connections should be shown to the user"? Anyhow, it's currently completely undefined what min_transfer_time means for transfer_type=5, so forbidding it can only improve the situation.

What might be more interesting: how long does a trip wait for a timed transfer?

The departing vehicle is expected to wait for the arriving one and leave sufficient time for a rider to transfer between routes.

In case of a delay the connecting trip won't wait forever but knowing how long it will wait helps riders make decisions in case of disruptions. But probably this would require another column to not create confusion.

@skalexch skalexch Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@felixguendling you're right for the first one. I think if we take both your points together, we probably need another column for "the vehicle waits N minutes". Because min_transfer_time does not point to that whatsoever.

Also, from the definition of min_transfer_time, it says "The min_transfer_time should be sufficient to permit a typical rider to move between the two stops, including buffer time to allow for schedule variance on each route." So not applicable for type 5. I think I'm going to stop the vote, add type 5 and restart after a while.

cc @jfabi

@skalexch

skalexch commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator Author

I am starting a vote to adopt this correction in the spec. The vote ends on 19 November 2026 at 23:59:59 UTC.

@jfabi @rudiejd @gcamp

@skalexch skalexch added Vote to Adopt Community votes to officially adopt the change. and removed Review Period The Community reviews the proposal for clarity, feasibility, and alignment with GTFS goals. labels Nov 5, 2026
@felixguendling

felixguendling commented Nov 5, 2026 •

Copy link
Copy Markdown

+1 MOTIS (consumer)

@skalexch

skalexch commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator Author

I am cancelling this vote and add transfer_type = 5 to the list of types for which min_transfer_time is forbidden, I will keep the PR for a while in a discussion period before I restart the vote.

@skalexch skalexch added Discussion Period The community engages in conversations to help refine and develop the proposal. and removed Vote to Adopt Community votes to officially adopt the change. labels Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Change type: Non-Functional Refers to important updates to the specification that do not significantly affect functionalities. Discussion Period The community engages in conversations to help refine and develop the proposal. GTFS Schedule Issues and Pull Requests that focus on GTFS Schedule

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants