The "breadcrumbs" element is always present, on top of the page.
It shows you where you are on the lab.
It enables you to reach any page on the lab.
NMBS/SNCB describes its offer as lines: a train type plus a number — IC 01, IC 12, S 01, L 01. A line is a commercial corridor with a fixed list of served stations and a regular cadence, typically one train per hour in each direction. It is the number printed on the network map, on the platform screens and on the IC leaflets NMBS/SNCB publishes (one pdf per line, with its timetable).
Each line owns one or more blocks of train numbers, per schedule (week, saturday, sunday). The block is what identifies the line — a weekday train numbered 517 falls in 500-549, so it is an IC 01. A line can own several blocks (IC 04 has one towards Poperinge and one towards Lille), and the blocks change from one schedule to the next, which is why every row below is keyed on a period.
The NMBS/SNCB gtfs feed carries none of this. A gtfs route is only an origin–destination pair ("Oostende – Eupen"), and a gtfs trip is one departure, identified by its train number (gtfsTrips.shortName). Nothing in the feed says "this trip is an IC 01". The line number is a shadow numbering: it only exists through the train-number blocks, and those live on the leaflets, not in the data.
So we keep the blocks ourselves. gtfsNmbsTrainNumbers is the reference table transcribed from the leaflets, one row per (period, type, line, range). On every ingest the enricher looks up each trip's train number in the ranges of its schedule and writes the match to gtfsNmbsTripTrainNumbers. That join is what gives every NMBS/SNCB trip a line.
Gtfs has two layers — routes and trips — and misses the one in between. Between "the Oostende – Eupen route" and "the 07:23 departure" sits the train that leaves every hour: a set of trips that are all exactly the same except for their times. Same origin, same destination, same stop sequence, only the clock moves. That set is a trip pattern, and it is the unit people actually reason about: "the IC 01 towards Eupen", not one of its 18 daily trips.
The line number is what lets us build it. Grouping the trips of a line by headsign gives NMBS/SNCB trip patterns: gtfsNmbsTripPatterns is keyed on the line row plus the headsign (gtp$gnt:nmbssncb:week:ic:1:500-549$Eupen), and gtfsNmbsTripTripPatterns links every trip to its pattern. Aribus inbound rules select on these patterns rather than on a gtfs routeId, so a rule targets a line in one direction and holds for every hourly train instead of a single trip id.
The strict, stop-sequence based version of the same idea, computed for every agency, lives on the Trip Patterns page.