Arrival · point-in-time feature store

The leak looks 0.92 minutes better than the honest model. The honest model is only 2.83 minutes better than doing nothing.

generated 2026-10-09 18:21 UTC from 19,312 trips · 01 Sep to 12 Sep · every figure computed at build time

What each model scores on the held-out trips

Lower is better. The flat promise is what the business does today, so it is the only baseline an improvement means anything against.

honest leaked, cheated
flat promise 11.019 min MAE
p90 error 25.6 min · breach 71.9% · 3,863 trips
ridge, point-in-time 8.190 min MAE
p90 error 16.4 min · breach 41.0% · 3,863 trips
ridge, leaky: in-flight window 7.265 min MAE
p90 error 15.8 min · breach 46.4% · 3,863 trips
ridge, leaky: no window 8.103 min MAE
p90 error 16.3 min · breach 42.2% · 3,863 trips

The gap is the finding. Filtering a feature window on when a trip was assigned rather than when it finished buys 0.92 minutes of MAE, more than the honest model's entire lift over the baseline, and none of it survives production, because at prediction time those trips had not finished and one of them is the trip being predicted. Dropping the window altogether gaps only 0.09 minutes: small enough to dismiss as noise, wrong for exactly the same reason, and the shape a GROUP BY written without a date filter actually takes.

A model that broke at 09:00

Every estimate doubled from 09:00. Trips take 35 minutes, so a trip's true duration is only known 35 minutes after it was predicted. This is what the accuracy dashboard showed. Click or press Enter on a column heading to sort.

TimeTrips scored MAE (healthy) MAE (broken) Visible? Labels pending
09:20460.5000.500identical154
09:40660.5003.636diverged134
10:00860.50010.930diverged114

Twenty minutes into the outage the dashboard reads the same MAE as a model that never broke, because every trip it could score was predicted before 09:00. Accuracy is structurally behind by the label delay. Prediction drift is not. Predictions exist the moment they are served, and the broken model's distribution has already moved while its accuracy has not.

Serving

Latency, reported as percentiles rather than a mean.

11 ms
p50
1982 ms
p99
106 ms
mean
1,000
requests

The mean is 106 ms and would clear any alarm anyone would set. One request in twenty takes 2.0 seconds. Reporting a mean latency is how a service stays slow without anybody finding out.

Could the experiment have seen it?

A treatment that genuinely is 2% better, 0.16 min off an 8 min MAE, over 800 trips.

0.16
real effect, min
0.07
measured, min
1.00
smallest detectable, min

The measured difference sits inside what this experiment could resolve, so it is noise with a decimal point. Without the third number the second one goes into a deck as a win either way.

How it is built

Trips come from Dispatch's gold table, where assigned_at is the instant a prediction was due and tat_minutes only exists once the trip ends. Features are declared once and retrieved two ways: point-in-time for training, by entity for serving, and a test replays a day asserting the two paths return identical values for every trip.

Architecture diagram →  ·  What Dispatch hands Arrival →

Trips are synthetic where Dispatch's warehouse is absent, so treat the absolute minutes as a demonstration. What is not circular is the ordering: a leak flatters a model, the flattery does not survive serving, and an accuracy dashboard cannot see an outage until its labels arrive.