affaan-m/ECC · error · RuntimeError
placement missing from requested track
Error message
placement {event['id']} missing from requested track What it means
After appending placements, _readback looks up each placed item among the track's members by unique identity and requires exactly one match. Zero or multiple matches means the clip did not land on the requested track (or duplicates were created), so the operation fails loudly rather than continuing with a wrong edit.
Solutions
- Check the target video track is not locked/hidden and exists in Resolve
- Inspect the timeline after failure to find where the clip actually landed
- Re-run apply on a fresh versioned timeline; avoid concurrent edits during apply
- Verify media pool items imported successfully before append
- Confirm the track index used for readback matches the one used for append
Example fix
// before
# appended to track 2 but track was locked; readback searches track 2 and finds nothing
// after
track_item = timeline.GetTrackName("video", track)
assert not timeline.GetIsTrackLocked("video", track) # or unlock before apply
apply_placements(...) Defensive patterns
Strategy: validation
Validate before calling
if timeline.GetIsTrackLocked("video", track):
raise ValueError(f"video track {track} is locked; unlock before applying placements") Type guard
def track_is_appendable(timeline, kind: str, track: int) -> bool:
return (not timeline.GetIsTrackLocked(kind, track)) and track < timeline.GetTrackCount(kind) Try / catch
try:
apply_placements(...)
except RuntimeError as exc:
if "missing from requested track" in str(exc):
print(f"Check track locks and where the clip landed: {exc}")
raise Prevention
- Unlock/enable target video tracks before applying
- Verify media pool imports succeeded before AppendToTrack
- Run applies against a fresh duplicated timeline, never interactively edited ones
- Avoid concurrent edits/scripts on the timeline during apply
When it happens
Trigger: AppendToTrack silently dropped the clip; the clip landed on a different track than requested; duplicate items share an identity; the track list was read from the wrong track index.
Common situations: Target track locked or auto-disabled in Resolve; media pool item failed to import so append no-ops; Resolve redirecting inserts to the first available track; concurrent edits to the timeline during apply.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
- could not read track
- placement readback mismatch
- Resolve returned an item without an identity
- source_end_mode must be inclusive or exclusive
- source_timeline must be explicit
AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16).
Data as JSON: /api/errors/5a7f8f493d3c54e6.
Report an issue: GitHub.
Appendix: source
Thrown at skills/taste-application/scripts/tasteforge/resolve.py:205
return snapshot
def _readback(timeline, item, event):
track = event["track"]
members = _items(timeline, "video", track)
# API wrappers can be recreated on each call, so verify track membership by
# stable unique id when available; test doubles may use object identity.
def identity(candidate):
method = getattr(candidate, "GetUniqueId", None)
return method() if callable(method) else id(candidate)
item_id = identity(item)
if item_id is None:
raise RuntimeError("Resolve returned an item without an identity")
matches = [member for member in members if identity(member) == item_id]
if len(matches) != 1:
raise RuntimeError(f"placement {event['id']} missing from requested track")
item = matches[0]
actual = {
"start": item.GetStart(),
"end": item.GetEnd(),
"duration": item.GetDuration(),
"enabled": item.GetClipEnabled(),
"track": track,
"opacity": item.GetProperty("Opacity"),
"composite": item.GetProperty("CompositeMode"),
"path": _path(item),
}
expected = {
"start": event["record_frame"],
"end": event["record_frame"] + event["frames"],
"duration": event["frames"],
"enabled": True,
"track": track,
"opacity": event["opacity"],View on GitHub (pinned to 8321021c54)