router-for-me/CLIProxyAPI · error
credential concurrency release max backoff must not be less
Error message
credential concurrency release max backoff must not be less than release flush interval
What it means
ValidateCredentialConcurrency enforces release-max-backoff >= release-flush-interval. The release path flushes at a fixed interval and backs off up to a ceiling; a ceiling shorter than the flush cadence is contradictory (the backoff would never take effect), so the pair is rejected.
Source
Thrown at internal/config/credential_concurrency.go:156
return c
}
// ValidateCredentialConcurrency validates values intrinsic to a credential concurrency configuration.
func ValidateCredentialConcurrency(cfg CredentialConcurrencyConfig) error {
if cfg.LifecycleConfigRevision < 0 || (cfg.lifecycleConfigRevisionPresent && cfg.LifecycleConfigRevision == 0) {
return fmt.Errorf("lifecycle configuration revision must be positive when present")
}
if cfg.ObservationBarrierRevision < 0 {
return fmt.Errorf("observation barrier revision must not be negative")
}
if cfg.CPAHeartbeatTimeout <= 0 || cfg.CPACancelBound <= 0 || cfg.ReclaimGrace <= 0 || cfg.CleanupInterval <= 0 {
return fmt.Errorf("credential concurrency lifecycle durations must be positive")
}
if cfg.ReleaseFlushInterval <= 0 || cfg.ReleaseMaxBackoff <= 0 || cfg.BusyRetryMin <= 0 || cfg.BusyRetryMax <= 0 {
return fmt.Errorf("credential concurrency limiter durations must be positive")
}
if cfg.ReleaseMaxBackoff < cfg.ReleaseFlushInterval {
return fmt.Errorf("credential concurrency release max backoff must not be less than release flush interval")
}
if cfg.BusyRetryMin%time.Millisecond != 0 || cfg.BusyRetryMax%time.Millisecond != 0 {
return fmt.Errorf("credential concurrency busy retry durations must be whole milliseconds")
}
if cfg.BusyRetryMax < cfg.BusyRetryMin {
return fmt.Errorf("credential concurrency busy retry max must not be less than busy retry min")
}
if cfg.MaxLimit < 1 || cfg.MaxLimit > maxCredentialConcurrencyLimit {
return fmt.Errorf("credential concurrency max limit must be between 1 and %d", maxCredentialConcurrencyLimit)
}
return nil
}
// ValidateCredentialConcurrencyLifecycle verifies the Home lifecycle timing safety invariant.
func ValidateCredentialConcurrencyLifecycle(nodeHeartbeatTimeout time.Duration, cfg CredentialConcurrencyConfig) error {
if nodeHeartbeatTimeout <= 0 {
return fmt.Errorf("credential concurrency lifecycle durations must be positive")
}View on GitHub (pinned to 78f0c4079e)
Solutions
- Raise release-max-backoff to at least release-flush-interval (e.g. flush 500ms, backoff 2s).
- Or lower release-flush-interval below the backoff ceiling.
- After fixing, re-validate: both must also be strictly positive and satisfy the whole-millisecond check.
Example fix
# before (config.yaml) credential-concurrency: release-flush-interval: 2s release-max-backoff: 500ms # after credential-concurrency: release-flush-interval: 500ms release-max-backoff: 2s
Defensive patterns
Strategy: validation
Validate before calling
// Go: keep backoff ceiling >= flush interval.
if cfg.ReleaseMaxBackoff < cfg.ReleaseFlushInterval {
return errors.New("release-max-backoff must be >= release-flush-interval")
} Prevention
- When raising flush for batching, raise backoff ceiling first.
- Think of the pair as (cadence, ceiling) with ceiling >= cadence.
When it happens
Trigger: config.yaml with 'credential-concurrency:\n release-flush-interval: 2s\n release-max-backoff: 500ms' — any combination where max backoff is numerically smaller than flush interval.
Common situations: Tuning flush up for batching while forgetting to raise the backoff ceiling; copying values from different example versions; assuming backoff and flush are independent knobs.
Related errors
- credential concurrency lifecycle durations must be positive
- credential concurrency limiter durations must be positive
- credential concurrency busy retry durations must be whole mi
- credential concurrency lifecycle timing safety invariant ove
- lifecycle configuration revision must be positive when prese
AI-assisted analysis of router-for-me/CLIProxyAPI@78f0c4079e (2026-08-15).
Data as JSON: /api/errors/43bec6e87f903ff8.
Report an issue: GitHub.