- Shipped
- September 12, 2026 at 10:23 PM UTC
- Author
- Kamo
- Commit
- 5a6f27f
The list was already read a page at a time, but only forwards, as an endless scroll with no total — and a status filter found its rows by walking the list in address order, which for a dozen failures among a billion recipients reads the billion. - /recipients/page takes before= and last= as well as after=: previous reads the address index backwards from the first row shown, and the last page reads backwards from the end — one seek either way, never a walk. - Each page carries its total, taken from the campaign's counters rather than by counting rows; a search counts to 10,000 and then says so. - A status with few rows is read through the (campaign, status) index and sorted; a common one along the address order. The same counters decide.