{"record":{"id":"f56be38b1eaeed22","repo":"unslothai/unsloth","slug":"execution-artifacts-are-no-longer-available","errorCode":null,"errorMessage":"Execution artifacts are no longer available.","messagePattern":"Execution artifacts are no longer available\\.","errorType":"exception","errorClass":"RecipeDatasetPublishError","httpStatus":400,"severity":"error","filePath":"studio/backend/core/data_recipe/huggingface.py","lineNumber":37,"sourceCode":"\nclass RecipeDatasetPublishError(ValueError):\n    \"\"\"Raised when a recipe dataset cannot be published to Hugging Face.\"\"\"\n\n\ndef _resolve_recipe_artifact_path(artifact_path: str) -> Path:\n    root = recipe_datasets_root().expanduser().resolve()\n    candidate = resolve_dataset_path(artifact_path).expanduser()\n    resolved = candidate.resolve(strict = False)\n\n    try:\n        resolved.relative_to(root)\n    except ValueError as exc:\n        raise RecipeDatasetPublishError(\n            \"This execution artifact is outside the Recipe Studio dataset storage.\"\n        ) from exc\n\n    if not resolved.exists():\n        raise RecipeDatasetPublishError(\"Execution artifacts are no longer available.\")\n    if not resolved.is_dir():\n        raise RecipeDatasetPublishError(\"Execution artifact path is not a dataset folder.\")\n\n    return resolved\n\n\ndef publish_recipe_dataset(\n    *,\n    artifact_path: str,\n    repo_id: str,\n    description: str,\n    hf_token: str | None = None,\n    private: bool = False,\n) -> str:\n    dataset_path = _resolve_recipe_artifact_path(artifact_path)\n\n    try:\n        from data_designer.engine.storage.artifact_storage import (","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/core/data_recipe/huggingface.py#L19-L55","documentation":"RecipeDatasetPublishError raised when the artifact path resolves inside the datasets root but no longer exists on disk (resolved.exists() is False). It typically means the execution outputs were cleaned up (retention/GC) or deleted between run completion and the publish call.","triggerScenarios":"Publishing long after the recipe ran, with a retention job having purged old artifacts; manually deleting the artifact directory; container restarts wiping ephemeral storage that hosted the datasets root.","commonSituations":"RetentionPolicy/GC deleting old run outputs; studio deployed with the datasets root on a tmpfs or ephemeral volume; users cleaning disk space to free quota.","solutions":["Re-run the recipe to regenerate the artifact, then publish promptly.","Increase or disable artifact retention if publishing happens long after runs.","Put the datasets root on persistent storage (not a container tmpfs) in deployments that publish later.","Publish immediately after execution completes rather than from an old run history entry."],"exampleFix":"# before\npublish_recipe_dataset(artifact_path=old_artifact, ...)\n\n# after\n# re-execute the recipe first, then publish the fresh artifact\nrun = service.run_recipe(recipe)\npublish_recipe_dataset(artifact_path=run.artifact_path, ...)","handlingStrategy":"validation","validationCode":"from pathlib import Path\ndef artifact_available(artifact_path: str) -> bool:\n    return Path(artifact_path).expanduser().resolve().exists()","typeGuard":null,"tryCatchPattern":"try:\n    publish_recipe_dataset(artifact_path=p, repo_id=r)\nexcept RecipeDatasetPublishError as e:\n    if 'no longer available' in str(e):\n        run = rerun_recipe(recipe); publish_recipe_dataset(artifact_path=run.artifact_path, repo_id=r)","preventionTips":["Publish soon after execution completes.","Set artifact retention longer than your publish delay.","Keep the datasets root on persistent storage."],"tags":["filesystem","huggingface","data-recipe","studio"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}