Case study · working prototype · 2026-08-04 lift
Mars Arena habitability leaderboard
A scored leaderboard of Martian cave / lava-tube candidates with filterable columns and an inspector modal. The scoring function is in the page JavaScript — not a decorative progress bar.
The problem
Habitability candidates from the NASA/USGS MGC³ cave catalog are scientific records, not a product UI. Mars Arena wraps them in a leaderboard so a visitor can compare structure/safety, location, logistics, and science potential — and inspect one candidate at a time.
Pipeline
01 CatalogMGC³ / PDS cave candidate records
02 Seed demo12 hand-authored entries for the prototype
03 ScoreWeighted sum in leaderboard.js
04 ExploreFilter, sort, paginate, open modal
Live interface (lifted)
Real public/mars-arena/index.html + leaderboard.js. Tailwind/Google-font CDNs were replaced with a local utility sheet so the case runs with no network dependency. AI chat remains the prototype placeholder the HTML already declared.
Score weights (from leaderboard.js)
| Component | Weight | Source |
| safety | 0.4 | WEIGHTS in lf3-assets/js/mars-arena/leaderboard.js |
| location | 0.3 | same |
| logistics | 0.2 | same |
| science | 0.1 | same |
Catalog rows supply component inputs via a deterministic heuristic from priority/type so the weight function is exercisable at full scale. That heuristic is labelled in the dataset metadata — it is not a peer-reviewed habitability model.
Volumes (labelled separately)
12seed entries (default prototype fixture)mars-arena-seed.json → entries
1,062repaired catalog records wired into the same UImars-cave-catalog.repaired.json → records
1,062catalog index count field (entries were null shells)mars-cave-catalog-index.json — not used as row data
100sample import records (not default path)mars-cave-catalog-sample.json
What was hard / what it got wrong
- The certified catalog index file reports 1,062 but every entry’s fields are null — wiring it blindly would show an empty board. The repaired catalog is what actually loads.
- AI Assistant is explicitly a placeholder in the source HTML; this lift does not pretend Gemini chat works.
- Original page depended on CDN Tailwind/fonts; that violates the offline case rule, so utilities were inlined.
What is real
Leaderboard markup, modal, filters, pagination, sort, WEIGHTS function, seed JSON (12), repaired catalog coordinates/type/priority/comments (1,062).
What is reconstructed
Offline CSS utilities replacing Tailwind CDN; SVG mark replacing missing logo asset; catalog→entry schema mapping including deterministic parameter heuristics for scoring; submitter fields normalised to “MGC³ catalog” / “Catalog Import”.