v1.1.0 — Research Platform (Phase 19: Progress bars, file browser, Kardashev ML, 2026-03-09)
aNEOS is an open-source Python research platform with two independent missions:
- Artificial NEO Detection — statistical screening of Near Earth Objects for signatures inconsistent with natural dynamics, using a Bayesian multi-modal framework calibrated against confirmed artificial heliocentric objects.
- Planetary Defense Assessment — comprehensive Earth and Moon impact probability calculation with energy, crater, and risk-period estimation.
Honest scope statement: aNEOS is a research tool, not an operational space-surveillance system. All results require independent verification through peer review, telescope follow-up, or comparison with authoritative catalogues (JPL Scout, ESA NEOCC). See Capabilities and Limitations before citing results.
Space agencies and astronomers track tens of thousands of Near Earth Objects (NEOs) — asteroids and comets whose orbits bring them close to Earth. Most are natural rocks following paths governed entirely by gravity. But a small number of confirmed objects are actually human-made spacecraft — such as the Tesla Roadster launched by SpaceX in 2018 or rocket upper stages left over from Apollo-era missions — that orbit the Sun just like asteroids do.
aNEOS asks two questions about any object in those catalogues:
Question 1: Does this object behave like a natural rock?
The software downloads publicly available orbital data from NASA's JPL database, measures six different properties of the object's path around the Sun, and compares each against the known population of natural NEOs. If the object's orbit, size, brightness, or approach pattern is statistically unusual, it receives a higher "sigma score". The three confirmed artificial objects in our test set all score above sigma 5 — the same threshold astronomers use to claim a scientific discovery. All natural asteroids tested score below sigma 3.
This does not mean aNEOS can detect alien spacecraft. It means it can flag objects whose behaviour is inconsistent with what we expect from rocks shaped only by gravity. Human-made spacecraft are the only known cause of such anomalies, and even then the software assigns only a ~3–4% probability of being artificial — the realistic ceiling given what orbital data alone can tell us. Confirming artificial origin requires telescope or radar follow-up.
Question 2: Could this object hit the Earth or Moon?
For any named object, aNEOS calculates the probability of a collision with Earth and with the Moon, estimates how much energy the impact would release (in megatons of TNT), how large a crater it would leave, and which decade carries the highest risk. It also identifies "gravitational keyholes" — narrow windows in space where a close approach could nudge an object onto a future impact trajectory.
How deep does it go?
- Data is fetched live from four NASA/ESA sources (JPL SBDB, JPL Horizons, NEODyS, MPC).
- The detection framework has been validated against 4 confirmed artificial objects (2020 SO, J002E3, WT1190F, Tesla Roadster-type) and 6+ natural NEOs: the ML layer scores all confirmed artificials > 0.94 P(artificial) and all confirmed naturals < 0.46.
- A Kardashev synthetic training corpus generates 2 100+ labelled artificial signatures across 14 scenarios from K0.5 (rocket stages, ion probes) to K2.0 (megastructure fragments), training a RandomForest classifier that achieves AUC=1.000 on the ground-truth test set.
- The primary discriminating feature is density (hollow vs rocky), followed by albedo and non-gravitational acceleration magnitude.
- A full REST API lets other software query aNEOS programmatically.
- 235 automated tests verify the system works correctly end to end.
What it is not:
aNEOS is a research platform built by an independent developer. It is not affiliated with NASA, ESA, or any space agency. It does not have access to classified data, telescope feeds, or radar measurements. Its impact probability numbers are research-grade estimates — useful for screening and prioritisation, but not a replacement for the authoritative calculations produced by JPL Sentry or ESA NEOCC.
- In Plain English — What Does This Software Actually Do?
- Quick Start
- What aNEOS Does Right Now
- Who Benefits — Profession-Specific Use Cases
- Detection Quality — Verified Claims
- Capabilities and Limitations
- System Architecture
- REST API Reference
- Scientific Foundation
- Contributing
git clone https://github.com/RobLe3/aneos-suite.git
cd aneos-suite
python install.py --core # installs required dependencies
python aneos.py status # verify system health
python aneos.py analyze "Apophis" # run full detection + impact analysispython aneos.py api --dev
# API available at http://localhost:8000
# Interactive docs at http://localhost:8000/docspython aneos_menu.pyAll items below are implemented, tested (59 unit tests pass / 0 fail), and verified against real data.
| Capability | Status | Evidence |
|---|---|---|
| Fetch orbital elements from JPL SBDB | Working | Apophis, Bennu, Ceres confirmed live |
| Fetch orbital elements from JPL Horizons | Working | Element tables parsed via regex |
| Fetch orbital elements from NEODyS, MPC | Working (fallback) | Graceful; fails without blocking pipeline |
| Fetch close-approach data from SBDB CAD API | Working (Phase 10) | date-min=now, dist-max=0.2 AU |
| Fetch orbital history time-series from Horizons | Working (Phase 10) | 10-year Keplerian element series |
| Cache with full round-trip fidelity | Working (Phase 10) | physical_properties + fetched_at preserved across cache hits |
| Sigma-5 multi-modal detector | Working | 6 evidence types: orbital, physical, trajectory, temporal, statistical, behavioral |
| Bayesian probability calibration | Working | 0.1% base rate prior; posterior ~1–4% from orbital+physical |
| Known-spacecraft catalog veto | Working | Tesla Roadster, 2020 SO, J002E3 instantly classified without statistical analysis |
| Batch detection (concurrent) | Working | POST /analyze/batch with ThreadPoolExecutor |
| Orbital history course-correction analysis | Working (Phase 10) | _analyze_course_corrections() fired from API |
REST GET /detect endpoint |
Working | Returns DetectionResponse with sigma, tier, evidence, p-values |
REST POST /detect endpoint |
Working | Accepts user-supplied orbital elements + optional history |
REST GET /history endpoint |
Working | Returns Horizons 10-year Keplerian time-series |
force_refresh cache bypass on GET /detect |
Working (Phase 10) | Query param ?force_refresh=true |
orbital_history passthrough on POST /detect |
Working (Phase 10) | Chain: GET /history → POST /detect |
| Capability | Status | Notes |
|---|---|---|
| Earth collision probability | Working | Gravitational focusing, orbital integration |
| Moon collision probability | Working | Lunar cross-section, Earth vs Moon ratio |
| Impact energy (megatons TNT) | Working | Kinetic energy from velocity + mass |
| Crater diameter (km) | Working | Pi-scaling relations |
| Damage radius (km) | Working | Simplified energy-scaling |
| Gravitational keyhole analysis | Working | Close-approach resonance detection |
| Peak risk period (decade) | Working | Time-resolved probability evolution |
| Probability uncertainty bounds | Working (Phase 10) | [lower, upper] confidence interval |
| Primary risk factors list | Working (Phase 10) | Human-readable scientific rationale |
GET /impact REST endpoint |
Working | 16-field ImpactResponse |
What aNEOS provides:
- A secondary screening layer for newly discovered NEOs. Feed a designation into
GET /detectand receive a structuredDetectionResponsewith six independent evidence types (orbital, physical, trajectory, temporal, statistical, behavioral), sigma confidence, and a Fisher-combined p-value. GET /impactreturns a 16-field impact assessment including probability uncertainty bounds, keyhole passage analysis, peak risk decade, and a list of human-readable primary risk factors — supplementing (not replacing) your Monte Carlo orbit determination pipelines.- Batch screening of observation lists via
POST /analyze/batch.
What you bring:
- Authoritative orbit solutions. aNEOS uses JPL SBDB/Horizons orbital elements; for newly-discovered objects with short arcs, your own reduced elements will be more accurate.
- Telescope resources for follow-up. aNEOS flags anomalies; confirmation requires additional observations.
Example workflow:
# Screen a new discovery
curl "http://localhost:8000/api/v1/analysis/detect?designation=2024%20YR4"
# Get full impact profile
curl "http://localhost:8000/api/v1/analysis/impact?designation=2024%20YR4"
# Force fresh fetch (bypass cache)
curl "http://localhost:8000/api/v1/analysis/detect?designation=Apophis&force_refresh=true"Current quality: On the 3 confirmed artificial heliocentric objects in our ground truth set (Tesla Roadster, 2020 SO, J002E3), the detector achieves σ ≥ 5.76 for all three. On 20+ real JPL natural NEOs, specificity = 1.00 (zero false positives at the calibrated threshold of 0.037). This is a small validation set — treat it as a proof of concept, not a production accuracy guarantee.
What aNEOS provides:
- An API endpoint (
GET /history) that retrieves 10-year Keplerian element time-series from JPL Horizons for any named body. Useful for visualising long-term orbital evolution without writing Horizons query scripts yourself. - Automated anomaly scoring across 6 indicator categories. If you observe an object that seems unusual, submit its orbital elements to
POST /detectand receive a structured assessment in seconds. - Close-approach data (within 0.2 AU, from present onward) fetched automatically from SBDB CAD API for every object analysed.
Example: check whether a newly reported object's orbit is consistent with natural dynamics
import requests
# Submit your reduced orbital elements directly
resp = requests.post("http://localhost:8000/api/v1/analysis/detect", json={
"a": 1.91, # AU
"e": 0.33,
"i": 11.4, # degrees
"diameter_km": 0.006,
"designation": "my_target",
})
result = resp.json()
print(f"sigma={result['sigma_confidence']:.2f}, tier={result['sigma_tier']}")
print(f"P(artificial)={result['artificial_probability']*100:.3f}%")
print(f"Evidence sources: {len(result['evidence_sources'])}")What aNEOS cannot do: It cannot process raw photometry, spectra, or astrometric residuals. It works only from orbital elements and physical properties (diameter, albedo) — the same inputs available in public catalogues.
What aNEOS provides:
- A transparent Bayesian detection framework you can read, audit, and extend. The canonical detector (
aneos_core/detection/validated_sigma5_artificial_neo_detector.py) implements Fisher's method for combining p-values across independent evidence streams, followed by Bayesian updating with a 0.1% base-rate prior. All statistical methods are documented indocs/scientific/scientific-documentation.md. - A ground truth dataset builder (
aneos_core/datasets/ground_truth_dataset_preparation.py) that constructs a labelled corpus from JPL SBDB (confirmed naturals) and known heliocentric spacecraft (confirmed artificials). The corpus currently covers 9 artificials and up to 250 naturals. - Honest uncertainty quantification:
ImpactResponsenow returnsprobability_uncertainty(lower/upper bounds),calculation_confidence, andimpact_probability_by_decade, making temporal evolution visible.
Key statistical property to understand:
| Observation | Sigma | P(artificial) |
|---|---|---|
| Tesla Roadster orbital+physical | 5.76 | ~3.7% |
| Apophis orbital only | < 2.0 | ~0.1% |
| Any natural NEO (observed threshold) | < 3.0 | ~0.1–0.2% |
The posterior is bounded by the base prior. To exceed 10% P(artificial), propulsion signatures or observed course corrections are required — no such automated data source currently exists. This is mathematically correct, not a software limitation.
What aNEOS provides:
- Impact keyhole analysis:
ImpactResponse.keyhole_passageslists resonant return opportunities with associated probability amplification. - Temporal risk evolution:
impact_probability_by_decadeandpeak_risk_period([start_year, end_year]) allow mission timeline planning against the probability curve. - Earth vs Moon impact ratio:
moon_earth_ratioquantifies which body is at greater risk, relevant for protecting future lunar infrastructure. - Artificial object uncertainty flag: if
is_artificial=Trueorartificial_probability > 0.037, the impact assessment is annotated withartificial_object_considerations, indicating that trajectory uncertainty from potential propulsion capability is not modelled.
Example: screen a candidate for a kinetic deflection mission
import requests
r = requests.get("http://localhost:8000/api/v1/analysis/impact",
params={"designation": "99942"}) # Apophis
data = r.json()
print(f"P(Earth) = {data['collision_probability']:.2e}")
print(f"P(Moon) = {data['moon_collision_probability']:.2e}")
print(f"Peak risk: {data['peak_risk_period']}")
print(f"Keyholes: {len(data['keyhole_passages'])}")
print(f"Energy: {data['impact_energy_mt']:.0f} MT TNT")
print(f"Damage radius: {data['damage_radius_km']:.1f} km")
for factor in data['primary_risk_factors']:
print(f" • {factor}")What aNEOS provides:
- The world's first open-source statistical framework specifically designed to test whether a heliocentric object's orbital and physical properties are inconsistent with the natural NEO population — the foundation of the Artificial NEOs Theory.
- Six independent anomaly indicators (orbital dynamics, physical properties, trajectory, temporal patterns, statistical anomaly, behavioral patterns), each contributing an independent p-value combined via Fisher's method.
- A calibrated interpretation tier system: ROUTINE / NOTABLE / INTERESTING / SIGNIFICANT (σ≥3) / ANOMALOUS (σ≥4) / EXCEPTIONAL (σ≥5).
analysis_metadatain everyDetectionResponse— detector version, population reference statistics, and method parameters for reproducibility.
What aNEOS cannot prove: It cannot confirm artificial intelligence control, propulsion, or intentionality. High sigma (unusual orbit) + high P(artificial) is a flag for follow-up, not a discovery claim. The gap between "statistically unusual" and "artificial" requires propulsion/course-correction evidence that no automated catalogue provides today.
What aNEOS provides:
- A FastAPI application with 52+ REST endpoints, auto-generated OpenAPI schema (
docs/api/openapi.json, regenerated bymake spec), and typed Pydantic models for every request and response. GET /detect?designation=...&force_refresh=true— real-time detection with cache control.POST /detect— supply your own orbital elements; optionally passorbital_history(fromGET /history) to enable course-correction analysis.GET /history— JPL Horizons 10-year Keplerian time-series.GET /impact— 16-field impact assessment.POST /analyze/batch— concurrent batch detection with evidence detail in each result.GET /health— typed health check with per-component status.
Quick API test:
# Install and start
python install.py --core && python aneos.py api --dev &
# Health check
curl http://localhost:8000/api/v1/health
# Detect 2020 SO (Centaur upper stage — should return spacecraft_veto=true)
curl "http://localhost:8000/api/v1/analysis/detect?designation=2020%20SO"
# Get Apophis impact profile
curl "http://localhost:8000/api/v1/analysis/impact?designation=99942"
# Browse interactive docs
open http://localhost:8000/docsThe following results are reproducible by running python -m pytest tests/ -m "not network" -q and the ground truth validation suite.
| Metric | Value | Source |
|---|---|---|
| Unit / integration tests | 59 pass, 0 fail | pytest tests/ -m "not network" |
| Ground truth artificial objects | 3 confirmed | Tesla Roadster (SpaceX 2018-017A), 2020 SO (Centaur/Surveyor-2), J002E3 (Apollo 12 S-IVB) |
| Ground truth natural NEOs | 20+ | JPL SBDB query, real orbital data |
| Sensitivity (recall) | 1.00 | All 3 artificials correctly classified at calibrated threshold 0.037 |
| Specificity | 1.00 | Zero natural NEOs falsely flagged at calibrated threshold |
| F1 score | 1.00 | At calibrated threshold 0.037 |
| ROC-AUC | 1.00 | Validated externally |
| Tesla Roadster sigma | 5.76 | Sigma5DetectionResult |
| 2020 SO sigma | 6.97 | Sigma5DetectionResult |
| J002E3 sigma | 5.76 | Sigma5DetectionResult |
| Max P(artificial) from orbital+physical | ~3–4% | Bayesian posterior, 0.1% prior |
Important context: The ground truth set is small (3 artificials, 20+ naturals). Perfect discrimination on this set demonstrates the approach works; it does not guarantee the same performance on a large, diverse unseen corpus. The Bayesian posterior ceiling (~3–4%) is mathematically correct given the 0.1% base rate and available evidence types — it is not a software bug.
- Statistical screening of NEOs by orbital and physical anomaly indicators
- Multi-source data acquisition: JPL SBDB, JPL Horizons, NEODyS, MPC (with graceful fallback)
- Close-approach history (upcoming, within 0.2 AU) via SBDB CAD API
- Time-series orbital element history via JPL Horizons
- Earth and Moon impact probability with uncertainty bounds, keyholes, risk periods
- REST API with OpenAPI specification, Pydantic models, and batch processing
- Interactive Rich-based terminal menu (11,500-line
aneos_menu.py) - JSON/CSV export of analysis results
- JSON file caching with full round-trip fidelity for physical properties
| Gap | Reason |
|---|---|
| Propulsion / manoeuvre signature detection | No automated data source exists; requires dedicated tracking campaigns |
| Radar polarimetry (SC/OC ratio) | SWARM KAPPA implemented but no live data feed |
| Thermal infrared modelling (NEATM) | SWARM LAMBDA implemented but requires WISE/NEOWISE photometry input |
| Gaia astrometric anomaly detection | SWARM MU implemented but requires Gaia epoch astrometry input |
| Real-time NEO discovery alerts | No MPC/JPL Scout webhook integration |
| Observation scheduling or telescope control | Out of scope for this platform |
| Production authentication (JWT) | Mock tokens in dev mode; not suitable for public deployment |
| ML classifier activation | Deferred (G-015); scikit-learn pipeline exists but is not wired into the default detection path |
| Processing raw photometry or spectra | Only processed orbital elements and physical properties are accepted |
| IAU Torino / Palermo scale ratings | aNEOS uses its own risk classification; Torino/Palermo require authoritative orbit solutions |
| ESA/NASA operational endorsement | aNEOS is an independent research tool |
- Report a result as "anomalous" only if
sigma_confidence >= 3.0(SIGNIFICANT tier). - Report a result as "potential artificial" only if
sigma_confidence >= 5.0(EXCEPTIONAL tier) and independent follow-up confirms the anomaly. - Do not cite
artificial_probabilityas proof of artificiality. The maximum posterior from orbital+physical evidence alone is ~3–4%. Values in this range indicate "unusual orbit", not "confirmed artificial object". - Cross-check impact probabilities against JPL Scout or ESA NEOCC for any object with
collision_probability > 1e-6.
aneos-suite/
├── aneos_core/ # Core science and data packages
│ ├── data/ # DataFetcher, CacheManager, SBDB/Horizons/NEODyS/MPC sources
│ ├── detection/ # ValidatedSigma5ArtificialNEODetector (canonical), DetectionManager
│ ├── analysis/ # ImpactProbabilityCalculator, scoring, pipeline
│ ├── validation/ # 6 SWARMs (KAPPA/LAMBDA/MU/CLAUDETTE/THETA/ATLAS), stats
│ ├── datasets/ # Ground truth dataset builder and validator
│ ├── ml/ # ML classifier (deferred, behind HAS_TORCH guard)
│ ├── monitoring/ # Prometheus/Grafana, psutil metrics, SMTP alerts
│ └── config/ # APIConfig, settings
├── aneos_api/ # FastAPI application
│ ├── endpoints/ # analysis, dashboard, monitoring, admin, data
│ ├── schemas/ # Pydantic models: DetectionResponse, ImpactResponse, OrbitalInput, ...
│ └── app.py # Application factory
├── aneos_dashboard/ # Web dashboard (Flask)
├── aneos_menu.py # Rich interactive terminal menu (~11,500 lines)
├── aneos.py # CLI entry point
├── tests/ # 59 unit and integration tests
└── docs/ # Architecture (ADR, DDD), API spec, user guide, scientific docs
GET /detect?designation=Apophis
│
├─ Known spacecraft catalog veto → instant ARTIFICIAL (no analysis)
│
├─ DataFetcher.fetch_neo_data()
│ ├─ JPL SBDB → orbital elements + physical properties
│ ├─ JPL Horizons → element table (fallback)
│ ├─ NEODyS / MPC → element table (fallback)
│ └─ SBDB CAD API → close-approach history (supplemental, never blocks)
│
├─ HorizonsSource.fetch_orbital_history() → 10-year Keplerian time-series
│
└─ ValidatedSigma5ArtificialNEODetector.analyze_neo_validated()
├─ 6 evidence modules → individual p-values
├─ Fisher's method → combined_p_value
├─ Bayesian update → bayesian_probability (0.1% prior)
└─ DetectionResponse → sigma_confidence, sigma_tier, evidence_sources, ...
Full OpenAPI specification: docs/api/openapi.json (regenerate with make spec).
Interactive documentation available at http://localhost:8000/docs when the API server is running.
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/analysis/detect |
Run Sigma-5 detector on a named NEO |
| POST | /api/v1/analysis/detect |
Run detector on caller-supplied orbital elements |
| GET | /api/v1/analysis/impact |
Compute Earth/Moon impact probability |
| GET | /api/v1/analysis/history |
Fetch 10-year Keplerian history from Horizons |
| POST | /api/v1/analysis/analyze/batch |
Batch detection for multiple designations |
| GET | /api/v1/analysis/batch/{id}/status |
Poll batch job with full evidence detail |
| GET | /api/v1/health |
Per-component health check |
| GET | /api/v1/data/neo/{designation} |
Raw NEO data fetch |
DetectionResponse:
sigma_confidence— sigma above natural NEO null hypothesissigma_tier— ROUTINE / NOTABLE / INTERESTING / SIGNIFICANT / ANOMALOUS / EXCEPTIONALartificial_probability— Bayesian posterior (0.1% prior)combined_p_value— Fisher's combined p-value across evidence typesfalse_discovery_rate— expected FDR at current sigma thresholdevidence_sources— list ofEvidenceSummarywithanomaly_score,p_value,effect_sizeanalysis_metadata— detector version, method, population statisticsspacecraft_veto/veto_reason— instant classification for known spacecraft
ImpactResponse (16 fields):
collision_probability,probability_uncertainty[lower, upper]moon_collision_probability,moon_earth_ratioimpact_energy_mt,crater_diameter_km,damage_radius_kmkeyhole_passages,peak_risk_period,impact_probability_by_decadeprimary_risk_factors,comparative_risk
aNEOS builds on the Artificial NEOs Theory — the hypothesis that some Near Earth Objects may exhibit orbital or physical properties statistically inconsistent with natural formation and evolution, potentially indicating artificial origin. This is a scientific hypothesis, not an established finding.
The statistical framework is grounded in:
- Bayesian inference: Posterior probability updated from a 0.1% base rate (estimated fraction of heliocentric objects that could be artificial). This prior is conservative; the true rate is unknown.
- Fisher's method: Independent p-values from 6 evidence types are combined into a single test statistic. Under the natural null hypothesis, this statistic follows a chi-squared distribution with 2k degrees of freedom.
- Sigma-5 threshold: Classification as artificial requires combined significance ≥ 5σ (p < 5.7×10⁻⁷), matching standard astronomical discovery criteria.
- Calibrated threshold: At p(Bayesian) ≥ 0.037, the current ground truth validation achieves sensitivity = 1.00 and specificity = 1.00 on the available corpus.
Full methodology: docs/scientific/scientific-documentation.md
Architecture decisions: docs/architecture/ADR.md (39 ADRs)
Domain model: docs/architecture/DDD.md (10 bounded contexts)
See CONTRIBUTING.md for development guidelines. The project follows the C&C + Implementation + Q&A agent structure defined in DEVELOPMENT_FRAMEWORK.md.
Run the test suite before opening a pull request:
python -m pytest tests/ -m "not network" -q # 59 tests, 0 fail
make spec # regenerate OpenAPI spec
git diff --stat docs/api/openapi.json # confirm spec is currentScientific research and educational use. See LICENSE for complete terms.
aNEOS v1.0.0 — Phase 10 complete. All planned gaps closed. Ground truth: sensitivity=1.00, specificity=1.00 on 3 confirmed artificials. REST API: 52+ endpoints. Test suite: 59 pass / 0 fail.