What Picasso taught me about building AI Agents A practitioner's account argues that building AI agents has become simpler as models improve, with the author's current workflow reduced to creating a folder, running Claude Code in the terminal, and having Claude generate an AGENTS.md plus Markdown-based skills, context files, and a minimal tool set via plugins or MCP connectors. The agent is then invoked headless with the `claude -p` flag for cron jobs, webhooks, or other programs, with tool permissions configured in advance and structured JSON returned for downstream use. The author credits the shift to better models and to stripping away frameworks, orchestration engines, multi-agent architectures, state machines, vector databases, and elaborate planning mechanisms, invoking Picasso's 11-iteration *Le Taureau* as the analogy. The great master Pablo Picasso is famously attributed with saying: "It took me four years to paint like Raphael, but a lifetime to paint like a child." His work, Le Taureau The Bull , captures this beautifully. Across 11 iterations, Picasso progressively stripped away the details of a bull until only a few lines remained. Yet the bull was unmistakable. In my journey of learning to build AI agents, I can relate. It has come full circle. Like many engineers, I started with abstractions and sophisticated software systems. Frameworks, orchestration engines, multi-agent architectures, state machines, vector databases, memory systems, and elaborate planning mechanisms. The more I experimented, the more I found myself stripping things away. The models were getting better. More things worked with a single prompt. But that wasn't the whole story. I had been overcomplicating things. This is now my workflow. I open my terminal. mkdir my awesome agent cd my awesome agent claude and start a conversation. "Claude, I want to build an agent that does XYZ. Help me initialize it. Create an AGENTS.md and let's figure out what else it needs." I work through a few questions with Claude. What is this agent supposed to accomplish? What is the actual job? Not what framework to use, unless you're creating a framework. What does success look like? What decisions can the agent make independently? What should it never do without permission? What skills does it need? Skills are specialized instructions that can be reused and remixed. There are plenty of excellent examples on the internet. Borrow them, adapt them, combine them, or ask Claude to create new ones. Often, a skill is simply a Markdown file with instructions and perhaps a few supporting resources. What context does it need? The agent will need context: what your business does, who your customers are, how your codebase works, or some domain-specific knowledge. These can all live as Markdown files inside the folder. Some context can be retrieved when needed. Some comes from the conversation itself. You don't automatically need a vector database or a sophisticated memory architecture. What tools does it need? To perform a job, an agent needs tools. Maybe it needs to search the web, read a database, call an API, execute a script, or interact with a browser. Introducing a tool is as simple as enabling a plugin https://code.claude.com/docs/en/discover-plugins or adding an MCP connector https://code.claude.com/docs/en/mcp . I ask Claude to help identify the smallest set of tools required to accomplish the task. A tool could even be created dynamically, with the agent writing and invoking code. The agent could also find tools on the internet and install them. How does the agent get invoked? For an agent to be useful, it needs to be invoked as part of a workflow, whether by a cron job, a webhook event, or another program. The simplicity is in the packaging. A folder with instructions is a clean deployable unit. It can be versioned, copied around, and embedded in other processes. With Claude and the required tools and credentials available, it can be invoked headless using the -p flag: cd my awesome agent claude -p "Do awesome stuff" Headless means there is no interactive chat. Claude receives the task, works in the agent's folder, prints the result, and exits. A script can pass in the task and collect the output. For unattended work, I configure the tool permissions in advance. Claude can also return structured JSON for another program to use. Anthropic's documentation on headless execution https://code.claude.com/docs/en/headless covers the commands and configuration. When the agent starts, it needs to know where to find its instructions, what input it has received, and whether it should resume previous work. The invocation mechanism can change without changing the fundamental purpose of the agent. This setup can be deployed on a remote VM, with hooks triggering the agent and a tunnel providing access to a service that invokes it. How does it know whether it has done a good job? This is where things have drastically improved. I can now get things done with a single prompt, without elaborate instructions. Nowadays, I often just trust it to get on with the job. And I expect it to keep getting better. When it gets something wrong, I go through it with Claude. What happened? What was missing? What should we change? Claude saves local session transcripts https://code.claude.com/docs/en/claude-directory application-data under ~/.claude/projects/