{"record":{"id":"624ffb303e58afae","repo":"conductor-oss/conductor","slug":"named-slots-planner-and-fallback-are-onl","errorCode":null,"errorMessage":"Named slots ``planner=`` and ``fallback=`` are only valid with ``strategy=Strategy.PLAN_EXECUTE``. Agent '{}' has strategy='{}'. Either set ``strategy=Strategy.PLAN_EXECUTE`` or pass the sub-agents via ``agents=[…]`` instead.","messagePattern":"Named slots ``planner=`` and ``fallback=`` are only valid with ``strategy=Strategy\\.PLAN_EXECUTE``\\. Agent '(.+?)' has strategy='(.+?)'\\. Either set ``strategy=Strategy\\.PLAN_EXECUTE`` or pass the sub-agents via ``agents=\\[…\\]`` instead\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/compiler/AgentCompiler.java","lineNumber":160,"sourceCode":"                            || config.getPlanner() != null\n                            || config.getFallback() != null;\n            boolean hasTools = config.getTools() != null && !config.getTools().isEmpty();\n\n            AgentConfig.Strategy strategy = config.getStrategy();\n\n            // Named slots (``planner=``/``fallback=``) are PLAN_EXECUTE-only.\n            // Every other strategy compiler iterates ``config.getAgents()``\n            // directly without consulting the named slots; the dispatch fix\n            // that broadened ``hasAgents`` admits planner-only configs into\n            // those compilers, which then NPE on ``config.getAgents().size()``.\n            // Reject the cross-product here with a clear migration message\n            // rather than letting it die with an opaque stack trace deep\n            // inside compileSequential / compileParallel / compileHandoff\n            // / compileHybrid / etc.\n            boolean hasNamedSlots = config.getPlanner() != null || config.getFallback() != null;\n            boolean isPlanExecute = strategy == AgentConfig.Strategy.PLAN_EXECUTE;\n            if (hasNamedSlots && !isPlanExecute) {\n                throw new IllegalArgumentException(\n                        \"Named slots ``planner=`` and ``fallback=`` are only valid with \"\n                                + \"``strategy=Strategy.PLAN_EXECUTE``. Agent '\"\n                                + config.getName()\n                                + \"' has strategy='\"\n                                + (strategy == null ? \"(unset → handoff)\" : strategy.toValue())\n                                + \"'. Either set ``strategy=Strategy.PLAN_EXECUTE`` or pass the \"\n                                + \"sub-agents via ``agents=[…]`` instead.\");\n            }\n\n            // Strategy-led dispatch: an explicit non-handoff multi-agent\n            // strategy (PLAN_EXECUTE, SEQUENTIAL, PARALLEL, ROUTER, SWARM,\n            // ROUND_ROBIN, RANDOM, MANUAL) always routes to MultiAgentCompiler.\n            // Previously a non-empty ``tools`` field silently rerouted to\n            // ``compileHybrid``, which only knows handoff semantics — the\n            // declared strategy was dropped on the floor. Hybrid is reserved\n            // for the handoff case (the only one it actually implements).\n            boolean isMultiAgentStrategy =\n                    strategy != null && strategy != AgentConfig.Strategy.HANDOFF;","sourceCodeStart":142,"sourceCodeEnd":178,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/compiler/AgentCompiler.java#L142-L178","documentation":"Error \"Named slots ``planner=`` and ``fallback=`` are only valid with ``strategy=Strategy.PLAN_EXECUTE``. Agent '{}' has strategy='{}'. Either set ``strategy=Strategy.PLAN_EXECUTE`` or pass the sub-agents via ``agents=[…]`` instead.\" thrown in conductor-oss/conductor.","triggerScenarios":"Thrown at agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/compiler/AgentCompiler.java:160 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set strategy=Strategy.PLAN_EXECUTE on the agent when using planner= and fallback= named slots.","Or drop planner=/fallback= and pass sub-agents via agents=[...] for non plan-execute strategies."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}