Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion packages-ts/core/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages-ts/markets/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages-ts/meta/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages-ts/weather/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages/core/pyproject.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
2 changes: 1 addition & 1 deletion packages/markets/pyproject.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
2 changes: 1 addition & 1 deletion packages/weather/pyproject.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
Loading