{"record":{"id":"a5deabf4a7461030","repo":"aaif-goose/goose","slug":"timeout-multiplier-must-be-positive","errorCode":null,"errorMessage":"--timeout-multiplier must be positive","messagePattern":"--timeout-multiplier must be positive","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"evals/harbor/runner.py","lineNumber":134,"sourceCode":"    name, sep, ref = dataset_ref.rpartition(\"@\")\n    dataset_name = name if sep else dataset_ref\n    dataset: dict[str, Any] = {\"name\": dataset_name}\n    if sep:\n        dataset[\"ref\" if \"/\" in name else \"version\"] = ref\n    if tasks:\n        dataset[\"task_names\"] = tasks\n    return dataset\n\n\ndef build_harbor_config(args: argparse.Namespace) -> dict[str, Any]:\n    if \"/\" not in args.model:\n        raise ValueError(\"--model must be in provider/model form, e.g. anthropic/claude-sonnet-4-6\")\n    if args.trials < 1:\n        raise ValueError(\"--trials must be at least 1\")\n    if args.concurrency < 1:\n        raise ValueError(\"--concurrency must be at least 1\")\n    if args.timeout_multiplier <= 0:\n        raise ValueError(\"--timeout-multiplier must be positive\")\n\n    goose_binary = args.goose_binary.expanduser().resolve()\n    if not goose_binary.is_file():\n        raise ValueError(f\"--goose-binary does not exist or is not a file: {args.goose_binary}\")\n\n    config_yaml, extension_entries = render_goose_config(args.extensions)\n\n    provider = args.model.split(\"/\", 1)[0]\n    missing_secrets = [\n        key for key in PROVIDER_SECRETS.get(provider, []) if not os.environ.get(key)\n    ]\n    if missing_secrets:\n        raise ValueError(\n            f\"Missing env vars for provider '{provider}': {', '.join(missing_secrets)}. \"\n            f\"Set them in a .env file (cwd or {HARBOR_DIR}) or your shell.\"\n        )\n\n    agent_kwargs: dict[str, Any] = {","sourceCodeStart":116,"sourceCodeEnd":152,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/evals/harbor/runner.py#L116-L152","documentation":"Raised by build_harbor_config in the harbor benchmark runner when --timeout-multiplier is zero or negative. The multiplier scales per-task timeouts (fractions like 1.5 or 2 are valid); zero or negative would collapse every timeout to nothing, so it is rejected during argument validation before the harbor config dict is built.","triggerScenarios":"Running with --timeout-multiplier 0; a negative value like --timeout-multiplier -1; passing '2x' style strings that argparse fails to parse into a number at all.","commonSituations":"Misreading the flag as a boolean/flag-style switch; unit confusion (minutes vs multiplier); scripts defaulting the multiplier to 0 before it is set.","solutions":["Pass a positive number: --timeout-multiplier 1.5 to extend timeouts 50%, or 1 for defaults","If generating the value, default it to 1.0 rather than 0","Check for accidental string suffixes or locale-specific decimal commas in the value"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"assert args.timeout_multiplier > 0, f'--timeout-multiplier must be positive, got {args.timeout_multiplier}'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Default the multiplier to 1.0 in wrappers, not 0","Pass plain numbers (1.5, 2) without units or suffixes","Remember fractions are valid; only zero and negatives are rejected"],"tags":["cli","validation","timeout","harbor","benchmark"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}