{"record":{"id":"09e3e28c486f0968","repo":"NousResearch/hermes-agent","slug":"missing-required-value-s-name-s-label","errorCode":null,"errorMessage":"missing required value: {s.name} ({s.label})","messagePattern":"missing required value: (.+?) \\((.+?)\\)","errorType":"validation","errorClass":"BlueprintFillError","httpStatus":null,"severity":"warning","filePath":"cron/blueprint_catalog.py","lineNumber":774,"sourceCode":"    slot, so a form can show field errors and the agent knows what to ask.\n    Unknown slot names are rejected (a typo'd ``tiem=07:15`` must not silently\n    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,","sourceCodeStart":756,"sourceCodeEnd":792,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/cron/blueprint_catalog.py#L756-L792","documentation":"BlueprintFillError: iterating the blueprint's slots, a non-optional slot resolved to None or '' (no value given and no usable default). The message names both the slot's machine name and its human label so a form can attach the error to the right field.","triggerScenarios":"fill_blueprint(bp, {}) on a blueprint whose 'time' slot is non-optional with default None; or a partial submission that fills some required slots but leaves one blank.","commonSituations":"Multi-step conversational job creation where the agent submits before collecting every required field; a form where a required field was left empty and the client did not enforce it client-side.","solutions":["Provide a value for the named slot in the next fill_blueprint call","Drive collection from blueprint.slots (required = not s.optional) so you know upfront which fields to ask for"],"exampleFix":"# before\nfill_blueprint(bp, {\"day\": \"monday\"})  # 'time' slot required\n# BlueprintFillError: missing required value: time (Time of day)\n\n# after\nfill_blueprint(bp, {\"day\": \"monday\", \"time\": \"09:00\"})","handlingStrategy":"validation","validationCode":"def missing_required(bp, values: dict) -> list[str]:\n    return [\n        s.name for s in bp.slots\n        if not s.optional and values.get(s.name, s.default) in (None, \"\")\n    ]","typeGuard":null,"tryCatchPattern":"try:\n    spec = fill_blueprint(bp, values)\nexcept BlueprintFillError as e:\n    if str(e).startswith(\"missing required value\"):\n        slot = str(e).split(\": \", 1)[1].split(\" \")[0]\n        values[slot] = ask_for(slot)\n        spec = fill_blueprint(bp, values)\n    else:\n        raise","preventionTips":["Derive required fields from blueprint.slots (optional flag) and collect them all before submit","Enforce required fields in the form so the backend error is a backstop, not the primary path","Map the slot name in the error back to its label when re-asking the user"],"tags":["cron","blueprint","validation","required-field"],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}