{"record":{"id":"8eea0786920667f8","repo":"calesthio/OpenMontage","slug":"pipeline-manifest-not-found-path","errorCode":null,"errorMessage":"Pipeline manifest not found: {path}","messagePattern":"Pipeline manifest not found: (.+?)","errorType":"exception","errorClass":"FileNotFoundError","httpStatus":null,"severity":"error","filePath":"lib/pipeline_loader.py","lineNumber":62,"sourceCode":"    re-parsing YAML + re-validating the schema each call.\n    \"\"\"\n    return _load_pipeline_cached(name, str(defs_dir) if defs_dir else \"\")\n\n\ndef load_pipeline(name: str, defs_dir: Optional[Path] = None) -> dict[str, Any]:\n    \"\"\"Load and validate a pipeline manifest by name.\n\n    Args:\n        name: Pipeline name (without .yaml extension).\n        defs_dir: Override directory for pipeline definitions.\n\n    Returns:\n        Validated pipeline manifest dict.\n    \"\"\"\n    defs_dir = defs_dir or PIPELINE_DEFS_DIR\n    path = defs_dir / f\"{name}.yaml\"\n    if not path.exists():\n        raise FileNotFoundError(f\"Pipeline manifest not found: {path}\")\n\n    with open(path, encoding=\"utf-8\") as f:\n        manifest = yaml.safe_load(f)\n\n    schema = _load_manifest_schema()\n    jsonschema.validate(instance=manifest, schema=schema)\n\n    return manifest\n\n\ndef list_pipelines(defs_dir: Optional[Path] = None) -> list[str]:\n    \"\"\"List all available pipeline manifest names.\"\"\"\n    defs_dir = defs_dir or PIPELINE_DEFS_DIR\n    return [p.stem for p in defs_dir.glob(\"*.yaml\")]\n\n\ndef _condition_is_active(condition: Optional[str], context: Optional[dict[str, Any]]) -> bool:\n    \"\"\"Evaluate a simple manifest condition against runtime context.\"\"\"","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/calesthio/OpenMontage/blob/95e1c3d0ab93482159818560f6a8c8e866b9139f/lib/pipeline_loader.py#L44-L80","documentation":"Raised by lib/pipeline_loader.py's load_pipeline() when no {name}.yaml exists in the pipeline definitions directory (defaults to PIPELINE_DEFS_DIR, overridable via defs_dir). The loader resolves the manifest purely by filename inside the defs directory, so any name that doesn't correspond to a checked-in YAML file fails before schema validation runs. The message includes the full resolved path, which tells you exactly which directory was searched.","triggerScenarios":"Calling load_pipeline('nonexistent') or with a typo'd pipeline name; passing a custom defs_dir that doesn't contain the manifest; name includes a .yaml extension so the loader looks for name.yaml.yaml; the definitions directory moved or the file was deleted.","commonSituations":"Typo in a CLI argument or config reference; custom pipeline directory misconfigured; expecting a pipeline that only exists in another checkout/branch; passing the filename with extension.","solutions":["Check the resolved path in the error message and confirm the file actually exists there.","List available pipelines with list_pipelines() (or list_pipelines(defs_dir=...)) and use an exact name without the .yaml extension.","If using a custom definitions directory, verify defs_dir points at the folder containing the YAML, and fix the path if it was moved."],"exampleFix":"# before\nmanifest = load_pipeline(\"short-form-video\")  # FileNotFoundError\n\n# after\nfrom lib.pipeline_loader import list_pipelines, load_pipeline\nprint(list_pipelines())               # see exact valid names\nmanifest = load_pipeline(\"short_form_video\")","handlingStrategy":"validation","validationCode":"from lib.pipeline_loader import list_pipelines\n\navailable = set(list_pipelines())\nif pipeline_name not in available:\n    raise SystemExit(f\"Unknown pipeline {pipeline_name!r}. Available: {sorted(available)}\")","typeGuard":"from lib.pipeline_loader import list_pipelines\n\ndef pipeline_exists(name: str, defs_dir=None) -> bool:\n    return name in list_pipelines(defs_dir)","tryCatchPattern":"try:\n    manifest = load_pipeline(name)\nexcept FileNotFoundError as e:\n    # e.args[0] contains the resolved path — report it so the user sees which dir was searched\n    raise SystemExit(str(e)) from e","preventionTips":["Pass the bare pipeline name (no .yaml extension).","When using a custom defs_dir, verify the directory contains the YAML before loading.","Offer list_pipelines() output in CLI help/usage errors."],"tags":["pipeline","manifest","file-not-found","configuration"],"backgroundTag":null,"analyzedSha":"95e1c3d0ab93482159818560f6a8c8e866b9139f","analyzedAt":"2026-08-15T06:31:20.014Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}