# Autoreg Script Hardening — checklist для прожарки/написания волн-регераторов Класс-уровень: применимо к ЛЮБОМУ масс-регеру (почта+OTP+прокси+стейт). Чек-лист багов, которые реально ловятся в бою. ## 1. State persistence — атомарная запись `save_state()` = запись в `path + ".tmp"` → `os.replace(tmp, path)`. Креш/kill посреди прямой записи = битый JSON = волна не резюмится с самого начала. `os.replace` атомарен на Windows и POSIX. ## 2. Прокси — dead-TTL, не вечный бан Один сетевой таймаут ≠ мёртвый узел навсегда. Помечай `d["dead_until"] = time.time() + 900`, при выборе скипай только пока `dead_until > now`. Вечный блэклист за длинную волну съедает пул до нуля на транзиентных ошибках. ## 3. Курсор почтового пула — якорь по IDENTITY, не по индексу Числовой `mail_ptr` ломается, когда список ящиков фильтруется между запусками (used-фильтр, dead-креды) — индексы съезжают → ящики скипаются или берутся повторно. Сохраняй `last_mail` (адрес) и при резюме ищи его индекс в ТЕКУЩЕМ отфильтрованном списке; числовой ptr — только fallback. ## 4. IMAP OTP — фильтр свежести + body fallback - Парсь заголовок `Date` и отбрасывай письма старше `since_ts - 90` — иначе берётся вчерашний код от прошлой реги (регистрация фейлится молча/с непонятной ошибкой). - Нет `text/plain` части → fallback на `text/html` (некоторые провайдеры шлют только html). - По таймауту возвращай последний найденный кандидат (`fallback or ""`), а не пустоту сразу. ## 5. Zero-quota health probe ключей Дешёвая проверка живости API-ключа БЕЗ траты квоты: POST chat/completions с несуществующей моделью (`probe/nonexistent-model-xyz`). Интерпретация: - 404 (model not found) = ключ ЖИВ - 403 + "suspended" = аккаунт забанен - 429 / "allowance" = квота выжрана (обычно восстанавливается за 24ч) GET /models при этом часто 200 даже на suspended — не годится. Используй probe в ротационных кронах/шлюзовых синках. ## 6. Конвейер, не партия Антифрод провайдеров банит волны пачками через часы-сутки после регистрации (массовый `403 suspended` — норма, не баг скрипта). Одиночный ключ = расходник. Правильная архитектура: непрерывная волна + cron-ротация живых в пул/шлюз (probe из п.5 → live в каналы, suspended в disable). Крон 15 мин — бан прилетает с задержкой, 30-минутное окно оставляет трупы в ротации. ## 7. Fail-stop волны Счётчик подряд-фейлов: при >N фейлов и валящемся успехе — останавливать волну (обычно = сдох captcha-sidecar или весь прокси-пул), иначе тихо сжигается почтовый пул. ## 8. Шлюз new-api (если ключи идут в ротацию) Канал-на-ключ, мульти-ключ блобом ломает Authorization (`invalid header field value`); `\r` из Windows-файлов ключей = та же ошибка; правки БД channels/abilities требуют `systemctl restart`. Детали — README llmtr-autoreg репо и memory-заметки по new-api.