From 050b0f6805a71462a2b9e9b0f4aa9ffb04708dea Mon Sep 17 00:00:00 2001 From: helloiamvu Date: Sun, 21 Jun 2026 11:20:30 +0200 Subject: [PATCH] =?UTF-8?q?chore(release):=20bump=20version=201.9.0=20?= =?UTF-8?q?=E2=86=92=201.10.0=20(CWOP=20adapter)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the APRS-IS Citizen Weather Observer Program adapter: scan/nearby/stream/snapshot/latest/history/persist_observations, 6-layer QC, monthly parquet persistence. Parity firewall intact — no research()/merge/live wiring added. --- CHANGELOG.md | 24 ++++++++++++++++++++++++ packages-ts/core/package.json | 2 +- packages-ts/markets/package.json | 2 +- packages-ts/meta/package.json | 2 +- packages-ts/weather/package.json | 2 +- packages/core/pyproject.toml | 2 +- packages/markets/pyproject.toml | 2 +- packages/weather/pyproject.toml | 2 +- 8 files changed, 31 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af6c231..a38236a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,30 @@ All notable changes to `mostlyright`. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.10.0] — 2026-06-21 — CWOP adapter (PWS live stream + backtest cache) + +Adds the **Citizen Weather Observer Program (APRS-IS) adapter** (`mostlyright.weather.cwop`) as a standalone live data source for Personal Weather Stations. Deliberately isolated from the parity-critical core — CWOP data never enters `research()`, `merge/observations.py`, or `live/_sources.py`. + +### Added +- **`mostlyright.weather.cwop` public surface:** + - `nearby(icao, *, radius_km, min_count)` — discover nearby CWOP stations from an ICAO anchor + - `scan(stations)` — batch single-observation fetch for a station list + - `stream()` — async generator yielding live APRS-IS packets + - `snapshot(stations, *, persist)` — returns a `schema.cwop.v1` DataFrame; `persist=True` also writes the backtest parquet cache + - `latest(station)` — most-recent observation for a single station + - `history(station, from_date, to_date, *, qc_status)` — backtest replay from persisted cache, returns `schema.cwop.v1` DataFrame + - `persist_observations(observations)` — explicit write path for custom ingestion loops +- **6-layer QC** — weighted geometric mean (0.0–1.0): range (0.20), temporal consistency (0.20), indoor detection (0.15), buddy/ASOS check (0.20), solar-radiation bias (0.10), reliability (0.15). `< 0.3` → dropped, `0.3–0.7` → flagged, `> 0.7` → clean. History-dependent layers (indoor ≥24 h, solar ≥7 d) pass until enough data accumulates. +- **Persistence** — monthly parquet at `$HOME/.mostlyright/cache/cwop/{station}/{year}/{month}.parquet` (honors `MOSTLYRIGHT_CACHE_DIR`). `filelock`-guarded read-modify-write merge, dedup by `(station_id, observed_at)` first-seen-wins. No current-month skip (CWOP is ephemeral — unlike re-fetchable AWC/IEM, the current month is the only retention opportunity). +- **In-house APRS parser** (`weather/_aprs.py`) — MIT-licensed, no GPLv2 `aprslib` dependency; pure stdlib (`socket` + `re`). +- **`NoCWOPDataError`** — subclass of `NoLiveDataError`; raised instead of returning `[]`/`None`. +- **`schema.cwop.v1`** — new schema, accepts source tags `"cwop.live"` and `"cwop.cache"` via `_registered_sources`. `schema.observation.v1` `observation_type` enum is untouched (parity firewall). +- **`[cwop]` extra** — pulls `pandas` for `snapshot()`/`history()` DataFrames. + +### Notes +- **Parity firewall holds.** CWOP is not registered in `research()`, `merge/observations.py` (`SOURCE_PRIORITY`), or `live/_sources.py`. Models access CWOP only through `cwop.history()` — a DataFrame the strategy joins itself, never the settlement join. +- **Python-only release.** No public TS API surface change; npm packages bump to 1.10.0 in lockstep with no functional change. + ## [1.9.0] — 2026-06-20 — Global NATIVE satellite ring (live path) Extends the Phase 25 GOES extractor to **entire-world coverage at native-L2 fidelity on the live/self-parse path** — one SDK, no fork. Each instrument family is a distinct, leakage-safe `source` so a model trained on one never silently reconciles against another. The anonymous ring is landed and routed: GOES + Himawari + VIIRS (no key). EUMETSAT Meteosat SEVIRI landed its CGMS projection + OAuth boundary (golden-vector verified, synthetic-fixture-tested) but its **live Data-Store GRIB file reader is a forward seam** — so Meteosat is reachable by explicit `satellite=` and gated out of auto-routing (Europe/Africa falls back to the honest VIIRS fill) until the reader lands. GMGSI mosaic was dropped (lower fidelity, off-brand for a source-identity SDK). Hosted delivery stays a Phase-27 seam. diff --git a/packages-ts/core/package.json b/packages-ts/core/package.json index a002196..e8583a4 100644 --- a/packages-ts/core/package.json +++ b/packages-ts/core/package.json @@ -1,6 +1,6 @@ { "name": "@mostlyrightmd/core", - "version": "1.9.0", + "version": "1.10.0", "description": "TypeScript SDK core for quants, ML pipelines, and AI agents: types, schemas, validators, temporal-safety primitives, and the research() join over weather data + prediction-market settlements. Local-first, no hosted backend.", "keywords": [ "weather", diff --git a/packages-ts/markets/package.json b/packages-ts/markets/package.json index 3dcf9ea..9415db3 100644 --- a/packages-ts/markets/package.json +++ b/packages-ts/markets/package.json @@ -1,6 +1,6 @@ { "name": "@mostlyrightmd/markets", - "version": "1.9.0", + "version": "1.10.0", "description": "Prediction-market data for TypeScript / Node — Kalshi NHIGH/NLOW weather-contract resolvers, Polymarket discovery + settlement, and Kalshi + Polymarket trade history. For quants, backtesting, and ML training pipelines.", "keywords": [ "kalshi", diff --git a/packages-ts/meta/package.json b/packages-ts/meta/package.json index 285284b..295996e 100644 --- a/packages-ts/meta/package.json +++ b/packages-ts/meta/package.json @@ -1,6 +1,6 @@ { "name": "mostlyright", - "version": "1.9.0", + "version": "1.10.0", "description": "Public-data SDK for TypeScript — one import for quants, ML pipelines, and AI agents. Adapters ship weather (METAR, ASOS, GHCNh, NWS CLI) and prediction-market settlements (Kalshi NHIGH/NLOW, Polymarket) today; SEC filings, Federal Reserve series, court filings, FDA approvals, and equities are next. Local-first, no hosted backend.", "keywords": [ "weather", diff --git a/packages-ts/weather/package.json b/packages-ts/weather/package.json index 53f1843..921ba60 100644 --- a/packages-ts/weather/package.json +++ b/packages-ts/weather/package.json @@ -1,6 +1,6 @@ { "name": "@mostlyrightmd/weather", - "version": "1.9.0", + "version": "1.10.0", "description": "Weather data for TypeScript / Node — live METAR (AWC), ASOS archive (IEM), historical observations (GHCNh), and NWS climate text products (CLI). For quants, ML training pipelines, and weather-bot agents. Direct public-API access, no hosted backend.", "keywords": [ "weather", diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml index 2546c45..d8baebc 100644 --- a/packages/core/pyproject.toml +++ b/packages/core/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "mostlyrightmd" -version = "1.9.0" +version = "1.10.0" description = "Python SDK for quants, ML engineers, and AI agents — one interface to public data. Adapters ship weather + prediction-market settlements (Kalshi NHIGH/NLOW, Polymarket) today; SEC filings, Federal Reserve series, court filings, FDA approvals, and equities are next. Schema-versioned, leakage-free, local-first. Imports as `mostlyright`." readme = "README.md" license = "MIT" diff --git a/packages/markets/pyproject.toml b/packages/markets/pyproject.toml index 18ee944..6236956 100644 --- a/packages/markets/pyproject.toml +++ b/packages/markets/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "mostlyrightmd-markets" -version = "1.9.0" +version = "1.10.0" description = "Prediction-market data for Python — Kalshi NHIGH/NLOW weather-contract resolvers, Polymarket discovery + settlement, and Kalshi + Polymarket trade history. For quants, backtesting, and ML training pipelines. Imports as `mostlyright.markets`." readme = "README.md" license = "MIT" diff --git a/packages/weather/pyproject.toml b/packages/weather/pyproject.toml index 228e4f7..c66a4a6 100644 --- a/packages/weather/pyproject.toml +++ b/packages/weather/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "mostlyrightmd-weather" -version = "1.9.0" +version = "1.10.0" description = "Weather data for Python — live METAR (AWC), ASOS archive (IEM), historical observations (GHCNh), and NWS climate text products (CLI). For quants, ML training pipelines, and weather-bot agents. Direct public-API access, no hosted backend. Imports as `mostlyright.weather`." readme = "README.md" license = "MIT"