calesthio/OpenMontage · error · FileNotFoundError

Pipeline manifest not found: {path}

Error message

Pipeline manifest not found: {path}

What it means

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.

Source

Thrown at lib/pipeline_loader.py:62

    re-parsing YAML + re-validating the schema each call.
    """
    return _load_pipeline_cached(name, str(defs_dir) if defs_dir else "")


def load_pipeline(name: str, defs_dir: Optional[Path] = None) -> dict[str, Any]:
    """Load and validate a pipeline manifest by name.

    Args:
        name: Pipeline name (without .yaml extension).
        defs_dir: Override directory for pipeline definitions.

    Returns:
        Validated pipeline manifest dict.
    """
    defs_dir = defs_dir or PIPELINE_DEFS_DIR
    path = defs_dir / f"{name}.yaml"
    if not path.exists():
        raise FileNotFoundError(f"Pipeline manifest not found: {path}")

    with open(path, encoding="utf-8") as f:
        manifest = yaml.safe_load(f)

    schema = _load_manifest_schema()
    jsonschema.validate(instance=manifest, schema=schema)

    return manifest


def list_pipelines(defs_dir: Optional[Path] = None) -> list[str]:
    """List all available pipeline manifest names."""
    defs_dir = defs_dir or PIPELINE_DEFS_DIR
    return [p.stem for p in defs_dir.glob("*.yaml")]


def _condition_is_active(condition: Optional[str], context: Optional[dict[str, Any]]) -> bool:
    """Evaluate a simple manifest condition against runtime context."""

View on GitHub (pinned to 95e1c3d0ab)

Solutions

  1. Check the resolved path in the error message and confirm the file actually exists there.
  2. List available pipelines with list_pipelines() (or list_pipelines(defs_dir=...)) and use an exact name without the .yaml extension.
  3. If using a custom definitions directory, verify defs_dir points at the folder containing the YAML, and fix the path if it was moved.

Example fix

# before
manifest = load_pipeline("short-form-video")  # FileNotFoundError

# after
from lib.pipeline_loader import list_pipelines, load_pipeline
print(list_pipelines())               # see exact valid names
manifest = load_pipeline("short_form_video")
Defensive patterns

Strategy: validation

Validate before calling

from lib.pipeline_loader import list_pipelines

available = set(list_pipelines())
if pipeline_name not in available:
    raise SystemExit(f"Unknown pipeline {pipeline_name!r}. Available: {sorted(available)}")

Type guard

from lib.pipeline_loader import list_pipelines

def pipeline_exists(name: str, defs_dir=None) -> bool:
    return name in list_pipelines(defs_dir)

Try / catch

try:
    manifest = load_pipeline(name)
except FileNotFoundError as e:
    # e.args[0] contains the resolved path — report it so the user sees which dir was searched
    raise SystemExit(str(e)) from e

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of calesthio/OpenMontage@95e1c3d0ab (2026-08-15). Data as JSON: /api/errors/8eea0786920667f8. Report an issue: GitHub.