Skip to content

mostlyright.core.schemas.observation_ledger

mostlyright.core.schemas.observation_ledger

Section titled “mostlyright.core.schemas.observation_ledger”

schema.observation_ledger.v1 — silver-tier observation ledger.

Phase 2.1 (LINEAGE-01..05). Rows-per-source long format: one row per (station_code, observed_at, source) ledger key. Multiple rows per (station_code, observed_at) are valid silver-tier outputs (one per contributing source: AWC, IEM, GHCNh). Read-time query_time_merge(silver_df, policy=LIVE_V1) materializes the single-row-per-key gold for Mode-1 parity callers.

This is a NEW canonical schema separate from schema.observation.v1 (the v0.14.1 Mode-1 gold-tier shape) — per codex review 2026-05-22 P2 finding “Keep observation.v1 out of the ledger refactor”, the existing gold schema stays unchanged so CORE-03 + parity callers see no breaking change.

ObservationLedgerSchema()schema.observation_ledger.v1 — silver-tier rows-per-source ledger.

class mostlyright.core.schemas.observation_ledger.ObservationLedgerSchema

Section titled “class mostlyright.core.schemas.observation_ledger.ObservationLedgerSchema”

Bases: Schema

schema.observation_ledger.v1 — silver-tier rows-per-source ledger.

Natural key: (station_code, observed_at, source, parser_name, as_of_time, ingestion_id).

Multiple rows per (station_code, observed_at) are valid — one per contributing source.

COLUMNS : ClassVar[list[ColumnSpec]] = [ColumnSpec(name=‘station_code’, dtype=‘string’, units=None, nullable=False, enum_values=None, notes=”), ColumnSpec(name=‘observed_at’, dtype=‘timestamp_utc’, units=None, nullable=False, enum_values=None, notes=”), ColumnSpec(name=‘observation_type’, dtype=‘enum’, units=None, nullable=False, enum_values=(‘METAR’, ‘SPECI’), notes=”), ColumnSpec(name=‘source’, dtype=‘enum’, units=None, nullable=False, enum_values=(‘awc’, ‘iem’, ‘ghcnh’, ‘ncei’), notes=‘ncei reserved per D-2.1-09; never written in v0.1.0.’), ColumnSpec(name=‘temp_c’, dtype=‘float64’, units=‘celsius’, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘dewpoint_c’, dtype=‘float64’, units=‘celsius’, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘parser_name’, dtype=‘enum’, units=None, nullable=True, enum_values=(‘mostlyright_v1’, ‘iem’, ‘ncei’, ‘ghcnh’), notes=”), ColumnSpec(name=‘parser_version’, dtype=‘string’, units=None, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘ingestion_id’, dtype=‘string’, units=None, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘as_of_time’, dtype=‘timestamp_utc’, units=None, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘source_received_at’, dtype=‘string’, units=None, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘qc_status’, dtype=‘enum’, units=None, nullable=True, enum_values=(‘clean’, ‘flagged’, ‘suspect’), notes=”), ColumnSpec(name=‘observation_kind’, dtype=‘enum’, units=None, nullable=True, enum_values=(‘METAR’, ‘SPECI’), notes=”), ColumnSpec(name=‘provenance’, dtype=‘enum’, units=None, nullable=True, enum_values=(‘legacy’, ‘reingested’), notes=”), ColumnSpec(name=‘observation_quality’, dtype=‘enum’, units=None, nullable=True, enum_values=(‘clean’, ‘flagged’, ‘suspect’), notes=‘Lineage row-quality flag per LINEAGE-01; distinct from qc_status enum slot AND distinct from the obs_qc_status bitmask column per QC-05.’)]

Section titled “COLUMNS : ClassVar[list[ColumnSpec]] = [ColumnSpec(name=‘station_code’, dtype=‘string’, units=None, nullable=False, enum_values=None, notes=”), ColumnSpec(name=‘observed_at’, dtype=‘timestamp_utc’, units=None, nullable=False, enum_values=None, notes=”), ColumnSpec(name=‘observation_type’, dtype=‘enum’, units=None, nullable=False, enum_values=(‘METAR’, ‘SPECI’), notes=”), ColumnSpec(name=‘source’, dtype=‘enum’, units=None, nullable=False, enum_values=(‘awc’, ‘iem’, ‘ghcnh’, ‘ncei’), notes=‘ncei reserved per D-2.1-09; never written in v0.1.0.’), ColumnSpec(name=‘temp_c’, dtype=‘float64’, units=‘celsius’, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘dewpoint_c’, dtype=‘float64’, units=‘celsius’, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘parser_name’, dtype=‘enum’, units=None, nullable=True, enum_values=(‘mostlyright_v1’, ‘iem’, ‘ncei’, ‘ghcnh’), notes=”), ColumnSpec(name=‘parser_version’, dtype=‘string’, units=None, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘ingestion_id’, dtype=‘string’, units=None, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘as_of_time’, dtype=‘timestamp_utc’, units=None, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘source_received_at’, dtype=‘string’, units=None, nullable=True, enum_values=None, notes=”), ColumnSpec(name=‘qc_status’, dtype=‘enum’, units=None, nullable=True, enum_values=(‘clean’, ‘flagged’, ‘suspect’), notes=”), ColumnSpec(name=‘observation_kind’, dtype=‘enum’, units=None, nullable=True, enum_values=(‘METAR’, ‘SPECI’), notes=”), ColumnSpec(name=‘provenance’, dtype=‘enum’, units=None, nullable=True, enum_values=(‘legacy’, ‘reingested’), notes=”), ColumnSpec(name=‘observation_quality’, dtype=‘enum’, units=None, nullable=True, enum_values=(‘clean’, ‘flagged’, ‘suspect’), notes=‘Lineage row-quality flag per LINEAGE-01; distinct from qc_status enum slot AND distinct from the obs_qc_status bitmask column per QC-05.’)]”