de7ea730d3
Живой прогон на отклонённой кампании 2231134 (03.08.2026) вскрыл две поломки, из-за которых пересдача не работала вообще: 1. openResubmitEditor требовал, чтобы «Исправить» открыло шаг «Сообщение». Кабинет открывает «Стоимость» — робот падал на входе. Теперь шаг ЧИТАЕТСЯ из адреса (wizardStepFromUrl), а не предполагается, и робот возвращается на «Сообщение» кнопкой «Назад» (goBackToStep): правки текста/ссылки/ОРД живут только там, без возврата пересдали бы кампанию БЕЗ исправлений и получили тот же отказ. 2. У отклонённой кампании расписание остаётся прошлым, и кабинет не пускает дальше: «Измените дату начала, выбранная уже прошла». Кнопка «Продолжить» при этом АКТИВНА и нажимается — робот молча стоял до тайм-аута, а наверх уходило невнятное «не перешли на /confirmation». submitBudget теперь сам переставляет даты на будущие (fixPastDatesIfNeeded) и проверяет результат по полям ввода; уход дат в следующий месяц — громкая ошибка, а не догадка (клик по клетке выбирает день показанного месяца). Тесты: новые чистые функции (wizardStepFromUrl, isPastStartDateMessage, datesForRestart) покрыты и доказаны вырезанием — сломанная правка красит тест. Весь набор робота: 168 зелёных. Приёмка живьём на 2231134: «Исправить» → budget → возврат на message → budget → confirmation, остановка ДО отправки на модерацию. Ни рубля не потрачено. Заодно там же прочитана касса (шаг /payment, без единого клика): подпись «Сумма к оплате» существует, значение 201,6 ₽, parseCost даёт 201.60 — договор чтения стоимости подтверждён живьём впервые.