Scope freeze — magnetic_observatory Locationdex kind
Frozen 2026-06-26. Third kind of the Locationdex family
(docs/locationdex-framework.md), after the neutron_monitor pilot and tide_gauge. The
slot is a place: one fixed INTERMAGNET geomagnetic observatory. This is the
intermagnet admin source (BGS GIN, https://imag-data.bgs.ac.uk/GIN_V1/GINServices),
organized — not a new ingestion.
The slot
- One slot = one INTERMAGNET observatory. Slot ID = the 3-letter IAGA code (e.g.
BOUBoulder, USA;ESKEskdalemuir, UK;KAKKakioka, Japan). - Full-roster deep pull (no-spiking rule). The live
intermagnetfetcher hard-codes 9 representative observatories; the dex registers the full published network: 154 observatories across ~50 countries (16 marked closed), pulled from the BGS GINGetCapabilitiescatalog (?Request=GetCapabilities&format=json), 100% with coordinates. - An observatory IS a place, so each slot carries lat/lon + a PostGIS point (unlike a Yeardex year-slot, whose geo stays null). A spatial sweep is therefore buildable later; this kind stays catalog-first.
Slot contents
- Identity: IAGA code, observatory name, country.
- Place: latitude, longitude, elevation, PostGIS point. (Catalog longitude is 0..360; normalized to -180..180 to match the live feed and PostGIS.)
- Station character:
closed(decommissioned vs operating), data-embargo hours — the permanent attributes that classify the observatory. - Measured-series summary joined from the live
intermagnetfeed by IAGA code (quality_flag): observation count, coverage span, mean/min/max total-field intensity f (nT), unit — cited tointermagnetper the universal multi-source rule. Observatories not yet delivering usable measurements are real registry places (has_series=false) and are kept, not dropped.
Measured reality
- IN: the geomagnetic field series = the measured magnetometer reading at the
observatory (what the field physically did). Total-field f in
value; x/y/z components in the feed'sextra_json. Clean perfeedback_measured_reality_only. - OUT: no model output is involved. INTERMAGNET serves raw/best-available magnetometer readings; the dex draws only those. (Geomagnetic indices derived from these — Kp, Dst — are separate sources, not part of this observatory roster.)
Storage
- Spine source
intermagnet_stations(registry,active=False— refreshed by re-running the reload, not by a 60s feed). - Slots in the third sibling storehouse
data/location_storehouse/(shared withneutron_monitorandtide_gauge), reusing theevent_storehousewrite + disk-rebuilt-index machinery via itsbase_dirargument.
Gotchas (reuse-critical)
- Catalog longitude is 0..360, not -180..180. Normalize (
lon - 360 if lon > 180) or every Eastern-hemisphere observatory lands on the wrong side of the globe. (closed)is encoded in the Name string, not a field — parse it out and derive both a clean name and theclosedflag; country is the last comma-segment of the cleaned name.- httpx hangs on the BGS GIN endpoint (known platform gotcha) — the reload shells out
to
curl, and reads thedata/intermagnet_roster_cache/getcap.jsoncache first. - Some streaming observatories deliver all-null f (e.g. ESK during the staged window):
the series summary counts only non-null
value, so a register-but-no-data station rolls up as registry-only, not a phantom series. 9 stream, 8 with usable total-field values.
Frozen vs deferred-v2
- Frozen (this brick): full 154-observatory roster as place-slots; measured total-field series summary cited; catalog index.
- Deferred-v2: spatial sweep (a magnetic-observatory slot CAN anchor a radius read-across of other phenomena); full time-series streaming of every observatory (the live feed covers 9); x/y/z component and declination/inclination enrichment; per-country or cutoff-latitude stratified reads; merge of the IAGA roster with Kp/Dst index sources.