shareAI-lab/learn-claude-code · error · WorkflowInputError

meta requires `name` and `description`

Error message

meta requires `name` and `description`

What it means

validate_meta requires both 'name' and 'description' to be present and truthy in the meta dict. A missing key, empty string, or None for either raises WorkflowInputError before the workflow starts. This is the mandatory-field gate that runs ahead of the finer name/description format checks.

Source

Thrown at s16_workflow_runtime/code.py:125

    finally:
        if handle is not None:
            try:
                fcntl.flock(handle.fileno(), fcntl.LOCK_UN)
            finally:
                handle.close()
        local_lock.release()
        with _run_locks_guard:
            if not local_lock.locked() and _run_locks.get(run_id) is local_lock:
                _run_locks.pop(run_id, None)


# -- Metadata Validation --
def validate_meta(meta):
    """Validate name, description, and optional phases before launch."""
    if not isinstance(meta, dict):
        raise WorkflowInputError("meta must be an object literal")
    if not meta.get("name") or not meta.get("description"):
        raise WorkflowInputError("meta requires `name` and `description`")
    if not isinstance(meta["name"], str) or not WORKFLOW_NAME_RE.fullmatch(meta["name"]):
        raise WorkflowInputError(
            "meta.name must be a 1-64 character slug using letters, numbers, '.', '_', or '-'"
        )
    if not isinstance(meta["description"], str):
        raise WorkflowInputError("meta.description must be a string")
    if "phases" in meta:
        if not isinstance(meta["phases"], list) or not all(
            isinstance(phase, str) and phase for phase in meta["phases"]
        ):
            raise WorkflowInputError("meta.phases must be a list of non-empty strings")
    return meta


def check_permission(meta, settings=None):
    """Apply the s03 allow/deny gate before launching a workflow."""
    settings = settings or {}
    if meta["name"] in settings.get("deny", []):

View on GitHub (pinned to 985456f4ad)

Solutions

  1. Set both fields to non-empty strings: a one-line summary is enough for description
  2. If generating meta programmatically, assert both keys before launch
  3. Keep a lint/test that validates every workflow fixture through validate_meta

Example fix

# before
meta = {"name": "ingest"}

# after
meta = {"name": "ingest", "description": "Ingest nightly feeds into the warehouse"}
Defensive patterns

Strategy: validation

Validate before calling

def has_required_meta_fields(meta: dict) -> bool:
    return bool(meta.get("name")) and bool(meta.get("description"))

assert has_required_meta_fields(meta), "meta requires non-empty name and description"

Type guard

def meta_has_name_and_description(meta) -> bool:
    return isinstance(meta, dict) and bool(meta.get("name")) and bool(meta.get("description"))

Try / catch

try:
    validate_meta(meta)
except WorkflowInputError as exc:
    if "requires `name` and `description`" in str(exc):
        meta.setdefault("description", "(no description provided)")
        validate_meta(meta)
    else:
        raise

Prevention

When it happens

Trigger: run(meta={"name": "ingest", "description": ""}) — empty description is falsy. Forgetting the description key entirely. Conditionally building meta and skipping description for 'internal' workflows.

Common situations: Templates or snippets copied without filling all fields. Optional-description assumptions carried over from other workflow engines where description is optional.

Related errors


AI-assisted analysis of shareAI-lab/learn-claude-code@985456f4ad (2026-08-14). Data as JSON: /api/errors/5b2458782c0283b9. Report an issue: GitHub.