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
- Add all missing required keys (path, name, start, end, left_offset, right_offset, enabled, properties) to each clip dict.
- Check clip keys against `required = {"path","name","start","end","left_offset","right_offset","enabled","properties"}` before calling the API.
- 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
- Keep snapshot producers and consumers on the same schema version
- Diff clip keys against the required set in CI tests
- Never trim clip dicts when copying them between systems
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
- -32602
- artifact path must be a non-empty relative path
- assets must be a nonempty list
- built an invalid spec
- Canonical session snapshot must be an object
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)