resumesPartialDownload: счётчики Range-запросов и байт; сервер отдаёт 400
без Range для .part — запасной путь «начать заново» закрыт.
failsOnSizeMismatch разделена на два:
- rejectsWrongTotalFromContentRange — сервер соврал в Content-Range,
бьёт в проверку actualTotal != expectedTotal (вторая, достижимая);
- truncatedResponseDoesNotProduceFile — оборванный ответ, по факту ловит
ветку IOException → «не удалось скачать» (а не first size check).
В mutations.tsv убрана строка про if (declaredBody >= 0 && written !=
declaredBody) — через java.net/http недостижимо (оборванный ответ даёт
IOException, не EOF). Добавлена строка про if (expectedTotal >= 0 &&
actualTotal != expectedTotal) — теперь убивает rejectsWrongTotalFromContentRange.
Все 18 мутаций (4 из ModelStore) убиты прогоном mutation_check.py.