Why are my paginated posts always returning the same results?

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.