Skip to content

Terraluna · how the release is checked

Methods

Each release gate with its status, scope, result and consequence, as recorded in the bundle's validation.json. A status is always shown as its literal text, and a missing field is labelled Unavailable.

Globe: ShadowAstra Atlas 0.5° land grid drawn as evenly tinted dots, decoration only (no score layer).

01Validation board

  1. G0

    PASS
    scope
    G0 pilot decision (PRD 9): shipping mode, frozen target window, Earth search regions and the first-card Earth window, from the pilot evidence
    result
    shipping mode C attested by orchestrator, delegated by the team (docs/ralph/DECISIONS.md G0-01-RESULT, G0-02/04/05-RESULT)
    consequence
    the bundle ships in Mode C (PRD 4)
    Provenance
    evidence_path
    outputs/gates/G0_attestation.json
    run_id
    sha256:68e39c748b4525aeaa36afc00db9456557c43d8b34806a962d7ab3ec6b92b6cf
    command
    python -m terraluna_pipeline.gates attest-g0 --mode C --operator 'orchestrator, delegated by the team (docs/ralph/DECISIONS.md G0-01-RESULT, G0-02/04/05-RESULT)' --confirm I-RECORD-THE-G0-DECISION
    config_version
    9fcb0191c70dc2aca1e463978278e1882a1bf8e60d0e5fd7ae2988bdb2c4b675
    input_hashes
    • config/run.yaml 9fcb0191c70d
    • outputs/g0/earth-radar-roi.json b6b4d32cf3aa
    • outputs/g0/web-evidence.json 4feaa141ab6d
    • outputs/g0/windows-evidence.json 670a8083ffae
    • outputs/gates/G0_attestation.json a39ba63b7264
  2. G1

    PASS
    scope
    G1 conversion correctness (PRD 9): fixtures F1-F10 against an independent basis transformation, and every test of T2-01 to T2-03 (the convention tests, the invalid-data tests and the others), in every listed case, as listed in fixtures/polarimetry/g1_required_tests.json and read from a pytest junit report. The real-scene polsartools oracle check (T2-07, PRD 12): included and passed.
    result
    Machine-readable record (JSON), expand
    {"notes": {"command": "python -m terraluna_pipeline.polarimetry record-g1 --junit /tmp/terraluna-g1-t5/junit.xml --out fixtures/polarimetry/g1-record.json --pytest-command 'TERRALUNA_UAVSAR_SCENE=<local UAVSAR scene dir> uv run pytest --junitxml=/tmp/terraluna-g1-t5/junit.xml -q -p no:cacheprovider pipeline/tests/test_polarimetry_covariance.py pipeline/tests/test_polarimetry_decode.py pipeline/tests/test_polarimetry_derive.py pipeline/tests/test_polarimetry_mchi.py pipeline/tests/test_polarimetry_oracle.py pipeline/tests/test_polarimetry_stokes.py'", "pytest_command": "TERRALUNA_UAVSAR_SCENE=<local UAVSAR scene dir> uv run pytest --junitxml=/tmp/terraluna-g1-t5/junit.xml -q -p no:cacheprovider pipeline/tests/test_polarimetry_covariance.py pipeline/tests/test_polarimetry_decode.py pipeline/tests/test_polarimetry_derive.py pipeline/tests/test_polarimetry_mchi.py pipeline/tests/test_polarimetry_oracle.py pipeline/tests/test_polarimetry_stokes.py", "commit": "723b1447cf83543e5017255f09689a0a92171a61", "uncommitted_changes": []}, "junit_sha256": "bee9491127d4b47669c5997a456ae21c4cc4c9f2f73caac9b3507ee1526036b1", "junit_timestamps": ["2026-11-15T03:45:33.175637+01:00"], "required_tests": "fixtures/polarimetry/g1_required_tests.json", "required_tests_sha256": "dd7ca958a38ae84ac439ba5af37de5dc1e67489e0178f05bac758197b92bbfc0", "fixtures": {"F1": {"tests": 3, "passed": 3, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 3}, "F2": {"tests": 3, "passed": 3, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 3}, "F3": {"tests": 3, "passed": 3, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 3}, "F4": {"tests": 3, "passed": 3, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 3}, "F5": {"tests": 3, "passed": 3, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 3}, "F6": {"tests": 7, "passed": 7, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 14}, "F7": {"tests": 6, "passed": 6, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 9}, "F8": {"tests": 2, "passed": 2, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 2}, "F9": {"tests": 1, "passed": 1, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 1}, "F10": {"tests": 1, "passed": 1, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 1}}, "conventions": {"T2-01": {"tests": 3, "passed": 3, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 3}, "T2-02": {"tests": 4, "passed": 4, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 4}, "T2-03": {"tests": 8, "passed": 8, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 10}}, "invalid_data": {"T2-01": {"tests": 54, "passed": 54, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 295}, "T2-02": {"tests": 56, "passed": 56, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 94}, "T2-03": {"tests": 39, "passed": 39, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 109}}, "other": {"T2-01": {"tests": 18, "passed": 18, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 28}, "T2-02": {"tests": 10, "passed": 10, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 17}, "T2-03": {"tests": 14, "passed": 14, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 20}}, "real_scene_check": {"tests": 1, "passed": 1, "failed": 0, "skipped": 0, "incomplete": 0, "absent": 0, "cases": 1}, "failed": [], "skipped": [], "incomplete": [], "absent": [], "absent_cases": [], "other_failed": []}
    consequence
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    Provenance
    evidence_path
    fixtures/polarimetry/g1-record.json
    run_id
    sha256:9cf2b5ea7d32520d9017c443ee4c4db32bf366e8eb13679811d36bee977f773e
    command
    python -m terraluna_pipeline.polarimetry record-g1 --junit /tmp/terraluna-g1-t5/junit.xml --out fixtures/polarimetry/g1-record.json --pytest-command 'TERRALUNA_UAVSAR_SCENE=<local UAVSAR scene dir> uv run pytest --junitxml=/tmp/terraluna-g1-t5/junit.xml -q -p no:cacheprovider pipeline/tests/test_polarimetry_covariance.py pipeline/tests/test_polarimetry_decode.py pipeline/tests/test_polarimetry_derive.py pipeline/tests/test_polarimetry_mchi.py pipeline/tests/test_polarimetry_oracle.py pipeline/tests/test_polarimetry_stokes.py'
    config_version
    9fcb0191c70dc2aca1e463978278e1882a1bf8e60d0e5fd7ae2988bdb2c4b675
    input_hashes
    • config/run.yaml 9fcb0191c70d
    • fixtures/polarimetry/g1_required_tests.json dd7ca958a38a
  3. G2

    NOT_RUN
    scope
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    result
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    consequence
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    Provenance
    evidence_path
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    run_id
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    command
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    config_version
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    input_hashes
    Unavailable Observation or supported inference is absent validation.json lists no input files for this gate
  4. G3

    PARTIAL
    scope
    Holuhraun UAVSAR CPR facies reproduction; lunar shadow behaviour (analysis/g3_shadow.json); impact-melt context (analysis/g3_impact_melt_context.json)
    result
    Holuhraun: facies CPR overlap 91.8% to 95.6% against 88-89% (Tolometti et al. 2022), outcome consistent. Shadow: Unavailable (permanent-shadow fraction per window not available: no shadow product is named (decision G0-10); every window is in the unknown group). Impact-melt context: 2.6% of valid Site01 window CPR pixels in 0.7 to 1.0 (12 above 1, kept valid), context only.
    consequence
    G3 is PARTIAL, not PASS: the shadow behaviour check is Unavailable (decision G0-10: no permanent-shadow product), so not every G3 part is recorded. The Neish et al. 2017 values are not compared (region and convention not matching). Claims narrowed to the Holuhraun facies-overlap plausibility check and a context-only melt range.
    Provenance
    evidence_path
    analysis/holuhraun_reproduction.json
    run_id
    sha256:391a0a56ab5dbd16576103b5c4f536264ab2546cfe59b5c9988f07cf8a77c58a
    command
    python -m terraluna_pipeline.holuhraun run; python -m terraluna_pipeline.lunar_context run
    config_version
    9fcb0191c70dc2aca1e463978278e1882a1bf8e60d0e5fd7ae2988bdb2c4b675
    input_hashes
    • analysis/g3_impact_melt_context.json 86f2ffa3ccd7
    • analysis/g3_shadow.json f9967cd3ed2a
    • analysis/holuhraun_protocol.json 7e7d41642853
    • analysis/holuhraun_reproduction.json 308fe47579b1
  5. G4

    PASS
    scope
    moon-cr-site01-w000 (moon-sps-x2-y2) against 71 eligible Earth windows of the slice search; terrain families only (Mode C)
    result
    71 candidates, 2 excluded windows listed; first Pareto layer 1 window(s); 1 window(s) in the first layer in all 100 clone runs
    consequence
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    Provenance
    evidence_path
    analysis/g4_candidates.json
    run_id
    sha256:eca8fd8e34804fe37e1d24bb5358a6f12497c91adb147a2b45e191ceb22747bb
    command
    python -m terraluna_pipeline.checks g4 --target-id moon-cr-site01-w000
    config_version
    9fcb0191c70dc2aca1e463978278e1882a1bf8e60d0e5fd7ae2988bdb2c4b675
    input_hashes
    • analysis/g4_candidates.json b6764ca23799
    • analysis/g4_counterexample.json d556865b9b05
    • config/run.yaml 9fcb0191c70d
    • outputs/comparisons/moon-cr-site01-w000.json e252bcdba17b
    • outputs/search/targets.json 140aa37f13d5
    • outputs/uncertainty/clones_moon-sps-x2-y2.json c1ded889eba2
  6. G5

    FAIL
    scope
    encoder on spatial test blocks
    result
    failed: condition_3:body_invariance, condition_4:physics_agreement, condition_5:seed_stability
    consequence
    The encoder stays EXPERIMENTAL with the failed tests named; its report and live probe still ship and rankings stay on M0 (PRD 11.7).
    Provenance
    evidence_path
    outputs/ml/evaluation/test/g5_conditions.json
    run_id
    sha256:a903a6e10a32fb72d78ad5e6c6552b6bca44f92d70a3c49b637022cf62fbee68
    command
    python -m terraluna_ml.evaluate g5 --metrics outputs/ml/evaluation/test/evaluation_metrics.json --out outputs/ml/evaluation/test --parity outputs/ml/model/export_record.json --gate-out outputs/gates/G5.json
    config_version
    9fcb0191c70dc2aca1e463978278e1882a1bf8e60d0e5fd7ae2988bdb2c4b675
    input_hashes
    • config/run.yaml 9fcb0191c70d
    • outputs/ml/evaluation/test/evaluation_metrics.json c991fa8ef16b
    • outputs/ml/model/export_record.json 4487c0b41ce3
  7. G6

    NOT_RUN
    scope
    G6 for bundle 2026-11-15T0456Z-7e3c74c is evaluated after assembly by make validate and recorded in outputs/validation.json of the repository
    result
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    consequence
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    Provenance
    evidence_path
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    run_id
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    command
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    config_version
    Unavailable Observation or supported inference is absent validation.json gives null for this field
    input_hashes
    Unavailable Observation or supported inference is absent validation.json lists no input files for this gate

Evidence labels

Every displayed or exported quantity carries one of these labels.

  • Observed Supplied by a qualified instrument product
  • Derived Computed from named observations by a documented transformation
  • Predicted Estimated by a fitted statistical model
  • Assumed Scenario input, tolerance or unverified physical simplification
  • Unavailable Observation or supported inference is absent
From ShadowAstra Atlas (MIT, Team ShadowAstra)

How ShadowAstra Atlas scores sites (the factor model used on /find and /explore)

Everything below is ShadowAstra Atlas's own methods page, copied with permission. It explains the factor scores shown on /find and /explore, which come from their model and their 0.5° Earth grid. Its tests, ranks and counts are ShadowAstra's validation, not Terraluna results; Terraluna's own gates are the validation board above.

Measuring Earth · 0%
How it works

Open data in.
Honest answers out.

Every dot is one of the 80,206 land areas we measured with NASA data. The brighter it glows, the more it is like the Moon or Mars.

places measured
0
measurements each
0
Moon and Mars targets
0
real sites to test against
0
01Four questions

The challenge names four things. We measure each one.

The same measurements, at the same 50 km scale, on Earth, the Moon and Mars. Every number below is real.

Atacama, Earth Jezero, Mars
flatsteep
01

Ground shape

Slopes and height range across 50 km.

SRTMLRO LOLA 118 mMGS MOLA 463 m
0
volcanoes
0
impact craters
0
rock types
02

Rocks & craters

Volcanic ground, impact craters and bare rock. (Rock type is shown in reports and used by the learned model, not scored here.)

Smithsonian GVPEarth Impact DatabaseMODIS land cover
Svalbard, Earth: up to 35°Shackleton, Moon: up to 1.9°horizon
03

Cold & light

Night cold, the day and night swing, and how high the Sun climbs.

MODIS LSTNASA POWERSun geometry
Rain and snow per year
Loading…
04

Bare, dry ground

Rain and plants: how much loose soil and rock is exposed to drive on and dig. For ice jobs, ice is scored under Cold & light.

NASA POWERMODIS NDVIMODIS snow
Earth can't copy:gravity·vacuum·space radiationShown next to every score, never added in.
02One mission, step by step

Where on Earth is like Jezero crater? Watch the planet answer.

01 · Measure every place
01

Measure every place

Coldest night ground temperature, for all 80,206 land areas.

warmcoldNASA MODIS
02

Find bare, dry ground

Little rain and few plants, so rock and soil show, like regolith.

greenbareNASA POWER · MODIS
03

Compare the ground

Slopes and height range next to Jezero crater on Mars.

differentalikeSRTM · MGS MOLA
04

Weigh it for the job

Looking for signs of life? Rocks and dryness count most.

poorstrongFive factors
05

Ask what experts chose

A model learned from 38 places NASA, ESA and others use.

unlikealike3-model ensemble · 8 bags
06

Shortlist new places

60% model, 40% factors. 300 km apart. Known sites left out.

Top 10 for Jezero
03The proof

We tested it on places it never saw.

28 new test sites
…
Typical rank among all 80,206 land areas, as the site scores them. None were used for training.
Hidden known sites
…
Typical rank, as the site scores them, with each site and its neighbours within 300 km hidden and the model retrained. The learned model alone: top 1.2%.
Top places that stay when the weights change by about 25%
…
Typical over eight missions, 60 random shifts each.

28 published sites, kept out of training

From the Austrian Space Forum, ISRO, Europlanet, NASA teams and Apollo training. Each dot is one site; the white line is the typical rank.

The learned model finds them best. On these new sites the mission factors alone do about as well as a simple rule: their job is to explain why a place matches and to tune it to your target and job. Note that Rocks & craters partly uses the volcano and crater lists, so volcanic and impact sites get some help by design.

Loading the test results…

How much should the model count?

We let the 38 known sites speak, then only checked the new ones. More model finds hidden sites better. But the model knows nothing about your target or job, and at that share your choices would hardly change the list, so we keep 60%. You can change it in step 3 of Find new sites.

Loading the test results…

The job matters

Each line is a site, scored for the jobs it was really used for and for all the other jobs.

Loading the test results…

What each factor adds

Take one factor out and see how the known sites move. Many famous analog sites are volcanoes and craters in green land, so bare ground pulls them down. We keep it, because bare ground matters for driving and digging, and you can turn it off.

Loading the test results…

Where it fails, and why

The three test sites it ranks lowest, each chosen for something a 55 km average cannot see: a rock type, an ice margin or a small feature in a green landscape.

04New evidence

New data, new checks. Each one tested before it counts.

A rule we keep: new data only changes the score if it ranks the known sites better. Otherwise we show it as a fact and say so here.

A terrain AI that reads the ground

On two Kaggle T4 GPUs we trained a vision transformer (DINO, self-supervised) on 50 km height maps from Earth, the Moon and Mars, with an extra part that discourages it from simply telling the worlds apart (70% of its nearest neighbours still come from the same world, against 33% by chance).

For ground shape alone it ranks the known and the new test sites higher than our formula, and ties on the pairs experts chose. It now powers the AI twin finder.

Try AI twins for Jezero crater
Loading the test results…

Minerals from orbit, with NASA EMIT

EMIT, a spectrometer on the space station, maps the minerals of Earth's dry, bare land. We grouped them the way Mars scientists do: clays, sulfates, carbonates and iron oxides, the minerals water leaves behind.

A good sign: the strongest gypsum EMIT sees is the Qaidam basin and the strongest hematite the Pilbara, both well-known Mars analogs. We tested minerals twice, as an input to the learned model and as part of Rocks & craters for the Mars targets where orbiters found these minerals.

Every place report now shows its EMIT minerals next to the target's.

Loading the test results…

Measured on the Moon and Mars side too

Reports used to say "water ice: likely nearby". Now they show NASA measurements for the target itself, for all 18 targets. We read only the ground around each target from Diviner's large tables (605 MB at the pole, 156 MB per band elsewhere), straight from NASA's Planetary Data System.

Loading the test results…

Looking for the ice itself: LEND and Mini-RF

Diviner shows where ice could survive. Two more instruments on NASA's Lunar Reconnaissance Orbiter, both in the 2026 challenge resources, look for the ice itself. We read them straight from the Planetary Data System, only the ground near each target.

LEND counts neutrons. Hydrogen, for example in water ice, slows neutrons down, so ground with more hydrogen sends fewer of them up to the orbiter. Near the equator the kind of rock moves the count by a few percent (dark mare lava sends more neutrons than bright highland rock), so those three numbers say little about water.

Mini-RF is a radar. Radar roughness (CPR): smooth, dusty ground gives low values; rough, blocky rock and thick, clean ice can both give values above 1. So a high value inside a dark crater is a hint of ice, not proof: rough, rocky ground looks the same to the radar.

LEND sees a blurry patch: its map cells are 15 km wide near the pole and 30 km elsewhere, and scientists still debate how sharp its view is, so the number describes the neighbourhood, not one landing spot. PDS publishes LEND counts, not a water map, so we do not turn the dip into an amount of water. Both are shown as measured facts on Compare and in the printable site report.

Shown as facts, not scoredSee the three clues for Cabeus
Loading the test results…

The best 10 km spot inside each place

A place on this site is about 55 km across; a field team works in a few kilometres. So every place report now marks the 10 km piece whose slopes are most like the target's, measured on the same 1.2 km grid as everything else. Height range is shown, not scored, because it grows with the size of the piece.

Loading the test results…
05Every dataset

NASA first, checked against other agencies.

NASA published the challenge's own resources on 13 November. Earthdata, Worldview, the Planetary Data System, LRO and Diviner were already part of Atlas, and LRO's LEND neutron map and Mini-RF radar are now in too, as facts at every Moon target. Every place report links to the same spot in NASA Worldview and Earthdata Search, so you can check it there.

The Python pipeline in pipeline/ rebuilds every number from these public sources.

06Our rules
Every number comes from a dataset or our pipeline.
Known sites teach and test. They are never shown as new.
Ground is compared at the same physical scale on every world.
Every layer names its instrument, detail and provider.
Gravity, vacuum and radiation: Earth can't copy them, and we say so.
Field visits need permission, local partners and care for the land.

See it run on your mission.

All 80,206 places, every target score, the AI twins and every test are open on Hugging Face under CC BY 4.0, ready for anyone to check or reuse.