{"record":{"id":"6801f350f7a4af0d","repo":"NousResearch/hermes-agent","slug":"s-name-raw-r-not-allowed-one-of-join-m","errorCode":null,"errorMessage":"{s.name}={raw!r} not allowed — one of {', '.join(map(str, s.options))}","messagePattern":"(.+?)=(.+?) not allowed — one of (.+?)","errorType":"validation","errorClass":"BlueprintFillError","httpStatus":null,"severity":"warning","filePath":"cron/blueprint_catalog.py","lineNumber":776,"sourceCode":"    create a job with the default time). Enum values are checked against their\n    options. The result is passed straight to ``create_job`` — no second schema.\n    \"\"\"\n    known = {s.name for s in blueprint.slots}\n    unknown = sorted(set(values) - known)\n    if unknown:\n        raise BlueprintFillError(\n            f\"unknown slot{'s' if len(unknown) > 1 else ''}: \"\n            f\"{', '.join(unknown)} — valid: {', '.join(s.name for s in blueprint.slots)}\"\n        )\n    resolved: Dict[str, Any] = {}\n    for s in blueprint.slots:\n        raw = values.get(s.name, s.default)\n        if raw in (None, \"\"):\n            if s.optional:\n                continue\n            raise BlueprintFillError(f\"missing required value: {s.name} ({s.label})\")\n        if s.type == \"enum\" and s.strict and s.options and str(raw) not in {str(o) for o in s.options}:\n            raise BlueprintFillError(\n                f\"{s.name}={raw!r} not allowed — one of {', '.join(map(str, s.options))}\"\n            )\n        resolved[s.name] = raw\n\n    schedule = _resolve_schedule(blueprint, resolved)\n\n    # Render the prompt with whatever slots it references.\n    try:\n        prompt = blueprint.prompt_template.format(**resolved)\n    except KeyError as e:\n        raise BlueprintFillError(f\"blueprint prompt missing value for {e}\") from e\n\n    spec: Dict[str, Any] = {\n        \"prompt\": prompt,\n        \"schedule\": schedule,\n        \"name\": blueprint.title,\n        \"deliver\": resolved.get(\"deliver\", blueprint.deliver_default),\n    }","sourceCodeStart":758,"sourceCodeEnd":794,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/cron/blueprint_catalog.py#L758-L794","documentation":"BlueprintFillError: a slot declared type='enum' with strict=True has a fixed options list, and the submitted value (as a string) is not among the stringified options. This is an exhaustive whitelist — close-but-not-exact values are refused, not fuzzy-matched.","triggerScenarios":"fill_blueprint with e.g. deliver='email digest' when the enum's options are ['email', 'telegram', 'none']; case/format variants that don't string-match exactly also fail.","commonSituations":"Users free-typing an option label instead of picking from a list; the agent paraphrasing an enum value; a blueprint update that renamed options while old callers still submit the previous label.","solutions":["Use one of the exact options printed in the error message","If calling programmatically, offer s.options to the user/agent as the choice set and submit verbatim"],"exampleFix":"# before\nfill_blueprint(bp, {\"deliver\": \"email digest\"})\n# BlueprintFillError: deliver='email digest' not allowed — one of email, telegram, none\n\n# after\nfill_blueprint(bp, {\"deliver\": \"email\"})","handlingStrategy":"type-guard","validationCode":"def enum_ok(slot, value) -> bool:\n    if slot.type == \"enum\" and slot.strict and slot.options:\n        return str(value) in {str(o) for o in slot.options}\n    return True","typeGuard":"from cron.blueprint_catalog import Slot\n\ndef is_allowed_enum_value(s: Slot, value) -> bool:\n    if s.type != \"enum\" or not s.strict or not s.options:\n        return True\n    return str(value) in {str(o) for o in s.options}","tryCatchPattern":"try:\n    spec = fill_blueprint(bp, values)\nexcept BlueprintFillError as e:\n    if \"not allowed\" in str(e):\n        # re-ask with the exact options listed in the message\n        values[slot_name] = choose_from(options_from_message(str(e)))\n        spec = fill_blueprint(bp, values)\n    else:\n        raise","preventionTips":["Render strict enum slots as pick-lists built from slot.options","Submit the option value verbatim — no paraphrasing, no extra words","When a blueprint updates its options, regenerate any cached choice lists"],"tags":["cron","blueprint","validation","enum"],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}