A minor version of a library renamed a protected hook method, and the attribute turned a silent behaviour change into a fatal error at load.
final class TurkerDevClient extends VendorClient
{
#[Override]
protected function handleResponse(ResponseInterface $r): mixed { /* ... */ }
}
// after composer update:
// Fatal error: TurkerDevClient::handleResponse() has
// #[Override] attribute, but no matching parent method
// exists
// the library's changelog:
// "internal: renamed handleResponse to processResponse"
Calling it internal is defensible for a protected method and it is a break for anybody who extended the class, which the library encourages in its own documentation. Without the attribute this would have been a deployment where our response handling silently stopped running and the library default applied — which was close enough to correct that it might have taken months to notice.