
In this series, I'll walk you through how I think about designing solutions with Claude - not writing the code, but making the decisions that come before the code. I'll keep it in plain language and focus on the things that have proven most useful to me in practice.
Let's face it: picking a model is the easy part. The hard part is everything around it. Before you build anything with Claude, you have to answer four questions:
This series goes through these decisions one by one, a few at a time.
The approach I'm going to describe isn't a recipe you can copy and paste. Every project is different, and every choice here is a trade-off between cost, complexity and risk. My goal is to give you a set of questions and patterns, so that you can make a decision and defend it when someone puts a reasonable alternative on the table.
Note: Anthropic's products change quickly. Model names, features and availability mentioned here reflect the state of the platform at the time of writing. Always double-check the current Anthropic documentation before you commit to anything.
One of the most frustrating things I've seen is a design that looked perfect in the demo and fell apart three months later. The demo ran flawlessly five times in a row, so everybody assumed the system was reliable. Then the bill arrived, or the audit, or an angry customer.
The pattern is almost always the same. Someone said "let's just use Claude for that", "let's use an agent, so we don't limit it too early", or "let's use the best model available, just to be safe". Each of these sounds reasonable in a meeting. Each of them is a decision that was never really made - and a decision you don't make is still a decision. Usually it's the most expensive one.
If you design without understanding how the model behaves, you pay for it after launch, when rework is most expensive and trust is hardest to rebuild.
What makes it worse is that these problems don't announce themselves. A system that ignores the model's properties won't throw an error. It quietly drifts, and the gap shows up as inconsistent results caught by an auditor or an unhappy user - not by the system itself.
Most of these failures are predictable, though. If you know where to look, you can spot them on the whiteboard instead of in production.
Before deciding what Claude should do in your solution, you need a clear picture of how it behaves. None of the properties below is a bug to fix. Each one is a strength you design around - the same way a structural engineer designs around the properties of steel or concrete.
| Property | Where it shines | Where it struggles | What you do about it |
|---|---|---|---|
| Next-token prediction | Summarizing, reformatting, explaining well-known concepts | Precise details - names, dates, citations and statistics can look right without being right | Citations, uncertainty flags, generator-verifier loops, and tool calls to authoritative sources for specific facts |
| Knowledge | Topics that are common, recent and consistently present in training data | Rare, niche, disputed or fast-changing topics, which the model may present in the same confident tone | Web search, RAG, tool use or MCP servers, so an external system - not the model - is the source of truth |
| Working memory | Everything that fits inside the active context window | The window has a hard edge: once content falls outside it, the model has no access to it at all | Progressive context loading, chunking, putting key information first, and summarizing between turns |
| Steerability | Short, specific, verifiable instructions with defined formats, limits and clear roles | Vague instructions, long reasoning chains, precise math - and following the letter of an instruction but not its intent | System prompts, structured outputs, code execution for precise logic, and restating the goal next to the instruction |
The working memory edge can fail in two different ways, and they are easy to confuse:
400 invalid_request_error. If the raw request body exceeds the byte limit, you get 413 request_too_large.model_context_window_exceeded and truncated output.To stay away from the edge, check the usage field in every response and use the token counting API before you hit send.
Each property maps directly to a design consequence:
A story I keep coming back to: an architect watched a demo run perfectly five times in a row and concluded the behavior was deterministic. The team shipped a financial reconciliation pipeline that treated every model output as a fixed, repeatable result, with no checks around it. In week two, outputs started drifting - the same statement, processed again, got a different categorization. Nobody noticed until an analyst happened to re-run a batch.
The lesson isn't "the model is unreliable". The lesson is that a demo is not proof of determinism, and these four properties are there whether your architecture acknowledges them or not.
Before choosing anything, you need words that everyone in the room understands the same way. I've been in a review where someone said "we'll use an agent" and five people heard five different things: a single model with tools, a multi-step workflow, a team of subagents, Claude Code, and a chatbot. The discussion stalled for twenty minutes before anyone noticed.
These three terms are often used as if they meant the same thing, but they belong to different layers of the architecture. Every deployment includes all three.
You pick the entry point for the user and the job. You pick the build-time interface for the engineering team. You pick the delivery route for the partner's cloud commitments and compliance posture. Three different conversations with three different stakeholders.
Every pattern and architecture in this article is a combination of a small set of primitives. Each one has one job:
| Primitive | Job | In one sentence |
|---|---|---|
| Tools | Act | A function the model can call to take an action or fetch a result from your code |
| MCP | Connect | A protocol for exposing a set of tools, so many Claude clients can reach the same ones |
| Subagents | Isolate / parallelize | Hand a scoped subtask to a separate context, so it runs in isolation or in parallel |
| Hooks | Guarantee | Deterministic code that runs on defined events to enforce a rule the model can't skip |
| Skills | Package a procedure | A versioned, reusable unit (instructions plus optional scripts) that packages a repeatable procedure |
| Agent Teams | Coordinate partners | Multiple agents working as coordinated peers, each owning part of a larger goal |
| Dynamic Workflows | Compose at runtime | Assembling workflow steps at runtime instead of fixing them up front |
The key skill is composing these blocks - and using as few of them as the requirement allows. Every primitive you add is something to build, observe and govern. Reaching for a team of agents when a single tool call would do means paying in latency, tokens and operational surface on every single request.
Knowing how Claude behaves is only the foundation. In the next part, I'll use it to make the first two real design decisions: which work Claude should own, and whether it should run as a single call, a workflow or an agent.
Continue reading: Part 2: Decomposition and pattern selection