1. ChangeMessageVisibilityBatch при VisibilityTimeout=0 лишь инкрементировал
Retry и НЕ переносил сообщение в DLQ (логика была только в одиночной версии).
Вынесен единый метод Queue.ResetVisibilityAndTryDLQ — сброс видимости +
DLQ-перенос. Обе версии привели к одному пути.
2. SendMessageBatch: проверка OOM-лимита была только по устаревшему снимку
(RLock → Lock) — добавлена повторная проверка под per-queue Lock (TOCTOU).
3. Инварианты InFlightIndexes/ensureIndexes зафиксированы в док-комментариях.
Тест: TestChangeVisibilityBatch_MovesToDLQ (падает на старой логике, зелёный
на новой).