{"record":{"id":"626f9cb766e8c51a","repo":"charmbracelet/crush","slug":"task-agent-not-configured","errorCode":null,"errorMessage":"task agent not configured","messagePattern":"task agent not configured","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/agent/agent_tool.go","lineNumber":29,"sourceCode":"\t\"github.com/charmbracelet/crush/internal/agent/tools\"\n\t\"github.com/charmbracelet/crush/internal/config\"\n)\n\n//go:embed templates/agent_tool.md\nvar agentToolDescription string\n\ntype AgentParams struct {\n\tPrompt string `json:\"prompt\" description:\"The task for the agent to perform\"`\n}\n\nconst (\n\tAgentToolName = \"agent\"\n)\n\nfunc (c *coordinator) agentTool(ctx context.Context) (fantasy.AgentTool, error) {\n\tagentCfg, ok := c.cfg.Config().Agents[config.AgentTask]\n\tif !ok {\n\t\treturn nil, errors.New(\"task agent not configured\")\n\t}\n\tprompt, err := taskPrompt(prompt.WithWorkingDir(c.cfg.WorkingDir()))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tagent, err := c.buildAgent(ctx, prompt, agentCfg, true)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn fantasy.NewParallelAgentTool(\n\t\tAgentToolName,\n\t\tagentToolDescription,\n\t\tfunc(ctx context.Context, params AgentParams, call fantasy.ToolCall) (fantasy.ToolResponse, error) {\n\t\t\tif params.Prompt == \"\" {\n\t\t\t\treturn fantasy.NewTextErrorResponse(\"prompt is required\"), nil\n\t\t\t}\n","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/charmbracelet/crush/blob/7944b8e52225d8805e31eacbf7ef24856b0dfb7a/internal/agent/agent_tool.go#L11-L47","documentation":"coordinator.agentTool builds the 'agent' sub-agent tool and requires that an agent definition named config.AgentTask (\"task\") exists in the configured Agents map. If the user's crush config defines no 'task' agent, the tool cannot know which prompt/model to run for sub-agent spawns, so buildTools fails with this error.","triggerScenarios":"Calling buildTools (during coordinator setup) when cfg.Config().Agents does not contain the key config.AgentTask — i.e. the 'task' agent block was removed, renamed, or never defined in crushrc/crush.json.","commonSituations":"Users hand-editing their crush config and deleting or renaming the [agents.task] section; configs copied from older versions before the task agent was mandatory; programmatic Config objects built without Agents entries.","solutions":["Add a 'task' agent definition to your crushrc/crush.json (agents.task with model and prompt settings).","Restore the default config (remove a custom config that omits the task agent) so the built-in task agent is used.","If building Config programmatically, populate Agents[config.AgentTask] before constructing the coordinator."],"exampleFix":"// before (crushrc)\n# no task agent defined\n// after\ntask {\n  model anthropic/claude-sonnet-4\n  prompt \"You are a task agent\"\n}","handlingStrategy":"validation","validationCode":"if _, ok := cfg.Agents[config.AgentTask]; !ok {\n    return errors.New(\"config must define a 'task' agent before building tools\")\n}","typeGuard":null,"tryCatchPattern":"coord, err := NewCoordinator(ctx, opts)\nif errors.Is(err, errTaskNotConfigured) || strings.Contains(err.Error(), \"task agent not configured\") {\n    // reload default config or inject Agents[config.AgentTask], then retry\n}","preventionTips":["Never delete the 'task' agent block from crushrc/crush.json when customizing.","Start custom configs from the shipped default config as a template.","Add a config pre-flight check validating required agent keys (coder, task) before launch."],"tags":["config","agent","subagent","missing-definition"],"backgroundTag":"missing-config-entry","analyzedSha":"7944b8e52225d8805e31eacbf7ef24856b0dfb7a","analyzedAt":"2026-08-29T12:48:59.079Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}