Workflows
Read the quickstart first. Every workflow here uses the same method and the same frozen source witness. Choose the path that matches your question:
| Goal | Path | Standing of a fresh run |
|---|---|---|
| Evaluate in-memory grids, or verified files, in Python | DIRECT evaluation | Not a standing-bearing STUDY result |
| Reproduce the frozen Site01 study with custody checks | STUDY (run), then project | METHOD_EXECUTED |
| Inspect results interactively | Notebook reader (marimo) | METHOD_EXECUTED |
| Produce a numeric Figure | examples/polar-source-quality/make_figure.py | Depends on the retained projection |
| Explore an ROI in the browser | Workbench | METHOD_EXECUTED · NOT_ADMITTED |
| Rebuild the preliminary paper | task paper | NUMERIC_REPRODUCED for the frozen study; not admission |
Source and derived-data rights are UNVERIFIED. Keep all data and artifacts local and private.
Workbench workflow: Explore → Analyze → Compare → Publish → Present
Section titled “Workbench workflow: Explore → Analyze → Compare → Publish → Present”The five scenes are starting panel layouts over one shared research context, not five
independent analyses. Select them with 1–5, the scene menu, or Ctrl K. Start the
local Python sidecar and browser client as described in the
Workbench overview; the sidecar needs the configured manifest and
local content-addressed store. If those frozen inputs are absent, or Python is offline,
there is no numeric browser fallback: wait for the explicit error/offline state or restore
the authorized local inputs before proceeding. The scenes do not download source data.
- Explore (
1). Begin with Moon, Evidence and Method. Select a served source ROI or draw a user ROI on the Moon; an evaluation is sent to Python. Check the Evidence panel’s status and source witness before interpreting anything. A drawn ROI is a user-mask exploration, markedMETHOD_EXECUTED · NOT_ADMITTED, not a reproduction of the frozen Site01 result. See ROI and brushing. - Analyze (
2). Read the Python-produced Rows for counts and statistics, select a τ row to change the research context, then use Cells and Python or Lab for closer inspection. Cells is a deterministic stride sample capped at 50,000 rows, labelledSAMPLED; it is not the complete mask. Brushing can still resolve an exact cell absent from that sample, and explicitly says “not in the sample.” Missing numeric values remain null/—, never zero. Use the Rows CSV or Python result when you need exact values, not rounded table labels or sampled cell records. - Compare (
3). Use the Pythoncompare-referencepreset to place rows for the reference ROIs beside the user ROI. Keep the mask-rule distinction in view: user ROIs use cell-centre-inside, whereas reference ROIs use the v1 lattice closed rule. A comparison in this exploratory workbench is not the independent NumPy-oracle agreement check for the frozen witness described in Verification. - Publish (
4). Choose Figure to generate a Python-rendered Histogram, Inclusion or Map from the evaluation and export SVG, PNG or PDF. Map uses a validated selected τ. Keep the figure with its method/status stamp and retain the corresponding run details; the valid-cell fraction is not lunar area and τ is a slope-RMS data-quality cutoff. This numeric figure is not a screenshot and is not evidence of admission or publication. - Present (
5). Use Moon and Figure together for a display-oriented view. The Moon basemap/terrain and camera are context, not the numeric terrain result; neither the live view nor a captured screenshot is a reproducible Figure. If communicating results, share the exported numeric Figure and its provenance separately from any illustrative screenshot, and state that the exploratory result is not admitted.
A saved run is not a Study. Save run (S) stores a local JSON capsule of the successful
ROI evaluation, which can be restored or downloaded; it is not a durable research archive,
a new calculation, a frozen-source STUDY receipt, or an admission record. A STUDY is the
separate custody-checked CLI workflow in the table above. Likewise, a Figure is regenerated
from Python numeric output, while a screenshot records only a rendered interactive view.
See Export for capsule, CSV and figure details.
If a panel shows Python offline, a request is refused, a file is missing, or a cell is outside the grid/ROI, preserve that explicit state and diagnose the local sidecar/input condition; do not fill the gap with browser-derived values. Interactive panels, sampled records, local run capsules and screenshots each have different limits and are not interchangeable evidence.
Interactive reading with marimo
Section titled “Interactive reading with marimo”notebooks/polar_source_quality.py is a marimo reader around lunartrace.science.study.
It is not a separate analysis engine. It provides manifest and store path controls and a
Run study button. Nothing runs on import. After the button is pressed, it calls
run_study, caches the execution keyed by the manifest and store strings, and displays a
projection of the result bytes, with the receipt identity, rows and tau-filtered
valid-cell fractions.
Launch it from the authorised checkout with the notebook group:
uv run --frozen --group notebook marimo edit notebooks/polar_source_quality.pySet the controls to real authorised paths before pressing Run study. The cache is a convenience, not a source-currency monitor, and reopening the notebook does not restore a research capsule. The notebook does not export a Figure or save a durable run; use the CLI and renderer below for those.
A newly run result is METHOD_EXECUTED. Do not transfer the Site01 fixture’s NUMERIC_REPRODUCED standing to a new run. The notebook states that admission is not established and that source rights are unverified.
Reproducible numeric Figure
Section titled “Reproducible numeric Figure”examples/polar-source-quality/make_figure.py reads a result and its manifest, checks the
method identifier, the SOURCE_FROZEN status and the input hashes, and renders a fixed
two-panel figure to SVG and PDF:
- Panel (a): the union’s included slope histogram at τ = 2° beside its full jointly valid histogram.
- Panel (b): the valid-cell fraction per ROI and for the union at τ = 2°.
The footer takes the method, the input hash prefixes and the citation from the result and
manifest. A fixed Matplotlib configuration and omitted date metadata make the output
deterministic for a fixed environment and inputs. The renderer overwrites figure.svg and
figure.pdf in the output directory.
uv run --frozen python -I examples/polar-source-quality/make_figure.py \ --result .build/site01-study/result.json \ --manifest research/sources/pgda78-site01.manifest.json \ --out .build/site01-figureThe renderer does not accept a standing argument, and its footer does not seal admission.
Retain the matching projection.json and receipt.json with the SVG or PDF. A Workbench
screenshot is not this numeric Figure.
Portable reproducer, not a public dataset
Section titled “Portable reproducer, not a public dataset”The reproducer consists of examples/polar-source-quality/README.md, make_figure.py
and ro-crate-metadata.json, backed by the pinned code and lock and the source-witness
manifest. The RO-Crate describes the method, inputs, result, receipt, Figure and proof. It
does not package the source rasters and offers no public download. A recipient needs an
authorised checkout and the exact CAS blobs, including the shapefile sidecars, not just the
metadata.
For the complete article build, see Paper build.
Browser projection seam
Section titled “Browser projection seam”Python is authoritative for method results and typed projections. The browser reader
readSlopeQuality validates the loaded value against the generated AJV validator and
returns the typed projection. Invalid data fails; it is not repaired or replaced.
The seam is the generated contracts/ directory: Python Pydantic models produce JSON
Schema, which generates TypeScript types and AJV validators. The summary fixture is
contracts/fixtures/pgda78-site01.slope-quality.projection.json. Per-cell sidecars are
emitted by the raster CLI described in the CLI reference.
Browser code may filter, sort, format and draw validated projection data. It must not:
- recompute science or promote a standing;
- imply a physical area from
included_fraction; - turn a missing or null value into zero;
- invent ROI polygons. The summary grid extent is not the native ROI vertices.
A Cesium ion Moon basemap is display context, not LOLA numeric terrain truth. Workbench layout, Lab integration and save behaviour are separate from the scientific seam and are not claimed here as qualified end-to-end.
Running the web clients
Section titled “Running the web clients”The web client and the R3 workbench sidecar are started through Task:
task dev # browser client, Vite, 127.0.0.1:4317task workbench:py # Python sidecar for the workbench, 127.0.0.1:4318task docs:dev # this documentation site, 127.0.0.1:4321task workbench:py runs python -I -m lunartrace.workbench in the notebook group. Its
HTTP routes are documented in the Python API reference.
Native terrain and display Sun
Section titled “Native terrain and display Sun”Two local paths exist that are separate from the slope-quality method:
- Terrain.
task terrainbuilds private, no-ion 3D Tiles from a verified frozen LOLA surface in the CAS (it requires--store). The handoff records unverified rights, and browser drawing, draping, camera behaviour and mixed-LOD seam quality are not qualified. Terrain does not feed the slope-quality analysis. - Display Sun.
task spice:exportgenerates geometric display light for an explicitly supplied epoch, using manifest-pinned SPICE kernels fetched bytask spice:fetch. It is not an observation-time product or a photometric model, and it does not change the method, result or standing.
What these workflows do not do
Section titled “What these workflows do not do”They do not download public data, fetch current source bytes, perform live LROC or ODE discovery, pair observations, or establish scientific admission. Historical Probe observation rows are unavailable; see provenance.