Skip to content

Introduction

LunarTrace connects frozen lunar source bytes to a versioned scientific method, a deterministic numerical result, an execution receipt, a numeric Figure and a browser projection. The numerical authority is Python. The browser does not implement a second scientific method.

LunarTrace has a temporal Study and a slope-quality method. They share the same habits: frozen bytes in, a canonical record out, and a digest that shows nothing moved.

lt.temporal.study(...) takes a site, an event interval and a product type, and compiles the observations before and after the event, every PRE x POST pair, and the Pareto frontiers of the pairs that no other pair beats. study.why(pair) names the pair that beat another, and study.save(...) writes a file that replays to the same SHA-256. The method is lunartrace.temporal_prepost/v1, and a Study is recorded as METHOD_EXECUTED. It is not a claim that the surface changed. The call and its limits are on the one-call Study; the retained run it replays is the Lunar ODE query for the Chandrayaan-3 Vikram lander site (landing 23 August 2023), fetched on 14 October 2026.

import lunartrace as lt
study = lt.temporal.study(site=(-69.3741, 32.32),
event="2023-08-23T12:33Z/12:35Z",
products="LRO/LROC/CDRNAC4",
archive="vikram-2026-10-14") # replays the archived pages

The only numerically reproduced vertical is PGDA LOLA Site01 slope quality: the Planetary Geodesy Data Archive product 78, LOLA 5 m/pixel products for Site01 (“Connecting ridge”). The method lunartrace.slope_quality/v1 evaluates a slope raster and a slope-RMS raster against a set of regions of interest (ROIs) at one or more thresholds τ. For each ROI and for the union of ROIs it reports cell counts, the fraction of jointly valid cells that are included, slope quantiles and mean, and a histogram in 2° bins.

The project separates five things that are easy to conflate:

ConceptWhere it livesWhat it establishes
Source bytesLocal content-addressed store (CAS), outside GitThe exact input bytes, identified by SHA-256
Source witnessresearch/sources/pgda78-site01.manifest.jsonWhich bytes are intended for a task, and their roles
Resultresult.json, canonical bytesThe deterministic output of the method
Execution receiptreceipt.jsonThat one execution occurred, with its inputs, code state and environment
StandingA projection labelThe evidence level a claim may carry

A receipt records an execution. It is not a signature, not proof of numeric reproduction and not scientific admission. Standing is an explicit label chosen by the caller and must reflect the available evidence; no command in this project promotes it.

Data flow
frozen source witness + local CAS
| hash-verified inputs
v
lunartrace.science (Python, canonical authority)
| result.json, receipt.json, projection.json
v
Pydantic models -> JSON Schema -> generated TypeScript types and AJV validators
| contracts/ (generated, not hand-edited)
v
Web workbench (TanStack Start client, Vite) -> filters, sorts, draws validated data

Browser code may filter, sort, format and draw validated projection data. It must not recompute science, raise a standing, derive an area from included_fraction, or turn a missing value into zero. A projection that fails validation is an error, not a silent fallback.

ClaimStanding
Frozen Site01 study, historical primary and oracle agreementNUMERIC_REPRODUCED, NOT_ADMITTED
Temporal Study compiled from the retained Vikram pages (digest sha256:3d75a662...)METHOD_EXECUTED
Temporal Study fetched liveMETHOD_EXECUTED on bytes that were current at fetch time; not comparable with the retained run
Fresh STUDY execution on a new runMETHOD_EXECUTED, NOT_ADMITTED
Workbench ROI resultsMETHOD_EXECUTED · NOT_ADMITTED
Source and derived-data rightsUNVERIFIED; local and private use only
Historical Probe observation rowsUnavailable; only frozen aggregate reports exist

Scientific admission, landing safety, uncertainty propagation and physical area are not established by this software. See the method for the exact cell rules and the provenance guide for source status.