New features
* feat: canonicalise `union[?X, Y]` into `union[?X, ?Y]` by agoose77 in https://github.com/scikit-hep/awkward/pull/2427
* feat: add `ak.forms.from_type` by agoose77 in https://github.com/scikit-hep/awkward/pull/2425
* feat: add `ak.enforce_type` by agoose77 in https://github.com/scikit-hep/awkward/pull/2365
* feat!: deprecate `length_zero_array` highlevel argument by agoose77 in https://github.com/scikit-hep/awkward/pull/2437
Bug-fixes and performance
* fix: avoid reference cycles with the error-handling machinery by agoose77 in https://github.com/scikit-hep/awkward/pull/2442
* fix: proper unknown size broadcasting for all-regular by agoose77 in https://github.com/scikit-hep/awkward/pull/2444
Other
* ci: publish to PyPI with OIDC by agoose77 in https://github.com/scikit-hep/awkward/pull/2450
* chore(deps): bump pypa/gh-action-pypi-publish from 1.8.5 to 1.8.6 by dependabot in https://github.com/scikit-hep/awkward/pull/2445
* chore: update pre-commit hooks by pre-commit-ci in https://github.com/scikit-hep/awkward/pull/2446
* chore: prepare 2.2.0 release by agoose77 in https://github.com/scikit-hep/awkward/pull/2451
* chore: update pre-commit hooks by pre-commit-ci in https://github.com/scikit-hep/awkward/pull/2443
* docs: add `broadcast_fields` to toctree by agoose77 in https://github.com/scikit-hep/awkward/pull/2436
**Full Changelog**: https://github.com/scikit-hep/awkward/compare/v2.1.4...v2.2.0