# Support Policy

This is a community maintained project run by volunteers. What that means in
practice is:

* Responses to issues and PRs depend on available time and energy.
* If you care, contribute (see <project:#contributing>) and get involved.

## Supported rules_python Versions

In general, only the latest version is supported. Backporting changes is
done on a best-effort basis based on severity, risk of regressions, and
the willingness of volunteers.

If you want or need particular functionality backported, then the best way
is to open a PR to demonstrate the feasibility of the backport.

### Backports and Patch Releases

Backports and patch releases are provided on a best-effort basis. Only fixes are
backported. Features are not backported.

Backports can be done to older releases, but only if newer releases also have
the fix backported. For example, if the current release is 1.5, in order to
patch 1.4, version 1.5 must be patched first.

Backports can be requested by [creating an issue with the release or backport
tracking template][backport-issue] or by sending a pull request performing the
backport. Creating an issue is preferred because it triggers automation to
perform all necessary backporting steps. See the dev guide for
[how to create a backport PR](creating-backport-prs).

[backport-issue]: https://github.com/bazel-contrib/rules_python/issues/new?template=release_tracking_template.md

## Supported Bazel Versions

The supported Bazel versions are:

1. The latest rolling release
2. The active major release.
3. The major release prior to the active release.

For (2) and (3) above, only the latest minor/patch version of the major release
is officially supported. Earlier minor/patch versions are supported on a
best-effort basis only. We increase the minimum minor/patch version as necessary
to fix bugs or introduce functionality relying on features introduced in later
minor/patch versions.

See [Bazel's release support matrix](https://bazel.build/release#support-matrix)
for what versions are the rolling, active, and prior releases.

## Supported Python versions

As a general rule, we test all released non-EOL Python versions. Different
interpreter versions may work but are not guaranteed. We are interested in
staying compatible with upcoming unreleased versions, so if you see that things
stop working, please create tickets or, more preferably, pull requests.

## Supported Platforms

We only support the platforms that our continuous integration jobs run on, which
are Linux, Mac, and Windows.

In order to better describe different support levels, the following acts as a rough
guideline for different platform tiers:
* Tier 0 - The platforms that our CI runs on: `linux_x86_64`, `osx_arm64`, `RBE linux_x86_64`.
* Tier 1 - The platforms that are similar enough to what the CI runs on: `linux_aarch64`,
  `osx_x86_64`.
  What is more, `windows_x86_64` is in this list, as we run tests in CI, but
  developing for Windows is more challenging, and features may come later to
  this platform.
* Tier 2 - Other platforms have varying levels of support, e.g.,
  `linux_s390x`, `linux_ppc64le`, `windows_arm64`, `nix`.

:::{note}
Code to support Tier 2 platforms is allowed, but regressions will be fixed on a
best-effort basis, so feel free to contribute by creating PRs.

If you would like to provide/sponsor CI setup for a platform that is not Tier 0,
please create a ticket or contact the maintainers on Slack.
:::

## Compatibility Policy

We generally follow the [Bazel Rule
Compatibility](https://bazel.build/release/rule-compatibility) guidelines, which
provides a path from an arbitrary release to the latest release in an
incremental fashion.

Breaking changes are allowed, but follow a process to introduce them over
a series of releases to so users can still incrementally upgrade. See the
[Breaking Changes](#breaking-changes) doc for the process.


## Experimental Features

An experimental feature is functionality that may not be ready for general
use and may change quickly and/or significantly. Such features are denoted in
their name or API docs as "experimental". They may have breaking changes made at
any time.

If you like or use an experimental feature, then file issues to request it be
taken out of experimental. Often times these features are experimental because
we need feedback or experience to verify they are working, useful, and worth the
effort of supporting.
