Found the culprit. I’d foolishly hard-coded the offset to be 0, which must have been overriding WordPress’ query.
I changed:
$posts_list = new WP_Query([
'posts_per_page' => 1,
'offset' => 0,
'orderby' => 'date',
'order' => 'DESC',
'post_type' => 'post',
'suppress_filters' => true,
'paged' => $paged
]);
to:
$posts_list = new WP_Query([
'posts_per_page' => 1,
'orderby' => 'date',
'order' => 'DESC',
'post_type' => 'post',
'suppress_filters' => true,
'paged' => $paged
]);
and all is well.