Stats no longer shows impossible all-time records. A garbled transponder reading could set the fastest or highest record, a small piston homebuilt at over 1,000 kt or a C-130 above 100,000 ft, and it stayed until something beat it. Those two records now check each reading against what that type of aircraft can do. So do Today's fastest and highest cards and their detail panels.
A wrong record already stored corrects itself. On the first start after this update, a fastest or highest record that fails the check is replaced by the best reading that passes. It comes from your hourly history, which is kept however short your retention is, and the date shown is when that reading happened. You won't get a notification, and the other records aren't touched. The service log says what was replaced and with what.
The limits are generous. Piston aircraft are limited to 500 kt and 50,000 ft, turboprops to 650 kt and 60,000 ft, and helicopters to 280 kt and 45,000 ft. Airliners and common business jets stay at 700 kt, which leaves room for a jet-stream tailwind, and now have a 60,000 ft limit. Types that already had a tighter speed limit, like the Cessna 172 at 250 kt, keep it. U-2s, Global Hawks, fighters, balloons and gliders have no altitude limit.
Operational notes
- The limits apply only to the fastest and highest records and Today's cards. Live, Search and an aircraft's own page still show what its transponder sent.
- An aircraft of unknown type can still set a wrong record, and so can a jet outside the common airliner and business-jet list, because there's nothing reliable to compare it with. If an unknown aircraft's type is learned later, the next start corrects its record.
- Replacing a record sorts the hourly history once at startup: about 2 seconds on 1.5 million rows. A healthy record adds almost nothing to a start.
Behind the scenes
type_classes.py lists the engine class of 2,088 ICAO DOC 8643 type designators and is generated by scripts/gen_type_classes.py; helicopters keep their existing list. heal_all_time_records replaces the old fastest-only repair, which read only the sightings still within retention. It reads sightings_hourly with no row limit, so a long run of glitches can't hide the real answer, and it uses the reading's hour as set_at, so the daily summary doesn't report an old reading as new. There's no schema change. test_stats_records.py covers the ceilings, a live poll, a first-run seed, the repair and the Stats read path, with invented data.