← Blog · 2026-09-07 · Case study · ESA Anomaly Detection Benchmark

Label-free, explainable anomaly detection on ESA's own spacecraft data.

We ran Steriod against the ESA Anomaly Detection Benchmark: two real spacecraft, 1.39 billion telemetry samples, about 500 expert-labelled events. We used only mined, human-readable rules and statistical models: no training, no labels in any loop, re-mining walk-forward year by year, and every score produced by ESA's own published evaluation code.

0.788 vs 0.786
Event-wise F0.5, Mission 1 lightweight subset, vs the best published method
5.2×
The best published F0.5 on the full 58-channel Mission 1 set (0.316 vs 0.061)
0.973
Alarming precision on the Mission 1 full set: one alarm per event
3.9×
The best published F0.5 on the sealed Mission 2 full set, one scoring attempt (0.307 vs 0.079)

Self-reported on ESA's public labels and scored with ESA's own evaluation code. Our walk-forward protocol differs from the paper's train/test split; supervised methods in other setups score higher. Dataset: ESA Anomaly Dataset, ESA/ESOC, Airbus DS, KP Labs, CC-BY 4.0, DOI 10.5281/zenodo.12528695.

Why this benchmark

ESA asked operators what a detector must do. Then it published the data.

The benchmark paper lists operator requirements next to the dataset. The top complaint from spacecraft operations engineers was too many false positives, because false alarms decrease adoption and trust. Among the requirements: binary verdicts, a list of affected channels, no repeated alarms for one event, rare nominal events (often commanded) told apart from anomalies, online operation, and a single high-end PC. Steriod is built around exactly that list.

The data

Two missions, 14 years of Mission 1 telemetry (611 million samples) and Mission 2, 1.39 billion samples in total, with telecommands and about 500 labelled anomalies and rare events.

The rules of the game

Labels only as the exam, never as input. No detector reads the future. Every attempt counted, every scoring run pre-registered, nine failures documented.

The hardware

One laptop. No GPU. No language-model tokens in detection: every threshold is a mined, readable number with its derivation.

Mission 1 results

ESA's Table 2, with our column added.

Event-wise (EW) scores over all labelled events, against the strongest published methods. The full tables, with every method and metric, are in our engineering blog series.

Lightweight subset (channels 41–46)

MetricTelemanom-ESADC-VAE (5)Telemanom-ESA-Pruned (best published)Steriod
EW precision.148.063.999.892
EW recall.894.338.424.539
EW F0.5.178.075.786.788
Alarming precision.868.028.8751.000

Full set (58 channels)

MetricTelemanom-ESADC-VAE (5)Telemanom-ESA-Pruned (best published)Steriod
EW precision.007.005.050.275
EW recall.946.804.870.791
EW F0.5.008.007.061.316
Alarming precision.074.017.206.973
Subsystem F0.5.689.623.436.680
What made the difference

Three design choices an operator will recognise.

1 · ONE ALARM PER EVENT

Fragments are merged into episodes.

A real disturbance fragments into many short alarms, and every fragment is billed as a false interval or a redundant alarm. Merging silent gaps under 24 hours (a horizon taken from the alarm stream's own gap histogram, with no label consulted) turned 3,911 spans into 123 episodes. Recall is preserved; alarming precision went from 0.32 to 0.97.

Before: fragmented alarms around one labelled event and noise elsewhere. After: one episode per disturbance; 3,911 spans to 123 episodes, F0.5 0.039 to 0.316
2 · ANNOTATE, DON'T SUPPRESS

A command can explain an alarm. Only a person can silence it.

Commanded operations look like anomalies, so we mine command-to-effect links from the archive. In an early frozen run, a link mined years before explained away a real anomaly (id_116): the command had stopped appearing, but the link still acted as a permanent alibi.

Since then, a mined link only annotates the alarm with its proposed explanation. Suppression requires a human-accepted link. Dangerous suppressions are zero by construction, not by luck.

Three detectors: an envelope rule with a 600 s dwell, command context that annotates an alarm, and a joint detector that fires when the combination of in-band channels is impossible
Episode in the product: notable severity, mined but unreviewed command links account for it, not suppressed until a person accepts the link
The same policy in the product: "mined but unreviewed command links account for it; not suppressed until a person accepts the link."
3 · REGIME CHANGE NEEDS A SIGNATURE

Spacecraft change. A detector that quietly accepts change will quietly accept a slow failure.

On Mission 2, one subsystem moved to a new operating regime. Our mining refuses to learn an unacknowledged shift, so those channels keep alarming until a person accepts the new baseline. That is the behaviour you want: a detector that adapts silently would absorb a slow real anomaly the same way. In a labelled simulation, three operator "accept new baseline" decisions lifted the full-set F0.5 from 0.307 to 0.579.

Mission 2 subsystem 1: channels failing continuously after a regime change, and three acceptance moments where an operator would accept a new baseline
Since then

From batch experiment to the live product.

Streaming equals batch

The same detector chain now runs as a live pipeline and reproduces the batch results (one fold differed at first and was fixed). The episodes timeline on our monitoring page is that pipeline.

Commands as input

A command-to-response map found two rare events nothing else reached, with only 14 alarm intervals in seven years. Statistical lanes stay advisory unless they earn alarm status, which keeps precision high.

A pre-registered prediction

A Fourier noise-band detector with a three-window consensus: we predicted a mean per-fold F0.5 of 0.8469 over the seven walk-forward years and measured 0.8470. That is a mean of per-year scores, not comparable to the pooled scores above.

Steriod events timeline on ESA Mission 1: rules and models per row, nine episodes, Download report and Export for scoring
"Export for scoring": verdicts leave the product in ESA's format, so ESA's code computes the score, not ours.
Why you can trust the numbers

The discipline matters as much as the score.

  • Labels only as the exam; no detector input from the future
  • ESA's evaluation code vendored and pinned as the external referee
  • Pre-registration with amendments and attempt counting
  • Every failure (nine) documented and encoded into the test harness
  • Bit-for-bit reproducible after a full wipe
  • Every threshold a readable number with its derivation and sample count
Your archive next

What would this find in your telemetry?

Six-week Qualified Monitoring pilot: blind replay over one year of your archive, scored against your own anomaly list afterwards, never trained on it.

ping@steriod.ai