Плоский список собранных страниц отвечает на вопрос «что мы скачали». Спрашивают обычно другое: как устроен каталог конкурента. Что у него есть раздел кровли, клея и красок; что у кровли внутри ещё подразделы, а у клея товары начинаются сразу; сколько в каждом разделе страниц и все ли они забраны. Ответ на это собирается сам, без дополнительных заходов: обход помечает каждую страницу по ходу дела, а ручка tree раскладывает пометки деревом.

Чем помечается страница

В готовых решениях пометка ставится по всей разметке страницы, а не по форме её адреса: фильтр и подраздел по адресу неотличимы, и разбирается это только содержимым. Как именно — на отдельной странице: что не каталог. У /v1/crawl с вашим собственным правилом решение принимается по двум признакам — по форме адреса и по наличию цен в разметке. Поодиночке не хватает ни одного: форма адреса не отличает раздел с товарами от раздела с подразделами, а цены есть и в списке, и в карточке.
Вторая и следующие страницы списка (?page=2) остаются списком. Карточка товара постраничной не бывает, и такие адреса карточками не считаются.

Ручка

Ветки неравной глубины — это норма, а не сбой: у одного раздела товары начинаются сразу, у другого под ним ещё этаж. Разложить каталог заранее по одинаковому числу этажей нельзя, поэтому обход разбирает каждую ветку на месте. Ручка денег не стоит: она перекладывает уже собранное и оплаченное.

Сколько страниц осталось

У каждой страницы списка записано, сколько всего страниц у этого списка (pages_total), а у карточки — сколько на ней торговых предложений (offers). Оба числа видны в /v1/crawl/{id}/pages. По ним же составляется итоговая заметка задания. Если объём кончился раньше каталога, задание завершается со status: "partial" и говорит об этом прямо:
Молчаливое «готово» на трёх страницах из двадцати пяти — худший из возможных отчётов: по нему нельзя отличить обойдённый каталог от первой страницы каждого раздела. Поэтому итог всегда называет числа.