v0.8.0 2026-05-09 Breaking
Per-host Config · DIRECT Removal · Richer Task Logs

ScatterProxyRouter now accepts per-host (host, config) tuples, enabling independent tuning of concurrency, sources, and timeouts per target. Remaining DIRECT code vestiges are fully removed. Task-completed and proxy-dead logs now carry host context.

  • ScatterProxyRouter::new() now takes (host, ScatterProxyConfig) tuples — shared config parameter removed
  • ProxyManager: DIRECT const, set_state guard, and get_client direct-connection branch fully removed
  • Task-completed debug log with host, proxy, attempt, and latency_ms fields
  • host field added to proxy-dead log for identifiability in multi-host deployments
Task Value
4.5
Cognitive Load
4.0
Trust
4.5
Consistency
4.5
Iterability
4.5
v0.7.0 2026-05-09 Feature
ScatterProxyRouter · Per-host Metrics · Host-prefixed Logs

Introduced ScatterProxyRouter for per-host pool isolation. Each host gets its own independent proxy pool, health tracker, and scheduler. Metrics log lines are automatically prefixed with [hostname] for multi-host deployments.

  • ScatterProxyRouter — routes requests to per-host ScatterProxy pools; isolated health, scheduler, and eviction per host
  • ScatterProxyConfig::name — optional label auto-prefixed to metrics log lines as [name]
  • ScatterProxyError::UnknownHost — returned when a request targets an unregistered host
  • ScatterProxyConfig: Clone and RateLimitConfig: Clone
Task Value
5.0
Cognitive Load
4.0
Trust
4.5
Consistency
4.5
Iterability
5.0
v0.5.0 2026-04-23 Breaking
Multi-worker Scheduler · Delayed Retry Queue · Richer Metrics

Removed the DIRECT node and the circuit breaker subsystem. The scheduler now runs multiple concurrent workers backed by a FIFO ready queue and a heap-ordered delayed retry queue. Metrics expanded to cover delay, requeue, dispatch, and skip-reason observability.

  • Removed implicit DIRECT proxy candidate (direct://localhost); proxy mode now uses only fetched/configured proxies
  • Removed circuit breaker subsystem entirely; temporary proxy shortages are handled by the delayed retry queue
  • Reworked scheduling: multiple concurrent workers, FIFO ready queue, heap-backed delayed retry queue
  • Metrics expanded: delayed tasks, requeues, zero-available events, dispatch count, and skip reasons now reported
  • Eliminated hot-loop requeue: tasks are now delayed until their next retry window instead of being immediately re-enqueued
  • Improved scheduling fairness: ready tasks maintain FIFO order; delayed tasks are promoted by ready_at timestamp
Task Value
4.5
Cognitive Load
4.0
Trust
4.5
Consistency
4.5
Iterability
4.5
v0.3.0 2026-04-22 Breaking
Never-fail Scheduler · DIRECT Node · Cold-start Fast Sampling

The scheduler never terminates tasks — internal infinite retry; caller-side timeouts are opt-in. The local machine is a permanent proxy candidate. Cold-start fan-out K is boosted automatically. The submit API no longer wraps results in Result.

  • submit() is now async and returns TaskHandle directly (no longer wrapped in Result)
  • submit_batch() is now async and returns Vec<TaskHandle> directly
  • ScatterProxyConfig: removed task_timeout and max_attempts fields
  • try_submit() — non-blocking submit; returns Err(PoolFull) immediately when pool is full
  • try_submit_batch() — atomic non-blocking batch submit; rejects entire batch if capacity insufficient
  • submit_timeout() — blocks up to deadline waiting for pool slot; returns Err(Timeout) on expiry
  • TaskHandle::with_timeout(Duration) — caller-side deadline; underlying task continues retrying
  • DIRECT node — local machine (direct://localhost) is a permanent, non-evictable proxy candidate
  • Cold-start fast sampling — fan-out K boosted to max(5, max_concurrent_per_request) while any proxy is untested
  • Scheduler no longer sends terminal errors to task handles for IO failures, proxy timeouts, or attempt exhaustion; all such tasks are silently requeued
Task Value
4.5
Cognitive Load
4.5
Trust
4.5
Consistency
4.3
Iterability
4.5
v0.1.0 2025-07-13 Initial Release
scatter-proxy Initial Release

First release of the multi-path race scheduler. Features adaptive fan-out, per-(proxy, host) rate limiting, health tracking, exponential-backoff cooldown, circuit breakers, proxy eviction, and state persistence.

  • ScatterProxy — submit(), submit_batch(), metrics(), shutdown()
  • Multi-path race: fan out K proxies per task; first successful response wins
  • Adaptive fan-out: K auto-adjusts based on success rate and available proxy count
  • Per-(proxy, host) rate limiting with configurable host overrides
  • Sliding-window health tracking with latency stats
  • Exponential-backoff cooldown for consecutively-failing (proxy, host) pairs
  • Per-host circuit breaker: Open → HalfOpen → Closed state machine
  • Proxy eviction: 0% global success rate after sufficient samples → marked Dead
  • BodyClassifier trait + DefaultClassifier for response classification
  • JSON state persistence with atomic writes; hot-restart restore
  • Automatic proxy source refresh; socks5h:// default for remote DNS
  • 240+ unit tests across all modules