Skip to content

release(v1.7.0): GEFS/CFS ensemble member selection (#74)#76

Merged
helloiamvu merged 7 commits into
mainfrom
merged-vision
Jun 12, 2026
Merged

release(v1.7.0): GEFS/CFS ensemble member selection (#74)#76
helloiamvu merged 7 commits into
mainfrom
merged-vision

Conversation

@helloiamvu

Copy link
Copy Markdown
Member

Summary

Integration PR from merged-visionmain for the v1.7.0 minor release.

PR Issue Type
#75 #74 feat — member= ensemble selector on forecast_nwp() (GEFS/CFS)

Fixes #74.

What's in 1.7.0

Added (#74): forecast_nwp(station, "gefs", member="p05") — ensemble member selection for GEFS (c00/p01..p30/avg/spr) and CFS (01..04), validated against the closed member enums with loud ValueErrors raised before the [nwp] extra imports. member=None (default) is byte-identical to v1.6.0. Works on single-cycle and cycle_range_* backfill paths. No output-schema change (no member column — selector only). TS parity: ForecastNwpOptions.member? (signature-forward; TS NWP stub unchanged).

Changed (#74): mostlyrightmd[research] extra floor mostlyrightmd-weather>=1.6.0>=1.7.0 (core wrapper threads member= to the weather impl). Default calls stay skew-tolerant — the wrapper passes the kwarg only when set.

Review record

Full three-reviewer loop per REVIEW-DISCIPLINE.md on #75 (mixed Python+TS): Codex (gpt-5.5, medium) PASS ×3 dispatches; Python Architect — iter-1 found 1 HIGH (untested public single-cycle member threading; CI lacks [nwp]), fixed with a mutation-verified test, iter-2 PASS; TypeScript Architect PASS. Post-loop skew-guard amendment (conditional member threading + research floor bump) re-reviewed by Codex + Python Architect — both PASS.

Verification

  • Full PR feat(forecast_nwp): expose member= ensemble selector for GEFS/CFS (#74) #75 CI: 19/19 checks green (fast-suite 3.11/3.12/3.13 ×2 workflows, pandas-3-suite, polars-suite, coverage-gate, test-ts, wheel-metadata-check ×2, parity-ticket-check, docs-required, changes ×2)
  • Release smoke on this branch: pnpm -r build + typecheck, uv sync, ruff check + format --check, uv run pytest -m "not live" -q (incl. the HARD parity gate), uv build --all-packages + scripts/check_wheel_metadata.py

Version

1.6.01.7.0 across all 3 pyproject.toml + 4 package.json; CHANGELOG [1.7.0] section added; uv.lock refreshed.

⚠️ Release tags held: v1.7.0 + vts-1.7.0 (PyPI + npm trusted publishing) are pushed only after this PR merges, on the main merge commit, per .planning/RELEASE-RUNBOOK.md.

🤖 Generated with Claude Code

minereda and others added 7 commits June 12, 2026 15:06
- Add keyword-only member: str | None = None to the weather impl
- Validate member EARLY (pre-[nwp]-import): reject on non-member models
  naming gefs/cfs; reject out-of-enum values listing sorted valid members
- Thread member to build_fetch_plan via per_model_kwargs only when non-None
  (member=None stays byte-identical — never overrides the path-builder default)
- Multi-cycle recursion forwards member to each single-cycle call
- TDD: TestForecastNwpMember (A-F) written RED first, then GREEN

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ity (#74)

- Core mostlyright.forecasts.forecast_nwp accepts member= and forwards it
  verbatim to the weather impl (validation stays in the weather package)
- TS ForecastNwpOptions exposes optional member?: string (signature-forward
  parity per the Dual-SDK rule; runtime stub still throws)
- TDD: core wrapper test written RED (TypeError) then GREEN; TS test locks
  the member? option shape at compile time

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…count (#74)

- GEFS row: 31-member ensemble (c00 + p01..p30) plus avg/spr statistical
  products — 33 values (was incorrectly '32 members')
- CFS row: document member= (01..04, default 01)
- Add an 'Ensemble members (member=)' section with GEFS/CFS examples,
  validation behavior, and the no-member-column scope note

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… architect iter-1 HIGH)

The mirror-loop call site passing member= to _try_fetch_records_for_mirror
had zero test executions (CI lacks the [nwp] extra; Tests C/E hit the
helper directly; Test F intercepts the recursion). Stub the lazy [nwp]
imports into sys.modules and capture the helper kwargs through the public
forecast_nwp() entry point. Mutation-verified: deleting member=member at
the call site fails this test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…r floor to 1.7.0 (#74)

Core 1.7.0 passing member=member unconditionally would TypeError on EVERY
forecast_nwp call against a pre-member mostlyrightmd-weather (<=1.6.0)
installed outside the [research] extra. Thread member only when set
(default calls stay skew-tolerant), pin the [research] extra to
weather>=1.7.0 (mirrors #64 codex P1 precedent for variables=), and pin
the default-call omission with a core-layer test mirroring weather Test D.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat(forecast_nwp): expose member= ensemble selector for GEFS/CFS (#74)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Docs-required check: PASS

API-surface change includes docs updates — no reminder needed.

API-surface files changed:

packages-ts/weather/src/forecasts/nwp-stub.ts
packages/core/src/mostlyright/forecasts.py
packages/weather/src/mostlyright/weather/forecast_nwp.py

Docs files changed:

CHANGELOG.md
docs/forecasts.md

@github-actions

Copy link
Copy Markdown

Parity ticket gate: PASSED

parity-ticket-check: PR touches BOTH Python and TypeScript trigger surfaces — paired-language change satisfies the gate.

See CROSS-SDK-SYNC.md §2 for the workflow.

@helloiamvu helloiamvu merged commit 98028a9 into main Jun 12, 2026
20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs/forecasts.md documents member= kwarg for GEFS but forecast_nwp() doesn't expose it

2 participants