A reveal.js deck on porting the USGS ESPA LaSRC atmospheric correction library to Rust: why HLS needed it, how agentic development and an automated validation suite made it affordable, and how we would like to work with GSFC on algorithmic change going forward.
Structured and styled after NASA-IMPACT/esdis-spotlight-virtualization.
python3 -m http.server 8000Then open http://localhost:8000. Press S for speaker notes, F for fullscreen.
Every slide carries a full presenter script in an <aside class="notes">.
27 slides in five acts, targeted at 15 to 20 minutes, driven by outline.md:
| Slides | Act | |
|---|---|---|
| 1 to 7 | The dependency and what it costs | Where LaSRC sits in HLS, why ESPA was the right choice in 2019, the science code versus production code framing, and what the gap costs around the codebase and inside the algorithm |
| 8 to 11 | Vision and trigger | SNWG funded GSFC work, the community driven atmospheric correction vision, why Rust, and the GDAS requirement that forced the decision |
| 12 to 14 | The robot army | Multi-agent porting, the compare-against-reference loop, and why the initial port was a foundation rather than a finished result |
| 15 to 20 | Validation and the humans | The in-house validation suite, what it measures, one comparison in detail, the bugs the full run surfaced, and the cases where the port was arguably more correct than the reference |
| 21 to 27 | Results and the ask | Equivalence and performance, what is next in priority order, the proposed GSFC collaboration loop, takeaways, and the longer horizon for validation |
The argument turns on slide 4 (science code is not production code), slide 13 (the loop), and slide 25 (the collaboration proposal). Slide 20 exists on purpose: conceding that the port sometimes disagreed with the C reference and was right to is what makes slide 25 land.
Slide 27 is the closing note and carries the sign-off. It states the limit of everything before it: all validation in this deck uses ESPA LaSRC C output as the baseline, which buys continuity with the existing archive but cannot measure physical accuracy. It points at Chris Holden's ACIX-II and AERONET work as the direction of travel.
Two slides carry .todo blocks. Search the source for class="todo".
| Slide | What it needs |
|---|---|
| 17 | Re-export the granule comparison panel from the current validation run, replacing images/granule-panel-rows.png |
| 23 | Optional. Space reserved for a fuller performance picture: runtime table, memory profile or per-granule breakdown |
| File | Source |
|---|---|
granule-panel-rows.png |
Two band rows cropped from the per-granule comparison panel, hls-application notebooks/LaSRC_container_validation.ipynb |
distribution_summary_immediate_20260922_150055.png |
Per-granule mean absolute difference by band against the 5 DN threshold, 2026-09-22 run |
scatter_summary_immediate_20260922_150055.png |
Mean reflectance C against Rust, one panel per band, 353 granules, 2026-09-22 run |
ODSI full light.png |
ODSI logo |
rust-logo.png, rust-logo-blk.svg |
Rust Foundation, https://www.rust-lang.org/policies/media-guide |
Two diagrams are drawn in the deck's own palette as inline SVG in index.html, not images:
the HLS processing chain on slide 2, and the porting loop on slide 13.
No em dashes anywhere in the deck text, by request.