ares-curation is a FAIR client for NASA's ARES/JSC catalogues — the Apollo
lunar sample collection, the PDS archive of sample photographs, the ARES planetary-simulant
table and Astromaterials 3D. It joins them on the sample number and reports which samples
each one actually covers.
Source on GitHub · built for AstroRegolith
The archives do not cover the same material, and the material most relevant to growing plants is the least documented: soils are photographed at 25% (208 of 818) against 63% for the collection as a whole.
| Mission | Samples | Photographed | % |
|---|---|---|---|
| Apollo 11 | 80 | 57 | 71% |
| Apollo 12 | 77 | 64 | 83% |
| Apollo 14 | 234 | 164 | 70% |
| Apollo 15 | 480 | 327 | 68% |
| Apollo 16 | 844 | 564 | 67% |
| Apollo 17 | 756 | 405 | 54% |
| Luna 16 | 15 | 0 | 0% |
| Luna 20 | 15 | 0 | 0% |
| Luna 24 | 10 | 0 | 0% |
The Luna 16/20/24 samples (40 in total) have no photographs here because the PDS Apollo volumes do not cover them — an archive boundary, not a gap.
NASA's OSD-476 grew Arabidopsis thaliana in Apollo regolith, and its deposited metadata names the material to the split. Two of the three soils are photographed and have compendium entries. The third does not.
| Sample | Mission | Type | Returned | Pristinity | Photos | Compendium |
|---|---|---|---|---|---|---|
| 10084 | Apollo 11 | Soil · Unsieved | 3830.0 g | 60.082% | 5 | yes |
| 12070 | Apollo 12 | Soil · Unsieved | 1102.0 g | 80.235% | 44 | yes |
| 70051 | Apollo 17 | Soil · <1 mm | 1438.0 g | 80.453% | 0 | no |
These are corrected and recorded rather than silently normalised, and each is reproduced by a test in the repository.
NASA's published table names this row “CSM-LHT-1”, repeating the row above it, while its photographs are all CSM-LMT-1.jpg and its Representative Planetary Surface reads “Lunar Mare”. The parser corrects it to CSM-LMT-1 and keeps the published name on the record.
Each PDS volume publishes its own manifest. Two of the six declare a row count their file does not contain, and one declares a record format it does not use:
| Volume | Index | Actual format | Declared rows | Parsed | |
|---|---|---|---|---|---|
| A11VIS_0001 | INDEX.TAB | fixed | 2,500 | 2,500 | — |
| A12VIS_0001 | INDEX.TAB | fixed | 5,107 | 5,107 | — |
| A14VIS_0001 | INDEX.TAB | fixed | 4,514 | 4,514 | — |
| A15VIS_0001 | IMGINDEX.TAB | csv | 2,226 | 8,950 | label disagrees |
| A16VIS_0001 | INDEX.TAB | fixed | 8,178 | 8,176 | label disagrees |
| A17VIS_0001 | INDEX.TAB | fixed | 5,713 | 5,713 | — |
In both cases the file is internally consistent and the label is stale — demonstrated by reconciling each file's byte count against its parsed records, rather than asserted.
SAMPLE_ID is not always one sample
Some photographs show several samples ("10017, 10018, 10019, 10020") and some
Apollo 15 records use a wildcard for a group ("154XX"). Multi-sample
photographs are attributed to every sample they show; wildcards are kept out of the join
rather than expanded into associations the archive never asserted. Getting this wrong
under-counted photographed samples by 125.
A fetch either returns real bytes from NASA or raises. There is no synthetic fallback and no mock path; a test scans the source tree for the machinery such a fallback needs and fails if it appears.
Assert the operation changed something. Each step guards its postcondition — and that row-count guard is what caught the two archive defects above.
curator.jsc.nasa.gov/robots.txt is a blanket Disallow: /. NASA
separately publishes REST APIs on that host for programmatic use, and those are the only
paths this client calls there — it refuses anything else on that host. The compendium
index is opt-in behind a flag, fetched once, and no PDF is ever mirrored: compendium
entries are linked, not copied.