Every turn re‑reads everything you left lying around.
The ceiling on Claude Code is rarely the model. It is what you loaded into the window before you started, and how many separate windows you were willing to spend. This page is the instrument panel for both.
Two sessions below hold the same task and the same model. One of them keeps the repository exploration, four pasted test logs and a nine‑hundred‑line instruction file in the main thread. The other pushed that work into child windows and kept the conclusions. The bill differs by roughly an order of magnitude, and so does the answer quality near the end of a long session.
The ladder exists so you can stop climbing
Seven rungs, in the order they were meant to be learned. The instruction that matters is not “get to the top”. It is take the lowest rung that solves the problem, because every rung above it adds coordination, tokens and a new way to be wrong.
A browser tab, a question, a copied block of code. One shot, no repository access, no memory of your conventions.
Stop here whenThe question is conceptual and the answer does not need to touch a file.
The agent reads files, edits them, runs your tests, and shows you a diff. This is where most real work happens and where most people stop needing anything fancier.
Stop here whenYou are making a handful of coupled edits in a repository you understand.
Teach the repository once instead of re‑explaining it every session. Files load broad‑to‑specific: your home file, then the project file, then any nested file for the subtree you are working in, then a local untracked file.
The test for what belongsIf a new engineer would learn it in two seconds by opening one file, leave it out. Semicolons and bracket style are visible. Whether you write the test first is not.
Stop here whenYou have stopped repeating yourself in prompts.
A skill is a prompt you wrote once, gave a name, and can now hand to a colleague. Markdown, front matter, supporting files that travel with it.
Stop here whenYour repeatable workflows are written down and Claude picks them up on its own.
Hooks put deterministic code on lifecycle events. MCP gives the agent typed access to systems that are not your repository.
Stop here whenThe rules you cannot afford to have negotiated are enforced outside the model's reasoning.
Subagents are child sessions with their own context windows. Plugins are how a team ships skills, agents, hooks and server definitions to each other.
Stop here whenNoisy exploration no longer lands in the thread you are trying to think in.
A lead session plus named teammates that coordinate through a shared task list and direct messages. Experimental, opt‑in, and the most expensive thing on this list.
The honest noteMost problems that look like they want a team are a fan‑out in a costume. Try the fan‑out first and let the failure tell you otherwise.
How to read this. The rungs are cumulative, not alternatives. Skipping to rung
seven with an unmaintained CLAUDE.md gives four teammates the same bad context in parallel.
Terminal fluency, because the interface is the tool
Four keystrokes carry most of the day-to-day leverage in this tool, and three of them are recovery moves. Learning them early is the difference between steering a run and restarting it.
Two of these inputs also change what you pay. The file reference narrows the search before it starts, so the agent reads three files instead of forty. The bash prefix does the opposite: it puts command output permanently into the conversation, which is exactly what you want when you plan to refer back to it and exactly what you do not want otherwise. Run unrelated commands in a separate terminal window.
| Input | What it does | Cost note |
|---|---|---|
!command | Bash mode. Runs a shell command and places the output into the conversation. | Output is resident from then on. Deliberate use only. |
@path | Reference a file or directory with typeahead. | Cheaper than letting it search, when you already know where the code is. |
| Paste or drag an image | Give it a screenshot, an error dialog, a mockup, a rendering bug. | Frequently cheaper than three paragraphs describing the same thing. |
| Shift+Tab | Cycle permission modes, including plan mode. | The cheapest place to change your mind is before any edit. |
| Esc | Interrupt mid-run and redirect without losing the work so far. | Saves a run instead of paying to rebuild it. |
| Esc Esc | Open rewind and checkpoint controls. /rewind is the explicit command. | Restores the agent's own edits only. |
| Ctrl+B | Send a running command or agent task to the background. | Keeps one context while you work in it. |
| Ctrl+T | Task view. Switch between running children. | How you inspect a fan-out while it runs. |
| Ctrl+O | Toggle the transcript viewer. | Read what actually happened rather than what you remember. |
| Ctrl+R | Reverse search your prompt history. | The fastest way to notice you have typed a prompt three times. |
| Ctrl+G | Open the current prompt in your editor. Ctrl+X Ctrl+E also works. | Long multi-line prompts belong here, not in a single line. |
| Ctrl+S | Stash the prompt you are composing. | Keeps a half-written thought while you check something. |
Two version notes. The image-paste binding differs by platform and terminal, so
ask in-session which combination applies to yours rather than trusting any written guide. Vim editing
is enabled through /config; the standalone vim command was removed. Bindings themselves can be
remapped in ~/.claude/keybindings.json.
The commands worth knowing by name
Type / and read the local picker rather than memorising a list. Not every built-in appears
for every account, because plan, provider and organisation policy all filter it. The ones below earn
their place in muscle memory.
| Command | Use it to | When |
|---|---|---|
/context | See the token split by system prompt, tools, memory, skills and messages | Before you guess why a session feels sluggish or expensive |
/usage | Tokens and spend for the session | Once a day, until you have calibrated intuition |
/compact | Summarise the thread, optionally with your own instructions | At a phase boundary, never at the automatic warning |
/clear | Start genuinely fresh | New task, unrelated to the last one |
/branch | Fork the conversation to try something else | When you want the alternative without losing the original |
/resume | Reopen a prior session in this directory | After you cleared or exited and regretted it |
/rewind | Restore code, conversation, or both | After a run went sideways in a recoverable way |
/diff | Inspect the current changes interactively | Before you approve anything wide |
/plan | Enter plan mode explicitly | Architecture, refactors, unfamiliar code |
/effort | Show and set reasoning depth for the model | When your attention or its tokens are the scarce thing |
/model | See what your account actually offers | Instead of memorising model names |
/memory | Open memory management, including automatic memory | Monthly, to prune what it decided to remember |
/init | Draft a starter instruction file | First session in a new repository, then edit it down |
/mcp | List servers, inspect tools, reconnect one | When an external tool is missing or stale |
/subtask | Fork a child that inherits the whole conversation | When a child needs the context a fresh subagent would lack |
/batch | Decompose a large repository change into many worktree tasks | One transformation, many independent targets |
/status | Account, provider, and what is enabled for you | First, whenever a documented feature seems missing |
/release-notes | What changed in your version | After every update, for about ninety seconds |
The twelve things worth muscle memory
@pathpoint, do not search!cmdoutput becomes context/contextread your own window/compactwith your own instructions/rewindcode, chat, or both/statuswhy a feature is missingPrinting this page produces the card above and the reference tables, without the interactive panels.
The context meter
A context window is not storage. It is the payload re‑sent on every single turn, so anything sitting in it is charged again each time the agent thinks. Load the window below and watch what one turn costs.
What is in the window
Window size and per‑token price both change with this choice.
Both are loaded before your prompt is read.
Only the name and description of each skill is resident. The body loads when the skill triggers.
Pinning a server keeps its whole tool schema resident instead of letting it load on demand.
Greps, forty file reads and four test logs, all landing in the main thread.
Three child windows absorb the reads. Three short reports come back.
!3Useful when you want to reference it. Permanent either way.
Frequently cheaper than three paragraphs describing a rendering bug.
Prompts, diffs, tool results and the agent's own reasoning all accumulate here.
One turn
—
of the window spent before the agent does any new work
- Resident tokens
- —
- Reserved for compaction
- —
- Cost of one turn's input
- —
- Next 20 turns
- —
- Same, on cache hits
- —
- Largest single item
- —
Token weights here are illustrative orders of magnitude chosen to make the arithmetic visible, not measurements of your repository. The relationship is what transfers: cost scales with resident size multiplied by turns.
The cheapest optimisation available to you is to send less. Every other lever is downstream of that one.
Two consequences fall straight out of the arithmetic. The first is that a long session is not free merely because you are not typing; the resident payload is billed on every turn, so a bloated thread taxes work you have not done yet. The second is subtler. Cache hits are charged at a fraction of standard input, but caching depends on the front of the conversation staying byte‑stable. Switch model in the middle of a long thread and that prefix is invalidated, so the history you were getting cheaply gets re‑billed at full price. The practical rule is to finish a phase, write the outcome to disk, clear, and then switch.
Model, then effort, then placement
Model choice is not about how hard the task looks. It is about blast radius: how many files change, and how badly a wrong assumption propagates. A single gnarly function is a small radius. A thirty‑file migration with side effects is a large one.
Haiku 4.5
$1 in · $5 out per MTok · 200K window
- Lookups, formatting, renames
- Well‑scoped work handed down by a stronger model
- Latency‑sensitive loops
Sonnet 5
$2 in · $10 out introductory · 1M window
- The daily driver
- Edits, debugging, tool‑heavy work
- High volume where cost still matters
Opus 5
$5 in · $25 out per MTok · 1M window
- Architecture and wide refactors
- Unfamiliar codebases
- Long‑horizon autonomous runs
Fable 5
$10 in · $50 out per MTok · 1M window
- Frontier reasoning where capability outranks cost
- Reach for it after an evaluation, not after a feeling
- Often unavailable while an organisation reviews it
Posted rates move. Introductory pricing expires, tiers get repriced, and availability varies by plan, provider and region. Treat the numbers above as the shape of the decision and confirm the current sheet before you build a budget on it. Two discounts usually matter more than the model you picked: cache hits bill at a tenth of standard input, and batched work at half.
One trap hides inside per‑token comparison. Token counts are not portable across model generations, because a newer tokenizer can emit more tokens for identical text. A lower posted rate can still produce a larger invoice. Measure your own workload before you migrate on price alone.
Effort is a depth dial, not a token cap
Effort changes how long the model works a problem before it defers to you. At low effort, an agent that finds four plausible utility functions is more likely to stop and ask which one you meant. At high effort it will read all four and decide. Neither is correct in general; the question is whether your time or its tokens are scarcer right now.
| Level | Reach for it when | Cost behaviour |
|---|---|---|
| low | Boilerplate, formatting, mechanical edits, work delegated by a stronger model | Shortest reasoning, most interruptions |
| medium | Everyday coding and tool‑heavy loops where throughput matters | The sensible default |
| high | Architecture, hard bugs, anything where a wrong turn is expensive | Noticeably more reasoning tokens |
| xhigh | Large refactors and bugs that survived high | Long runs; watch the counter |
| max | Highest‑stakes reasoning, model permitting | Most expensive per unit of progress |
Two corrections worth internalising. /effort auto resets to the selected
model's default level; it does not select the highest one available. And ultrathink buys a
single deeper turn without changing the saved effort setting, which makes it the right tool for one
hard step inside otherwise cheap work.
Figure: the context economy of one session
Everything on the left is loaded before your prompt is read. The two paths in the middle are the only two moves available: keep it and pay for it, or push it into a window you are not going to re‑read.
← scroll the figure sideways →
Reading the figure. The blue region is the resident payload. The amber region is curation, where you decide what survives the next compaction. The purple region is isolation, where a child window absorbs the cost of finding something out. The green band prices the turn. Full‑resolution and editable versions of both figures sit beside this page in the repository.
Pick the mechanism before you spend the tokens
Three questions settle it. Answer them about the task in front of you, not about the feature you are curious to try.
Are the pieces of this task independent of each other?
Does one piece need another piece's output before it can start?
Would two pieces be editing the same files at the same time?
Answer question one
The mechanism follows from the shape of the work. Nothing about the shape depends on which features you have enabled.
- When
- Isolation
- Talks to
- Overhead
- First move
- Watch out
The arithmetic behind the questions is unglamorous. Sequential duration is roughly the sum of the tasks. Parallel duration is roughly the longest task plus coordination. Parallelism therefore pays only when the longest task is much shorter than the sum and coordination stays cheap. People reliably remember the first condition and forget the second, which is why teams get reached for on work that a fan‑out would have finished quietly.
The mechanism people skip: worktrees
Subagents get all the attention, and for coupled work one session gets the rest, which leaves the middle case underserved. When you have one transformation to apply across many independent targets, what you want is neither: you want several real sessions, each in its own git worktree on its own branch, so that nothing shares a filesystem and the merge is where disagreement surfaces.
There is a command for the decomposition. Point it at a large repository change and it proposes a split into a set of worktree tasks, which you approve before anything runs. The approval step is the feature. You get to see the partition and reject it while rejecting is free, which is the same move as plan mode one level up.
The cost is honest and worth stating: one whole session per target. That is more expensive than a fan-out and cheaper than a team, and it is the right answer whenever the targets would otherwise fight over the same files.
Figure: what each mechanism costs
The same three questions, drawn out, with the price of each answer underneath.
← scroll the figure sideways →
Reading the figure. Isolation and communication are the two axes that actually separate these mechanisms. A subagent has isolation and no communication. A worktree has both isolation and its own filesystem. A team has communication and pays for it. One session has neither and is usually right.
Fan‑out and team, side by side
The structural difference is not how many agents run. It is how many messages have to cross between them, because every crossing is a token you pay for and a place the work can stall.
Counters are illustrative, scaled to show the ratio rather than to predict your bill.
What to take from it. The fan‑out has one hop out and one hop back per child. The team adds a claim, a completion and a handoff message per stage, plus a lead that has to stay awake. That overhead buys exactly one thing: the ability for stage two to consume stage one's output. If your work does not need that, you are paying for a feature you will not use.
Soft rules bend. Hard rules do not.
Instructions in CLAUDE.md enter the model's reasoning, which means they are
weighed against everything else in the window, including your latest prompt. A hook sits outside
that reasoning entirely.
The detail that makes hooks useful rather than merely restrictive. A blocking hook can write to standard error, and that text comes back to the agent. So the hook does not just refuse; it redirects, naming the sanctioned path. Enforcement plus a signpost, in one exit code.
Where hooks fire, and what they can run
The event catalogue is wider than any slide will show and it grows between releases. The families worth knowing are the tool lifecycle, the session and agent lifecycle, and environment changes. Handler types include a shell command, an HTTP endpoint that receives and answers JSON, a direct MCP tool call with no glue script, and prompt or agent handlers.
| Family | Representative events | Typical use |
|---|---|---|
| Tool lifecycle | PreToolUse, PostToolUse, PermissionRequest, PostToolUseFailure | Block a path, format after an edit, audit a write |
| Session and agent | SessionStart, UserPromptSubmit, PreCompact, SubagentStart, TaskCompleted, TeammateIdle | Inject context, snapshot before compaction, notify on completion |
| Environment | CwdChanged, FileChanged, WorktreeCreate | Reload configuration, sync a worktree, guard a directory |
Treat a hook as privileged code. It runs with your permissions and receives structured JSON that you did not write. Quote inputs, keep the blast radius small, and never assume a payload string is shell‑safe. This is exactly why many organisations restrict hooks before they restrict anything else.
Skills, and the economics of a description
A skill is a prompt with a name. That is the whole idea, and it is enough. The interesting part is what stays resident.
Every installed skill contributes its name and description to the window on every session, and nothing else. The body loads only once Claude decides the skill applies, or once you name it. So the description is doing two jobs at once: it is the trigger, and it is the part you pay for continuously. A vague description is expensive twice, because it occupies space and fails to fire.
Progressive disclosure
Idle: descriptions only.
A skill that audits its own source material
Here is a worked example that does something slightly unusual: it teaches a subject while treating its own reference material as suspect. The workshop notes it was built from contained several commands that no longer exist, so the skill routes every version‑sensitive claim through a separate audit file and instructs the model to check current documentation before asserting anything.
--- name: teach-claude-code description: Teach current Claude Code from fundamentals through advanced agentic workflows. Use when a user asks for a tutorial, onboarding, workshop, lesson plan, feature explanation, or help choosing an orchestration mechanism. Also use to audit Claude Code instructions for outdated commands or configuration. --- # Workflow 1. Establish the learner's OS, terminal, claude --version, provider, repository type and desired outcome. Ask only what changes the lesson. 2. Read references/workshop-notes.md for curriculum and demo context. 3. Read references/version-audit.md when the request touches commands, shortcuts, pricing, settings, front matter or managed policy. 4. Check the current official documentation before stating a version-sensitive fact. 5. Teach the smallest useful rung of the ladder. 6. Structure each lesson: concept, syntax, safe example, exercise, success criteria, pitfalls, source link.
Why the split matters. The description carries trigger language and stays resident. The workflow and the two reference files are dead weight until the skill fires, at which point they are exactly what you want. Splitting a large skill into supporting files is not tidiness; it is how you keep the resident cost proportional to the frequency of use.
When to write one
Three times
The threshold
- You have typed roughly the same complex prompt three times
One head
Knowledge risk
- The procedure exists only in one person's memory
Consistency
Trade-off accepted
- Uniform output matters more than free-form flexibility
Compliance
Non-negotiable steps
- A required step must never be quietly skipped
Where a skill defines what to do, a custom subagent defines how it runs: which model,
which effort, how many turns before it gives up, which tools it may not touch, which servers it can
reach. Two required fields, name and description, and a long list of optional ones.
Pairing them is the pattern worth remembering: put the procedure in the skill, put the execution
envelope in the subagent, then ask the subagent to run the skill.
--- name: reviewer description: Review an open diff for correctness and untested edge cases without editing files. model: opus effort: high maxTurns: 20 isolation: worktree background: true disallowedTools: [Write, Edit] --- Flag edge cases the tests do not cover. Check error paths. Report findings only. Do not edit.
A caution carried over from older material. context: fork is a skill
field, not subagent front matter. If you want a child that inherits the whole conversation, use the
current forked‑subtask command instead. And maxTurns earns its place the moment you start
running agents in the background, because it is the only thing standing between an ambiguous
instruction and a very long night.
The cheapest capability upgrade is more context, not more model
Everything so far has treated the repository as the world. Most root causes are not in the repository. They are spread across an alerting system, a runbook, a chat thread, an issue and a pull request, and nobody has assembled them since the incident.
Model Context Protocol is a protocol for exposing typed tools, prompts and resources to a client. An MCP server sits between the agent and a real system and presents a tool list with descriptions, which the agent then selects from exactly as it selects a built-in tool. Servers exist for the systems you would expect: issue trackers, code hosts, wikis, chat, databases, alerting, feature flag stores.
The part that gets misunderstood is authorisation. The server uses credentials it was configured with. There is no privileged path around your existing access controls, which means your normal authorisation and audit posture carries over rather than being bypassed. That is the reassuring answer and also the constraint: a server can do exactly what its credentials permit, so scope them like you would scope any service account.
The demonstration worth running once
Give the agent read access to five unrelated systems, hand it one incident identifier, and forbid it from reading the source code at all. Then watch what happens.
Evidence, one source at a time
Working hypothesis
No evidence yet. One incident identifier, and a rule that the source code stays closed.
What the exercise proves. Five systems, one cause, and not one line of the implementation was read. The uplift did not come from a more capable model. It came from the agent being able to reach the same five places a human would have checked, in the order a human would have checked them, without waiting on five people.
Configuration that actually matters
| Decision | Current guidance |
|---|---|
| Transport | Remote HTTP for remote services, stdio for local processes. Server-sent events is deprecated for new integrations. |
| Pinning tools | alwaysLoad: true keeps a server's whole tool schema resident instead of letting it load on demand. Use it sparingly, because it is a permanent charge against the window you just spent a whole section learning to protect. |
| Reloading | Edit .mcp.json, then /mcp reconnect <server>. You do not need to restart the session. |
| Mid-flow questions | Elicitations let a tool ask you a structured question while it runs, rather than guessing or failing. |
| Enterprise deployment | A fixed set normally ships as a managed configuration file. Policy can allow or deny specific servers and can restrict users to managed servers only. |
| Credentials | Managed policy governs which servers are permitted. It does not by itself rotate tokens. Ownership of the credential lifecycle depends on each integration, so do not promise central rotation you have not implemented. |
The write-access question. Read access across many systems is where nearly all the value sits and where nearly all of the risk does not. Creating tickets, closing incidents and pushing branches are separate decisions, and they are worth making separately rather than as one switch.
Plugins, and why half of this is greyed out for you
Two practical topics that get conflated: how a team shares what it built, and why a documented feature is missing from your machine.
The question people ask about plugins is when to use a plugin instead of a skill or a subagent, and it does not have an answer, because a plugin is not an alternative to either. It is a folder with a manifest that bundles the things you already made: skills, agent definitions, hooks, server definitions, language server configuration, themes, and supporting executables. It is a distribution mechanism.
flag-toolkit/ ├── .claude-plugin/plugin.json ├── skills/rollout/SKILL.md ├── agents/reviewer.md ├── hooks/hooks.json ├── .mcp.json └── bin/
You have four options for sharing, and one of them is not using plugins at all. A repository of markdown files that people copy into place works, and is what most teams should start with. Above that sits a private internal marketplace, which is well documented and takes real effort to stand up. Above that sit public marketplaces, official and community. Validate before you distribute anything: the abbreviated manifest printed in most training material is conceptual rather than copy-ready.
claude plugin validate flag-toolkit # require a green result before sharing
Trust deserves a sentence of its own. A skill is a prompt that will run with your permissions in your repository, and a plugin can carry hooks, which is arbitrary code. Read what you install. The provenance question is the same one you would ask of any dependency, and the fact that it is markdown makes it easier to audit, not less important to.
Why a feature you just read about is not there
Almost every gap between documentation and your terminal is a policy decision rather than a bug.
Run /status first, then work down this list.
| Symptom | Usual cause | What to do |
|---|---|---|
A model tier is missing from /model | Not enabled for your organisation, often while security, privacy and pricing terms are still under review | Nothing, locally. Ask internally, and design workflows that degrade to the tiers you have. |
| An experimental capability does nothing | Beta and preview features are commonly disabled at the organisation level, and some also need an explicit opt-in from you | Check policy first, then the opt-in. Never assume the opt-in alone is enough. |
| Hooks are blocked | Hooks run arbitrary code with your permissions, so they are usually the first thing restricted | Reasonable restriction. Use permission modes and instruction files for the same intent, accepting they are softer. |
| An MCP server will not connect | Allow-list policy, or a credential problem that looks like a connection problem | /mcp to inspect, reconnect the server, then check whether policy permits it at all. |
| You cannot install a plugin | Marketplaces disabled, which is common | Share the underlying markdown through a repository instead. Nothing is lost except convenience. |
| A command in a guide does not exist | Version drift, or a team-specific custom command that was never a built-in | /help, /release-notes, then the official reference. See the drift table. |
One thing worth internalising about surfaces. The terminal, the editor extensions, the desktop application, the browser version and the mobile application are different front ends over the same agent and the same models. There is no task that only one of them can do. Pick the one that fits where you are, and expect the capability differences you hit to be policy, not architecture.
Start from the symptom
Nobody arrives at a document like this looking for a topic. They arrive because something is behaving badly. Pick the sentence that sounds most like your afternoon.
Choose a symptom above. Each one maps to a cause, a fix, and the lab that drills it until you stop hitting it.
A pattern in that list. Most of these are not model failures. They are placement failures, or a soft rule being asked to do a hard rule's job, or a missing stop condition. The diagnostic question that resolves the majority of them is the same one: what is in the window, and what did I expect the model to be unable to negotiate?
Version drift is a first‑class hazard
Claude Code ships quickly. Any written guide, including this one, starts decaying the day it is published. The table below is a live example: every row was stated confidently in training material and every row needed correcting against current documentation.
| Stated as fact | Status | Current treatment |
|---|
The habit this should produce. Before you standardise a team workflow on a command, a settings key or a front‑matter field, check it against the official reference and pin the version you verified. A stale instruction file is worse than an empty one, because it is trusted.
Set up a repository you do not mind breaking
Nobody should learn permission modes, hooks or rewind semantics on code that matters. The labs below all run against one small practice service with three defects seeded in it on purpose.
Build the practice repository
There is a scaffold script beside this page. It writes a small fulfilment service with no npm dependencies, six passing tests on Node's built-in runner, a deliberately bloated instruction file, a release-managed directory for the hook lab, and a baseline git commit.
# from the folder holding setup-lab.sh bash setup-lab.sh claude-code-lab cd claude-code-lab # verify it yourself, before Claude sees it node --version # 18 or newer npm test # 6 passing npm run zones # prints the unroutable percentage
That last command is the one that matters. It reports the share of the catalogue that routes to a warehouse zone which does not exist. On the shipped scaffold it is exactly 1.00%, twelve SKUs out of twelve hundred. Write the number down. It is your ground truth for lab 3, and it is how you will know whether the agent found the real cause or a plausible-sounding neighbour.
If you would rather not run a script, the alternative is to ask for it. This is itself a reasonable first exercise, because it forces you to specify an outcome precisely:
Create a throwaway JavaScript practice repo with no npm dependencies, tests on node's built-in runner, and three deliberate defects: a modulus that routes to a zone outside the real range, a documented order cap that nothing enforces, and a route with no test coverage. Add a runbook that hints at all three without naming them. Do not fix the defects. Commit a baseline.
Preflight, in this order
| Step | What you run | What you are checking |
|---|---|---|
| 1 | claude --version | Which version you are about to learn. Every guide, including this one, is version-relative. |
| 2 | /status | Account, provider and which capabilities your organisation has actually enabled. |
| 3 | /model | What is available to you rather than what exists. Do not memorise model lists. |
| 4 | /help then / | Read the local command list once. Note anything you cannot explain. |
| 5 | /context | Your empty-session baseline. Record the number before you do anything. |
Record your own baseline
Type in what your own empty session reports. Everything downstream is measured against this.
——
Permission posture: start paranoid, relax on evidence
Set the session to ask before every action for the first few labs. It is slower and it is the
only way to build an accurate mental model of what the agent actually does, as opposed to what it
says it will do. Shift+Tab cycles the modes, including plan mode.
Widen autonomy after you have watched the agent do a class of task correctly several times, not before. The failure pattern to avoid is granting broad permissions early, because the tool then outruns your ability to follow what happened, and you lose the one thing you cannot delegate: being able to explain the code you now own.
Between every lab. git add -A && git commit -m "lab N". The in-session
checkpointer snapshots the agent's own file edits, but it does not track changes made by Bash
commands, hooks, or your editor. Git is the real undo. Checkpoints are a convenience on top of it.
How to argue your way to a plan
The labs assume a working method for going back and forth with the agent until an action plan is worth executing. Here it is, as five moves. The order matters more than the wording.
Most disappointing sessions fail at move one. Someone describes an implementation instead of an outcome, the agent complies, and both parties spend the next forty minutes refining a solution to the wrong problem. The loop below is designed to delay commitment until the option space has been seen, and to make the commitment explicit enough that drift is detectable.
State what must be true when you are done, what must not change, and how success will be checked. Withhold your own solution, even if you have one, because naming it collapses the search immediately.
TemplateGoal: 1% of the catalogue never receives a restock order and I need that to be zero. Constraints: the fix must not change the zone count, must not touch prod/, and must be verifiable by running npm run zones. Do not propose a fix yet. First tell me what you would need to read to be confident about the cause, and what you expect to find.Why the last line
Asking for its reading list before its answer gives you a cheap signal about whether it has understood the problem. If the list is wrong, stop there. You have spent a few hundred tokens instead of a few thousand.
Ask explicitly for alternatives and explicitly forbid a preference on the first pass. Agents are agreeable by default and will converge on your implied favourite if you let them.
TemplateGive me three materially different approaches. For each one: what changes, what it costs to verify, what breaks if the assumption behind it is wrong, and what it forecloses later. Do not recommend one. Do not rank them. I will choose.What good output looks like
The three options should differ in kind, not in degree. If you get the same fix at three levels of thoroughness, say so and ask again for options that differ in approach.
Pick a favourite, then argue against it rather than for it. The question that does the most work is the falsification question, because it forces the model to name its own assumptions instead of defending a conclusion.
TemplatesWhat would have to be true for option two to be the wrong choice? Which of your assumptions is load bearing, and which one is weakest? If this ships and something breaks a week later, what is the most likely thing and where would it surface? What are you assuming about the data that you have not verified?The tell to watch for
If it capitulates instantly and switches to whatever you hinted at, you learned nothing and should push back once more. A plan that survives three rounds of this is worth more than a first draft of the implementation.
Convert the conversation into written constraints and have the agent read them back. The read-back is the point: it surfaces the misunderstanding while it is still cheap, and it gives you a reference to compare against later when the work drifts.
TemplateRestate the plan as: files you will touch, the order you will touch them, the check you will run after each step, the rollback if a check fails, and three things you will explicitly not do. Keep it under 30 lines. Write it to docs/plan-zones.md.Why to a file
A plan in the transcript dies at the next compaction. A plan on disk survives /clear,
can be executed by a cheaper model in a fresh session, and can be diffed against what actually
happened.
Planning and executing want different models and different context. Once the plan is on disk, the reasoning that produced it is dead weight.
Sequence/clear
/model # step down to your daily driver
Execute docs/plan-zones.md exactly. Stop after step 2 and show me the diff.
Two reasons this is not fussiness
Switching model mid-thread invalidates the cached conversation prefix, so a long history gets re-billed at full input price. And the planning transcript is the single largest thing you could have carried into the execution phase for no benefit.
The stop after step 2 clause is the cheapest guardrail in this document. It converts a long autonomous run into a checkpointed one at the cost of one sentence.
Iterating on a plan costs a markdown file. Iterating on generated code costs a re-read, a diff, a test run and your attention, on every cycle.
How to analyse the options once you have them
Move three assumes you can compare candidates. Five axes carry most of the weight, and the one people skip is the last one.
| Axis | The question | Why it decides things |
|---|---|---|
| Reversibility | Can I undo this with one command? | A reversible option with a worse design often beats an irreversible option with a better one, because you get to be wrong cheaply. |
| Blast radius | How many files and systems does a wrong assumption reach? | This is what picks your model and your effort level, not how clever the task feels. |
| Verification cost | How do I know it worked, and how long does that take? | An option you cannot check is not an option. Prefer approaches with a command that answers the question. |
| Token cost | What does this add to the resident window, times the turns remaining? | Resident context is taxed per turn, so a cheap-looking approach that hoards context is not cheap. |
| Ownership | Can I explain this in review next week without the transcript? | The axis that gets skipped, and the one that produces codebases nobody can maintain. |
Score three candidates
Rate each option 1 to 5, where 5 is better. Adjust the weights to match what this decision is actually sensitive to. The point is not the number; it is finding out which axis is carrying your intuition.
| Axis | Weight | Option A | Option B | Option C |
|---|---|---|---|---|
| Weighted score | — | — | — |
——
Anti-patterns in this loop. Asking for a recommendation during move two. Accepting the first plan because it was articulate. Letting the agent choose the orchestration mechanism, which it will do enthusiastically and usually one rung too high. Leaving the plan in the transcript instead of on disk. And treating a confident tone as evidence, which it is not.
The lab: eleven exercises, in dependency order
Each lab is fifteen to thirty minutes. They are sequenced so that every one makes the next one legible: you cannot judge whether a subagent helped until you can read your own window, and you cannot write a useful skill until you have felt a prompt fail three times.
← scroll sideways →
Why this order. Measurement first, because every later claim is relative to a baseline. Control before encoding, because a skill is just a prompt you already trust. Enforcement after encoding, because a hook that redirects needs somewhere to redirect to. Distribution last, because orchestration multiplies whatever context you built in tiers one to four.
Progress is held in the page only and resets on reload, by design. The checklist is a working surface, not a record.