A filter that gained a fourth argument, and our callback declared with three, which is legal and silently receives less than it could.
// their 3.x
apply_filters( 'plugin_price', $price, $product );
// their 4.x
apply_filters( 'plugin_price', $price, $product, $context, $currency );
// ours, unchanged, and now wrong for one currency
add_filter( 'plugin_price', function ( $price, $product ) {
return $price * 1.2;
}, 10, 2 );
PHP does not complain when a callback accepts fewer arguments than are passed, so a signature change like this produces no error anywhere — the callback simply cannot see the new context and keeps returning an answer that used to be right. Reading the changelog for hook signature changes is the only defence, and pinning plugin versions is what makes that a scheduled task rather than a surprise.