🤖 from Claude
Design record: docs/design/sparse_coverage.md §4 (D8/D9), tracked on #198. Blocked by #199 (needs the store-root conventions: morton_hive.json, root-object exception to the node invariant).
What
At end of run, the dispatcher writes {store_root}/coverage.moc — the store's populated-shard coverage as a MOC (mortie's compressed multi-order coverage). This is the roll-our-own replacement for consolidated metadata (disabled by default; measured +70 s/worker), answering "where does data exist?" in one GET.
How (the fast part)
No S3 walk. The dispatcher already tracks per-shard completion via the status channel poller (runner.py _async_result_poll); build the MOC from that completion list in memory (existing morton_coverage/MOC machinery — milliseconds) and PUT one small object. Spatially coherent coverage compresses well (~50k CONUS shards → few KB).
Semantics
- Cache, not truth (D9): stamped with
generated_at + source (dispatcher vs sweep); regenerable from a tree walk. The strongly-consistent delimiter-LIST walk remains ground truth — a run that crashes before writing its MOC degrades to walking, never to wrong answers.
- Readers: GET manifest → GET MOC →
moc_and against query AOI → arithmetic hive paths. Zero LISTs on the hot path (D10).
Open questions (from the design doc)
🤖 from Claude
Design record:
docs/design/sparse_coverage.md§4 (D8/D9), tracked on #198. Blocked by #199 (needs the store-root conventions:morton_hive.json, root-object exception to the node invariant).What
At end of run, the dispatcher writes
{store_root}/coverage.moc— the store's populated-shard coverage as a MOC (mortie's compressed multi-order coverage). This is the roll-our-own replacement for consolidated metadata (disabled by default; measured +70 s/worker), answering "where does data exist?" in one GET.How (the fast part)
No S3 walk. The dispatcher already tracks per-shard completion via the status channel poller (
runner.py_async_result_poll); build the MOC from that completion list in memory (existingmorton_coverage/MOC machinery — milliseconds) and PUT one small object. Spatially coherent coverage compresses well (~50k CONUS shards → few KB).Semantics
generated_at+ source (dispatcher vs sweep); regenerable from a tree walk. The strongly-consistent delimiter-LIST walk remains ground truth — a run that crashes before writing its MOC degrades to walking, never to wrong answers.moc_andagainst query AOI → arithmetic hive paths. Zero LISTs on the hot path (D10).Open questions (from the design doc)
.moc(JSON nested-range pairs? packed-word.npy?) — needs freezing alongside the mortie spec; FITS/IVOA explicitly out (RangeMOC /moc-crate adoption decision (split from #35 Phase 3) espg/mortie#50).MAX_DEPTH = 18(v1.0: mixed-order MOC semantics espg/mortie#61) — fine for shard-order coverage (≤ 11 today), blocks cell-order domains at 19+.