{"record":{"id":"600f8724240f12a2","repo":"OpenBMB/ChatDev","slug":"startup-timeout-must-be-numeric","errorCode":null,"errorMessage":"startup_timeout must be numeric","messagePattern":"startup_timeout must be numeric","errorType":"validation","errorClass":"ConfigError","httpStatus":null,"severity":"error","filePath":"entity/configs/node/tooling.py","lineNumber":534,"sourceCode":"        inherit_env = optional_bool(mapping, \"inherit_env\", path, default=True)\n        if inherit_env is None:\n            inherit_env = True\n\n        env_mapping = mapping.get(\"env\")\n        if env_mapping is not None:\n            if not isinstance(env_mapping, Mapping):\n                raise ConfigError(\"env must be a mapping\", extend_path(path, \"env\"))\n            env = {str(k): str(v) for k, v in env_mapping.items()}\n        else:\n            env = {}\n\n        timeout_value = mapping.get(\"startup_timeout\", 10.0)\n        if timeout_value is None:\n            startup_timeout = 10.0\n        elif isinstance(timeout_value, (int, float)):\n            startup_timeout = float(timeout_value)\n        else:\n            raise ConfigError(\"startup_timeout must be numeric\", extend_path(path, \"startup_timeout\"))\n\n        wait_for_log = optional_str(mapping, \"wait_for_log\", path)\n        cache_ttl_value = mapping.get(\"cache_ttl\", 0.0)\n        if cache_ttl_value is None:\n            cache_ttl = 0.0\n        elif isinstance(cache_ttl_value, (int, float)):\n            cache_ttl = float(cache_ttl_value)\n        else:\n            raise ConfigError(\"cache_ttl must be numeric\", extend_path(path, \"cache_ttl\"))\n        return cls(\n            command=command,\n            args=normalized_args,\n            cwd=cwd,\n            env=env,\n            inherit_env=bool(inherit_env),\n            startup_timeout=startup_timeout,\n            wait_for_log=wait_for_log,\n            cache_ttl=cache_ttl,","sourceCodeStart":516,"sourceCodeEnd":552,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/entity/configs/node/tooling.py#L516-L552","documentation":"Raised when the stdio tooling 'startup_timeout' is present but non-numeric. It bounds how long the launcher waits for the process to become ready; only int/float are accepted (default 10.0).","triggerScenarios":"startup_timeout: \"15\" in the tooling config; YAML quoting; value null is allowed (falls back to 10.0) but strings/bools are not.","commonSituations":"Tuning slow-starting MCP servers by copying a quoted example value; config templating that emits strings.","solutions":["Write the value unquoted: startup_timeout: 15","Or use float(...) coercion upstream before from_dict","Drop the key to accept the 10.0 default"],"exampleFix":"# before\nstartup_timeout: \"15\"\n# after\nstartup_timeout: 15","handlingStrategy":"validation","validationCode":"v = cfg.get(\"startup_timeout\", 10.0)\nassert v is None or isinstance(v, (int, float)) and not isinstance(v, bool)","typeGuard":"def numeric_or_none(v) -> bool:\n    return v is None or (isinstance(v, (int, float)) and not isinstance(v, bool))","tryCatchPattern":"except ConfigError as e:\n    if \"startup_timeout\" in str(e):\n        cfg[\"startup_timeout\"] = float(cfg[\"startup_timeout\"])","preventionTips":["Leave startup_timeout unquoted","Null is allowed and falls back to 10.0"],"tags":["config","validation","timeout","subprocess","tooling"],"backgroundTag":"config-type-validation-failed","analyzedSha":"4fb2db0ea90375ce1059f44fe03ffbd191a7a169","analyzedAt":"2026-08-27T14:35:29.622Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}