{"record":{"id":"c8868a32145cd1ca","repo":"aaif-goose/goose","slug":"job-name-must-start-with-a-letter-or-number-and-co","errorCode":null,"errorMessage":"Job name must start with a letter or number and contain only letters, numbers, dots, underscores, and hyphens","messagePattern":"Job name must start with a letter or number and contain only letters, numbers, dots, underscores, and hyphens","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"evals/harbor/runner.py","lineNumber":91,"sourceCode":"    for name, entry in available.items():\n        entry[\"enabled\"] = name in extensions\n\n    recipe_entries = [\n        {\"type\": available[name][\"type\"], \"name\": name} for name in extensions\n    ]\n    return yaml.dump(template, sort_keys=False), recipe_entries\n\n\ndef default_job_name(model: str, dataset: str) -> str:\n    safe_model = re.sub(r\"[^A-Za-z0-9._-]+\", \"-\", model).strip(\"-\")\n    safe_dataset = re.sub(r\"[^A-Za-z0-9._-]+\", \"-\", dataset).strip(\"-\")\n    timestamp = datetime.now().strftime(\"%Y-%m-%d__%H-%M-%S\")\n    return f\"goose-{safe_dataset}-{safe_model}-{timestamp}\"\n\n\ndef validate_job_name(job_name: str) -> str:\n    if not re.match(r\"^[A-Za-z0-9][A-Za-z0-9._-]*$\", job_name):\n        raise ValueError(\n            \"Job name must start with a letter or number and contain only \"\n            \"letters, numbers, dots, underscores, and hyphens\"\n        )\n    return job_name\n\n\ndef parse_csv(value: str) -> list[str]:\n    return [item.strip() for item in value.split(\",\") if item.strip()]\n\n\nPACKAGE_INDEX_ENV_VARS = (\"UV_DEFAULT_INDEX\", \"PIP_INDEX_URL\", \"UV_INDEX_URL\")\n\n\ndef package_index_env() -> dict[str, str]:\n    index_url = next(\n        (os.environ[key] for key in PACKAGE_INDEX_ENV_VARS if os.environ.get(key)),\n        None,\n    )","sourceCodeStart":73,"sourceCodeEnd":109,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/evals/harbor/runner.py#L73-L109","documentation":"Raised by validate_job_name in the harbor benchmark runner before any job is launched. A job name must match ^[A-Za-z0-9][A-Za-z0-9._-]*$: start with a letter or digit, then only letters, digits, dots, underscores, hyphens. The default name built by default_job_name always passes because it sanitizes model and dataset with re.sub; the error only fires on a user-supplied --job-name that violates the charset rule (Kubernetes-style name constraints).","triggerScenarios":"Passing --job-name 'my run' (space), 'run/claude' (slash), 'run#1' (hash); a name starting with '-' or '_' such as --job-name '_baseline'; a name that is empty after shell quoting mishaps.","commonSituations":"Using human-readable labels with spaces or colons as job names; prefixing names with dashes for sorting; copy-pasting names from issue titles containing punctuation.","solutions":["Use a name matching the pattern, e.g. --job-name run.clb-2_baseline","Omit --job-name entirely and let default_job_name build a safe goose-<dataset>-<model>-<timestamp> name","If generating names programmatically, sanitize first: re.sub(r'[^A-Za-z0-9._-]+', '-', name).strip('-') and prefix 'goose-' if it no longer starts alphanumerically"],"exampleFix":"# before\nname = args.job_name or default_job_name(args.model, args.dataset)\nvalidate_job_name(name)  # raises on 'my run!!'\n\n# after\nname = args.job_name or default_job_name(args.model, args.dataset)\nname = re.sub(r'[^A-Za-z0-9._-]+', '-', name).strip('-')\nif not re.match(r'^[A-Za-z0-9]', name):\n    name = f'goose-{name}'\nvalidate_job_name(name)","handlingStrategy":"validation","validationCode":"import re\n\ndef is_valid_job_name(name: str) -> bool:\n    return bool(re.match(r'^[A-Za-z0-9][A-Za-z0-9._-]*$', name))\n\nassert is_valid_job_name(args.job_name), 'job name must match ^[A-Za-z0-9][A-Za-z0-9._-]*$'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Omit --job-name and accept the sanitized default","Sanitize generated names with re.sub(r'[^A-Za-z0-9._-]+', '-', name).strip('-') before passing them","Never include spaces, slashes, or leading dashes in job names"],"tags":["cli","validation","regex","harbor","benchmark"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}