Detection pipeline — 3 detectors, 1 fused score
Every six hours we re-pull the public TLE catalog (Space-Track + Celestrak) and re-score every active object. Three detectors run independently:
| Detector | What it does | Fires when |
|---|---|---|
| Catalog d² | Squared Mahalanobis distance from object's historical orbit elements. | Element-vector shifts > 3σ. |
| BSTAR-drift | 14-day linear regression of B∗ (drag-coefficient term). | Drift z-score > 2.0 AND positive slope. |
| Manoeuvre fingerprint | Step detection on mean-motion + secular elements. | Pre/post element z-scores all > 2 within a 36 h window. |
The three detector scores are min-max-normalised and weighted into a single fused_score (0–1). Severity is binned: info (< 0.20) / watch (0.20–0.40) / alert (≥ 0.40).
BSTAR-drift early-decay flag
The killer feature. When a satellite's B∗ trend rises sharply, drag is accelerating — almost always because the object is decaying. We flip decay_roster: true on the object.
| Field | Value |
|---|---|
| Headline backtest | ROC-AUC = 0.91 [95 % CI 0.88–0.92], 45-day horizon, n_pos = 522 actually-decayed Space-Track objects |
| Live nightly validation | ROC-AUC = 0.945 [0.92–0.97] @ 7-day horizon (smaller rolling sample, posted at /validation/) |
| Statistical significance | Bootstrap CIs above-chance — confirmed significant on the headline horizon |
| Reproducibility | Re-run yourself with scripts/eval_bstar_drift_backtest.py on the public catalog |
| Dashboard location | "Decay watch" overlay (bottom-left); dossier BSTAR sparkline |
| API field | enrichment.bstar_drift.decay_roster |
| Tier | Analyst+ (Watcher sees the alert but not the BSTAR breakdown) |
Manoeuvre advice chips
Not every detected burn warrants the same response. We classify each into three buckets:
- ● escalate — high confidence (≥ 0.80) AND (watchlisted OR active CDM). Page the operator.
- ● review — high confidence without watchlist, OR medium confidence (0.60–0.80). Add to the morning review queue.
- ● monitor — low confidence (< 0.60) or single-pair detection. Leave for the autopilot to confirm.
| Field | Value |
|---|---|
| Dashboard location | "Recent burns" overlay; per-object dossier "Manoeuvre fingerprint" panel |
| API field | enrichment.manoeuvre.advice_chip and advice_confidence |
| Bulk API | GET /v1/manoeuvres/recent?chip=escalate |
| Tier | Analyst+ |
Watchlist (per-tier cap)
Pin satellites you care about. The watchlist filters the alert stream, the world map, and (Analyst+) the BSTAR / manoeuvre advice feeds.
| Tier | Cap |
|---|---|
| Watcher | 1 NORAD |
| Analyst | 5 NORADs |
| Operator | 25 NORADs |
| Mission Control | 250 NORADs |
Enforced atomically via a DynamoDB conditional write — at 50-thread concurrency, exactly the cap succeeds and excess writes get HTTP 409. No double-add race.
Signed forensic dossiers
Every alert produces an HTML dossier + a canonical JSON side-car. The side-car is signed with HMAC-SHA256; the dossier embeds the signature and links a verification page.
What's signed: the canonical JSON of (object identity, TLE epoch, scoring trace, detector outputs, model version, signing timestamp).
What's verifiable: anyone (including you, a year later) can download the JSON and re-verify the HMAC against our public signing-key fingerprint. If the signature checks out, the dossier was produced by us on the claimed day, from the public TLE catalog.
Webhooks (Operator+)
Subscribe a URL (Slack, Teams, or generic) to alert events. Delivery is async with retry / dead-letter, signed with HMAC-SHA256 (per-webhook secret), and idempotency-keyed so retries don't duplicate.
Filter on min-severity, kind, watchlist-only, orbit class. Detailed retry policy: webhook-retry-policy.md.
CDM (conjunction) badges
Conjunction Data Messages from CSpOC are surfaced as a 24-hour rolling count tile + per-object red-orange-yellow risk badges (based on miss distance + Pc).
Coverage is opportunistic — we publish whatever CSpOC publishes publicly. The "stale" badge fires if our CDM mirror is > 6 h behind.
Pipeline autopilot & health pip
The scoring daemon writes a small ops/watch_status.json heartbeat after every cycle. The dashboard's top-bar health pip is green if the last heartbeat is < 7 h old (so a single missed 6h cycle is tolerable, two is not).
Recent-run streak counts the contiguous green cycles. Public status page coming soon.
Tier-by-tier summary
| Feature | Watcher | Analyst | Operator | Mission Control |
|---|---|---|---|---|
| Catalog lookups / day | 10 | 5,000 | 50,000 | 1,000,000 |
| Watchlist NORADs | 1 | 5 | 25 | 250 |
| BSTAR-drift detail | — | ✓ | ✓ | ✓ |
| Manoeuvre advice chips | — | ✓ | ✓ | ✓ |
/v1/manoeuvres/recent | 403 | ✓ | ✓ | ✓ |
| Historical reports | — | ✓ (30 d) | ✓ (90 d) | ✓ (2 y) |
| API keys | — | ✓ | ✓ | ✓ |
| Webhooks | — | — | ✓ | ✓ |
| User seats | 1 | 1 | 5 | 25 |
| SLA | — | — | — | 99.9 % uptime |
| Price | Free | $299/mo | $1,499/mo | $7,999/mo |
DeepField Labs · DebrisGuard guide