How it works

The idea

The NASA Exoplanet Archive publishes one row per planet per paper (the Planetary Systems table) and marks one row as the default. It also publishes a composite table with one row per planet whose values are picked parameter by parameter, so a single row can combine a mass from one paper with a radius from another, or with a radius the archive calculated from a mass–radius relation. The archive itself calls that table “a more complete, though not necessarily self-consistent, set of parameters”. Default Flag computes every derived number from one self-consistent parameter set and shows the composite answer only as a labelled counterfactual.

Sanity Context endpoints

One endpoint per mode, because an endpoint with both a dataset and a Knowledge Base attached serves the dataset only. Tools are discovered at runtime with MCP tools/list; the trace under every answer lists them.

Knowledge Base conflict, before and after

The Knowledge Base reads one dataset source with two documents per planet: its default parameter set and its composite row. For Kepler-139 d they disagree: 4.658 M⊕ (M·sin i, Weiss et al. 2024, the default) against 2 M⊕ (Lammers & Winn 2025, composite).

Context did not raise this as an issue. The Knowledge Base Purpose states the rule (“the self-consistent single-source set governs; composite values are recorded only as explicitly labelled alternatives”), and the build applied it directly. The planet entries keep a “Default parameter sets (preferred for derived quantities)” table and a separate “Composite table (mixed-source alternatives)” table, and state that Kepler-139 d’s composite mass differs from its default.

What changed: before the dataset source, the Knowledge Base held only methodology and could not say anything about Kepler-139 d. Now, asked which mass to use, the agent answers 4.66 M⊕ from Weiss et al. 2024 and explains that the composite’s 2 M⊕ comes from another paper. The computed density does not change, by design: numbers come only from the dataset and deterministic code. See both rows side by side.

Knowledge Base source: one GROQ query over the production dataset, 62 documents (each planet's default parameter set and its composite row).
Knowledge Base source: one GROQ query over the production dataset, 62 documents (each planet's default parameter set and its composite row).
Built entry planet_catalogue/mini_neptunes: default sets and composite alternatives in separate tables, with Kepler-139 d's disagreement stated.
Built entry planet_catalogue/mini_neptunes: default sets and composite alternatives in separate tables, with Kepler-139 d's disagreement stated.

Schema

planet
name, slug, host → star, parameterSets[] → parameterSet, defaultParameterSet → parameterSet, compositeSnapshot {each value + its reference or "Calculated Value"}
parameterSet
one archive Planetary Systems row: planet, publication, defaultFlag, radiusEarth / massEarth / semiMajorAxisAu {value, errPlus, errMinus, limitFlag}, massKind, stellarSolution, snapshot
stellarSolution
the stellar values published with that row: star, publication, radiusSun, massSun, teffK
publication
citation, refname exactly as the archive gives it, bibcode, year, ADS URL
snapshot
raw file, table, SHA-256, rows, source URL, retrieval time
constant / threshold / hzLimit
reference values, each with a source citation, URL and location
derivedAnswer
question, parameterSet, quantity, inputs[] {field, value, set}, result {median, p16, p84}, codeVersion

Public GROQ, no token: first five planets and their default papers (project 0eu544dk, dataset production).

Snapshots

The app reads this snapshot from Sanity; it never queries the archive at answer time.

Raw snapshot files
FileRowsRetrievedSHA-256
ingest/data/raw/nea-tables/nea-ps.csv401942026-10-03T16:52:21Zbbb513419ed5d36078221641517730d8ca3b83e32006554aae640fc5fa35a711
ingest/data/raw/nea-tables/nea-pscomppars.csv63752026-10-03T16:52:21Z75d9a617442b876babf088bbef3a7095e8c5725c70a363d082081faa9331503c

Code computes, the model explains