Skip to content

20260914 - Point the ADS-B truth feed at the node's own tar1090 - #39

Merged
Purple10101 merged 1 commit into
mainfrom
20260914-default-adsb-truth-to-local-tar1090
Sep 14, 2026
Merged

Purple10101 merged 1 commit into
mainfrom
20260914-default-adsb-truth-to-local-tar1090

Conversation

@Purple10101

Copy link
Copy Markdown
Collaborator

What

Changes the shipped truth.adsb.tar1090 default from sfo1.retnode.com to localhost:8078, and adds a migration so the change actually reaches deployed nodes.

Why

The default named one machine that every node read its truth from, and it has stopped answering. sfo1.retnode.com returns HTTP 530 from every node checked and from off-estate. Every node that never had this set by hand has been labelling nothing.

Four nodes, three different values, one working:

Node truth.adsb.tar1090 State
jonathan-node-1 localhost:8078 working, 240 labelled events across 25 aircraft
owl-ded9 sfo1.retnode.com (inherited) 530, blind
owl-debb sfo1.retnode.com (in user.yml) 530, blind
fairforest B 192.168.1.143:30005 BEAST port, parse error every cycle

jonathan-node-1 was fixed by hand in its own user.yml some time after 2026-07-16 and the value never came back into the repo. Every broken node already had a working tar1090 container on localhost:8078 that nothing was reading.

Why localhost:8078 is the right default

It is node-invariant, which is what makes it defaultable at all. Every node runs its own tar1090 container on that port, fed by adsb.lol and by a local receiver wherever tar1090.adsb_source names one. The genuinely per-site part stays in adsb_source, so attaching a receiver is three fields in one place and never involves the truth feed.

That separation is also the fix for how fairforest B went wrong: the receiver's BEAST address was put in the truth field. A raw feed port is not an HTTP endpoint, so fetchADSB() logged Parse Error: Expected HTTP/, RTSP/ or ICE/ every cycle for 15 hours and every detection's adsb came back null.

Why the migration is needed

Changing default.yml alone reaches no deployed node. First boot seeds user.yml with a whole copy of the defaults, so every node persists whatever shipped the day it booted and that overlay shadows the new value.

migrate_adsb_truth_server() follows migrate_doppler_span() and migrate_tracker_forward() exactly: drop the key when it still holds the legacy host, so the shipped default applies. Safe on the same reasoning, and more clearly so than either, since nothing is lost by moving a node off a host that answers 530.

Any other value is a real choice and survives untouched, including a receiver address like fairforest B's, which is wrong in a way this cannot safely judge. forced.yml still wins, and user.yml on disk is not rewritten, so the migration stays load-bearing rather than being a one-shot fixup.

Verification

As lint.yml runs it:

  • ruff check . clean
  • pytest config-merger/test/ 47 passed
  • vulture clean

8 new tests. Disabling the migration fails 2 of them; the other 6 are guards asserting values are kept (a deliberate host, a receiver address, the legacy host with a port appended, forced.yml precedence, and user.yml left unrewritten).

Verified on hardware

fairforest B was corrected by hand ahead of this change and the pipeline was traced end to end: local receiver → tar1090 (messages 0 → 4009), tar1090 → blah2-api (parse errors stopped), blah2-api → adsb2dd (aircraft converted to bistatic delay and Doppler). Association was still unproven at 04:00 local only because no aircraft had yet been inside both the delay and ±200 Hz Doppler windows. jonathan-node-1 proves that final link on identical software.

🤖 Generated with Claude Code

The shipped default named sfo1.retnode.com, one machine that every node read
its truth from. It stopped answering: it returns HTTP 530 from every node on
the estate and from off it, so every node that never had this set by hand has
been labelling nothing. Three of the four nodes checked were blind.

localhost:8078 is node-invariant, which is what makes it defaultable at all.
Every node already runs its own tar1090 container on that port, fed by
adsb.lol and by a local receiver where tar1090.adsb_source names one. The
per-site part stays in adsb_source, so attaching a receiver is three fields in
one place and never touches the truth feed.

That separation is also the fix for how this went wrong on fairforest B, where
the receiver's BEAST address was put in the truth field. A raw feed port is
not an HTTP endpoint, so blah2-api logged a parse error every cycle for 15
hours and every detection's adsb came back null.

Changing default.yml alone reaches no deployed node, because first boot seeds
user.yml with a whole copy of it. migrate_adsb_truth_server() drops the key
when it still holds the legacy host, on the same reasoning as the Doppler span
and tracker_forward migrations: nothing is lost by moving a node off a host
that answers 530. Any other value is a real choice and survives, including a
receiver address, which is wrong in a way this cannot safely judge.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@Purple10101
Purple10101 merged commit 288238c into main Sep 14, 2026
1 check passed
@Purple10101
Purple10101 deleted the 20260914-default-adsb-truth-to-local-tar1090 branch September 14, 2026 08:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant