PHPUnit 12, and a two-hour upgrade

A third consecutive annual major, each cheaper than the last, which is what doing the first one properly buys.

  10.0 (2023)   a week. a rewritten extension API,
                annotations to attributes, a migrated
                configuration.
  11.0 (2024)   two hours. removals of what 10
                deprecated, plus four stragglers in an
                excluded directory.
  12.0 (2025)   two hours. a PHP 8.3 minimum we
                exceeded, and three deprecations.

and the excluded directory is gone, deleted with the
code it tested.

The cost of an annual major is almost entirely determined by whether the previous one’s deprecations were acted on, which makes the deprecation output the thing to keep visible rather than to filter. Three consecutive cheap upgrades is not a property of the tool — it is the compounding return on one uncomfortable week in 2023.