A single satellite captures one high-priority image while flying over a
pole (far from any ESTRACK ground station). Shortly afterwards — and
before the satellite has any line-of-sight with any GS — the
satellite is killed by a Destroy hardware event. We then watch whether
the image still reaches the ground via peer satellites. Run on both
engines: EDFS is expected to deliver via inter-satellite links; TUS is
expected to lose the file entirely.
The run ends successfully if the image reaches any ground station despite the producer being destroyed.
The producer satellite is placed on an orbit whose initial position at
t=0 is high-latitude and out of LOS with every ESTRACK station. The
producer's agent writes one file of size S, with priority high, and
exits. Roughly T_destroy seconds after the photo is taken — but always
before the producer's first contact window with any GS — a Destroy
hardware event fires on the producer, irreversibly taking it offline.
For EDFS, success requires that the producer has had enough time (between the photo and the destroy) to replicate at least one block of the file to at least one surviving peer satellite, which then carries it forward until a GS comes into LOS. For TUS, the file existed only on the producer and the run becomes a control: TUS should fail to deliver, demonstrating the loss-mode that EDFS is supposed to mitigate.
The other satellites in the constellation do nothing besides act as
relays; the seven ESTRACK ground stations all have END_ON_ANY=true so
the first RECEIVED terminates the run.
Destroy does not mark the run failed)The producer's agent writes its single file and exits with code 0 within
seconds of activation — long before Destroy fires at T_destroy (≥ 5m).
This ordering is deliberate and load-bearing: the operator decides the
experiment's terminal Success/Failure from the agent containers' exit
codes (evaluateAgentExitCodes), not from delivery. Because the producer's
agent container has already terminated 0 before Destroy, the SIGKILL that
Destroy delivers to the (now-empty) producer pod does not turn the run
into a Failure. The producer agent must therefore always exit 0 right after
producing; do not give it long-running / post-photo behaviour in UC4.
Whether the file actually reached the ground (the real UC4 outcome) is determined by the ground-station agents' end-request on first RECEIVED, and is read from the delivery metrics — independently of the producer's destruction.
Demonstrate that EDFS survives the loss of the file's original
producer for an image with no remaining copies, and quantify the
trade-off. The headline deliverable is a delivery-success surface
success(n_sat, dt) per engine, where the two swept variables are:
n_sat — number of satellites in the layout (sat_count);dt — time between the photo being taken (≈ t=0) and the producer's
total destruction (T_destroy, the Destroy event's startOffset).success is the fraction (over repeats) of runs in which the image reached at
least one GS. EDFS is expected to dominate TUS across the whole grid:
delivered ∈ {true, false})time-to-first-delivery?EDFS.delivered = true && TUS.delivered = false on every
(sat_count, T_destroy) combination.KPI:
sat_count ≥ 8.| Parameter | Values | Notes |
|---|---|---|
engine |
tus, edfs |
TUS run is the negative-control baseline. |
sat_count |
1, 2, 8, 21, 100, 200 | At sat_count = 1 even EDFS must fail — no peers to replicate to. That is itself a useful data point. |
T_destroy (= dt) |
5m, 15m, 45m |
Minutes between "photo taken" (t≈0) and "Destroy fires" — the dt KPI axis. All three precede the producer's first GS contact (~54m, see orbit note), so all are genuine pre-contact destructions. Smaller dt = tighter race for replication. |
S (file size) |
32M |
Single regime; the sweep is priority × dt × sat_count. |
priority (EDFS) |
high, default, low |
Swept (EDFS only). Sets EDFS replication width: high→ceil(0.9·peers), default→ceil(0.1·peers), low→local-only. low should fail like TUS (file never leaves the producer). TUS ignores priority (one TUS run per dt × sat_count). |
RF (EDFS only) |
fixed at 3 | A single RF keeps the priority/dt effects interpretable. |
gs_count |
fixed at 7 (ESTRACK) | |
simulationStartTime |
fixed 2026-05-16T23:59:00.000Z (= synthetic producer's TLE epoch) |
Same for all sat_counts: the producer orbit is designed so its sub-point is over the South pole, out of LOS with every ESTRACK GS, at this epoch. See "Producer over the pole". |
max_duration |
EDFS 4h; TUS T_destroy + 10m |
EDFS needs a long window for a relay peer to fly into LOS with a GS. TUS cannot recover once the producer is destroyed (no inter-sat relay), so its run is stopped 10 minutes after the Destroy event — no point burning the full EDFS budget. Set per engine in run.sh (EDFS_MAX_DURATION, TUS_GRACE_SECONDS). |
TUS parameter coverage. priority (an EDFS-only axis) and RF are
both ignored by TUS. The TUS sweep therefore reduces to (sat_count,
T_destroy); priority and RF are omitted from the TUS run-id entirely.
This is by design — UC4 measures binary "does the file survive the
producer's loss?", and on TUS that answer is "no" for every parameter
combination, so a single run per (sat_count, T_destroy) suffices as the
negative baseline.
HardwareEvent (e.g. NetworkFailure or
NetworkBandwidthReduced) on one of the two stations.Beyond yass_file_delivery_seconds:
delivery_success boolean: count(file_delivered events) ≥ 1 per run.yass_edfs_replica_completeness{cid, fsNode} sampled at the
HardwareDestroyActive k8s event timestamp. If the producer hadn't
managed to replicate any blocks before being destroyed, the run will
fail and this snapshot will explain why.T_destroy:
yass_volume_used_bytes, yass_container_memory_bytes for every node
alive at that instant.sum(yass_network_tx_bytes_total) aggregated over
the whole constellation. For successful EDFS runs this tells us "how
expensive was the rescue" — i.e. how many bytes the constellation had
to shuffle through ISLs to compensate for the producer's loss.

| variant | engine | priority | dt | sat | RF | delivered | firstGS(s) | state |
|---|---|---|---|---|---|---|---|---|
| uc4-edfs-phigh-td15m-n01-rf3 | edfs | high | 15m | 1 | 3 | no | n/a | TimedOut |
| uc4-edfs-phigh-td45m-n01-rf3 | edfs | high | 45m | 1 | 3 | no | n/a | TimedOut |
| uc4-edfs-phigh-td15m-n02-rf3 | edfs | high | 15m | 2 | 3 | yes | 2796 | Success |
| uc4-edfs-phigh-td45m-n02-rf3 | edfs | high | 45m | 2 | 3 | yes | 2807 | Success |
| uc4-edfs-phigh-td5m-n02-rf3 | edfs | high | 5m | 2 | 3 | yes | 2797 | Success |
| uc4-edfs-pdefault-td15m-n08-rf3 | edfs | default | 15m | 8 | 3 | yes | 1296 | Success |
| uc4-edfs-pdefault-td45m-n08-rf3 | edfs | default | 45m | 8 | 3 | yes | 1326 | Success |
| uc4-edfs-phigh-td15m-n08-rf3 | edfs | high | 15m | 8 | 3 | yes | 1331 | Success |
| uc4-edfs-phigh-td45m-n08-rf3 | edfs | high | 45m | 8 | 3 | yes | 1293 | Success |
| uc4-edfs-phigh-td5m-n08-rf3 | edfs | high | 5m | 8 | 3 | yes | 1343 | Success |
| uc4-edfs-plow-td15m-n08-rf3 | edfs | low | 15m | 8 | 3 | no | n/a | Ongoing |
| uc4-edfs-plow-td45m-n08-rf3 | edfs | low | 45m | 8 | 3 | no | n/a | TimedOut |
| uc4-edfs-plow-td5m-n08-rf3 | edfs | low | 5m | 8 | 3 | no | n/a | Ongoing |
| uc4-edfs-pdefault-td15m-n21-rf3 | edfs | default | 15m | 21 | 3 | yes | 1302 | Success |
| uc4-edfs-pdefault-td45m-n21-rf3 | edfs | default | 45m | 21 | 3 | yes | 1306 | Success |
| uc4-edfs-pdefault-td5m-n21-rf3 | edfs | default | 5m | 21 | 3 | yes | 1305 | Success |
| uc4-edfs-phigh-td15m-n21-rf3 | edfs | high | 15m | 21 | 3 | yes | 1296 | Success |
| uc4-edfs-phigh-td45m-n21-rf3 | edfs | high | 45m | 21 | 3 | yes | 1322 | Success |
| uc4-edfs-phigh-td5m-n21-rf3 | edfs | high | 5m | 21 | 3 | yes | 1302 | Success |
| uc4-edfs-plow-td15m-n21-rf3 | edfs | low | 15m | 21 | 3 | no | n/a | TimedOut |
| uc4-edfs-plow-td45m-n21-rf3 | edfs | low | 45m | 21 | 3 | no | n/a | TimedOut |
| uc4-edfs-plow-td5m-n21-rf3 | edfs | low | 5m | 21 | 3 | no | n/a | TimedOut |
| uc4-edfs-phigh-td15m-n100-rf3 | edfs | high | 15m | 100 | 3 | yes | 84 | Success |
| uc4-edfs-phigh-td45m-n100-rf3 | edfs | high | 45m | 100 | 3 | yes | 101 | Success |
| uc4-edfs-phigh-td5m-n100-rf3 | edfs | high | 5m | 100 | 3 | yes | 60 | Success |
| uc4-tus-td15m-n01 | tus | - | 15m | 1 | — | no | n/a | TimedOut |
| uc4-tus-td45m-n01 | tus | - | 45m | 1 | — | no | n/a | TimedOut |
| uc4-tus-td5m-n01 | tus | - | 5m | 1 | — | no | n/a | TimedOut |
| uc4-tus-td15m-n02 | tus | - | 15m | 2 | — | no | n/a | TimedOut |
| uc4-tus-td45m-n02 | tus | - | 45m | 2 | — | no | n/a | TimedOut |
| uc4-tus-td5m-n02 | tus | - | 5m | 2 | — | no | n/a | TimedOut |
| uc4-tus-td15m-n08 | tus | - | 15m | 8 | — | no | n/a | TimedOut |
| uc4-tus-td45m-n08 | tus | - | 45m | 8 | — | no | n/a | TimedOut |
| uc4-tus-td5m-n08 | tus | - | 5m | 8 | — | no | n/a | TimedOut |
| uc4-tus-td15m-n21 | tus | - | 15m | 21 | — | no | n/a | TimedOut |
| uc4-tus-td45m-n21 | tus | - | 45m | 21 | — | no | n/a | TimedOut |
| uc4-tus-td5m-n21 | tus | - | 5m | 21 | — | no | n/a | TimedOut |
| uc4-tus-td15m-n100 | tus | - | 15m | 100 | — | no | n/a | TimedOut |
| uc4-tus-td45m-n100 | tus | - | 45m | 100 | — | no | n/a | TimedOut |
| uc4-tus-td5m-n100 | tus | - | 5m | 100 | — | no | n/a | TimedOut |