Skip to content

docs: node/server interface and phase 1 ADRs - #16

Closed
Babissimo wants to merge 3 commits into
mainfrom
docs/node-server-interface-adr
Closed

Babissimo wants to merge 3 commits into
mainfrom
docs/node-server-interface-adr

Conversation

@Babissimo

Copy link
Copy Markdown
Contributor

Adds the node ↔ server interface design decision record (dated 2026-07-21, revised 2026-07-23) to docs/decisions/.

The ADR covers how RETINA radar nodes communicate with the central server, phased:

  • Phase 1: live detections from up to ~50 nodes over HTTPS, with commands piggybacked on responses; the MQTT broker and bulk/archive plane are deferred with their designs retained and explicit return tripwires.
  • Three traffic planes (live, bulk/archive, control/identity) with independent failure modes.
  • Decisions D1–D15, measured parameters from the 2026-07-23 fleet probe, an ADS-B feeder-network prior-art survey, migration sketch, and open questions.

Status: Proposed (design agreed in discussion; implementation not started).

🤖 Generated with Claude Code

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Babissimo

Copy link
Copy Markdown
Contributor Author

Josh:
Okay having read the .md file I have only two real notes I wanna add: The blah2 raw IQ buffer durarion is not 1.5s but 1.5*cpi so thats 0.75s. Also saveIq writes at 16MB/s

Review against the blah2 source showed two figures wrong: the in-RAM IQ
buffer is 0.75 s, not 1.5 s (config's buffer: 1.5 is in units of CPIs,
sized cpi*buffer*fs at blah2.cpp:103), and saveIq writes 16 MB/s, not
8 MB/s (RspDuo.cpp:630 writes 4 int16 per sample instant: 2 channels
of I+Q).

The second has a knock-on the review surfaced: the 120 s ring buffer
estimate used the same wrong 2 B/sample assumption, so the real size is
~1.9 GB, not ~960 MB. That exceeds a 2 GB node's total RAM and, next to
blah2's 760 MB RSS, the 4 GB minority too, so raw IQ capture is now off
the table on all current hardware rather than merely tight; this
hardens the map-over-IQ working assumption (map advantage ~12x, not
~6x). No decision flips.

Also adds a section 6 item recording that downlink commands are
protected only by TLS terminating at Cloudflare's edge, with
server-signed commands as the upgrade if that seems thin once real
commands ship; later items renumbered.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
can be many nodes, so edge rules are tuned only for gross volumetric abuse. Ingest also
applies cheap plausibility gates (impossible delay, Doppler or position values, §10)
before frames reach the tracker.
- Payloads carry the existing `retina-custody` per-packet ECDSA signatures unchanged.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does the server explicitly reject packets with unsigned/invalid signatures? How should this be handled?


Phase 1:

1. **Control-plane and ingest authentication.** Requests signed with the custody key, or a

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the advantage of also using bearer tokens, alongside keys? Are there any tradeoffs?

The interim stopgap in §2.4 routed config visibility through a custom
Mender inventory script with the poll interval shortened from its 8 h
default. Building it buys a few weeks of visibility in exchange for a
second place config lives, an inventory script deployed to the whole
fleet, and a retirement step nobody prioritises once it works. Reporting
straight to the server over the control plane is less total work and
leaves config in one place. A6, D1 and A8 referred to that script, so
they move with it.

Also splits pairing from claiming, which the earlier text conflated as
"account linking". Pairing gives a node an identity and must work before
any other credential exists; claiming records whose node it is and needs
a human, so only the latter belongs to the account model.

That account model is decided in the phase 1 ADR (D25) rather than
duplicated here. D-numbers are unique across the decisions folder, so a
second statement of the same decision would have had to take a number the
phase 1 ADR had already used, and the flow was in any case written out
twice in near-identical words. This document now carries only what the
control plane has to transport and points at the decision.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Babissimo
Babissimo force-pushed the docs/node-server-interface-adr branch from 162ecb8 to 206461b Compare August 3, 2026 18:09
@Babissimo Babissimo changed the title docs: add node-server interface design ADR docs: node/server interface and phase 1 ADRs Aug 3, 2026
@Babissimo
Babissimo force-pushed the docs/node-server-interface-adr branch from 206461b to 60b14ff Compare August 4, 2026 12:15
@Babissimo

Copy link
Copy Markdown
Contributor Author

Closing unmerged. The interface ADR is kept locally rather than published here for now; the branch is being deleted to stop it drifting further behind main, which has moved on considerably since it was opened.

@Babissimo Babissimo closed this Aug 17, 2026
@Babissimo
Babissimo deleted the docs/node-server-interface-adr branch August 17, 2026 10:16
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.

2 participants