affaan-m/ECC · error · ValueError

native snapshot clip is incomplete

Error message

native snapshot clip is incomplete

What it means

Raised by _check_clip when a clip in a native snapshot track is not a dict or is missing any of the required keys: path, name, start, end, left_offset, right_offset, enabled, properties. The validator requires a complete clip schema before range/offset checks run.

Solutions

  1. Add all missing required keys (path, name, start, end, left_offset, right_offset, enabled, properties) to each clip dict.
  2. Check clip keys against `required = {"path","name","start","end","left_offset","right_offset","enabled","properties"}` before calling the API.
  3. Regenerate the snapshot with the current native exporter version instead of reusing an old one.

Example fix

// before
{'path': 'a.mp4', 'start': 0, 'end': 100}
// after
{'path': 'a.mp4', 'name': 'a', 'start': 0, 'end': 100, 'left_offset': 0, 'right_offset': 0, 'enabled': True, 'properties': {}}
Defensive patterns

Strategy: validation

Validate before calling

required = {'path','name','start','end','left_offset','right_offset','enabled','properties'}
for track, clips in snapshot['timeline_readback'].items():
    for i, clip in enumerate(clips):
        missing = required - set(clip.keys())
        assert isinstance(clip, dict) and not missing, f'{track}[{i}] missing {missing}'

Type guard

def is_complete_clip(clip) -> bool:
    required = {'path','name','start','end','left_offset','right_offset','enabled','properties'}
    return isinstance(clip, dict) and required <= clip.keys()

Try / catch

try:
    bundle = build_application_bundle(...)
except ValueError as e:
    if 'native snapshot clip is incomplete' in str(e):
        for t, clips in snapshot['timeline_readback'].items():
            for i, c in enumerate(clips):
                if not isinstance(c, dict) or not required <= c.keys():
                    log.error('incomplete clip', track=t, index=i, keys=sorted(c.keys()) if isinstance(c, dict) else None)
    raise

Prevention

When it happens

Trigger: build_application_bundle -> _snapshot -> _check_clip encounters a clip entry lacking one or more of the eight required keys, or the entry is not a dict (e.g. a path string or None).

Common situations: Snapshots assembled by hand or by an older exporter that omits 'properties' or 'left_offset'/'right_offset'; JSON snapshots where clips lost fields after a schema change; a clip entry accidentally reduced to just its path.

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/77eda7547dfc468e. Report an issue: GitHub.

Appendix: source

Thrown at skills/taste-application/scripts/tasteforge/integration.py:228

        raise ValueError("native snapshot fps is missing, invalid or contradictory") from exc
    for cfg, key in [("project_name", "project"), ("timeline_name", "timeline")]:
        if _text(baseline[cfg]) != snapshot.get(key):
            raise ValueError("native snapshot identity mismatch")
    tracks = snapshot.get("timeline_readback")
    if not isinstance(tracks, dict) or not tracks:
        raise ValueError("native clip snapshot required")
    for track, clips in tracks.items():
        if not re.fullmatch(r"(?:video|audio)[1-9][0-9]*", track) or not isinstance(clips, list):
            raise ValueError("invalid native snapshot track")
        for clip in clips:
            _check_clip(clip, bounds)
    return tracks


def _check_clip(clip: Any, bounds: list[int]) -> None:
    required = {"path", "name", "start", "end", "left_offset", "right_offset", "enabled", "properties"}
    if not isinstance(clip, dict) or not required <= clip.keys():
        raise ValueError("native snapshot clip is incomplete")
    _range([clip["start"], clip["end"]], bounds)
    _integer(clip["left_offset"])
    _integer(clip["right_offset"])
    if clip["path"] is not None:
        _text(clip["path"])
    _text(clip["name"])
    if type(clip["enabled"]) is not bool or not isinstance(clip["properties"], dict):
        raise ValueError("native clip state is incomplete")


def _binding(item: Any, tracks: dict, baseline: dict, *, audio: bool = False) -> tuple:
    _object(item, {"media", "track", "clip_index", "media_frames", "fps",
                   "source_range", "timeline_range"})
    track, index = _text(item["track"]), _integer(item["clip_index"])
    if not track.startswith("audio" if audio else "video"):
        raise ValueError("wrong source/audio track kind")
    if track not in tracks or index >= len(tracks[track]):
        raise ValueError("source binding has no native clip")

View on GitHub (pinned to 8321021c54)