STARBOARD

Rules of the road for satellites.

Two spacecraft from different operators, with no radio contact, each work out alone which one should move out of the way, and both always get the same answer, down to the last bit.

Starboard in actionTwo satellites, ACME-1 and ORBX-9, receive the same conjunction warning, each compute Pc 0x3F5117B3E9975E2E and the same verdict with no communication; ACME-1 gives way with a 1.012 m/s burn, passes 1280.0 m clear and returns to its slot. Then a 72-satellite flock relays one maneuver notice hop by hop until all ledgers are identical. Finally a mega-constellation of crossing satellite trains flows in unison while conjunctions resolve across it, each pair reaching its verdict alone, and an 8-craft formation re-plans one member’s dodge so nobody else is endangered. ACME-1 · equatorial, 552 kmORBX-9 · 45° inclpredicted miss 150.0 mPc 1.043e-03 ≥ 1e-4CCSDS CONJUNCTION DATA MESSAGE1280.0 mACME-12026-001AON BOARD · ALONETCA900.000 sMISS150.0 mPc1.043e-03BITSRULESVERDICT0xA4C123B1612DD2720xD1371C17149D43950x36B3216FDAEEB9750x3F5117B3E9975E2ER1R2R3R4R4R5I GIVE WAYRule 4 · starboardORBX-92026-044BON BOARD · ALONETCA900.000 sMISS150.0 mPc1.043e-03BITSRULESVERDICT0xA4C123B1612DD2720xD1371C17149D43950x36B3216FDAEEB9750x3F5117B3E9975E2ER1R2R3R4R4R5I STAND ONRule 4 · starboardBIT-IDENTICALsame Pc · same verdict · same idconj 0x65AA1F77F93217900 bytes exchangedACME-1 GIVES WAYmin-Δv burn 1.012 m/sClohessy-Wiltshire plan, 19% cheaperORBX-9 HOLDS COURSEpredictable by designCLOSEST APPROACH1280.0 m ≥ R_SAFE 1024 mwas 150.0 mBACK TO ITS SLOTreturn burns 1.307 m/s + 0.370 m/soffset 0.000 m · drift 0.000000 m/sP0S00fragment 1993-036BX · miss 140 mP5S01 · 317 km · clearTHE MURMURATION72 satellites · 6 planes × 12 · 550 km · 53°P0S00 GIVES WAYdebris can’t be verified · burn 0.315 m/smaneuver notice · 204 bytes · 4 laser linksHOP0KNOW1/72HOP1KNOW5/72HOP2KNOW13/72HOP3KNOW24/72HOP4KNOW36/72HOP5KNOW48/72HOP6KNOW59/72HOP7KNOW67/72HOP8KNOW71/72HOP9KNOW72/72FLOCK LEDGER, 72 CRAFTALL 71 LEDGERS IDENTICALdigest 1E3AC8C816631BCF on every satellite0 conflicts · nobody else moves284 link messages · duplicates droppedthe flock warns, it never decidesR4starboardcrossing · SB-001R1capabilityderelict stands on · SB-004R3overtakingchaser gives way · SB-002R2tiercrewed stands on · SB-005R5fair coinhead-on · SB-003derelict569 m593 m61 mDC-48 CRAFT · 2 KM APARTone formation, one ledgerDC-4 GIVES WAYannounces its plan to the ringFLOCK ALERT ×3same ledger on all 8: they agree on whoSCREEN EVERY PLANagainst the whole flock and the fragmentRE-ANNOUNCE · SEQ 2the update ripples through the ringALL CLEARclosest pair 1231 m · fragment 1184 mfragment 2009-005CQ · miss 60 mLEADDC-4 ALONEALL 8 IN UNISON2700 s3 · 1.00 m/s1 · 8.02 m/s3600 s3 · 1.12 m/s1 · 8.98 m/s4500 s2 · 1.93 m/s1 · 15.42 m/s5400 s1 · 6.62 m/s3 · 52.94 m/s6300 s0 · 5.33 m/s2 · 42.64 m/s7200 s4 · 1.75 m/s1 · 13.98 m/sTHE MEGA-CONSTELLATIONcrossing shells · every craft runs the same rules on boardVERDICTS, EACH PAIR ALONER4starboardcrossingSB-001R1capabilityderelict stands onSB-004R3overtakingchaser gives waySB-002R2tiercrewed stands onSB-005R5fair coinhead-onSB-003L4flockformation re-plan, DC-4every pair decides alone · 0 bytes exchanged to agreeSTARBOARDthe rules of the orbital roadtwo satellites · no radio contact · one answer, bit for bitrules need bits that agree.github.com/Tokeloshe/starboard-protocolSTARBOARDACT ONE THE CROSSINGACT TWO THE FLOCKACT THREE THE MEGA-CONSTELLATIONT−15:00T−14:30T−07:30T−03:45T+00:00 TCAT+80:41T+272:03T−6hCONTINUOUSMISSION CLOCK
0.0 s

Every number in the film is printed by the reference demos and the conformance suite in the repository; nothing on screen is invented for the animation.

01The problem

There are now roughly 15,000 working satellites in orbit, about two thirds of them in a single constellation, and plans for well over a hundred thousand more. When two satellites from different operators are predicted to pass too close, the operators still mostly sort it out by email and phone: who has the better data, who has fuel, who will move. That works when it is a handful of events a week between people who answer. It does not work when one side is slow, unreachable, out of contact, or a dead object that will never answer at all.

What is missing is not better tracking. It is an agreed answer to a simple question that both sides can compute on their own: who gives way?

02The answer is 150 years old

Ships solved this with the rules of the road (COLREGS). When two power-driven vessels cross, the one that sees the other on its starboard side gives way, and the other holds course. Both captains look at the same situation and reach the same conclusion. Nobody has to call anybody, and the vessel that holds course has a job too: be predictable.

Starboard is that convention for spacecraft, written precisely enough that two computers built by different companies, compiled with different toolchains, reach the same verdict without exchanging a single byte.

03What runs on board

Each satellite receives the standard close-approach warning, a CCSDS Conjunction Data Message (CDM) from a tracking provider, and runs Starboard on it. If the encounter is risky (probability of collision at least 1 in 10,000, or a predicted miss under 1 km), it walks the same chain of five rules. The first rule that decides, decides:

  1. R1Capability. If only one of them can maneuver, that one moves. A dead satellite has right of way.
  2. R2Priority. Crewed beats critical beats operational beats deorbiting. The lower priority moves.
  3. R3Overtaking. If one is catching up from behind, the overtaker moves.
  4. R4Starboard. If exactly one sees the other approaching from its right, that one moves.
  5. R5Fair coin. Otherwise a bit of the encounter's id decides: deterministic for this encounter, 50/50 across many.

The craft that gives way plans the smallest burn that restores a safe miss (a Clohessy-Wiltshire plan), and after the encounter two return burns put it back in its slot. In the crossing at the top of this page the predicted miss is 150 m with Pc 1.043 × 10⁻³; ACME-1 burns 1.012 m/s, passes 1,280 m clear, and is home again after 2.689 m/s in total.

Both craft evaluate the rules on the same ordered pair, sorted by international designator, so agreement is not something that is hoped for. It holds by construction. That is Theorem 1 of the spec, and it is machine-checked with CBMC.

04The hard part is the bits

"Roughly the same answer" is not good enough. Near a threshold, a one-bit difference in a probability can make each satellite conclude the other will move. So the property Starboard actually has to deliver is that two different computers produce identical bits for every quantity that affects the verdict. Ordinary floating-point code does not do that: compilers fuse multiply-adds, x87 keeps excess precision, every libm has its own sin and exp, and strtod implementations differ in the last place.

Starboard pins all of it:

58compiler × optimisation × language builds, bit-identical
11CPU architectures under QEMU, including RAD750-class PowerPC
3bare-metal Cortex-M targets with no operating system

The controls matter as much as the passes: a build with x87 excess precision or FMA contraction produces different bits, and the boot self-test catches it and refuses to fly. A computer that would get the maths wrong does not get a vote.

05A rounding bug in ARM soft-float

Running the transcripts on FPU-less ARM turned up one single-ulp difference in a sine. Tracing it led to the last operation of the cosine kernel, a 1.0 + m with a tiny negative m, where libgcc's software double addition (__aeabi_dadd, GCC 13) returned the wrong neighbour. A 200,000-case fuzz of double addition found 897 mismatches, all of them effective subtractions with an exponent gap of exactly 33, all rounded down. Reading the source suggests why: in the alignment path for large gaps the true round bit is folded into a sticky bit before a one-bit renormalisation needs it.

Caveats, plainly: this was observed under QEMU, the mechanism is read from the source rather than confirmed on silicon, and it has not yet been reported upstream. If you can run it on real ARM hardware, I would very much like to hear the result.

For Starboard the consequence is concrete: two satellites using that routine would agree with each other and silently disagree with everyone else. The self-test now probes rounding at exponent gaps 31 to 34 and refuses such a platform, and the C library ships a correctly rounded replacement, checked against hardware on 49.4 million additions and subtractions. Write-up: CROSS-ARCH.md.

06When something goes wrong

The design question is not only "do they agree" but "what happens when they don't, or when someone lies":

07The flock

Starlings in a murmuration never hold a meeting. Each bird watches its neighbours and a turn ripples through the flock. When a Starboard craft commits to a maneuver it broadcasts a 204-byte maneuver notice over its inter-satellite links; neighbours relay it hop by hop and keep a shared ledger, and each checks the mover's new path against its own. In the demo, a notice crosses a 72-satellite shell in 9 hops and every ledger ends with the same digest.

The interesting case is a tight formation. Near the end of the film, eight craft fly 2 km apart and one must dodge a fragment. Its first plan would drift through three neighbours' slots, so they raise flock alerts, and because all eight hold the same CDM and ledger they screen the same candidate plans and reach the same choice: a later burn by the mover alone, 5.33 m/s, nobody within 1,024 m. Moving the whole formation in unison was evaluated too, and lost on both conflicts and fuel. The flock warns; it never decides.

08What it is not, yet

Starboard is ready for a hardware-in-the-loop campaign and a demonstration mission in shadow mode, where it decides and reports but a human approves every burn. It is not flight-proven. Specifically:

The full, unflattering list is OPEN-PROBLEMS.md.

09Try it in 60 seconds

$ git clone https://github.com/Tokeloshe/starboard-protocol && cd starboard-protocol
$ cmake -B build && cmake --build build && ./build/starboard_crossing_demo
   Pc bits  ACME 0x3F5117B3E9975E2E | ORBX 0x3F5117B3E9975E2E  IDENTICAL [ok]
   ACME-1   verdict: I GIVE WAY   (Rule 4 - starboard)
   ORBX-9   verdict: I STAND ON   (Rule 4 - starboard)
 T+000:00  TCA - closest approach 1280.0 m >= R_SAFE 1024 m  [ok]

$ make -C ports/c && ports/c/murmuration
   hop  9  ##########################################*#############################  72/72 know
   flock ledgers: ALL 71 IDENTICAL (digest 1E3AC8C816631BCF on every satellite)

The C99 flight library is 43 KB of code and 25 KB of RAM, with no heap and no recursion, MISRA C:2012-checked, and fuzzed with about 129 million hostile inputs. It reads CCSDS CDMs, speaks CCSDS telemetry, and integrates with NASA cFS, F′ or bare metal. A header-only C++17 reference implementation produces the same bits.

10What would help

The specification is CC BY 4.0, free to implement forever, because a convention only works if everyone can adopt it. The reference code is AGPL-3.0-or-later, with a commercial license for proprietary flight software.