{"record":{"id":"a58fb3398be99d8e","repo":"Significant-Gravitas/AutoGPT","slug":"slug-is-a-built-in-skill-and-cannot-be-deleted","errorCode":null,"errorMessage":"'{slug}' is a built-in skill and cannot be deleted","messagePattern":"'(.+?)' is a built-in skill and cannot be deleted","errorType":"http","errorClass":"HTTPException","httpStatus":400,"severity":"warning","filePath":"autogpt_platform/backend/backend/api/features/v1.py","lineNumber":2783,"sourceCode":"    tags=[\"skills\"],\n    dependencies=[Security(requires_user)],\n)\nasync def delete_copilot_skill(\n    user_id: Annotated[str, Security(get_user_id)],\n    name: str = Path(..., description=\"Slug of the skill to delete\"),\n) -> dict[str, str]:\n    \"\"\"Delete a user-distilled skill by slug.\n\n    Built-in defaults are not user-deletable — attempting to delete one\n    returns 400.  Missing skills return 404 so the UI can reconcile a\n    stale list.\n    \"\"\"\n    try:\n        slug = await delete_user_skill(user_id, name)\n    except ValueError as exc:\n        raise HTTPException(status_code=400, detail=str(exc))\n    except BuiltInSkillError as exc:\n        raise HTTPException(status_code=400, detail=str(exc))\n    except SkillNotFoundError as exc:\n        raise HTTPException(status_code=HTTP_404_NOT_FOUND, detail=str(exc))\n    return {\"name\": slug}\n\n\n########################################################\n#####################  API KEY ##############################\n########################################################\n\n\n@v1_router.post(\n    \"/api-keys\",\n    summary=\"Create new API key\",\n    tags=[\"api-keys\"],\n    dependencies=[Security(requires_user)],\n)\nasync def create_api_key(\n    request: CreateAPIKeyRequest,","sourceCodeStart":2765,"sourceCodeEnd":2801,"githubUrl":"https://github.com/Significant-Gravitas/AutoGPT/blob/9c8bb5550f446ba5d3046b78896578742495b3cf/autogpt_platform/backend/backend/api/features/v1.py#L2765-L2801","documentation":"Skill-delete endpoint returns 400 when `delete_user_skill` raises BuiltInSkillError — the target slug resolves to a packaged default skill, which is shared across all users and therefore not user-deletable. The exception message is passed through verbatim ('{slug}' is a built-in skill and cannot be deleted). The detail endpoint flags these with is_default=True precisely so UIs can hide destructive affordances.","triggerScenarios":"DELETE /skills/{name} where name matches a built-in default skill slug (the same slugs get_default_skill_with_body resolves).","commonSituations":"UIs rendering a delete button on every list row including defaults; scripts iterating the full skill list and deleting each entry; users attempting to remove unwanted default skills to declutter.","solutions":["Filter deletes with the is_default flag from the skill detail/list payload.","If the default is unwanted in the UI, hide it client-side — deletion is intentionally blocked server-side.","Operators wanting default sets changed must change the packaged default skills, not per-user deletes."],"exampleFix":"// before\n{skills.map(s => <DeleteButton onClick={() => api.deleteSkill(s.name)} />)}\n// after\n{skills.map(s => !s.isDefault && <DeleteButton onClick={() => api.deleteSkill(s.name)} />)}","handlingStrategy":"type-guard","validationCode":"const detail = await api.getSkillDetail(slug);\nif (detail.isDefault) { show('Built-in skills cannot be deleted'); return; }","typeGuard":"function isDeletableSkill(s: {isDefault?: boolean}): boolean {\n  return s.isDefault !== true;\n}","tryCatchPattern":"try {\n  await api.deleteSkill(slug);\n} catch (e) {\n  if (e.status === 400 && /built-in/i.test(e.detail)) { hideDeleteUiFor(slug); return; }\n  throw e;\n}","preventionTips":["Hide delete affordances for entries with is_default=true.","Don't run blanket delete loops over mixed default+user skill lists.","Filter defaults out of user-management views."],"tags":["http-400","skills","built-ins","immutable-resources"],"backgroundTag":null,"analyzedSha":"9c8bb5550f446ba5d3046b78896578742495b3cf","analyzedAt":"2026-08-14T17:17:21.957Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}