openai/codex · error · std::io::Error
features.multi_agent_v2.min_wait_timeout_ms must be at most
Error message
features.multi_agent_v2.min_wait_timeout_ms must be at most features.multi_agent_v2.max_wait_timeout_ms
What it means
After each wait timeout in `[features.multi_agent_v2]` passes its individual bound check, Config enforces ordering: min_wait_timeout_ms must not exceed max_wait_timeout_ms. A minimum larger than the maximum is contradictory, so loading fails with InvalidInput instead of clamping.
Source
Thrown at codex-rs/core/src/config/mod.rs:3728
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
"features.multi_agent_v2.max_concurrent_threads_per_session must be at least 1",
));
}
validate_multi_agent_v2_wait_timeout(
"features.multi_agent_v2.min_wait_timeout_ms",
multi_agent_v2.min_wait_timeout_ms,
)?;
validate_multi_agent_v2_wait_timeout(
"features.multi_agent_v2.max_wait_timeout_ms",
multi_agent_v2.max_wait_timeout_ms,
)?;
validate_multi_agent_v2_wait_timeout(
"features.multi_agent_v2.default_wait_timeout_ms",
multi_agent_v2.default_wait_timeout_ms,
)?;
if multi_agent_v2.min_wait_timeout_ms > multi_agent_v2.max_wait_timeout_ms {
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
"features.multi_agent_v2.min_wait_timeout_ms must be at most features.multi_agent_v2.max_wait_timeout_ms",
));
}
if multi_agent_v2.default_wait_timeout_ms < multi_agent_v2.min_wait_timeout_ms {
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
"features.multi_agent_v2.default_wait_timeout_ms must be at least features.multi_agent_v2.min_wait_timeout_ms",
));
}
if multi_agent_v2.default_wait_timeout_ms > multi_agent_v2.max_wait_timeout_ms {
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
"features.multi_agent_v2.default_wait_timeout_ms must be at most features.multi_agent_v2.max_wait_timeout_ms",
));
}
validate_multi_agent_v2_tool_namespace(multi_agent_v2.tool_namespace.as_deref())?;
let agents_enabled = cfgView on GitHub (pinned to 339751715c)
Solutions
- Raise `max_wait_timeout_ms` to at least `min_wait_timeout_ms` (or lower the min).
- Prefer deleting both keys to accept defaults when custom bounds are not required.
- Re-check units; all three timeouts are milliseconds.
Example fix
# before [features.multi_agent_v2] min_wait_timeout_ms = 60000 max_wait_timeout_ms = 5000 # after [features.multi_agent_v2] min_wait_timeout_ms = 5000 max_wait_timeout_ms = 60000
Defensive patterns
Strategy: validation
Validate before calling
import tomllib
ma = tomllib.load(open("config.toml", "rb")).get("features", {}).get("multi_agent_v2", {})
mn, mx = ma.get("min_wait_timeout_ms"), ma.get("max_wait_timeout_ms")
assert mn is None or mx is None or mn <= mx, "min_wait_timeout_ms must be <= max_wait_timeout_ms" Try / catch
match config_result {
Err(ref e) if e.kind() == std::io::ErrorKind::InvalidInput
&& e.to_string().contains("min_wait_timeout_ms must be at most") => {
// fix the ordering, then reload config
}
other => other,
} Prevention
- Edit min/max/default timeouts as a triple, never singly
- Encode the min<=default<=max invariant in config-generation code
- Keep related timeout knobs in one config layer to avoid merge surprises
When it happens
Trigger: Any layer combination resolving to min_wait_timeout_ms > max_wait_timeout_ms (e.g. min = 60000, max = 5000). Both values are individually valid; only their order is wrong.
Common situations: Tuning one bound and forgetting its pair; copy-paste between environments with different latency profiles; layered configs where one layer raises the min and another lowers the max.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- features.multi_agent_v2.default_wait_timeout_ms must be at l
- features.multi_agent_v2.default_wait_timeout_ms must be at m
- features.multi_agent_v2.max_concurrent_threads_per_session m
- Environment variable {env_var} for MCP server '{server_name}
- Invalid MCP server name '{server_name}': must match pattern
AI-assisted analysis of openai/codex@339751715c (2026-08-25).
Data as JSON: /api/errors/164a35d80f418bf0.
Report an issue: GitHub.