Seven constraints nobody wrote down
An interview protocol for pulling tacit scheduling rules out of a human planner's head, tested against a GTFS vehicle-blocking model. Includes the questions that worked and the ones that didn't.
01 The problem
When mathematical schedulers replace human dispatchers, the initial schedules are almost always rejected as “unworkable.” Planners know dozens of unwritten rules: which relief points have bathroom access, which hills cannot be climbed when icy, which vehicle types must not be assigned to tight turning radiuses.
None of this is in the transit agency’s database.
02 The data
GTFS schedule data for a mid-sized metropolitan transit agency (42 lines, 620 vehicles) alongside audio transcripts of five 45-minute retrospective planning sessions.
| SOURCE | RANGE | DETAILS |
|---|---|---|
| Static GTFS Feed | Spring 2026 | 3,420 daily revenue trips |
| Operator Incident Reports | 2024 – 2025 | 812 relief-point complaints |
| Planning Protocol Logs | 5 sessions | 225 minutes of audio |
03 What I built
A semi-automated constraint elicitation pipeline. The system runs an initial unconstrained MIP, generates a diff against historical human schedules, and automatically forms targeted counter-factual questions for the planning team.
04 Result
| ITERATION | RECOVERED CONSTRAINTS | PLANNER OVERRIDES |
|---|---|---|
| Raw MIP | 0 | 73% |
| Round 1 Interviews | 4 | 28% |
| Round 2 Counter-factuals | 7 | 6% |
05 Where it broke
- Planner fatigue. After the third counter-factual query, respondents tended to agree with solver suggestions just to terminate the session.
- Conflicting seniority rules. Two planners held diametrically opposed interpretations of union seniority rules on interlined runs.
06 Run it yourself
$ git clone https://github.com/gospinup/spin-02-tacit-rules
$ cd spin-02-tacit-rules && python -m venv venv && source venv/bin/activate
$ pip install -r requirements.txt
$ python elicit_constraints.py --sample gtfs_sample.zip
07 Discuss
Every spin has a thread on GitHub Discussions. If a constraint looks over-fit, if the baseline is too easy, or if you’ve solved this properly in production and I’m busy reinventing it badly — say so there. Corrections get credited in the spin itself.