Guide · Software development × AI · October 2026

Understanding Claude Code and using it effectively

Same tool, same model: some developers get entire features out of it, others get throwaway code. The difference isn’t in the prompt. It’s in the method, and in what you write before Claude writes the first line.

Written for
  • devs

Tuesday, 10 a.m. Two developers on the same team open Claude Code on the same repository, with the same model and the same subscription. By noon, the first has shipped their feature, tests included, and has had time to reread every line. The second is looking at a fourteen-file diff for what was supposed to be a simple CSV export, and Claude assures them, with undiminished enthusiasm, that everything is done.

Nobody had asked it for a generic service. Nobody had forbidden it either. And that is what this whole article is about.

I use Claude Code in both my personal and my professional projects, and I’ve lived both versions of that Tuesday. I draw one simple conclusion from it:

With an agent like Claude Code, the prompt matters less than the organization.Organization comes down to four things, and the article covers them one by one.
What it knows

before it starts: the context, memory, the spec.

What it’s allowed to do

on its own, with your approval, or never.

How it checks

its work: tests, types, rendering.

Who reviews

at the end, and what gets pushed.

The question everyone asks What’s the best prompt for Claude Code?
The question I suggest instead Which way of working for which need, and what do I, myself, have to write so that the code it writes is the right code?

In the article “Will AI replace developers? Wrong question.”, I argued that the developer moves from the role of author to that of editor, and that the spec becomes the real code again. The article “Understanding AI and mastering its jargon” laid down the vocabulary: the context, the agent, the harness, MCP, skills. This one moves on to practice, with the tool that changed the way I work.

Since we’re talking to developers, the article is built like a Git branch: one commit per part, and a merge at the end. We start by opening the hood, because you can only drive well what you understand. Then come the seven ways of working with Claude Code, without judgment, then mine, with my reasons. We finish in the workshop, with configuration files you can copy, and a plan for your first week.

This article describes Claude Code as it stands at the end of October 2026. The tool changes every week: the principles will hold, the commands and options will shift. For up-to-date details, the reference remains the official documentation. I’ll update the article when the essentials change.
Part 1

Under the hood

You can only drive well what you understand. Before talking method, let’s open the hood: what Claude Code really is, what it sees, what it remembers, and who holds the wheel. Two images will help us, and will stay with us to the end of the article: a new colleague, for the way it works, and a car, for the way it is built and driven.

A harness, not autocomplete

Definition

Claude Code is not a model. It’s a harness: a program that runs on your machine and wraps an Anthropic model (Opus, Sonnet, Haiku or Fable) in tools, permissions, memory and a loop.

The word comes from the article “Understanding AI and mastering its jargon”. The model itself never touches your disk. It asks to read a file or run a command; Claude Code checks that it’s allowed, executes, and hands back the result. Then the model decides what comes next.

The Claude Code loop. Your message joins the context (instructions, CLAUDE.md and memory, skill descriptions, tools, conversation). The model reads the whole context and either answers or requests a tool. The request goes through permissions, the tool runs on your machine, and its result joins the context. The loop starts again until the final answer. You a message The context everything the model sees harness instructions CLAUDE.md and memory skill descriptions tool definitions, MCP the conversationmessages, files read, outputs The model reads it all, decides answers when it’s done asks Permissions allowed? denied? ask you? The tool runs on your machine read · search · edit · run · web · delegate the result joins the context
The loop: a simple request takes a few turns, a feature several dozen.
Key point

On every turn of the loop, everything that is read or displayed is added to the context. This detail explains half the advice in this article.

Image 1 · the colleague

A new colleague, every morning

A direct consequence of the loop: Claude Code doesn’t “know” your project. It discovers it in every session, by reading. Imagine a new colleague, brilliant and very fast, who shows up every morning with no memory of the day before. To work well with it, you need to know what it has in its head, what it can do with its hands, what it puts on its desk, and what it writes in its notebook.

Claude Codethe colleague who shows up every morning with no memory of the day before
Its brain= the model

It understands, reasons and decides. It’s also the car’s engine, further down.

Its hands= the tools

Reading, searching, editing, running a command. Without tools, it can only talk.

Its desk= the context

Everything it has in front of it while it works. Large, but not infinite.

Its notebook= memory

What survives the night: only what is written down in files.

Its equipment (the badge, the welcome sheet, the binder of procedures, the specialists it delegates to) is waiting in Part 4, in the workshop.

So before it starts, it knows only three things: what you wrote for it, what it noted down itself, and what it finds by searching. Everything else, it guesses. Let’s look at each trait more closely.

The colleague · its hands

The built-in tools

A tool is an action the model can request. Claude Code provides about ten, and you can add more (we’ll get to that in Part 4). You’ll see their names scroll by in the terminal.

Read and searchRead, Glob, Grep: open a file, find files by name, search their contents.
EditEdit, Write: replace a specific passage, or write a whole file.
RunBash: tests, build, git, any command. The most useful, and the most dangerous.
The webWebSearch, WebFetch: search, read a documentation page.
DelegateAgent: hand a subtask to a subagent, which works in its own context.
Get organizedA task list it keeps up to date as it works (Ctrl+T to show it).
Ask youMultiple-choice questions when a decision is yours to make.
ExtensionsTools from MCP servers and skills, which you add yourself.
The colleague · its desk

The context, its working memory

The article “Understanding AI and mastering its jargon” compared the context to a desk: everything the model needs in front of it to work is laid out there, and its size is limited. On recent models, Claude Code gets a huge desk, a million tokens, enough to lay out several thousand pages.

What’s already on it when you type your first message: the harness instructions, your CLAUDE.md files, the index of its auto memory, one line of description per skill, the tool definitions (for MCP servers, only the names are loaded at first; the details come on demand). After that, everything piles up: your messages, every file read, every command output, every answer.

First message
An hour later
Three tasks later
After the summary
Laid out at the start (instructions, CLAUDE.md, tools)Your messages and its answersFiles read, command outputsAutomatic summary

Illustrative proportions. To see yours, type /context.

When the desk nears its limit, Claude Code compacts it: it replaces the history with a summary, then reloads your CLAUDE.md files, its memory and the current plan. It’s convenient, and it’s a loss.

The image

Compaction is the minutes of a long meeting: the decisions remain, the nuances you spent twenty minutes explaining disappear.

Above all, a big desk is not a tidy desk. Anthropic acknowledges this itself in its writing on context engineering: the more loaded the context, the less precise the model’s attention. Specialists call it context rot, the context slowly going bad. An instruction given at the start of a long session carries less weight than the 300 lines of logs that followed. Hence the most profitable rule in this article:

One task, one session./clear between two unrelated topics. /compact followed by an instruction (“keep the decisions about the date format”) to carry on with a lighter load. /btw for a quick side question that isn’t added to the history. And subagents for broad searches: they read fifty files on their own desk and report back only their conclusion.
The colleague · its notebook

What it remembers

Since the desk is cleared every evening, everything that must last goes through files. Claude Code knows four kinds, and mixing them up is a classic source of disappointment.

MemoryThe imageWho writes itWhereWhen it’s read
CLAUDE.mdThe welcome sheet handed to it every morningYou (and the team)~/.claude/CLAUDE.md for you, ./CLAUDE.md for the project (versioned), CLAUDE.local.md for your personal notes (kept out of Git), one per subfolder if neededAt launch; those in subfolders when Claude reads a file there. An @path imports another file.
RulesThe note stuck on one specific cabinetYou.claude/rules/*.md, which can be limited to certain files (paths:)At launch, or when Claude touches the files concerned
Auto memoryIts personal notebookClaude, on its own~/.claude/projects/<project>/memory/, with a MEMORY.md indexThe start of the index in every session; the rest on demand. /memory to view it or turn it off.
Sessions and checkpointsThe recording of the meeting, and the “undo” buttonClaude CodeThe history of each conversationWhen you resume (claude -c, /resume) or go back (/rewind, Esc twice)
Advice, not a constraint

Claude reads the CLAUDE.md, almost always follows it, and may forget it in a busy session.

Anything that must never happen gets locked down with a permission or a hook (Part 4).

Not a substitute for Git

Checkpoints track the files Claude edits itself, not the effects of its commands.

An rm or a migration can’t be “rewound.”

Does your team use several agents? Claude Code also reads an AGENTS.md file, the format shared by other tools, when no CLAUDE.md is present. And nothing stops you from writing @AGENTS.md in your CLAUDE.md so you only maintain one file.
Image 2 · the car

One engine, one car, several bodies

The colleague tells us how Claude Code works. To understand how it’s built, and who drives it, let’s switch images. The article “Understanding AI and mastering its jargon” distinguished the model and the product the way you distinguish the engine from the car. Claude Code is a car built around an Anthropic engine. Each part matches a setting you’ll come across.

The Claude Code car. The car itself is the harness: the loop, the tools, memory. The engine is the model, and its revs are the effort. The steering wheel is the permission modes: who drives. The body is the surface: terminal, editor, desktop app, web, mobile or continuous integration. The guardrails are the sandbox and the deny rules, which hold whoever is driving. The car = the harness Claude Code: the loop, the tools, memory The body = the surface terminal, editor, desktop, web, mobile, CI The steering wheel = permission modes who drives: you, it, or both The engine = the model Opus, Sonnet, Haiku, Fable its revs = the effort The guardrails = the sandbox and the deny rules they hold whoever is driving
The same engine can power several bodies, and each car can be driven in several ways. That’s what the next three sections cover in detail.
The car · the body

The surfaces: terminal, editor, web…

The same harness comes in several forms. They share your settings and your configuration files; what changes is where the loop runs and how you watch it.

SurfaceWhat it bringsFor whom, for what
The terminalEvery feature, first. Scriptable.The reference. It’s where everything lands first.
VS Code, JetBrainsDiffs in the editor, the current selection as context.The Pair, when you want to see each change in place.
The desktop appVisual diff review, several sessions side by side, a browser preview.Running several workstreams in parallel without juggling terminals.
The web (claude.ai/code)Cloud sessions that keep going when you close your computer. claude --cloud starts one, claude --teleport brings it back.Long tasks, or tasks started from another machine.
MobileStart and follow tasks; drive a local session remotely (/remote-control).Unblocking the agent’s question from the subway.
Slack, GitHub, GitLabYou mention @claude in a thread, an issue, a pull request.The team, and continuous integration.
claude -p and the Agent SDKNo interface: a command for scripts, a Python and TypeScript library for your own agents.Automation, and people who build their own tools.
Installation (macOS, Linux, WSL), then launch inside a project
$ curl -fsSL https://claude.ai/install.sh | bash   # Windows: irm https://claude.ai/install.ps1 | iex
$ cd ~/my-project && claude                        # and claude doctor if something gets stuck

You need a paid Claude subscription (Pro, Max, Team or Enterprise) or an API account. Prices change often: the official page is the reference, and /usage tells you where you stand.

The car · the steering wheel

Who drives: the permission modes

It’s the most important setting, and the least looked at. It decides what Claude can do without asking you, in other words who holds the wheel. Shift+Tab cycles through the modes during a session, and the active mode is shown below the input box.

Planplan

You study the map, engine off.

Read-only. Claude explores, thinks and proposes a plan, without changing anything. /plan followed by the task takes you straight there.

To understand, design, prepare.
Manualdefault

The driving school: it drives, you keep your foot over the brake.

Claude asks for your approval before every file change and every command. You see everything go by.

For sensitive code, the step-by-step Pair.
Edit without askingacceptEdits

It drives alone in town; to get on the highway, it asks you.

File edits go through on their own, commands still ask. You review the diff at the end.

To carry out a plan you’ve already approved.
Autoauto

It drives, and a co-driver brakes as soon as it leaves the route.

A second model, a classifier, examines every action that is neither a read nor an edit in the working folder, and blocks anything that goes beyond your request: an escalation, unknown infrastructure, a hostile instruction read in a file. After three blocks in a row, it goes back to asking you.

The starting mode for new sessions in the terminal and VS Code.
UnattendeddontAsk

The driverless shuttle: authorized routes only.

Nobody is there to answer: anything not explicitly allowed is denied, without a question.

For scripts and continuous integration.
Anything goesbypassPermissions

The closed track: pedal to the metal, but on a circuit.

No more questions at all. Only the deny rules (deny) still hold, in this mode as in every other.

Only in a disposable container, with no secrets.
Good to know

Auto mode has become the default mode for new sessions.

To work as a Pair, you have to switch back to manual, once per session or once and for all in your settings.

Permissions aren’t the only barrier. /sandbox turns on operating-system-level isolation for shell commands: writes limited to the project folder, network filtered by a list of domains. These are our car’s guardrails: the permission decides whether a command can go, the sandbox limits what it can damage.

The car · the engine

Models, effort, thinking

/model chooses the engine (Option+P on Mac, Alt+P elsewhere). The aliases opus, sonnet, haiku and fable always point to the latest version of each family, and opusplan uses Opus to plan, then Sonnet to execute.

/effort sets the revs, that is, how hard it thinks, from low to max: more effort means a better answer on a hard problem, and more time and tokens on an easy one. The word ultrathink in a message pushes the thinking for that turn only. /fast turns on a fast mode for Opus, more expensive, in preview.

My rule of thumbThe engineThe revs
Planning, designing, debugging a tricky problemThe most capableDefault, higher if the first try fails
Executing a clear planA faster modelDefault
Subagents digging through the codeThe lightestDefault

4e1b0d2part 1: a harness, a loop, a context that fills up

You now know the colleague and its car: a loop that reads, acts and checks, a desk that fills up, a notebook made of files, and modes that decide who holds the wheel. With these same parts, you can drive in seven very different ways.

Part 2 · Seven ways of working
Part 2

Seven ways of working

In the article “Will AI replace developers?”, I ranked AI tools for developers on an autonomy scale, from L0 (no AI) to L5 (from sentence to app). Claude Code sat at L4, among the agents. That was true, and incomplete: depending on how you use it, it covers almost the whole scale. Here are the seven uses I come across, ranked by who holds the wheel. None of them is the right one in absolute terms.

You hold the wheelClaude holds the wheel

Each card follows the same format: the principle, an example request, the settings that go with it, and the trap. Skim the ones that don’t concern you yet, and try the switchman at the end.

1

The Explorer

Understand before you touch
Autonomy

You ask questions, Claude reads the code, the Git history, the documentation, and explains. It changes nothing. It’s the most underrated use of the tool, and often the most profitable: an unfamiliar codebase takes an hour to read instead of a week.

Best for
Joining a project, taking over old code, preparing an estimate, understanding a bug before fixing it.
Your place
In charge. You lead the investigation, it does the digging.
Settings
Plan mode (read-only). For broad questions, it will hand the digging to its Explore subagent, which reports back only its conclusion.
The trap
A fluent explanation is not a correct one. Demand references (file:line) and check one or two.
Example request
> Explain how an order goes from “cart” to “paid”.
  Trace the path through the code, with file:line
  at each step. Don’t change anything.

> Why is this test disabled? Look in the Git
  history for who did it, when, and why.
2

The Pair

Step by step, every change approved
Autonomy

Pair programming, in the literal sense. You break the work into small steps, Claude proposes each change, you accept it, reject it or correct it. You stay in the code, and you interrupt it as soon as it drifts.

Best for
Sensitive code (payments, security, personal data), small fixes, learning a language or a codebase.
Your place
Right beside it, on every line.
Settings
Manual mode (default). The VS Code or JetBrains extension, to see each diff in place. Esc to stop it, Esc twice to go back to an earlier point.
The trap
Approval fatigue. By the thirtieth “yes,” you stop reading. If you approve without reading, switch methods instead of pretending.
Example request
> In src/pricing/discount.ts, the loyalty discount
  is applied before VAT. It must be applied after.
  First write the test that proves it, show it to me,
  then propose the fix.
3

Plan then code

Agree before writing
Autonomy

Claude explores and proposes a plan in read-only mode; you amend it; it executes it in one go; you review the diff and commit. This is the “explore, plan, code, commit” cycle Anthropic recommended in its very first best practices, in 2025. It is still the best way in for anyone starting out with an agent.

Best for
A feature spanning a few files, a non-trivial bug, a localized refactoring.
Your place
Upstream (the plan) and downstream (the diff).
Settings
/plan or Shift+Tab to plan, then “edit without asking” to execute. The opusplan model alias is made for this. Ctrl+G opens your editor so you can write a long message comfortably.
The trap
Approving a plan you only skimmed. A ten-line plan for five files hides decisions Claude will make on its own. Read it like a code review.
Example request
> /plan Add pagination to the /orders API, by
  cursor and not by offset. First look at how
  /products does it. Propose a plan, and ask me
  your questions before coding.
4

Spec-driven

The file is the reference, not the conversation
Autonomy

The plan doesn’t stay in the conversation: it becomes a file in the repository, with the need, the acceptance criteria, what’s out of scope, the steps and a tracking table. Each step runs in a fresh session, tests first, and the file outlives every session. It’s my method, detailed in Part 3.

Best for
Anything that lasts more than one session, anything headed for production, and team work.
Your place
Author of the spec, editor of the code.
Settings
Plan mode to write the spec with Claude, then “edit without asking” or auto for each step. /clear between two steps. A rule in CLAUDE.md that says how to read the file.
The trap
The novel-length spec and the dead spec. Too long, and nobody reads it, Claude included. And a decision made in the conversation without being written into the file no longer exists in the next session.
Example request
> I described the need in docs/workstream-csv-export/
  NEED.md. Question me on what’s missing, then write
  PLAN.md: criteria, out of scope, steps, tracking.

  … (a few exchanges later, new session)

> step 2 of the file docs/workstream-csv-export/PLAN.md
5

The Prototype

Vibe coding, and proud of it
Autonomy

You describe, Claude produces, you judge by the visible result, without reading the code. This is the vibe coding described in the article “Will AI replace developers?”, and it is perfect for what it was invented for: explore fast, then throw away. Pasting a screenshot (Ctrl+V) is often enough to say what’s wrong.

Best for
Testing an idea, a demo, a personal tool, comparing several design directions.
Your place
Demanding client: you judge the screen, not the code.
Settings
Auto mode. In a separate folder or branch, ideally a worktree (claude -w mockups), so nothing gets polluted.
The trap
The prototype that ends up in production. Put “throwaway” in the folder name. If the idea is good, you start again from a spec, not from the prototype.
Example request
> Make three very different mockups of the home
  page, in throwaway/home-a.html, -b and -c.
  Throwaway code: aim for the effect, not quality.

> [Image #1] B, but with A’s title and
  fewer colors.
6

The Orchestra

Several agents, in parallel
Autonomy

Several sessions work at the same time, each in its own Git worktree (a working copy on its own branch), or a main session hands out subtasks to subagents. A useful variant: one agent writes, another reviews, without sharing the same context, and so without the same blind spots.

Best for
Truly independent tasks, a migration that can be split up, a broad search, a cross-review.
Your place
Conductor: you assign, you arbitrate, you merge.
Settings
claude -w <name> creates the worktree and its branch, .worktreeinclude copies your unversioned files into it (.env). Ctrl+B or claude --bg for the background, claude agents to see everything. The desktop app shows sessions side by side.
The trap
The bottleneck is you. Three agents means three diffs to review, and “independent” tasks that end up touching the same files. Start with two.
Example
$ claude -w auth-migration     # terminal 1
$ claude -w payment-tests      # terminal 2

> Launch three subagents in parallel to audit
  orders/, billing/ and shipping/: dead dependencies,
  duplicated code. Then give me a ranked summary.
7

The Robot

Nobody at the screen
Autonomy

Claude Code runs without an interface: in a script with claude -p, in your continuous integration, on a scheduled task, or when someone writes @claude in a GitHub issue. It works alone and delivers a result: a pull request, a comment, a report.

Best for
Repetitive, verifiable tasks: lint warnings, dependency updates, issue triage, first-pass pull request review, documentation.
Your place
Reviewer of the deliverable, and author of the guardrails.
Settings
dontAsk mode and a list of allowed tools kept as tight as possible. --max-turns and --max-budget-usd as limits. --bare in scripts, to ignore the local configuration. On the GitHub side, /install-github-app installs the official action. /schedule creates a scheduled task in the cloud.
The trap
Prompt injection. A robot that reads issues reads text written by anyone. It delivers a pull request, never a push to the main branch, and never has access to production secrets (Part 5).
Example, in a script
$ claude -p "Fix the lint warnings without changing
  behavior, then summarize your changes." \
    --permission-mode dontAsk \
    --allowedTools "Read,Edit,Bash(npm run lint *)" \
    --max-turns 20 \
    --output-format json

Which one to choose?

The choice depends less on the size of the project than on three questions: what you’re trying to get, what will become of the code, and the cost of a mistake. The switchman below asks them in order.

The switchman

1. You want to…
2. Will this code go to production?
3. How big is it?
4. Would a mistake be costly (payments, security, personal data)?
My recommendation Answer the questions above.

And to keep the big picture in view, here are all seven side by side:

WayStarting modeYour placeWhat to writeThe main risk
1The ExplorerPlanYou investigatePrecise questionsBelieving a wrong explanation
2The PairManualOn every lineOne step at a timeApproving without reading
3Plan then codePlan, then edit without askingThe plan and the diffThe goal and the contextA skimmed plan
4Spec-drivenPlan, then autoThe spec and the diffA complete spec fileA dead or overlong spec
5The PrototypeAuto, off the main branchThe visible resultThe desired effectThat it ends up in production
6The OrchestraAuto, one worktree per agentAssigning and mergingWell-separated tasksBeing swamped by reviewing
7The RobotdontAsk, listed toolsThe deliverableThe instructions and the guardrailsPrompt injection

9c27f5apart 2: seven ways, from the Explorer to the Robot

I presented these seven ways without taking sides. You probably noticed that only one of them puts a file at the center rather than a conversation. That one is mine. Here’s why, and how I go about it, in practice.

Part 3 · My method: the spec is the code
Part 3

My method: the spec is the code

The seven ways of working all have their place, and I use each of them at one point or another. But for anything that goes to production, I have one, and only one. It follows directly from what I argued in the article “Will AI replace developers?”.

From editor to spec

There I wrote that developers move from the role of author to that of editor, and that the spec becomes the real code again. In practice, I go one step further, and that is the heart of this article. Not a metaphor: a concrete way of organizing the repository and the working day.

The real code is the spec.The spec is the source. The code is derived from it.

The history of the profession has seen this shift before. When developers moved from assembly to languages like Java, source code changed language. Compiled code didn’t disappear: it became a derivative, regenerated at every build, that no one writes by hand anymore. With Claude Code, I’m living through a shift of the same order. The source is the specification, written in English in a file in the repository. The code is derived from it.

Three production chains, with the same steps: you, the source, the tool, the derivative, the action, and what you do if it’s wrong. Before, with assembly: you write every instruction in boutique.asm, the assembler translates line by line, you run the boutique binary; if it’s wrong, you fix boutique.asm. Yesterday, with Java: you write the logic in Boutique.java, the compiler, deterministic and with no initiative, produces the bytecode, which you run without reading it; if it’s wrong, you fix Boutique.java, never the bytecode. Today, with Claude Code: you write the intent in PLAN.md, Claude Code, fast and full of imagination, produces the source code, which you review, test and approve; if it’s wrong, you fix the spec first, then regenerate. YOU THE SOURCE THE TOOL THE DERIVATIVE THE ACTION BEFORE · ASSEMBLY write every instruction boutique.asm machine instructions The assembler translates line by line boutique the program, in binary you run it if it’s wrong: fix boutique.asm YESTERDAY · JAVA write the logic Boutique.java the source code The compiler deterministic, no initiative Boutique.class always the same bytecode you run it, without reading it if it’s wrong: fix Boutique.java, never the bytecode TODAY · CLAUDE CODE write the intent PLAN.md the spec, in English Claude Code fast, and full of imagination src/… yesterday’s source code you review it, test it, approve it if it’s wrong: fix the spec first, then regenerate
With each leap, you write one level higher, and the old source becomes the derivative: yesterday’s source code is what Claude Code produces today. Only one column really changes in nature: the action.

The same intent, in three eras. The table follows the columns of the diagram, with one line of code each time:

Before: assemblyYesterday: JavaToday: Claude Code
Youwrite every instruction for the processorwrite the logic, in a readable languagewrite the intent and the rules, in English
The sourceimul eax, [qty]
in boutique.asm
total = price * qty;
in Boutique.java
The total is the price times the quantity, in cents.
in PLAN.md
The toolthe assembler: one line gives one instructionthe compiler: one line gives several instructions, always the same onesClaude Code: one sentence gives several lines, never quite the same ones
The derivative0F AF 05 …, the binarythe bytecode, Boutique.class, that no one writes anymoretotal = price * qty;, yesterday’s source
The actionyou run ityou run it, without reading ityou read it, question it, test it, then approve it
If it’s wrongyou fix boutique.asmyou fix Boutique.java and recompile; never the bytecodeyou fix the spec first, then regenerate

We used to write Java. Now we write English, and read the Java.

Rivel Babindamana
Developer
The difference that changes everything

This compiler has imagination. A compiler like javac produces the same bytecode every time and never takes the initiative. Claude does.

Two consequences. The spec must be precise wherever imagination would be costly. And the output must be reviewed, which no one ever does with bytecode: that’s where the editor gets back to work.

Coding as a pair: who does what

I haven’t stopped coding. I code as a pair, and each of us has our own lines. The split is nothing theoretical: it’s the one I find in every workstream.

Me

  • the intent, and the why
  • the constraints and what’s off limits
  • what’s out of scope
  • the breakdown into steps
  • the acceptance criteria
  • the trade-offs along the way
  • the review: question, decide, approve before pushing
The plan the only file we truly write together. That’s why it’s the reference.

Claude

  • explore the existing code
  • ask me the questions I forgot
  • propose a plan, and its variants
  • write the code and the tests
  • run the checks
  • explain its choices when I question them
  • update the progress table and the documentation
  • flag what doesn’t add up

The cycle of a workstream

Definition

I call a workstream any piece of work that spans more than one session: a feature, a redesign, a migration.

Every workstream follows the same six-stage cycle.

MeThe intent

I write the need in ten lines, as I would to a colleague: the problem, who it’s for, what’s out of scope. Then I ask Claude to question me before writing anything. Its questions always reveal a gap.

TogetherExploration and plan

In plan mode, Claude reads the code without changing anything and proposes an approach. I amend it, decide between the variants, cut whatever goes too far.

TogetherThe plan becomes a file

The approved plan is written to docs/workstream-<name>/PLAN.md: the need, the steps, the shared rules, a progress table. It is versioned like code.

ClaudeOne step, one session

I run one step at a time, in a clean session. Claude carries it out, checks it (tests, types, rendering), commits it locally and ticks the progress table. Nothing goes to the shared repository yet.

MeThe reviewThe biggest part of the job

I read the diff and I question it. The spec first, then everything else: the libraries, the approach, the architecture, the naming. Every approved decision goes into the spec. And I only push what I have approved.

TogetherWrapping up

Lasting decisions go into the permanent documentation (architecture, design). The workstream folder is deleted: Git history keeps it.

Here’s what the file looks like, for our Tuesday-morning CSV export:

docs/workstream-csv-export/PLAN.md
# Workstream: CSV export of orders

> Temporary folder. Lasting decisions will go into docs/ARCHITECTURE.md,
> then this folder will be deleted.

## Need
At the end of every month, accounting matches paid orders against bank transfers.
Today, they copy and paste from the admin, page by page.

## Acceptance criteria
- “Export” button on /admin/orders; the list filters apply.
- Columns: no., date (YYYY-MM-DD), customer, total incl. tax, status.
- Semicolon separator, UTF-8 with BOM (otherwise Excel mangles accents).
- 50,000 rows without exhausting memory: streamed writing.
- Restricted to the `accounting` role; every export is logged.

## Out of scope
- No generic export for other entities. No PDF.

## Shared rules
- Follow docs/ARCHITECTURE.md § Admin. No new dependencies.
- Tests first. `npm test` and `npm run lint` green before each commit.
- Never modify an existing migration.

## Progress
| Step  | Content                                      | Status |
|-------|----------------------------------------------|--------|
| 1     | Format tests (headers, dates, BOM)           | ✅     |
| 2     | Streamed export service + `accounting` role  | ⬜     |
| 3     | Admin button + logging                       | ⬜     |
| 4     | Trial on 50,000 rows, documentation          | ⬜     |

With this file, Tuesday’s generic service would never have existed: it’s written in black and white under “Out of scope”. For Claude to know what to do with the file, a single rule in the project’s CLAUDE.md is enough:

CLAUDE.md (excerpt)
When the user writes “step X of file …”, carry out exactly that
step following the file’s “Shared rules”, then update
its “Progress” table.

And the working session then fits in one line:

The last line is my favorite. A good pair partner doesn’t just execute: it surfaces the gaps in the spec. And the answer, whatever it is, will go into the file, not into the conversation.

The review, the biggest part of the job

Reading a diff isn’t about hunting for typos. It’s where a developer’s experience weighs the most, and it’s where I spend the most time. It happens in a precise order.

1
First, the spec

Does the code do what the spec says? And does the spec say what I want? If the error comes from a vague spec, that’s what I fix first, before the code. It’s the most important fix: it holds for every session that follows.

2 · Then, everything an experienced developer knows how to question
The libraries

Why this one? Did we need one more dependency?

The approach

Why a generic service rather than a twenty-line function?

The architecture

Is the code in the right place? Are the layers respected?

The language and the framework

Is it idiomatic? Doesn’t the framework already do this?

The naming

Does the name say what the code does? Does it follow the project’s conventions?

The tests

Do they test the behavior, or only the implementation?

Every question follows the same path. What matters is the second-to-last step: an approved change that doesn’t make it into the spec will be forgotten by the next session.

I question Claude explains, or proposes something else I decide the decision goes into the spec Claude regenerates I approve git push
Only push what has been approved.Claude can commit locally as much as it likes. The push comes after the review, never before.

This isn’t a lab method. I’ve tried it out.

The five rules I don’t negotiate

rule 1

Fix the spec, not just the code

When Claude gets it wrong, I first ask myself whether the spec allowed it to get it wrong. If so, I fix the spec, then run it again. It’s the first fix, and the most important one. Fixing the code by hand is patching a binary: it works until the next build.

rule 2

What isn’t written down doesn’t exist

A decision made in a conversation disappears with it, or gets diluted in the first automatic summary. Its automatic memory doesn’t change much: it notes what it considers useful, not necessarily what you decided. Everything that must outlive the session goes into a file: the plan, the CLAUDE.md, the documentation.

rule 3

One step, one verifiable commit

Every step ends with a check that Claude can run on its own: tests, a type check, a screenshot. A step that can’t be checked is a badly cut step. And an “everything else” step isn’t a step.

rule 4

I approve before pushing

That’s the editor’s job, and the biggest part of my work. I don’t read every line with the same intensity, but I question everything that commits what comes next: a dependency, an approach, a name. Nothing gets pushed without my approval. The day I approve without reading, I’m vibe coding without admitting it.

rule 5

Production goes through me

Deploying, migrating a production database, touching secrets: Claude can prepare, never launch on its own. The project’s CLAUDE.md spells it out, and the permissions lock it down.

Why it works

There’s nothing magic about this method. It answers, point by point, the colleague’s limits described in Part 1:

What the machine doesWhat the method does
Its desk degrades as it fills up.One step per session keeps it small.
Its notebook keeps only what it chooses to write down.The plan keeps what we decided together.
It works better when it can check its work.Every step ends with a check.
It has imagination.The “out of scope” section and the review channel it.

I’m not the only one converging on this shape. For its agents that work over long periods, Anthropic describes a similar setup: a feature list and a progress file that the agent rereads at every new session, with work carried out one feature at a time. The spec-driven development tools cited in the article “Will AI replace developers?”, such as GitHub’s Spec Kit or AWS’s Kiro, point the same way. The name will change. The principle holds:

The more code AI writes, the more what’s written beforehand matters.

When I depart from my method

A method applied everywhere becomes a dogma. Here’s when I do things differently.

SituationWhat I doWhy
A typo, an obvious bug, a rename2The Pair, directly, no planWriting a plan would take longer than the fix.
Choosing a design5The Prototype: three throwaway mock-ups, then I pickIt’s easier to judge on the real thing.
Code I don’t know1The Explorer, before anything elseYou can only specify well what you understand.
A repetitive, verifiable task7The RobotIf the check is automatic, my review can focus on the result.

b81e04cpart 3: the spec is the reference, the code derives from it

A method is good. Files that carry it are better. Time to move to the workshop: where to put what, how to write it, and which tools to add to the box.

Part 4 · The workshop
Part 4

The workshop

A good method rests on a well-organized workshop. Claude Code offers half a dozen configuration building blocks, similar enough to be easily confused. Back to our colleague: in Part 1, we saw its brain, its hands, its desk and its notebook. Time to equip it. This part says what goes where, what each block is for, and gives you files ready to adapt.

The colleague · its equipment

Equipping the colleague

Each configuration block matches an object you would hand a new colleague so they work well, and for a long time. The colors in this portrait are the colors of the labels throughout this part.

Claude Codethe same colleague, equipped to last
The welcome sheet= the CLAUDE.md

What it needs to know when it arrives, every morning.

The note on the cabinet= a targeted rule

An instruction it only reads when opening that particular cabinet.

The binder of procedures= skills

It reads the label on the spine, and only opens the sheet when needed.

The specialists= subagents

Sent on a mission with their own desk, they come back with one page.

The security gate= hooks

It goes off without fail, whatever the colleague decided.

The badge= permissions

The doors it opens alone, the ones where it rings, the ones that stay shut.

The sockets= MCP servers

To plug into the company’s tools: tickets, errors, browser.

The toolkit case= plugins

A complete kit, ready to use, installed in one go.

The workshop layout

Here is where to put all of this, in the tree of a well-equipped project. You don’t need everything on day one: a CLAUDE.md and a settings file are enough to start. The rest gets added when a need keeps coming back.

my-project/
├── CLAUDE.md                  the project’s welcome sheet, versioned
├── CLAUDE.local.md            your personal notes, outside Git
├── .mcp.json                  the team’s MCP servers
├── .worktreeinclude           files to copy into each worktree (.env)
├── .claude/
│   ├── settings.json          the team’s permissions and hooks, versioned
│   ├── settings.local.json    your settings for this project, outside Git
│   ├── rules/                 targeted rules: tests.md, api.md…
│   ├── hooks/                 the scripts called by the hooks
│   ├── skills/                one folder per piece of know-how
│   │   └── release/SKILL.md
│   └── agents/                one file per specialist
│       └── reviewer.md
├── docs/
│   ├── ARCHITECTURE.md        the map: the what and the how
│   ├── CONCEPTION.md          the decisions: the why
│   └── workstream-csv-export/ temporary: PLAN.md
└── src/ …

~/.claude/                     your settings, valid in all your projects
├── CLAUDE.md                  your preferences: language, style, habits
├── settings.json
├── skills/  agents/  rules/
└── keybindings.json

When to use what

All these blocks change Claude’s behavior, but not in the same way. The most important distinction fits in two words:

CLAUDE.md is advice.

Claude reads it and follows it almost always. Almost. In a busy session, an instruction can slip through the cracks, and the official documentation says so itself.

A hook is a law.

A script that runs without fail, at a precise moment, whatever the model “decided.” Same for a permission rule. What must never happen gets locked down there.

The image

A “No smoking” sign doesn’t detect smoke. A detector does. Write the sign in the CLAUDE.md, install the detector with a hook.

BlockIt’s…Loaded whenForExample
CLAUDE.mdstanding adviceat launchwhat it needs to know in every sessiontest commands, the don’ts
Ruletargeted advicewhen it touches the targeted filesthe conventions of one part of the code“tests don’t use mocks”
Skilla piece of know-howthe description always, the content on usea recurring procedurepublishing a release
Subagenta specialist, with its own contextwhen Claude delegates to itreading a lot, or bringing fresh eyesa reviewer
Hooka lawon a specific eventwhat must never be forgottenformatting after every edit
Permissiona righton every tool callwhat it can do alone, or neverallow the tests, forbid .env
MCP servera connectionnames at the start, details on usetalking to the team’s toolsGitHub, Sentry, a browser
Plugina bundle of all of the aboveat installsharing a configurationa turnkey code review
The colleague · its welcome sheet

CLAUDE.md: short, precise, alive

/init writes a first draft of CLAUDE.md by reading your project. It’s a good starting point, and a bad end point: it often describes what Claude could find on its own. A good CLAUDE.md says what the code doesn’t. The documentation recommends staying under 200 lines; a good file often fits in far fewer.

The CLAUDE.md that does nothing
# My project

This project is a modern, high-performance
web application.

Write clean, maintainable code.
Follow best practices.
Be careful about security.

The code is in src/. Components are
in src/components/. Tests are in
tests/.

[followed by 400 lines copied from the wiki]
  • generic advice the model already applies
  • a description ls gives you in one second
  • a length that drowns the two lines that matter
The one that changes everything
# Shop: API and admin
Node 24, Fastify, PostgreSQL.

## Commands
- `npm test`: unit tests, fast
- `npm run test:e2e`: slow, only when asked
- `npm run check`: types + lint, after every edit

## Rules
- SQL only in src/db/queries/.
- Amounts in cents (integers), never floats.
- New table = new migration. Never
  modify an existing migration.
- Never run `npm run deploy`.

## Pointers
- Architecture: @docs/ARCHITECTURE.md
- “step X of file …”: run that step,
  follow its common rules, tick the tracker.
  • the exact commands, and when to run them
  • the rules no model can guess
  • pointers rather than copies (@ imports a file)

Treat it like code: it gets reviewed in pull requests, and it gains a line every time Claude repeats the same mistake. That’s rule 1 from part 3, applied to configuration.

The colleague · its badge

Permissions: write down the rights once and for all

Rather than answering “yes” fifty times to npm test, write it into the permissions. Each rule targets a tool, and optionally a pattern: Bash(npm run check) for an exact command, Bash(git diff *) for every command that starts that way, Read(./.env) for a file. Denials (deny) take precedence over questions (ask), which take precedence over approvals (allow).

.claude/settings.json, shared by the team
{
  "permissions": {
    "allow": [
      "Bash(npm test)", "Bash(npm run check)",
      "Bash(git status)", "Bash(git diff *)", "Bash(git log *)"
    ],
    "ask": [ "Bash(git push *)" ],
    "deny": [
      "Read(./.env)", "Read(./.env.*)", "Read(./secrets/**)",
      "Bash(npm run deploy *)"
    ]
  }
}

Settings stack up: yours (~/.claude/settings.json), the team’s (.claude/settings.json), yours for this project (.claude/settings.local.json), and, in companies, settings managed by the administrator, which override everything. /permissions shows the result, /status where each setting comes from. One limit to know: a deny rule on a shell command is a safety net, not a wall, because there are a thousand ways to write the same command. For truly sensitive files, add the sandbox (/sandbox), which filters at the system level.

The colleague · the security gate

Hooks: the law

A hook is a command Claude Code runs on a specific event: before or after a tool is used, when a message is sent, at the end of a turn, when a session starts, when Claude is waiting for your answer. There are about thirty of them. The hook receives the event details as JSON on its standard input. If it exits with code 2, the action is blocked, and its error message is sent back to Claude as an explanation.

In .claude/settings.json
{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{ "type": "command",
        "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" }]
    }],
    "PreToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{ "type": "command",
        "command": ".claude/hooks/protect.sh" }]
    }]
  }
}
.claude/hooks/protect.sh
#!/usr/bin/env bash
# Blocks edits to sensitive files.
file=$(jq -r '.tool_input.file_path // empty')

case "$file" in
  *.env|*.env.*|*package-lock.json)
    echo "Protected file: $file" >&2
    exit 2 ;;
  */migrations/*)
    if [ -e "$file" ]; then
      echo "Existing migration: create a new one." >&2
      exit 2
    fi ;;
esac
exit 0

The first hook formats every edited file: no more “remember to run Prettier” in the CLAUDE.md. The second turns the rule “never modify an existing migration” from advice into law. Another use I recommend: a hook on the Stop event, which runs the tests when Claude thinks it’s done, and sends it back to work if they fail. /hooks lists the active ones. And remember that a hook is a program running with your permissions: one that comes with a cloned repository gets read like any other script.

The colleague · its binder of procedures

Skills: the know-how

A skill is a folder containing a SKILL.md file: a name, a description, then instructions, and possibly scripts or templates alongside. Only the description is loaded at startup, one line per skill. The content only enters the context when the skill is used, either because you type /release, or because Claude recognizes the situation from the description. Like a binder where you only read the spines, you can have dozens of them without cluttering the desk. The old custom commands (.claude/commands/) still work, but skills replace them.

.claude/skills/release/SKILL.md
---
name: release
description: Prepares a new release (changelog, version number, tag).
  Use when asked to publish, ship or deliver a release.
disable-model-invocation: true
---

# Publish a release

1. Check that we’re on main, up to date, and that `npm test` passes.
2. List the commits since the last tag and sort them
   (additions, fixes, breaking changes).
3. Propose the version number (semver) and wait for my approval.
4. Update CHANGELOG.md, then run `npm version <number>`.
5. Don’t push anything: display the `git push --follow-tags` command.

The line disable-model-invocation: true reserves triggering for you alone: for a procedure with side effects, I don’t want Claude deciding on its own that the time has come. Skills follow an open standard, Agent Skills, which other tools read too. Anthropic publishes examples in the anthropics/skills repository (including those that handle Word, Excel, PowerPoint and PDF files), and an official plugin, skill-creator, helps you write your own.

The colleague · its specialists

Subagents: the specialists

A subagent is an instance of Claude with its own prompt, its own tools, its own model, and above all its own context. Claude Code ships three: Explore (search the code, read-only), Plan (prepare a plan) and a general-purpose agent. They serve three purposes: protecting the main desk from a search that would read fifty files (the specialist reads them on its own desk and comes back with one page), bringing fresh eyes to a piece of work, and parallelizing. You write your own in Markdown:

.claude/agents/reviewer.md
---
name: reviewer
description: Reviews a diff with fresh eyes. Use at the end
  of each step of a workstream, before the commit.
tools: Read, Grep, Glob, Bash
model: opus
---

You are a demanding reviewer. You are given a PLAN.md step and a diff.
Check, in this order:
1. The diff does what the step says, and nothing more (read “Out of scope”).
2. Edge cases: empty values, large volumes, time zones.
3. Security: access rights, personal data, injections.
Answer with a ranked list: blocking, to fix, suggestion.
Don’t modify any file.

This reviewer hasn’t seen the conversation that produced the code. That’s precisely what makes it useful: it doesn’t share the author’s blind spots. It prepares your review, it doesn’t replace it. Other options exist, like isolation: worktree so a subagent works on its own copy of the repository, or background so it runs while you keep working.

The colleague · its sockets

MCP: plugging the workshop into the rest of the company

The Model Context Protocol, introduced in the article “Understanding AI and mastering its jargon” as a standard socket, lets you plug Claude Code into your tools through MCP servers: tickets, production errors, database, browser, documentation. You add an MCP server with one command:

$ claude mcp add --transport http github https://api.githubcopilot.com/mcp/
$ claude mcp add --transport http sentry https://mcp.sentry.dev/mcp
$ claude mcp add --scope project playwright -- npx @playwright/mcp@latest

Three scopes: local (the default: just you, this project), project (in .mcp.json, versioned, approved by each person on first use) and user (you, all your projects). /mcp shows their status and handles authentication. Since Claude Code only loads tool names at the start, plugging in several servers costs little context. The real cost lies elsewhere: each server is a door. Treat it like a dependency: a source you know, and minimal rights, for example a read-only token.

Code and tickets

GitHub, GitLab, Linear, Jira, Asana: read an issue, open a pull request.

Production

Sentry for errors, a read-only database to check a hypothesis.

The browser

Playwright, so Claude opens the page, clicks, and checks its own work.

Documentation

Notion for your documents, Context7 for up-to-date library documentation, Figma for mockups.

The colleague · its toolkit case

Plugins: the ready-made toolkit case

A plugin bundles skills, subagents, hooks, MCP servers or language servers (LSP) into a package you install with one command. /plugin opens the catalog. Anthropic’s official marketplace, claude-plugins-official, is added automatically; a community marketplace exists alongside it. Careful: “official” refers to the catalog. Most of the plugins in it come from partners, and Anthropic itself maintains a smaller selection. Here are the ones from that selection I find most useful:

> /plugin install code-review@claude-plugins-official
Reviewcode-review

A pull request review run by several agents, keeping only confirmed issues.

Reviewpr-review-toolkit

Specialized reviewers: tests, error handling, comments, types.

Methodfeature-dev

A guided path for a feature: exploration, architecture, implementation, review.

Gitcommit-commands

Commit, push and open a pull request in one command.

Securitysecurity-guidance

Flags dangerous patterns while writing, reviews the diff at the end of the turn, and checks commits (injections, XSS, hardcoded secrets…).

Qualitycode-simplifier

An agent that simplifies the code you just changed, without changing its behavior.

Interfacefrontend-design

A skill for interfaces that don’t look like all the others.

Configurationclaude-md-management hookify

Maintain your CLAUDE.md, and create hooks by describing them in plain language.

Navigationtypescript-lsp pyright-lsp gopls-lsp…

The LSP plugins: Claude navigates the code like your editor does (definitions, references, errors).

Going furtherskill-creator plugin-dev

Write your own skills and plugins, with Claude’s help.

Autonomyralph-loop

Re-runs the same instruction in a loop until the work is done. Keep it for the robot, with guardrails.

Learninglearning-output-style

Claude lets you write the key pieces yourself, and explains its choices.

Claude Code also ships ready-to-use skills: /simplify to clean up a diff, /verify to check a change in the real application, /loop to repeat a task at an interval. And the /code-review command runs a local review at several levels of rigor, up to ultra, a multi-agent review in the cloud. For everything else, one rule: a plugin can contain hooks and MCP servers, which means code that runs on your machine. Install it the way you would install a dependency.

Four typical setups

To make this concrete, here are four typical workshops, from the lightest to the most fully equipped. Pick the one that looks like yours and remove what you don’t need.

The personal project

One developer, one repository, an urge to move fast
  • A twenty-line CLAUDE.md: the stack, the commands, three rules.
  • Auto mode by default, plan mode for features.
  • The LSP plugin for your language, and commit-commands.
  • A throwaway/ folder in the .gitignore for prototypes.

The product team

Several developers, code in production
  • CLAUDE.md and .claude/settings.json versioned, reviewed in pull requests like code.
  • Formatting and protection hooks; secrets and deployment under deny.
  • Two or three in-house skills (release, migration, new screen) and a reviewer subagent.
  • .mcp.json with GitHub, Sentry and the ticketing tool; the GitHub action for @claude.
  • Company-managed settings for the non-negotiable rules.

The old monolith

Lots of code, little documentation, no wish to break everything
  • Two weeks of the Explorer before any change.
  • A docs/ARCHITECTURE.md written by Claude, corrected by you, then imported into CLAUDE.md.
  • Rules per area (.claude/rules/ with paths:) rather than one giant file.
  • Characterization tests (which freeze the current behavior) before each refactoring; the Pair on critical areas.

The robot room

Agents that run without you
  • A development container, modeled on the one Anthropic publishes, with an outbound firewall.
  • No production secrets, no ~/.ssh mounted.
  • claude -p --bare, dontAsk mode, tools listed one by one, capped budget.
  • Only one possible way out: a pull request, reviewed by a human.

Commands worth knowing

There are many more, and the list grows every month. Here are the ones I actually use, grouped by moment. Type / in a session to see every command available to you, and check the official list of commands, the list of keyboard shortcuts and the list of command-line options.

CommandWhat it does
Starting
claude claude "task"Opens a session, with or without a first instruction.
claude -c claude -rResumes the last session, or picks one from the list. /resume from inside a session.
claude -w nameOpens the session in a new Git worktree, on its own branch.
/initWrites a first CLAUDE.md from the project.
Steering
Shift+Tab /planSwitches permission mode; enters plan mode with a task.
EscInterrupts Claude, without losing the work done.
Esc Esc /rewindGoes back to an earlier point: the code, the conversation, or both.
@file !commandMentions a file; runs a shell command whose output joins the session.
Ctrl+V Ctrl+GPastes an image (a screenshot); opens your editor for a long message.
Ctrl+B /tasksSends a command or an agent to the background; lists what’s running.
/btwAsks a side question without adding it to the history.
Context and cost
/contextShows what is taking up the context, by category.
/clear /compactStarts from scratch; or summarizes, with an instruction on what to keep.
/model /effort /fastPicks the model, the thinking intensity, fast mode.
/usageYour usage and your limits.
Configuring
/memoryOpens the CLAUDE.md files and auto memory.
/permissions /status /configThe rights in effect; where each setting comes from; preferences.
/hooks /agents /mcp /pluginThe state of hooks, subagents, MCP servers, plugins.
/statusline /keybindingsCustomizes the status line (model, context, cost) and the shortcuts.
Reviewing and shipping
/code-reviewReviews the work in progress or a pull request, from level low to ultra; --fix applies the fixes.
/security-reviewSecurity analysis of the branch’s changes.
/install-github-appInstalls the GitHub action that responds to @claude.
Automating
claude -pHeadless mode, for scripts and continuous integration.
/schedule /loopA scheduled task in the cloud; an instruction repeated at an interval within the session.
claude --cloud /remote-controlLaunches a session in the cloud; drives the local session from the web or your phone.
claude doctorDiagnoses the installation when something doesn’t work.

d3f6a19part 4: a tidy workshop, every block in its place

The workshop is in order. What’s left is merging all of this into your daily work without breaking production: the mistakes everyone makes, the security people forget, and a plan for the first week.

Part 5 · Merge into main
Part 5

Merge into main

Everything above only counts if it makes it into your working days. This last part gathers the mistakes I see most often (I’ve made every one of them), what agents change about security, and a one-week program to get started without getting burned.

The ten mistakes everyone makes

The never-ending session“It forgot what I told it earlier.”

One task, one session. /clear between two topics, and whatever needs to last goes in a file.

The one-sentence request“Fourteen files for a CSV export?”

Say what’s out of scope, point to existing code to imitate, and give the criterion that says it’s done.

Correcting in the conversation“It’s making the same mistake as on Monday.”

Fix the source: one line in CLAUDE.md, a clarification in the spec.

No verification“It said ‘done’, and nothing works.”

Give it a way to check on its own: a test command, a type check, a screenshot. A Stop hook if needed.

Accommodating tests“The tests pass… because it changed them.”

Write the tests first, approve them, then forbid touching them during implementation. Always review the tests first.

Stubbornness“Fourth attempt, and it’s worse than at the start.”

After two failed corrections, rewind (Esc twice) or start over with what you’ve learned. A context polluted by failures produces more of them.

The novel-length CLAUDE.md“But it’s written right there, line 312.”

Short, specific, with pointers. Whatever must never happen goes into a hook or a permission.

Allowing everything to go faster“I was tired of clicking yes.”

Auto mode, written permissions and the sandbox. “Anything goes” mode only in a throwaway container.

The promoted prototype“It worked in the demo, so we kept it.”

A prototype is for deciding. For production, you start again from a spec, carrying over what the prototype taught you.

Measuring your impression“I’m twice as fast, I’m sure of it.”

The METR study cited in the article “Will AI replace developers?” showed it: your impression lies. Measure the time to merge, and what has to be reworked afterwards.

Security: what an agent changes

An assistant that suggests code does nothing on its own. An agent does: it runs commands with your permissions, on your machine, and it reads a lot of text it didn’t choose. A dependency’s README, a GitHub issue, a web page, a comment in a file: any of them can contain instructions written for it. That’s prompt injection, and no model is fully immune to it. The Claude Code documentation says so plainly.

British developer Simon Willison gave the most dangerous case a name: the lethal trifecta. An agent that combines the three capabilities below can be manipulated into leaking your data. The defense is simple to state: always take away at least one of the three.

The lethal trifecta: access to private data, exposure to untrusted content, and the ability to communicate externally. When all three are combined, a malicious text can get your data out. Removing one of the three capabilities is enough: deny reading secrets, keep the agent away from untrusted content, or filter the network. all three together = your data can get out Private data code, .env, database, email Untrusted content issues, web pages, dependencies External communication network, push, APIs, messages ✂ deny on secrets ✂ don’t read external content ✂ filtered network (sandbox)
The lethal trifecta, after Simon Willison (2025). A robot that reads public issues necessarily touches “untrusted content”: so you have to take away its access to secrets or its external communication, and ideally both.

In practice, six habits cover the essentials:

Secrets out of reach

deny on .env and key folders, and no production keys on the machine where the agent runs.

The sandbox

/sandbox limits writes to the project and the network to a list of domains. Auto mode adds a classifier that spots hostile instructions.

Extensions are dependencies

MCP servers, plugins, hooks from a cloned repo: code that runs on your machine. Check the source.

Read before approving

A command with curl, a push, a change to the CI: that’s where your attention should go.

Autonomy in a container

The more autonomous the agent, the more isolated its environment must be. Anthropic publishes a reference development container for this.

In companies

Managed settings, enforced for everyone, for what isn’t negotiable: allowed MCP servers, prohibitions, disabled modes.

Your first week

If you’re just starting, don’t read all this as a checklist to tick off in one go. Here’s the progression I recommend, one day per way of working.

Monday1The Explorer
  • Install it and launch it in a project you know by heart.
  • In plan mode, ask ten questions you already know the answers to.
  • Note where it gets things wrong: that’s your trust benchmark.
Tuesday2The Pair
  • /init, then cut the CLAUDE.md in half and add your commands and three rules.
  • Fix a small bug in manual mode, step by step.
Wednesday3Plan then code
  • A real feature, with /plan.
  • Read the plan like a code review, and amend it.
  • /context before and after: watch what fills up.
ThursdayThe workshop
  • Permissions: tests in allow, secrets in deny.
  • A formatting hook, the LSP plugin for your language.
  • A throwaway prototype in a worktree, just to see.
Friday4Spec-driven
  • Write, with Claude, the PLAN.md for next week’s workstream.
  • Add a reviewer subagent.
  • Record in CLAUDE.md what the week taught you.

The Robot and the Orchestra can wait until the second week. You only delegate well what you’ve first done yourself with the tool.

Your turn

As in the article “Will AI replace developers?”, I’ll end with the questions I’m still asking myself. I’d like to hear your answers.

If the spec becomes the source code, will we have to test it like code? And how do you test a sentence?

How many agents in parallel can a developer really review before becoming a diff rubber stamp?

Will beginners learn the job by writing code, by reading Claude’s, or by writing specs?

And you: which of the seven ways do you use most? Which one have you given up, and why?

To reply, write to me by email or on LinkedIn. I’m always happy to reply, as my schedule allows, sometimes a little late, but I always reply.

My book on AI

If you enjoyed this article, follow me on X, Facebook, LinkedIn and Instagram to hear when my book on AI comes out. It will go further than my articles, with the same rigor, the same method and the same approach to writing.

The last word
Claude Code writes faster than I do, reads faster than I do, and never gets tired. But it doesn’t know what I want until I’ve written it down. My code now starts with a sentence in English. And I’m still the one who signs it.
Rivel Babindamana
Developer, October 2026

PS: this article was prepared with Claude Code, following the method it describes: a workstream folder, a plan, steps, and a human review before publication.