I’ve seen this happen when you have sticky posts. Try excluding them, like this:
<?php
$query = new WP_Query([
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'posts_per_page' => 4,
'ignore_sticky_posts' => true,
]);
?>