{"record":{"id":"0fa8ea7abda93077","repo":"conductor-oss/conductor","slug":"skill-registry-is-not-available","errorCode":null,"errorMessage":"Skill registry is not available","messagePattern":"Skill registry is not available","errorType":"exception","errorClass":"IllegalStateException","httpStatus":500,"severity":"critical","filePath":"agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/service/AgentService.java","lineNumber":1220,"sourceCode":"            }\n        }\n    }\n\n    // ── Config resolution ─────────────────────────────────────────\n\n    /**\n     * Resolve the AgentConfig from a AgentStartRequest. If {@code framework} is set, normalize the\n     * raw config via the appropriate normalizer. Otherwise, use the native {@code agentConfig}\n     * field directly.\n     */\n    private AgentConfig resolveConfig(AgentStartRequest request) {\n        if (request.getFramework() != null && !request.getFramework().isEmpty()) {\n            log.debug(\"Normalizing framework '{}' agent config\", request.getFramework());\n            if (\"skill\".equals(request.getFramework())\n                    && request.getRawConfig() == null\n                    && request.getSkillRef() != null) {\n                if (skillRegistryService == null) {\n                    throw new IllegalStateException(\"Skill registry is not available\");\n                }\n                request.setRawConfig(skillRegistryService.resolveRawConfig(request.getSkillRef()));\n            }\n            return normalizerRegistry.normalize(request.getFramework(), request.getRawConfig());\n        }\n        if (request.getAgentConfig() == null) {\n            throw new IllegalArgumentException(\n                    \"agentConfig is required when framework is not specified\");\n        }\n        return request.getAgentConfig();\n    }\n\n    // ── SSE Streaming ──────────────────────────────────────────────\n\n    /** Open an SSE stream for an agent execution. Replays missed events on reconnect. */\n    public SseEmitter openStream(String executionId, Long lastEventId) {\n        log.info(\"Opening SSE stream for execution {} (lastEventId={})\", executionId, lastEventId);\n        workflowService.getExecutionStatus(executionId, false);","sourceCodeStart":1202,"sourceCodeEnd":1238,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/service/AgentService.java#L1202-L1238","documentation":"Thrown by AgentService.resolveConfig when the request uses framework='skill' with a skillRef but the SkillRegistryService bean is null (not wired). This means the agentspan module was built/deployed without the skill registry integration, so skill references cannot be resolved. IllegalStateException maps to HTTP 500 — it is a configuration/deployment problem, not a caller input error.","triggerScenarios":"Starting an agent with framework=skill and skillRef set, but the SkillRegistryService is not on the classpath or not injected; the conditional bean for SkillRegistryService was not activated.","commonSituations":"Production deployment excludes the skill-registry module; Spring profile or conditional property for SkillRegistryService is not enabled; a custom build strips the skill registry dependency.","solutions":["Ensure the SkillRegistryService bean is available (include the skill-registry module and activate its conditional property).","If skills are not supported in this deployment, do not use framework=skill — use framework=conductor with an inline agentConfig instead.","Check the Spring context / bean wiring for SkillRegistryService."],"exampleFix":"// before (framework=skill but no registry)\nAgentStartRequest req = AgentStartRequest.builder()\n    .framework(\"skill\")\n    .skillRef(\"my-skill\")\n    .prompt(\"hello\")\n    .build();\nservice.start(req); // -> IllegalStateException\n\n// after (option A: enable the registry)\n// application.properties: conductor.integrations.ai.skills.enabled=true\n// after (option B: use inline config instead)\nAgentStartRequest req = AgentStartRequest.builder()\n    .agentConfig(myConfig)\n    .prompt(\"hello\")\n    .build();","handlingStrategy":"try-catch","validationCode":"// Before using framework=skill, verify the registry is wired\nif (skillRegistryService == null && \"skill\".equals(request.getFramework())) {\n    throw new IllegalStateException(\n        \"Skill registry not available; cannot resolve skillRef\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    service.start(request);\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"Skill registry is not available\")) {\n        // Deployment issue — fall back to inline agentConfig\n        log.error(\"Skill registry not wired; use inline config instead\", e);\n    }\n}","preventionTips":["Ensure the skill-registry module is on the classpath and its conditional property is enabled.","Do not use framework=skill in deployments that lack the registry bean.","Add a startup check that logs whether SkillRegistryService is active."],"tags":["illegal-state","skill","configuration","missing-bean"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}