20260827 - Ship no location by default - #34
Merged
Merged
Conversation
default.yml shipped a complete, plausible geometry: Greenwich Observatory
as the receiver, Crystal Palace as the illuminator. The merger writes it on
first boot, so from power-on every consumer saw a populated location and
none could tell an unconfigured node from a configured one. Nodes
registered with the server claiming to sit in south-east London.
Keys stay, with null values, rather than being removed. Consumers need to
tell "unset" from "absent because this config is malformed", and
retina-gui's config form renders from these keys.
The merger was substituting 0 for a missing coordinate, which is not a
neutral value: it is Null Island, a real place the node then claimed to be.
Worse, ADSBLOL_ENABLED stayed true, so the adsb.lol query asked for
aircraft within ADSBLOL_RADIUS of 0,0 and fed them to blah2 as ground
truth. The receiver block is now omitted when unset, and adsb.lol is forced
off whatever adsblol_fallback says.
Omitting the vars does not fully undo the zero on its own, because
tar1090-node's compose uses ${RECEIVER_LAT:-0} and its proxy does
parseFloat(... || '0'). Disabling adsb.lol is what actually prevents false
truth; the omission stops us asserting a position we do not have.
Coordinates are tested against None rather than for truthiness, so an owner
who genuinely sets 0,0 keeps it.
DEPLOY LAST. Everything that reads this config has to tolerate a null
first: retina-telemetry's _require raised, blah2-api dereferenced it
unguarded, and retina-gui's schema rejected it. All three are fixed on
their own branches; this is the change that makes the null real.
test_actual_config_files pinned default.yml's real coordinates and caught
this, which is what it is for. It now asserts the new intent.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The change that actually stops nodes telling the server a location nobody chose. (86cba5qt4)
Warning
Release this last. Everything that reads the config has to tolerate a null first:
_requireraises on a nullserver.jsdereferences it unguarded and throwsretina-gui#74 is not ordering-critical; current main already copes.
Why
default.ymlshipped a complete, plausible geometry: Greenwich Observatory as the receiver, Crystal Palace as the illuminator. config-merger writes it on first boot, so from power-on every consumer saw a populated location and none could tell an unconfigured node from a configured one. Nodes registered with the server claiming to sit in south-east London, poisoning the fleet's position data with values nobody chose.What
Keys stay, with null values, rather than being removed. Consumers need to tell "unset" from "absent because this config is malformed", and retina-gui's config form renders from these keys.
The merger was substituting
0for a missing coordinate, which is not a neutral value: it is Null Island, a real place the node then claimed to be. Worse,ADSBLOL_ENABLEDstayedtrue, so the adsb.lol query asked for aircraft withinADSBLOL_RADIUSof 0,0 and fed them to blah2 as ground truth. The receiver block is now omitted when unset, and adsb.lol is forced off whateveradsblol_fallbacksays — the query is a radius around the receiver, so with no receiver there is no query to make, only a wrong one.Omitting the vars does not fully undo the zero on its own, because tar1090-node's compose uses
${RECEIVER_LAT:-0}and its proxy doesparseFloat(... || '0'). Disabling adsb.lol is what actually prevents false truth; the omission stops us asserting a position we do not have.Coordinates are tested against
Nonerather than for truthiness, so an owner who genuinely sets 0,0 keeps it.Release note
config/default.ymlandconfig-merger/script/merge_config.pyboth bake into the sameretina-config-mergerimage, so they cannot be separated. But that image is pinned byCONFIG_MERGER_Vin this repo's own compose, so the pin has to be bumped to the new build or the release looks clean while the olddefault.ymlkeeps shipping. That pin has sat frozen before — it was stuck at v0.3.17 across six releases.Testing
4 new merger tests.
test_actual_config_filespinneddefault.yml's real coordinates and correctly failed on this change — it now asserts the new intent, and still checks the sited case when a location is present.Verified end to end on owl-ded9 with the full stack running unsited, via the real merger image and the real
retina-node.service(node fully restored afterwards;user.ymlandconfig.ymlchecksums confirmed identical to baseline):capture,network,process,save/api/detection/api/adsb2ddRECEIVER_*absentAlso confirmed the coupling is real: running the new
default.ymlagainst the old merger script producedRECEIVER_LAT=NoneandADSBLOL_ENABLED=true, which is worse than today. Same image, so it cannot happen in practice, but it is why the merger fix is in this PR rather than a separate one.Not verified: ran from a mounted script and defaults dir, not from a built image via Mender.
🤖 Generated with Claude Code