Handover
A new satellite, a new delay, a new bottleneck. Last epoch's samples are lies.
Open source v0.4.3 The Primer Starlink-class paths
Classic congestion control assumes a stable path and a stable RTT. Low Earth orbit has neither. VELA makes path epochs, mobility loss, and statistical contracts first-class, so the next controller can keep more of the bandwidth you already pay for.
The break
Starlink-class links hand over every 12 to 60 seconds. RTT jumps tens of milliseconds. Capacity flickers. Packets vanish because a beam moved, not because a buffer filled. CUBIC treats that as congestion and collapses. BBR keeps a stale min-RTT across the hop and sizes the window for a path that no longer exists.
A new satellite, a new delay, a new bottleneck. Last epoch's samples are lies.
A burst with no queue is not a full buffer. Recovery should hold, not cut.
One orbit can flatter a controller. A win that cannot survive five is not a win.
The language
VELA is not prettier Python. It is a type system and a compose kernel for LEO controllers. Reading a min-RTT after a reconfiguration is a type error. Loss is a closed taxonomy. Dual-gate claims are contracts the eval harness actually runs. The public flagship compose is Reach, observe-only. It names LeoAware. It does not write a cruise integrator.
lang vela 0.1
controller Reach {
posture observe
compose Detect + SoftReprobe + Calendar + IntervalBw
+ WriteBudget + DualGateGuard
signals:
epoch: Epoch
rtt: Sample<ms> @ epoch
bw: Interval<bps> @ epoch
delay_ratio: Ratio
p_ho: Prob
on Reconfig(e) match e {
RttHop => {
invalidate min_rtt, bw
enter Reprobe(cut: 0.58, explore: 1.15 * rtt, fill: 1.85 * rtt)
}
Flicker => {
invalidate min_rtt, bw
enter Reprobe(cut: 0.58, explore: 1.15 * rtt, fill: 1.85 * rtt)
}
}
on Loss(k) match k {
Mobility => hold
Congestive => cut(0.72)
Unknown => require delay_ratio > 1.35
then cut(0.72) else hold
}
}
contract DualGate vs BBRv3approx {
seeds = [13, 7, 42, 99, 123]
scenario leo_fast_ho duration 90s
assert mean(goodput) >= baseline.goodput
assert mean(p95) <= baseline.p95
assert terrestrial.goodput >= 77 Mbps
}
The Primer
Five beats. Same flagship compose. This tab is a reading primer, not an eval.
Last beat stays in this browser. A shared ?beat= link wins.
Numbers that would look like a win stay on
OrbitStack progress
and in results/eval_*.json. The 0.58 cut is load-bearing. Do not soften it here.
rtt: Sample<ms> @ epoch is not a float. After a hop, last epoch's min-RTT is a type error. That is the whole point of VELA.
signals:
epoch: Epoch
rtt: Sample<ms> @ epoch
bw: Interval<bps> @ epoch
What users should feel
VELA does not add satellites. It stops wasting the ones you already have. The design target is user-visible: higher sustained speed, calmer interactive delay, fewer stalls when the sky rearranges.
Honesty
VELA is MIT open source at github.com/Pitchfork-and-Torch/vela (v0.4.3). It does not flash your dish. It does not promise plus-N megabits on a particular terminal tonight. The running, measured congestion controller on this network is OrbitStack / LeoAware. VELA exists so that controller can be composed, checked, and extended for space internet without unnamed flags or lying numbers.
Optional path hints (ASCENT-D) stay fail-closed. If the hint is missing or corrupt, the endpoint controller is still defined. That is the only story that matches Starlink today.