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

  1. Pass the retry ordinal starting at 1 (first retry = 1)
  2. 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

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


AI-assisted analysis of HKUDS/Vibe-Trading@80ffdda44c (2026-08-28). Data as JSON: /api/errors/ac49c344c3c8d117. Report an issue: GitHub.