{"record":{"id":"48458e9695b7ec71","repo":"calesthio/OpenMontage","slug":"ark-task-succeeded-without-content-video-url","errorCode":null,"errorMessage":"Ark task succeeded without content.video_url","messagePattern":"Ark task succeeded without content\\.video_url","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"critical","filePath":"tools/video/seedance_ark.py","lineNumber":633,"sourceCode":"                detail = self._task_error(task)\n                safe_detail = (\n                    self._safe_error(RuntimeError(detail), api_key) if detail else \"\"\n                )\n                return ToolResult(\n                    success=False,\n                    data={\"task_id\": task_id, \"status\": status},\n                    error=(\n                        f\"Ark Seedance task {status or 'failed'}\"\n                        + (f\": {safe_detail}\" if safe_detail else \"\")\n                    ),\n                    duration_seconds=round(time.time() - started, 2),\n                    model=str(task.get(\"model\") or model),\n                )\n\n            content = task.get(\"content\") or {}\n            video_url = content.get(\"video_url\")\n            if not video_url:\n                raise RuntimeError(\"Ark task succeeded without content.video_url\")\n            output_path = Path(inputs.get(\"output_path\", \"seedance_ark_output.mp4\"))\n            self._download_video(str(video_url), output_path)\n\n            from tools.video._shared import probe_output\n\n            probed = probe_output(output_path)\n            cost_usd = self._cost_from_task(task, inputs)\n            return ToolResult(\n                success=True,\n                data={\n                    \"provider\": self.provider,\n                    \"task_id\": task_id,\n                    \"status\": status,\n                    \"model\": task.get(\"model\") or model,\n                    \"prompt\": inputs.get(\"prompt\"),\n                    \"operation\": inputs.get(\"operation\", \"text_to_video\"),\n                    \"video_url\": video_url,\n                    \"last_frame_url\": content.get(\"last_frame_url\"),","sourceCodeStart":615,"sourceCodeEnd":651,"githubUrl":"https://github.com/calesthio/OpenMontage/blob/95e1c3d0ab93482159818560f6a8c8e866b9139f/tools/video/seedance_ark.py#L615-L651","documentation":"Raised in the synchronous-completion path of `execute()`: the Ark task reported a succeeded status, but `task['content']['video_url']` is missing/empty, so there is nothing to download to `output_path`. Unlike the input-validation ValueErrors, this is a RuntimeError from the post-paid-call phase — money was spent but no artifact was delivered, which is a provider contract violation worth surfacing distinctly.","triggerScenarios":"Ark returns status=succeeded with an empty `content` object or no `video_url` key; a moderation pass stripped the asset; a payload shape change moved the URL elsewhere; extremely rare partial provider failures.","commonSituations":"Content-policy flags that mark a task succeeded without producing media; API version drift renaming `content.video_url`; tasks queried right at the boundary where the artifact is not yet materialized but status flipped early.","solutions":["Re-query the task once with `task_action: 'query'` and inspect the full task JSON — if the URL appears, download manually or re-run execute","Check the task's failure_reason / detail fields even on succeeded status (the code path above already extracts safe_detail for failed tasks)","If reproducible with a clean payload, report to Volcengine support with the task_id — you were billed for an undelivered artifact","Retry generation with a modified prompt if the content was policy-stripped"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"task = client.query(task_id)\ncontent = task.get(\"content\") or {}\nif task.get(\"status\") == \"succeeded\" and not content.get(\"video_url\"):\n    # re-query once; artifact may materialize late\n    import time; time.sleep(5)\n    task = client.query(task_id)\n    content = task.get(\"content\") or {}","typeGuard":null,"tryCatchPattern":"try:\n    result = ark.execute(inputs)\nexcept RuntimeError as e:\n    if \"content.video_url\" in str(e):\n        # one re-query, then escalate — money was spent, artifact missing\n        task = ark.execute({\"task_action\": \"query\", \"task_id\": task_id})\n        if not task.success:\n            report_provider_issue(task_id, e)\n        result = task\n    else:\n        raise","preventionTips":["Treat succeeded-without-URL as a billable incident: capture task_id and full JSON for support","Build a small re-query with backoff before declaring failure — status can flip slightly before the URL is present","Moderation-sensitive prompts are a common trigger; review prompt content if reproducible"],"tags":["seedance","ark","provider-bug","video-generation","download"],"backgroundTag":null,"analyzedSha":"95e1c3d0ab93482159818560f6a8c8e866b9139f","analyzedAt":"2026-08-15T06:31:20.014Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}