Listening for events…

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. BOU Boulder, USA; ESK Eskdalemuir, UK; KAK Kakioka, Japan).
  • Full-roster deep pull (no-spiking rule). The live intermagnet fetcher hard-codes 9 representative observatories; the dex registers the full published network: 154 observatories across ~50 countries (16 marked closed), pulled from the BGS GIN GetCapabilities catalog (?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 intermagnet feed by IAGA code (quality_flag): observation count, coverage span, mean/min/max total-field intensity f (nT), unit — cited to intermagnet per 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's extra_json. Clean per feedback_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 with neutron_monitor and tide_gauge), reusing the event_storehouse write + disk-rebuilt-index machinery via its base_dir argument.

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 the closed flag; 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 the data/intermagnet_roster_cache/getcap.json cache 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.
Live Feed