{"record":{"id":"6bede9786c77836c","repo":"affaan-m/ECC","slug":"every-shot-failed-nothing-to-compose","errorCode":null,"errorMessage":"every shot failed; nothing to compose","messagePattern":"every shot failed; nothing to compose","errorType":"console","errorClass":"SystemExit","httpStatus":null,"severity":"error","filePath":"skills/taste-application/scripts/apply.py","lineNumber":409,"sourceCode":"            raise SystemExit(\"--overlay not found: \" + \", \".join(str(m) for m in missing))\n        for o in overlays:\n            overlay_urls.append(falapi.upload(Path(o)))\n        print(f\"  overlays       : {len(overlay_urls)}\")\n\n    # Uploads are cached by (path, mtime, size), so the workers racing on the\n    # same handful of stills still only pay for each upload once.\n    lock = threading.Lock()\n    workers = max(1, min(int(concurrency), len(shots)))\n    print(f\"  generating     : {len(shots)} shot(s), {workers} worker(s) ...\")\n    with ThreadPoolExecutor(max_workers=workers) as pool:\n        list(pool.map(lambda s: _generate(s, base_video_url, lock), shots))\n\n    ok = [s for s in shots if s.video_url]\n    failed = [s for s in shots if not s.video_url]\n    for s in failed:\n        print(f\"  !! shot {s.index} failed: {s.error}\", file=sys.stderr)\n    if not ok:\n        raise SystemExit(\"every shot failed; nothing to compose\")\n\n    # Close ranks over any failed shot so the cut has no black hole in it.\n    timeline_clock = 0.0\n    for s in ok:\n        s.timeline_start = timeline_clock\n        timeline_clock += s.duration\n\n    # Generate long, trim short. Video models quantize to whole seconds with a\n    # floor of a few, but the pack's cadence is often faster than that (a 1.1s\n    # shot is normal in a fast reference). So each shot is requested at the\n    # model's nearest legal length and then cut back to its cadence-derived\n    # duration on the timeline - which is the only way the rough cut actually\n    # inherits the reference's rhythm instead of a 3s-per-clip floor.\n    tracks = [\n        {\n            \"id\": \"shots\",\n            \"type\": \"video\",\n            \"keyframes\": [","sourceCodeStart":391,"sourceCodeEnd":427,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/skills/taste-application/scripts/apply.py#L391-L427","documentation":"Aggregate failure guard in apply(): every shot generation in the worker pool failed, leaving no takes to compose into the rough cut. Individual shot errors were already logged; this fires only when the result set is empty.","triggerScenarios":"Thrown at skills/taste-application/scripts/apply.py:409 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Inspect the per-shot errors logged above this message (API auth, rate limit, or provider outage are typical)","Fix credentials/network and re-run with a new --out","Run with --dry-run first to validate the pipeline without spend"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"8321021c54d670126ce3b2969d5deb880b4b0c2a","analyzedAt":"2026-09-16T10:08:13.343Z","contentChangedAt":"2026-09-16T10:08:13.343Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}