HKUDS/Vibe-Trading · error · ValueError
retry_number must be at least 1
Error message
retry_number must be at least 1
What it means
_worker_retry_delay_ceiling_s computes exponential backoff for worker retries and requires retry_number to be one-based (1, 2, ...). Passing 0 or a negative number raises ValueError, since 2**(negative exponent) semantics would be wrong for a ceiling.
Source
Thrown at agent/src/swarm/runtime.py:60
from src.swarm.presets import build_run_from_preset
from src.swarm.store import SwarmStore
from src.swarm.task_store import (
TaskStore,
resolve_dependencies,
topological_layers,
validate_dag,
)
from src.tools.mcp import invalidate_mcp_specs_cache
from src.tools.redaction import redact_internal_paths
from src.swarm.worker import agent_artifact_dir, clear_agent_artifacts, run_worker
logger = logging.getLogger(__name__)
def _worker_retry_delay_ceiling_s(retry_number: int) -> float:
"""Return the capped exponential ceiling for a one-based retry number."""
if retry_number < 1:
raise ValueError("retry_number must be at least 1")
config = get_env_config().swarm
base_delay = config.swarm_worker_retry_base_delay_s
max_delay = config.swarm_worker_retry_max_delay_s
exponent = min(retry_number - 1, 62)
return min(base_delay * (2**exponent), max_delay)
def _worker_retry_delay_s(retry_number: int) -> float:
"""Return an equal-jitter exponential delay for a worker-level retry.
Equal jitter keeps half of the exponential delay while spreading
concurrent swarm workers across the remaining half of the window.
"""
delay_ceiling = _worker_retry_delay_ceiling_s(retry_number)
return random.uniform(delay_ceiling / 2, delay_ceiling)
View on GitHub (pinned to 80ffdda44c)
Solutions
- Pass the retry ordinal starting at 1 (first retry = 1)
- If you have a zero-based attempt index, pass attempt+1
Example fix
# before delay = _worker_retry_delay_ceiling_s(attempt) # attempt starts at 0 # after delay = _worker_retry_delay_ceiling_s(attempt + 1)
Defensive patterns
Strategy: validation
Validate before calling
retry_number = max(1, retry_number)
Type guard
def is_valid_retry_number(n) -> bool:
return isinstance(n, int) and n >= 1 Try / catch
try:
delay = _worker_retry_delay_ceiling_s(n)
except ValueError:
delay = _worker_retry_delay_ceiling_s(1) Prevention
- Treat retry numbers as one-based throughout the codebase
- Name loop variables retry_no starting at 1
- Unit-test boundary retry_number=1
When it happens
Trigger: Computing a delay for the attempt before the first retry (retry_number=0), or looping `for i in range(retries)` and passing i starting at 0.
Common situations: Off-by-one bugs in retry loops; mixing zero-based attempt counters with the one-based retry API.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- max_consecutive_failures must be at least 1
- retry_base_delay_ms must be non-negative
- retry_max_delay_ms must be at least retry_base_delay_ms
- invalid alpha_id
- alpha_id not found
AI-assisted analysis of HKUDS/Vibe-Trading@80ffdda44c (2026-08-28).
Data as JSON: /api/errors/ac49c344c3c8d117.
Report an issue: GitHub.