Docs / TeoScore / Routing & Logistics
Routing & Logistics (V7–V9)
Category 3 — the shape of the journey: how many stops, how good the layovers are, and how painful the connection transfers look.
How the category aggregates
Fixed weighting, not a plain mean: V7×0.40 + V8×0.30 + V9×0.30 when all three are active. On a nonstop, V8 and V9 have nothing to score and drop, so the weights renormalize and the category is V7 alone. V9 is currently disabled (see below), so a real connecting itinerary today renormalizes to V7 and V8 only.
Measures — stop count vs the most direct option in the search.
Score = max(0, 100 − 25 × max(0, thisStops − fewestStopsInSearch))
Data & accuracy — purely structural from the itinerary's legs and the search-wide fewestStops anchor. Fully reliable — no external data needed.
Gotchas — relative to the search: if every option in the set has one stop, they all score 100 on V7.
Measures — for each connection, whether the layover is the right amount of time — not so short the connection is risky, not so long the traveler is stuck waiting — scored against the airport's Minimum Connection Time (MCT).
The traveler's intent selects the mode (a per-search choice):
- Minimize (default) — layovers close to the operational minimum; get through efficiently. Below MCT is penalized (risky), MCT–2×MCT is perfect, and it tapers off beyond that as tedium sets in.
- Open to Extended — the traveler doesn't mind waiting (work in the lounge, a long meal, just relax). Below MCT is still penalized, but any layover ≥ MCT scores 100 — no tedium penalty.
- Stopover in a specific city — an intentional break in a chosen city. ≥4h in that city scores 100; a shorter stop there behaves like Extended; other airports on the trip use Minimize.
Minimize: <MCT → max(0, (L/MCT)×100 − 30) · MCT–2×MCT → 100 · beyond → max(0, 100 − (L − 2×MCT)/15) Extended: <MCT → same risk penalty · ≥MCT → 100 Stopover: chosen city ≥4h → 100 · else Extended there · other airports → Minimize worst connection wins (min)
Data & accuracy — anchored on MCT, resolved in order: an enriched per-connection MCT (future OAG/SSIM feed) → a curated per-hub reference table (major global hubs, domestic vs international — e.g. AMS 40/50, ATL 45/75) → a conservative default floor (90 domestic / 120 international) for uncovered airports.
⚠️ MCT values are estimated, pending verification
The per-hub MCTs are curated from published / “recommended” connection times (airport sites, airline guides, aggregators), not the official IATA SSIM / GDS Minimum Connecting Time used for ticketing, and they aren't terminal- or direction-specific. Neither our cash nor award data sources expose MCT. Treat them as estimates until an authoritative feed replaces them — an uncovered airport deliberately keeps the higher default floor, so it's never less safe than before.
Worked example — Mode 1, MCT = 90 min
| Layover | Region | Score |
|---|---|---|
| 30 min (⅓ MCT) | below MCT — risky | 3 |
| 45 min (½ MCT) | below MCT — risky | 20 |
| 81 min (90% MCT) | below MCT — risky | 60 |
| 90–180 min (MCT–2×MCT) | plateau — perfect | 100 |
| 4 h | tedium | 96 |
| 6 h | tedium | 88 |
| 10 h | tedium | 72 |
| 24 h | tedium | 16 |
| ≈28 h | tedium floor | 0 |
Below MCT hits 0 at ≤30% of MCT; the tedium taper is deliberately gentle (1 pt per 15 min past 2×MCT), so even a very long wait scores non-zero until ~28 h at MCT 90.
Aggregation — each connection is scored independently, then the worst one wins (min). One perfect 90-min layover (100) + one 11 h layover (≈68) → V8 = 68, not the 84 an average would give — the traveler lives the worst layover.
Gotchas — drops on nonstops. Mode is set per search via layoverMode (+ stopoverCity, matched by airport IATA code, for Mode 3). A 4th path: an enriched per-connection score overrides the mode curve when present.
Measures — how hard the physical transfer between flights would be — currently disabled, not scored.
Disabled 2026-08-04 (V9_DISABLED)
Award (seats.aero) itineraries carry no terminal data at all, so every award connection would always fall to the carrier-coherence estimate below with no path to a confirmed score. Disabled for cash itineraries too, not just award, per an explicit decision — the logic and reference data are intact for re-enabling, they just aren't contributing to any score right now. A connecting itinerary's Category 3 score today is V7 + V8 renormalized, as if V9 didn't exist.
different airports → 15 · exit + reclear → 50 · airside, different terminals → 70 · same terminal → 100 worst connection wins
Data & accuracy (when re-enabled) — the engine detects different-airport transfers itself and reads terminals from the legs; the 70/50 tiers come from an airside-connectivity map covering the top-50 hub airports. Enriched per-connection tiers are honored when present. When no terminal data exists, it falls back to a carrier-coherence estimate (same carrier/alliance → 70, mixed → 50) and flags the result terminal-estimate vs terminal-confirmed.
Gotchas — would drop on nonstops if re-enabled. Gate-level confidence is a TEO Agent concern and never set here.