V0.31.0 Release Readiness#
Decision#
v0.31.0 is ready as a Git-tag-only release.
Release conclusion:
downstream_discovery_task_bridge
Package Metadata#
package version:
0.31.0git tag:
v0.31.0(do not create until explicitly authorized after review)PyPI/TestPyPI: deferred until
v1.0or later
Do not publish to TestPyPI or PyPI for v0.31.0.
Public Surface#
New in v0.31 — downstream discovery task bridge (submodule-only)#
The v0.31 arc adds one narrow scientific delta: a submodule-only downstream discovery task bridge under pdelie.tasks. No root pdelie export is added. The pdelie.residuals.weak_1d PDELie-native weak-derivative path remains available and distinct.
Stable public submodule surfaces:
pdelie.tasks.run_pysindy_pde_task— executable PySINDyPDELibrary-backed sparse-discovery task runner (v0.31b1). Periodic scalar 1D only. Layer-1 boundary-condition guard raisesPySINDyDiscoveryUnsupportedBoundaryErrorbefore any PySINDy call whenis_x_periodic(field)is false. Returns a strict-JSONdiscovery_task_result.pdelie.tasks.summarize_discovery_task_result— strict-JSON payload assembler (v0.31b1). Enforces the 22-key composed schema, recordssummary_type = "discovery_task_result",summary_schema_version = "0.1", andpysindy_bridge_variant = "periodic_only_v1". Embeds the v0.31b0-frozen backend-nativesummarize_discovery_resultverbatim underunderlying_discovery_result.pdelie.tasks.PySINDyDiscoveryUnsupportedBoundaryError— subclass ofScopeValidationError. Raised at thepdelie.tasks.discoveryentry when a nonperiodic-xFieldBatchis supplied.pdelie.tasks.inspect_pysindy_weak_pde_library— diagnostic-only wrapper around PySINDy’sWeakPDELibrary(v0.31b2). Two-layer scope guard (periodic-x, uniform x/t grids, batch==1, single var, K-scaled grid-sufficiency floormax(8, 4*K), unsupported PySINDy API). Returns a strict-JSONpdelie_weak_pde_library_diagnostic.pdelie.tasks.summarize_pysindy_weak_pde_library_diagnostic— strict-JSON payload assembler for the diagnostic-only wrapper (v0.31b2). Enforces the 27-key composed schema.pdelie.tasks.WeakPDELibraryDiagnostic— caller-declared, JSON-safe library-configuration dataclass withas_dict()(v0.31b2). Rejects NaN/Inf at construction via_validate_strict_json_compatible.pdelie.examples.run_downstream_discovery_task_bridge_exampleand CLIpython -m pdelie.examples.downstream_discovery_task_bridge(v0.31c) — composed JSON-only demonstration runner. Not a new report schema.
All names above are exposed from pdelie.tasks (or pdelie.examples) as their canonical submodule-only public surface. None appear at the root pdelie namespace.
Discovery task support#
input_layout:
"scalar_1d_uniform".periodic scalar 1D only.
backend: PySINDy
PDELibrary(or any caller-configuredpysindy.SINDymodel per the v0.31b1 adapter loosening).output
summary_type:"discovery_task_result".22-key top-level composed schema.
Strict-JSON composition:
_validate_strict_json_compatible(payload, name="discovery_task_result summary")invoked exactly once at the final composition boundary.pysindy_bridge_variant = "periodic_only_v1"on every produced TaskResult.Adapter loosening:
fit_pysindy_discoveryaccepts a caller-suppliedpysindy_modelkwarg (v0.31b1);config != Nonestill raises; theconfig=None, pysindy_model=Nonedefault path is byte-preserved for existing v0.30 callers.
Weak diagnostic support#
output
summary_type:"pdelie_weak_pde_library_diagnostic".diagnostic_only = Trueon every produced summary.27-key top-level composed schema.
method_family = "pysindy_weak_pde_library_polynomial_gauss_v1".test_function_family = "pysindy_weak_pde_library_polynomial_bump_v1".quadrature_rule = "pysindy_weak_pde_library_composite_gauss_v1".No WSINDy benchmark claim.
No noise-robustness claim.
No numerical equivalence with
pdelie.residuals.weak_1d. The PDELie-native weak-derivative path remains available and is retained through at leastv0.32close.Two-layer scope guard: nonperiodic-x rejected via
PySINDyDiscoveryUnsupportedBoundaryError(reused from v0.31b1); scope violations (dims, var_names, batch, uniform grids, K-scaled grid-sufficiency floor, unsupported PySINDy API) rejected viaScopeValidationError/SchemaValidationError.
Retained from earlier v0.x#
Canonical
FieldBatch → DerivativeBatch → ResidualBatch → GeneratorFamily → VerificationReportpipeline (frozen sincev0.1.x).All
v0.30runtime and reporting surfaces includingBoundaryConditionSpec, structuredFieldBatchschema 0.2, low-order finite-difference derivative backend, interior-only residual diagnostics, and the ambient supportability report layer.pdelie.residuals.weak_1dbehavior — unchanged.
Compatibility Policy#
The v0.31 downstream task bridge is a temporary compatibility surface. It validates against a single narrow PySINDy generation, and its compatibility constraints are all bounded:
PySINDy:
>=1.7.5,<2underpython_version < '3.12'.scikit-learn:
>=1.2.2,<1.3underpython_version < '3.12'.setuptools:
<82underpython_version < '3.12'— temporary constraint added by v0.31c1 because pysindy 1.7.5 importspkg_resourcesat package init and setuptools 82 removed that module.Python: downstream task support is validated on Python 3.11 only.
The v0.31c1 adversarial matrix confirmed:
setuptools 81.0.0: pass end-to-end.
setuptools 82.0.0: install succeeds but
import pysindyfails withModuleNotFoundError: No module named 'pkg_resources'.setuptools 83.0.0: same failure mode as 82.
Post-fix rebuilt-wheel verification confirms pip auto-downgrades an ambient setuptools 82/83 to 81 without any user co-install. Fresh-venv baseline: setuptools stays at the bundled 65.5.0, untouched.
Deferred to v0.31.1:
PySINDy 2.x support. Four independent 2.x API breaks are documented in
docs/design/PYSINDY_COMPATIBILITY_POLICY.md(SINDy kwargs removed; SINDy.fit signature; SINDy.differentiate removed; PDELibrary/WeakPDELibrary kwargs).Python 3.12+ downstream support. The
[downstream]extra is marker-scoped topython_version < '3.12'; a user on Python 3.12+ who invokes the task bridge receives a targeted, actionable error message that names the v0.31.1 deferral and states that reinstalling the same extra will not fix the environment.numpy>=2 floor bump. Coordinated with the PySINDy 2.x port.
No hidden manual installation step is required in the documented user path.
Public Example#
The v0.31c JSON-only demonstration runner:
Public submodule surface:
pdelie.examples.run_downstream_discovery_task_bridge_example.CLI:
python -m pdelie.examples.downstream_discovery_task_bridge.Composes both v0.31 paths on one manufactured periodic scalar 1D Heat field (T=64, X=64, K=16, seed=31000).
7-key top-level
summary_type = "downstream_discovery_task_bridge_example". NOT a new report schema — the composed wrapper carries the verbatim v0.31b1discovery_task_result(22 keys) and v0.31b2pdelie_weak_pde_library_diagnostic(27 keys) as children.Deterministic under the frozen seed via a private
_legacy_numpy_rng_seed_scopecontext manager (v0.31c1). Not thread-safe — PySINDy 1.7.5 uses the legacynp.randomglobal RNG and does not accept a modernGenerator.Uses only public submodule APIs (AST-checked in
tests/test_v0_31c_downstream_task_bridge_example.py).
Expected xfails ledger#
The v0.31.0 release close retains three declared xfails, each with a non-empty reason and each assigned to a documented follow-up milestone. None represent a genuine failure masked to make the suite green.
Node id |
Reason |
Strictness |
Owner milestone |
Planned disposition |
|---|---|---|---|---|
|
The runtime version guard on |
runtime-conditional |
|
KEEP as xfail until v0.31.1 lands the guard |
|
The same runtime version guard has not been landed on |
runtime-conditional |
|
KEEP as xfail until v0.31.1 |
|
Asks |
runtime-conditional |
provenance follow-up (v0.31.1 or earlier) |
KEEP as xfail until the follow-up lands |
Compatibility test / release-close validation#
pytest full suite baseline at v0.31.0 close: 1252 passed, 3 skipped, 3 xfailed (v0.31c1 close baseline) → 1253 passed, 3 skipped, 3 xfailed after adding the Python 3.12+ UX test.
ruff check .clean.mypy src/pdelie/tasks/clean.sphinx -b html -W --keep-going docs docs/_build/htmlclean.python -m build --sdist --wheelproducespdelie-0.31.0.tar.gzandpdelie-0.31.0-py3-none-any.whl.git diff --checkclean.
Clean-install smoke matrix:
Core-only (Python 3.11, no
[downstream]): install passes; task runner raisesImportErrornamingpdelie[downstream].Downstream (Python 3.11, ambient
setuptools>=82): pip auto-downgrades setuptools to 81;run_pysindy_pde_taskpasses (22-key summary, strict JSON);inspect_pysindy_weak_pde_librarypasses (27-key summary,diagnostic_only=True, strict JSON); example runner + CLI pass.Downstream (Python 3.11, fresh venv): setuptools stays at the bundled 65.5.0; smoke passes.
Python 3.12+ unsupported downstream behavior: targeted
ImportError(orScopeValidationErroron the weak path) message names Python 3.12, the v0.31.1 deferral, and states that reinstalling the same extra will not fix the environment. Verified bytests/test_v0_31c1_downstream_packaging_policy.py::test_v0_31_python_312_downstream_missing_extra_message_is_actionableunder monkeypatchedsys.version_info.
Boundaries / non-goals for v0.31.0#
No new discovery backend. PySINDy 1.x only.
No new summary type.
discovery_task_result(22 keys) andpdelie_weak_pde_library_diagnostic(27 keys) are the entire v0.31 report surface.No WSINDy benchmark claim. The
WeakPDELibrarywrapper is diagnostic-only.No noise-robustness claim.
No nonperiodic PySINDy discovery. Both task paths raise on nonperiodic-x inputs.
No PySINDy 2.x code. Deferred to
v0.31.1.No symmetry-method registry, no
SymmetryCandidateruntime. Deferred tov0.30.1.No PDEBench / The Well support claim.
No multi-channel / 2D widening. Deferred to
v0.34+.No new PDE.
No root pdelie export added.
No package version bump beyond
0.31.0.No PyPI or TestPyPI publication.
Deferred scope confirmed#
v0.31.1: PySINDy 2.x migration (four independent API breaks + numpy>=2 floor + Python 3.12+ downstream support + runtime version guard on unsupported pysindy versions).v0.30.1: submodule-onlySymmetryMethodregistry MVP +SymmetryCandidatewrapper contract freeze.v0.31.5: nonperiodic orbit/action scope decision.v0.32: external dataset readiness cookbooks (no benchmark claim).v0.33: first external symmetry candidate-generator method.v0.34: multi-channel / 2D contract widening scope decision.v0.35: trained-model extraction layer.v1.0: stable public engine + PyPI publish + optional root-entry decision.
Validation checklist#
[x] version bump
0.30.0 → 0.31.0inpyproject.tomlanddocs/conf.py.[x] release readiness document exists (this file).
[x]
CHANGELOG.mdv0.31.0 entry with the five subsections (Added / Compatibility / Diagnostics / Examples / Boundaries).[x]
docs/specs/support_matrix.v0_31.jsonwritten as strict JSON with the v0.31 additions.[x]
docs/planning/V0_31_DISCOVERY_TASK_BRIDGE_SCOPE.mdstatus → COMPLETE.[x]
docs/planning/PLAN.mdv0.31.0 release-close record.[x]
docs/planning/ROADMAP.mdv0.31 moved to completed releases; v0.31c1 marked completed; next active items called out explicitly.[x]
docs/specs/API_STABILITY.mdv0.31 final stable-surface note.[x]
configs/release_gate_manifest.json—"0.31"row extended in place;current_release_gate_job_namerenamed tov0_31-release-gate.[x]
.github/workflows/ci.ymlrelease-gate job renamedv0_30-release-gate → v0_31-release-gate.[x]
tests/test_current_release_gate.pyupdated to the new job name.[x] Full validation gates pass (pytest / ruff / mypy / sphinx / build / git diff-check).
[x] Clean-install smoke matrix (core-only, downstream, ambient setuptools 82/83, Python 3.12+ UX message).
[ ] Git tag
v0.31.0— deferred to explicit authorization after review.