affaan-m/ECC · error · RuntimeError

Blender did not complete every requested render frame

Error message

Blender did not complete every requested render frame

What it means

Render verification in verify_render: Blender did not report FINISHED or one or more expected per-frame PNGs (turn_0001.png..turn_NNNN.png) is missing or empty, so the render is incomplete and unusable.

Solutions

  1. Check Blender's console/log output for render errors before the failure
  2. Freeze no longer needed — reduce frames or resolution and re-render to a new output
  3. Verify disk space; zero-byte frames often mean a full disk
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at skills/taste-application/scripts/blender_prop.py:143 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at skills/taste-application/scripts/blender_prop.py:143

               radius / math.sin(min(horizontal_half, vertical_half)) * 1.05)


def linearize_action(action) -> None:
    """Blender 4 legacy actions and Blender 5 slotted action channel bags."""
    if hasattr(action, "fcurves"):
        curves = action.fcurves
    else:
        curves = [curve for layer in action.layers for strip in layer.strips
                  for bag in getattr(strip, "channelbags", ()) for curve in bag.fcurves]
    for curve in curves:
        for point in curve.keyframe_points:
            point.interpolation = "LINEAR"


def verify_render(status, render_dir: Path, frames: int) -> None:
    expected = [render_dir / f"turn_{frame:04d}.png" for frame in range(1, frames + 1)]
    if "FINISHED" not in status or not all(path.is_file() and path.stat().st_size > 0 for path in expected):
        raise RuntimeError("Blender did not complete every requested render frame")


def _sha256(path: Path) -> str:
    with path.open("rb") as stream:
        return hashlib.file_digest(stream, "sha256").hexdigest()


def build(mesh: Path, pack: Path, out: Path | None, frames: int, size: int,
          render_dir: Path | None, *, width: int | None = None,
          height: int | None = None, fps: float = 24,
          receipt: Path | None = None) -> None:
    width = size if width is None else width
    height = size if height is None else height
    validate_settings(frames, width, height, fps)
    if not mesh.is_file():
        raise ValueError(f"mesh is not a regular file: {mesh}")
    for path in (out, receipt, render_dir):
        if path is not None:

View on GitHub (pinned to 8321021c54)