affaan-m/ECC · error · ValueError

asset requires verified alpha

Error message

asset requires verified alpha: {asset}

What it means

When a placement is marked as requiring alpha (alpha=True), tasteforge only trusts an explicit verified has_alpha=True in the asset's probed metadata. Anything else (missing key, false, unverified) throws this error because compositing an opaque asset would silently lose transparency.

Solutions

  1. Verify the asset actually has an alpha channel and fix the probe metadata to report has_alpha=True
  2. Set alpha=False on the placement if transparency is not required
  3. Re-export the asset with an alpha-capable codec (ProRes 4444, PNG sequence)
  4. Update the probe implementation so it detects the codec's alpha support

Example fix

// before
plan = allocate_placements([{"asset": "overlay.mov", "alpha": True}], probe=my_probe)  # my_probe omits has_alpha
// after
plan = allocate_placements([{"asset": "overlay_prores4444.mov", "alpha": True}], probe=probe_with_alpha_detection)
Defensive patterns

Strategy: validation

Validate before calling

if placement.get("alpha") and probe(asset).get("has_alpha") is not True:
    raise ValueError(f"{asset} lacks verified alpha; re-probe or set alpha=False")

Type guard

def has_verified_alpha(info: dict) -> bool:
    return info.get("has_alpha") is True

Prevention

When it happens

Trigger: allocate_placements called with a placement where alpha is true but the probe result for the asset does not set has_alpha to exactly True (prober doesn't detect alpha, or codec/container has no alpha channel).

Common situations: Using ProRes 4444 vs ProRes 422 mistakenly; a probe function that never reports has_alpha; PNG/MOV re-encoded without alpha; passing alpha=True for assets that were never verified on this Resolve host.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16). Data as JSON: /api/errors/f481be531c7c1945. Report an issue: GitHub.

Appendix: source

Thrown at skills/taste-application/scripts/tasteforge/resolve.py:131

        raw_asset = event.get("asset")
        if not isinstance(raw_asset, (str, Path)) or not str(raw_asset):
            raise ValueError("asset must be a local regular file")
        asset = Path(raw_asset).expanduser().resolve()
        if not asset.is_file():
            raise ValueError(f"asset must be a local regular file: {asset}")
        alpha = event.get("requires_alpha", False)
        if not isinstance(alpha, bool):
            raise ValueError("requires_alpha must be boolean")
        key = str(asset)
        if key not in metadata:
            metadata[key] = probe(asset)
        info = metadata[key]
        if _fps(info.get("fps")) != rate:
            raise ValueError(f"asset fps differs from timeline: {asset}")
        if _integer(info.get("frames"), "asset frames", 1) < frames:
            raise ValueError(f"asset contains too few frames: {asset}")
        if alpha and info.get("has_alpha") is not True:
            raise ValueError(f"asset requires verified alpha: {asset}")
        checked.append(
            {
                "id": identifier,
                "asset": key,
                "record_frame": start,
                "frames": frames,
                "opacity": opacity,
                "composite": composite,
            }
        )
    if not checked:
        raise ValueError("at least one placement is required")
    ends, allocated = [], {}
    for event in sorted(checked, key=lambda entry: entry["record_frame"]):
        index = next(
            (i for i, end in enumerate(ends) if end <= event["record_frame"]), len(ends)
        )
        if index == len(ends):

View on GitHub (pinned to 8321021c54)