9.3 moved the coverage settings out of the filter element into their own, and the old form is ignored rather than rejected.
<!-- before -->
<filter>
<whitelist><directory suffix=".php">src</directory></whitelist>
</filter>
<!-- 9.3 -->
<coverage>
<include><directory suffix=".php">src</directory></include>
<exclude><directory>src/Legacy</directory></exclude>
</coverage>
$ vendor/bin/phpunit --migrate-configuration
The failure is silent and reports a coverage figure computed over nothing, which is worse than an error — a build enforcing a minimum threshold now enforces it against an empty set. --migrate-configuration rewrites the file and is worth running rather than editing by hand. Checking the reported line count after any PHPUnit upgrade is the two-second verification.