Reject non-transponder hexes from the ADS-B world - #252
Conversation
A dark simulated aircraft has no transponder, but the fleet's 1 Hz ADS-B push substitutes the simulator object id (obj-NNNNN) for the missing hex, and both the sim ingest and the solver keying rule took any truthy string. Every dark solve then claimed against its own pseudo-transponder, keyed mn-adsb-obj-*, and the feed marked it adsb_assisted — measured live 2026-08-26 as 15008/15008 multinode samples ADS-B-assisted with the mn-dark-* store (violet lane, anchor honoring, proximity claiming) permanently empty. Three layers, one rule (id_utils.is_transponder_hex — six hex digits, tar1090's ~ prefix allowed for non-ICAO TIS-B): - /api/sim/adsb/push drops non-transponder hexes, reports rejected_hex in the response, and counts them (sim_adsb_push_rejected_hex) so an outdated fleet still pushing dark aircraft is visible. - multinode_key_decision refuses the mn-adsb-* branch for them, so a poisoned adsb_hex can no longer put a dark target in the ADS-B lane. The fleet-side fix (stop pushing dark aircraft at all) lands separately in retina-simulation; this side must hold regardless of fleet version. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @jehanazad's task in 2m 55s —— View job Claude's review
I traced Summary: this is a well-scoped, well-tested fix. The root cause (a truthy-string check accepting One minor nit, nothing blocking:
Nothing else stood out:
|
Summary
Dark simulated aircraft were displayed as ADS-B assisted — universally, not intermittently. The fleet's 1 Hz ADS-B push substitutes the simulator object id (
obj-NNNNN) for the missing transponder hex, and both the sim ingest and the solver keying rule accepted any truthy string: every dark solve claimed against its own pseudo-transponder, keyedmn-adsb-obj-*, and the feed marked itadsb_assisted. Measured live 2026-08-26: 15008/15008 multinode samples ADS-B-assisted, the mn-dark-* store (violet lane, anchor honoring, proximity claiming) permanently empty, "MLAT dark 0" on the map's stats panel.Changes
services/id_utils.py— newis_transponder_hex: six hex digits, tar1090's~prefix allowed for non-ICAO TIS-B addresses. Defined overnormalize_hex_keyoutput.routes/sim_ingest.py—/api/sim/adsb/pushdrops non-transponder hexes, reportsrejected_hexin the response, and bumps a newsim_adsb_push_rejected_hexcounter so an outdated fleet still pushing dark aircraft is visible.services/tasks/solver.py—multinode_key_decisionrefuses themn-adsb-*branch for a non-transponderadsb_hex; the solve falls through to the dark branches (anchor / proximity / mint) instead.core/state.py/vulture_whitelist.py— the counter declaration, its reset, and the string-keyed-bump whitelist entry.Test coverage
tests/test_id_utils.pypins the hex shape rule (including the~TIS-B form and the normalized-input contract).tests/test_sim_ingest.pygainsTestAdsbPush: ICAO hex accepted,~hex accepted,obj-*rejected without touchingstate.adsb_aircraft.tests/test_solver_anchor.pygains two key-decision cases:obj-*inadsb_hexfalls through to proximity claiming;~hex still takes the ADS-B branch.test_id_utils.py,test_solver_anchor.py,test_sim_ingest.py,test_sim_ingest_mount.py(55 passed) and the pre-commit gate (ruff, vulture) clean.Review notes
5ba14e,3e13e6) — a genuine mis-association upstream of the keying rule.solver.py:670(previously dead code for these targets).🤖 Generated with Claude Code