ExoSAGE is a point-in-time, risk-controlled research system for exoplanet transit screening and rocky/temperate follow-up allocation.
It treats discovery like a quantitative research problem: remove shared systematics, search residual signals, control a large hypothesis universe, calibrate uncertainty through time, and allocate limited telescope hours under correlated risk.
The project does not claim to detect life or output a ground-truth probability of habitability.
- Immutable NASA Exoplanet Archive TOI snapshots with query, retrieval time, schema, SHA-256 checksums, and overwrite protection
- A tracked 160-row NASA fallback slice for reproducible UI and CI execution
- A real 12,000-point TESS/MAST light curve for Pi Mensae c
- Robust low-rank factor residualization for target-by-time flux panels
- Box Least Squares search with robust cadence-noise estimation
- Benjamini-Hochberg false-discovery control and calibration diagnostics
- Monte Carlo rocky-composition and habitable-zone characterization
- Point-in-time walk-forward backtesting with future outcomes used only for evaluation
- Mixed-integer telescope allocation with budget, target-count, idiosyncratic risk, and shared factor-exposure risk
- A FastAPI research service and responsive vanilla JavaScript/D3 workstation
- CI tests, remote-only training guardrails, and a Linux container
The current candidate ranking is a transparent physics-and-observability screen, not a trained classifier. The workstation says this explicitly.
flowchart LR
A[NASA TOI snapshots] --> B[Point-in-time universe]
C[TESS and Kepler light curves] --> D[Common-factor residualizer]
D --> E[BLS signal search]
E --> F[Vetting and FDR control]
B --> G[Physical uncertainty model]
F --> H[Calibrated discovery score]
G --> I[Candidate evidence]
H --> J[Walk-forward evaluation]
I --> K[Covariance-aware allocator]
H --> K
K --> L[Telescope follow-up portfolio]
The system separates three questions:
- Does the photometric signal look planetary rather than instrumental or astrophysical contamination?
- Given measurement uncertainty, how plausible are a rocky composition and a conservative or optimistic habitable-zone orbit?
- Which candidate set maximizes expected scientific value under limited telescope time and correlated failure risk?
| Quant concept | ExoSAGE implementation |
|---|---|
| Point-in-time universe | Dated, checksummed NASA snapshots |
| Factor neutralization | Robust low-rank common-mode removal |
| Alpha signal | Residual transit-search statistic and vetting evidence |
| Multiple testing | Benjamini-Hochberg q-values |
| Calibration | Brier score, ECE, and MCE |
| Walk-forward research | Grouped temporal cutoffs with an embargo-ready config |
| Risk model | Candidate uncertainty plus shared sector/stellar/magnitude/radius exposures |
| Portfolio construction | Binary mixed-integer allocation under telescope-hour constraints |
The API analyzes the tracked real TESS light curve and recovers Pi Mensae c at
approximately 6.2660 days, close to its known 6.2679-day period. This is a
signal-processing validation case, not a trained-model benchmark.
The Python/API suite contains 18 tests and currently maintains more than 80% statement coverage. The browser code is dependency-free apart from pinned D3 v7.9.0 loaded from a CDN, and CI performs a JavaScript syntax check.
Requirements: Python 3.12 and uv. Node is only needed for the optional browser-code syntax check.
make setup
make apiIn a second terminal:
make webOpen:
- Workstation:
http://localhost:5173 - API:
http://localhost:8000 - OpenAPI docs:
http://localhost:8000/docs
The committed demo assets are enough to run the complete vertical slice. To create a new full NASA snapshot:
make dataA snapshot for the current UTC date is immutable. The command refuses to overwrite it.
| Method | Route | Purpose |
|---|---|---|
GET |
/health |
Data provenance and model-state disclosure |
GET |
/api/candidates |
Ranked point-in-time candidate universe |
GET |
/api/candidates/{id} |
Physical posterior and evidence decomposition |
GET |
/api/signal/demo |
Real TESS signal views and BLS result |
POST |
/api/portfolio |
Risk-aware follow-up allocation |
src/exosage/
data/ immutable ingestion, manifests, repository
signals/ factor residualization and transit search
risk/ FDR and calibration
science/ physical uncertainty characterization
backtest/ point-in-time walk-forward evaluation
allocation/ covariance-aware telescope portfolio
api/ FastAPI research service
training/ remote-compute policy guard
web/ vanilla JavaScript and hand-written D3 workstation
scripts/ reproducible static-data build and remote training entrypoint
configs/ versioned experiment definitions
data/demo/ tracked public runtime assets
tests/ numerical, policy, and end-to-end API tests
The workstation can also run without the API. make web-data rebuilds the
tracked browser payload from the public demo assets, and make web serves it
with Python's standard-library HTTP server. See web/README.md for the visual
encoding, interaction, and accessibility decisions.
Training is disabled on macOS. Local execution is limited to data contracts,
small public demo assets, unit tests, signal-processing validation, and model
forward passes. Full preprocessing and training must run in a versioned Linux
container with EXOSAGE_REMOTE_TRAINING=1.
make remote-trainThe remote entrypoint remains intentionally locked until a labeled, point-in-time dataset and leakage audit are approved.
Public metrics must come from grouped, point-in-time, walk-forward experiments. Random row splits, future dispositions in features, proxy labels presented as ground truth, synthetic calibration metrics, and unversioned datasets are not accepted.
Rocky and habitable-zone posteriors are physical screening quantities. They are not evidence for an atmosphere, surface water, biological activity, or life.