The sensor
A sliding window of recent observations (status codes, latency, challenge and reset signals) produces one of three readings:
Only 429 (Too Many Requests) and 503 (Service Unavailable) count as blocks. Ordinary answers like 401, 403, 404 or 405 are treated as clean samples, so per-URL results never falsely trip the brakes. Challenge pages (“just a moment”, “attention required”, CAPTCHA, Cloudflare) and connection resets also register as blocks.
The state machine
Each host moves through states as its signals change:1
Normal
Healthy. The rate climbs on every clean interval (additive increase).
2
Throttle
Straining. The rate holds and the client identity (User-Agent) switches to a browser string.
3
Blocked, then Cooldown
A block triggers a multiplicative back-off (rate is halved, down to a floor), the egress lane escalates (direct to Tor), and the host pauses for a cooldown window.
4
Resume
After the cooldown, the host resumes at its rate floor and ramps back up only after several clean intervals in a row.
5
Parked
If a host blocks repeatedly (several cooldown cycles), it is parked: it keeps running at the floor rate rather than being abandoned, so the engagement still makes progress.
The rate model (AIMD)
The rate follows additive increase, multiplicative decrease, the same principle that keeps TCP stable:- Clean interval:
rate = min(rate + step, ceiling), climb gently. - Block:
rate = max(rate x backoff, floor), drop sharply (balanced halves it).
Honoring Retry-After
If a target sends an explicitRetry-After, Evasive Mode honors it, but caps the wait at 180 seconds so a hostile or misconfigured header can never stall the run indefinitely.
