API stability

The packages are pre-1.0 and versioned accordingly; this page states what that means so it is a policy rather than a mood.

Public API. The documented names importable from a package’s top level (and its documented submodules, e.g. risksim.metrics, risksim.uncertainty, risksim.dependence). Anything prefixed with an underscore — attributes like _design_info_ included — is internal and may change without notice.

Versioning. Patch releases (0.x.Y) never intentionally change public behavior: fixes, docs, performance. Minor releases (0.X.0) may change or remove public API, always with a changelog entry stating what changed and why; where feasible, a deprecated name keeps working for one minor release with a DeprecationWarning before removal. Numerical outputs may shift within documented tolerances when an underlying method is corrected — a correction is a change, and the changelog says so (see, for example, the null_deviance_ and IRLS notes in the ratingmodels changelog).

Cross-package floors. Sibling dependencies use compatible-release pins (actuarialpy~=0.40.0 style): a package release is tested against the sibling minor it names. The dependency direction is deliberately thin — ratingmodels requires actuarialpy; everything else cooperates through small duck-typed protocols (sf + mean_excess) rather than imports.

Python. All packages support Python 3.10–3.13, enforced by the CI matrix on Linux and Windows.

What 1.0 will mean. Freezing the public surface listed above, with removals thereafter only via a full deprecation cycle. The gate is not feature count; it is a release or two of the current surface in the wild without design regrets.