{"record":{"id":"3bc4afb6e1fb9e5a","repo":"bytedance/deer-flow","slug":"failed-to-get-skill-str-e","errorCode":null,"errorMessage":"Failed to get skill: {str(e)}","messagePattern":"Failed to get skill: (.+?)","errorType":"http","errorClass":"HTTPException","httpStatus":500,"severity":"error","filePath":"backend/app/gateway/routers/skills.py","lineNumber":429,"sourceCode":"    response_model=SkillResponse,\n    summary=\"Get Skill Details\",\n    description=\"Retrieve detailed information about a specific skill by its name.\",\n)\nasync def get_skill(skill_name: str, config: AppConfig = Depends(get_config)) -> SkillResponse:\n    try:\n        skill_name = skill_name.replace(\"\\r\\n\", \"\").replace(\"\\n\", \"\")\n        skills = _get_user_skill_storage(config).load_skills(enabled_only=False)\n        skill = next((s for s in skills if s.name == skill_name), None)\n\n        if skill is None:\n            raise HTTPException(status_code=404, detail=f\"Skill '{skill_name}' not found\")\n\n        return _skill_to_response(skill)\n    except HTTPException:\n        raise\n    except Exception as e:\n        logger.error(f\"Failed to get skill {skill_name}: {e}\", exc_info=True)\n        raise HTTPException(status_code=500, detail=f\"Failed to get skill: {str(e)}\")\n\n\ndef _write_extensions_skill_state(\n    storage: SkillStorage,\n    skill_name: str,\n    enabled: bool,\n    *,\n    rebuild_public_projection: bool,\n) -> None:\n    \"\"\"Read-modify-write a skill's enabled state in the shared extensions_config.json.\n\n    Blocking filesystem IO: always call this via ``asyncio.to_thread``. It takes\n    the public projection lock before ``extensions_config_write_lock``. The first\n    keeps the enabled-only view synchronized across workers; the second prevents\n    this router and the MCP router from interleaving writes to the shared file.\n    Both locks are held by the worker, so request cancellation cannot release\n    either lock while the write or projection rebuild is still running.\n    \"\"\"","sourceCodeStart":411,"sourceCodeEnd":447,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/app/gateway/routers/skills.py#L411-L447","documentation":"Error \"Failed to get skill: {str(e)}\" thrown in bytedance/deer-flow.","triggerScenarios":"Thrown at backend/app/gateway/routers/skills.py:429 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check the Gateway logs for the underlying read error.","Verify the skill files on disk are readable and not corrupted."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"1dd6ba1acb03700589994b0366c5d1c7d05e2eff","analyzedAt":"2026-08-14T21:20:34.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}