Conversation
blah2-api's enrichment reports where the node saw the aircraft it matched a detection to — lat, lon, altitude, ground speed, track, and its own delay and Doppler residuals — and until now the wire reduced all of that to the hex. Contract 1.5.0 adds an optional `adsb` column to DetectionFrame: an AdsbTag or null per detection, parallel to `adsb_hex` and agreeing with it entry for entry. The server files the position for the detection itself, so it, and every environment it mirrors the frame to, can claim the detection and calibrate the node's coverage without a position source of its own. build_detection_frame fills the column from the same associations `adsb_hex` reads: a tag where the hex passed and a finite lat/lon is present, null where either is missing, the whole column omitted when association is off. A tag the spec refuses (a latitude past 90) costs that one tag, the same trade the other per-entry rules make, and a detection dropped for a non-finite value takes its tag with it. docs/node-ingest-v1.yml carries the DetectionFrame change and the AdsbTag schema from the server's 1.5.0 contract; the 1.3/1.4 additions elsewhere in that document are not synced here, because regenerating from the whole document renames the generated node-state enum and is its own change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Server side: offworldlabs/retina-server#514 (contract 1.5.0). Merge and deploy that to prod and test before this ships to nodes. |
|
@Babissimo If I'm understanding correctly, the nodes aren't sending all the ADS-B data when there is an association. They're just sending the Hex of the aircraft. |
|
Heads-up: the server side of 1.5.0 has changed under this PR. offworldlabs/retina-server#514 now makes What changed in
The motive: with the tags, every match went out twice, and nothing on the server reads the frame's What this PR needs
The rollout order is unchanged. A server older than 1.5.0 refuses a frame carrying |
|
TODO by me: Remove adsb_hex from detections |
Summary
The node already knows where it saw the aircraft it correlated a detection to (blah2-api's enrichment carries lat/lon, altitude, ground speed, track and residuals), but the v1 wire only had room for the hex. Server contract 1.5.0 adds an optional
adsbcolumn, anAdsbTagor null per detection parallel toadsb_hex, so the server can file the position for the detection itself. This makes claiming and coverage calibration work on any environment that only sees the node through the detection mirror, where a bare hex cannot be placed.Server side: offworldlabs/retina-server branch
feat/v1-adsb-position-tags(PR linked in a comment below).Changes
retina_telemetry/wire/detection.py:build_detection_framefillsadsbfrom the same associationsadsb_hexreads. A tag is built only where the hex passed andlat/lonare finite, so the server's entry-for-entry agreement rule holds by construction. Null where no usable position, the whole column omitted when association is off, and the non-finite detection filter keeps the column aligned.docs/node-ingest-v1.yml: theDetectionFrame.adsbproperty and theAdsbTagschema, copied from the server's 1.5.0 contract;info.version1.5.0.retina_telemetry/wire/models.py: regenerated (+17 lines).retina_telemetry/wire/__init__.py: provenance table row for the new column.Test coverage
tests/wire/test_detection.py::TestPositionTags: position carried with all fields; column omitted when association is off; documented wire shape; association without a position keeps its hex only; a refused position (lat 95, string lon, NaN, bool) costs that tag only; a dropped detection takes its tag with it.tools/check.sh(ruff, dead code, models-match-spec, pytest) passes locally with the pinned tool versions.Review notes
adsb(additionalProperties: false), and the client has no way to learn the server's contract version. Deploy the server change to every environment nodes post to before this reaches nodes.to_wireprunes optional nulls at the top level only, so a tag's unreported fields (for examplegs,track) travel as null inside the tag. The contract admits them and the server drops them on filing.🤖 Generated with Claude Code