{"record":{"id":"626b30d7781b677c","repo":"affaan-m/ECC","slug":"base-video-not-found-bp","errorCode":null,"errorMessage":"--base-video not found: {bp}","messagePattern":"--base-video not found: (.+?)","errorType":"console","errorClass":"SystemExit","httpStatus":null,"severity":"error","filePath":"skills/taste-application/scripts/apply.py","lineNumber":381,"sourceCode":"    clock = 0.0\n    for t in plan:\n        i = t[\"index\"]\n        s = ShotPlan(\n            i, clock, float(t[\"used\"]), stills[i % len(stills)],\n            cuts=t[\"shots\"], gen_duration=float(t[\"gen_duration\"]),\n        )\n        s.prompt = build_prompt(\n            spec, grade, style_steer, brief, i, len(plan),\n            float(t[\"gen_duration\"]), n_cuts=len(t[\"shots\"]),\n        )\n        shots.append(s)\n        clock += float(t[\"used\"])\n\n    base_video_url = None\n    if base_video:\n        bp = Path(base_video)\n        if not bp.exists():\n            raise SystemExit(f\"--base-video not found: {bp}\")\n        base_video_url = falapi.upload(bp)\n        print(f\"  base video     : {bp.name} (frames pulled per shot timecode)\")\n\n    overlay_urls: list[str] = []\n    if overlays:\n        # Fail before any paid upload: forge() rejects a missing overlay\n        # later, which would strand every generated take without a manifest.\n        missing = [Path(o) for o in overlays if not Path(o).is_file()]\n        if missing:\n            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)))","sourceCodeStart":363,"sourceCodeEnd":399,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/skills/taste-application/scripts/apply.py#L363-L399","documentation":"apply.py validates the optional --base-video argument before any upload: the user-supplied path does not exist on disk, so the pipeline aborts (via SystemExit) before calling falapi.upload.","triggerScenarios":"Thrown at skills/taste-application/scripts/apply.py:381 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Correct the --base-video path","Verify the file exists before invoking: ls on the path","Omit --base-video if no base video is needed"],"exampleFix":null,"handlingStrategy":"validation","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"}