The map resolved the newest acars breadcrumb per flight on every poll, over a
table that grows for the life of the install and was never pruned. One row per
flight replaces that, and its presence is what puts a flight on the map — no
state filter, no time arithmetic on the read path.
Prefile opens the row at the departure gate, the ACARS batch endpoint maintains
it, and a five-minute cron owns eviction. acars.live_time did two unrelated jobs
and is split into pireps.tombstone_time plus two live map timers.
Also closes the child-record gap PirepService::delete() has claimed to handle
since it was written: acars rows are now deleted, with a cascading foreign key
behind it. Adding that constraint permanently purges pre-existing orphans.