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

  1. Check the target video track is not locked/hidden and exists in Resolve
  2. Inspect the timeline after failure to find where the clip actually landed
  3. Re-run apply on a fresh versioned timeline; avoid concurrent edits during apply
  4. Verify media pool items imported successfully before append
  5. 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

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


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)