release(v1.7.0): GEFS/CFS ensemble member selection (#74)#76
Merged
Conversation
- 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>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
✅ Docs-required check: PASS API-surface change includes docs updates — no reminder needed. API-surface files changed: Docs files changed: |
|
Parity ticket gate: PASSED See |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Integration PR from
merged-vision→mainfor the v1.7.0 minor release.member=ensemble selector onforecast_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 loudValueErrors raised before the[nwp]extra imports.member=None(default) is byte-identical to v1.6.0. Works on single-cycle andcycle_range_*backfill paths. No output-schema change (nomembercolumn — selector only). TS parity:ForecastNwpOptions.member?(signature-forward; TS NWP stub unchanged).Changed (#74):
mostlyrightmd[research]extra floormostlyrightmd-weather>=1.6.0→>=1.7.0(core wrapper threadsmember=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
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.pyVersion
1.6.0→1.7.0across all 3pyproject.toml+ 4package.json; CHANGELOG[1.7.0]section added;uv.lockrefreshed.🤖 Generated with Claude Code