Skip to content

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:

GoalPathStanding of a fresh run
Evaluate in-memory grids, or verified files, in PythonDIRECT evaluationNot a standing-bearing STUDY result
Reproduce the frozen Site01 study with custody checksSTUDY (run), then projectMETHOD_EXECUTED
Inspect results interactivelyNotebook reader (marimo)METHOD_EXECUTED
Produce a numeric Figureexamples/polar-source-quality/make_figure.pyDepends on the retained projection
Explore an ROI in the browserWorkbenchMETHOD_EXECUTED · NOT_ADMITTED
Rebuild the preliminary papertask paperNUMERIC_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.

  1. 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, marked METHOD_EXECUTED · NOT_ADMITTED, not a reproduction of the frozen Site01 result. See ROI and brushing.
  2. 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, labelled SAMPLED; 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.
  3. Compare (3). Use the Python compare-reference preset 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.
  4. 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.
  5. 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.

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.py

Set 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.

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-figure

The 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.

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.

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.

The web client and the R3 workbench sidecar are started through Task:

task dev # browser client, Vite, 127.0.0.1:4317
task workbench:py # Python sidecar for the workbench, 127.0.0.1:4318
task docs:dev # this documentation site, 127.0.0.1:4321

task workbench:py runs python -I -m lunartrace.workbench in the notebook group. Its HTTP routes are documented in the Python API reference.

Two local paths exist that are separate from the slope-quality method:

  • Terrain. task terrain builds 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:export generates geometric display light for an explicitly supplied epoch, using manifest-pinned SPICE kernels fetched by task spice:fetch. It is not an observation-time product or a photometric model, and it does not change the method, result or standing.

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.