The Practitioner's Course
AI Engineering Workflows That Hold Up
0% complete

AI Engineering Workflows That Hold Up

Three tracks, eighteen lessons, real diagrams, Q&A, and quizzes. By the end you will have a working mental model for how the Claude Code harness fits together, where specs belong, and how to roll it out to a team. Save the course and come back to it whenever a teammate asks "how should we set this up?"

Track 1

The Claude Code Harness

Six layers around the model plus subagents as delegation. The harness matters more than the model, and the build order matters too.

8 lessons, ~50 min0%
Track 2

Bringing It Together

Where the harness meets the spec workflow. The 30-day adoption plan, failure diagnostics, and a day-one onboarding flow.

4 lessons, ~20 min0%
Track 3

Where Specs Belong

Why spec.md drifts, the two-snapshot pattern, the workspace-authored / files-generated rule. The architecture that holds up.

6 lessons, ~32 min0%

How to use this course

Lessons are short and self-contained. Each one has a body, a diagram, an expanded explainer, a Q&A, and a 3-question quiz so you can self-check before moving on. The sidebar tracks what you have finished. Progress is saved in your browser.

You can read the tracks in order or jump around. Track 1 (the harness) is the foundation. Track 2 (bringing it together) assumes Track 1. Track 3 (specs) is independent but lands harder after the harness is understood.

Marco Kotrotsos, 30 years of IT experience now focused on practical AI deployment. The course is curated from the Autocomplete publication on Medium and Substack, with the harness content annotated from Anthropic's May 14 2026 guide and supporting docs.

Track 1 banner: The Claude Code Harness
Track 1⏱ 6 minB1

Why the harness matters more than the model

Anthropic's May 14 guide contains one sentence that carries the whole argument.

What you will learn
  • What the harness actually is
  • Why model benchmarks alone are the wrong lens
  • The seven components: six extension points plus one delegation capability

Anthropic dropped a substantial guide on May 14 called "How Claude Code works in large codebases." The central claim is one sentence:

The harness matters as much as the model.

The capabilities of Claude Code are the capabilities of the model plus the harness wrapped around it. Six extension points and one delegation capability. The model is one of seven things.

The wrong knob

Teams that fixate on model benchmarks are tuning the wrong knob. The benchmark differences between current frontier models are real but small. The differences in harness quality between teams are massive. Two teams running the same model can finish ten times the work apart because one has a configured harness and the other is fighting against it.

The seven components

Six extension points (build in this order):

  1. CLAUDE.md files (context that loads every session)
  2. Hooks (scripts triggered by events)
  3. Skills (packaged expertise loaded on demand)
  4. Plugins (bundles of the above, distributable)
  5. LSP integrations (symbol-level code intelligence)
  6. MCP servers (connections to external tools and data)

Plus one delegation capability: subagents (isolated Claude instances with their own context).

A single Claude logomark sits on top of a stack of six translucent teal plates labeled CLAUDE.md, hooks, skills, plugins, LSP, and MCP. Three smaller floating Claude logomarks labeled subagents hover beside the stack.
Six fixed plates supporting one model, three transient subagents available on demand.
Go deeper

The six harness layers do not make the model smarter. They give the model a working environment that compounds: a place to remember conventions, a way to react to events, packaged expertise it can pull on demand, distribution so the whole team shares the same setup, symbol-level navigation, and connections to the systems where real work lives. A frontier model with none of that is a graduate engineer dropped into a codebase with no onboarding. A mid-tier model with all of it is a senior engineer with two years of tenure.

From Anthropic's customer numbers

Rakuten reported 79% reduced time to market (24 days to 5 days). Stripe shipped a 10,000-line Scala-to-Java migration in 4 days that they estimated at 10 engineer-weeks manually. Wiz did a 50,000-line Python-to-Go migration in ~20 hours of active development versus an estimated 2-3 months manually.

Source: claude.com/product/claude-code/enterprise

Q&A

If the harness matters more than the model, does the model choice still matter at all?
Yes, but as a smaller multiplier on top of harness quality. A better model with a good harness pulls ahead noticeably, but a better model with a bare harness still loses to a worse model with a configured one. Pick the harness first, then optimize the model.
How do I tell if my team is tuning the wrong knob?
Look at what conversations sound like. If teammates argue about which model to use this week but nobody can describe their CLAUDE.md, hooks, or skills, the team is on the model knob. If teammates argue about whether a rule belongs in CLAUDE.md or a skill, the team is on the right one.
Why call subagents a delegation capability instead of a seventh layer?
The six extension points are things you configure once and they apply by default. Subagents are not configured upfront, they are summoned during a session for a specific job, like spawning a worker. Treating them as a layer makes people think they need to set up a fleet, which is the wrong mental model.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
Two teams use identical models on identical codebases. Team A ships 10x more work. What is the most likely explanation?
  • ATeam A pays for a higher model tier
  • BTeam A has a better-configured harness around the model
  • CTeam A writes shorter prompts
  • DTeam A disables safety features
Why:Capability differences at the team level are dominated by harness quality, not model choice.
Which of these is NOT one of the six extension points?
  • ACLAUDE.md
  • BHooks
  • CSubagents
  • DMCP servers
Why:Subagents are a delegation capability rather than a configured layer, available anytime rather than set up in advance.
A team spends three weeks A/B testing four different models. Performance differences are within 5%. What should they do next?
  • ATry a fifth model
  • BStop testing models and start building the harness
  • CSwitch back to the cheapest model
  • DFine-tune their own model
Why:The model differences are small and the harness differences are where the real performance gap lives.

Key takeaways

  • Performance at scale is determined by the harness, not the model.
  • Six extension points plus subagents as delegation. The model is one of seven things.
  • Teams that focus on model benchmarks alone are tuning the wrong knob.
Track 1⏱ 5 minB2

Agentic search vs RAG

Why Claude Code does not embed your codebase, and the tradeoff that creates.

What you will learn
  • Why RAG-based code tools fail at scale
  • How agentic search works (grep, file traversal, follow references)
  • The starting-context tradeoff and how to mitigate it

The RAG failure mode

A RAG-powered AI coding tool embeds the entire codebase ahead of time and retrieves relevant chunks at query time. At small scale this is fine. At large scale it breaks, because the embedding pipeline cannot keep up with active engineering teams committing code. The index reflects the codebase as it existed days or weeks ago. Retrieval returns a function the team renamed two weeks ago. The build fails.

How agentic search works

Claude traverses the file system, reads files, runs grep, follows references. No index. No staleness window. Every query operates on what is true right now.

The tradeoff
Agentic search works best when Claude has enough starting context to know where to look. If you ask it to find all instances of a vague pattern across a billion-line codebase, you hit the context window before the work begins.
Split-screen showing RAG with stale index returning a renamed function versus agentic search returning the current state
Same problem, different failure mode.
Go deeper

The reason RAG staleness is fatal in code but tolerable in document search is that code has reference integrity that documents do not. A document with a slightly outdated paragraph is still useful. A function reference pointing to a renamed symbol breaks the build. Code is unforgiving about staleness in a way that prose never is, which is why retrieval-based architectures hit a wall the moment teams scale past a few engineers committing concurrently.

Q&A

Could you build a fresh-enough RAG index that updates on every commit?
In principle yes, but the operational burden grows with team size, and the moment a single commit slips through unindexed, you are back to the same failure mode. Agentic search sidesteps the whole class of staleness bugs rather than trying to bound them.
Does agentic search ever lose to RAG?
For very small codebases where you can fit everything in context, RAG and agentic both work and RAG is faster. The crossover happens early. By the time a codebase has a few hundred files, agentic wins on correctness even if it costs a few extra tokens.
What does good starting context actually mean in practice?
A short root CLAUDE.md that names the major directories and what lives where, plus subdirectory CLAUDE.md files that describe local conventions. With that in place, Claude knows to grep in services/payments/ for a payment bug rather than scanning the whole tree.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
A team's RAG-indexed assistant returns a function name that was renamed two weeks ago. What does this illustrate?
  • AThe model hallucinated
  • BThe embedding index is stale and the codebase has moved past it
  • CThe agent search failed
  • DThe LSP was misconfigured
Why:This is the canonical RAG-at-scale failure: the index reflects a past state of the codebase, and the model uses what it finds even though the symbol no longer exists.
Agentic search performs best when:
  • AThe model has a long context window
  • BClaude has good starting context about where to look
  • CThe repository uses a single programming language
  • DRAG is also enabled as a fallback
Why:Agentic search needs direction, and the harness exists to provide that direction through CLAUDE.md files, skills, and LSP.
Which task is agentic search least well-suited for without harness support?
  • AFinding all callers of a specific named function in a known module
  • BLocating a vague pattern across an entire billion-line repository
  • CReading a single file the developer has just opened
  • DRunning grep on a specific subdirectory
Why:Without good starting context, vague searches across enormous codebases burn the context window before useful work begins.

Key takeaways

  • RAG embeddings get stale; at scale they cannot keep up with commits.
  • Agentic search uses grep and file traversal against the live codebase. No staleness.
  • The tradeoff is that agentic search needs good starting context. The harness is how you provide it.
Track 1⏱ 7 minB3

CLAUDE.md (lean, layered, audited)

The foundation layer. Get this right or nothing else works.

What you will learn
  • The three operational rules for CLAUDE.md
  • How directory-tree loading works
  • The most common pathology: skill-shaped content in CLAUDE.md

CLAUDE.md files are the foundation. Nothing else has anywhere to live until these are right.

The inverse pattern is common: every convention, every style rule, every "do not do this" rule gets piled into a single root CLAUDE.md that grows to 2,000 lines over six weeks. Claude tries to honor all of it, runs out of context space, and the team blames the model.

Three operational rules

Lean. The root CLAUDE.md should fit on one screen. Pointers, critical gotchas, and the highest-leverage conventions only. If the root file is more than 80 lines, it is doing too much.

Layered. Claude walks up the directory tree and loads every CLAUDE.md file it finds along the way. A CLAUDE.md in src/payments/ loads automatically when Claude is working in that directory. Put module-specific conventions in module-specific files.

Audited. Anthropic recommends reviewing CLAUDE.md every three to six months. Tighter rule: audit after every major model release.

Hierarchical folder tree with CLAUDE.md cards floating above each folder, a coral path showing how Claude loads context as it walks down the tree
Root, subdir, and local context all load along the path.
Go deeper

The directory-tree loading mechanic is the most underused property of CLAUDE.md, and it is the one that solves the bloat problem mechanically rather than through discipline. When Claude is editing a file in src/payments/processors/stripe.ts, it reads every CLAUDE.md from root down through that path, in order, with later ones layered on top. That means the conventions for the payments module never need to appear in the root file. They live where the work happens. Teams that learn to write subdirectory CLAUDE.md files first, and only promote a convention to the root when it genuinely applies everywhere, end up with foundations that stay lean for years.

Direct from the Anthropic docs

"For each line, ask: would removing this cause Claude to make mistakes? If not, cut it. Bloated CLAUDE.md files cause Claude to ignore your actual instructions."

The docs also flag four file locations: ~/.claude/CLAUDE.md (global to you), ./CLAUDE.md (team, in git), ./CLAUDE.local.md (personal, gitignored), and parent/child directory files for monorepos.

Source: code.claude.com/docs/en/best-practices

Audit your CLAUDE.md right now

Type the line count of your root CLAUDE.md file to see how the audit reads it.
Enter a line count to see how the harness audit reads your root CLAUDE.md.

Q&A

How small is "lean" in practice?
The 80-line target is a useful ceiling, but the real test is whether you can describe everything in the root file in a single elevator pitch. If you cannot, it has drifted into convention territory and the convention parts belong deeper in the tree.
What goes in the root file then, if not conventions?
Three things: what the repo is, where the major pieces live, and the gotchas that genuinely apply everywhere. A new agent reading the root file should know what kind of project it is and which directories to explore.
How do you audit CLAUDE.md without spending half a day on it?
Read it cold, pretending you have never seen the repo. Anything you cannot justify in one sentence to a new teammate is a candidate for deletion or relocation. Most useful audits take 30 minutes and remove more than they add.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
Where should a payments-specific code style rule live?
  • AIn the root CLAUDE.md
  • BIn src/payments/CLAUDE.md
  • CIn a separate document linked from the root
  • DIn a global skill that loads every session
Why:Local conventions belong in the directory they apply to. The directory-tree loader picks them up automatically.
A root CLAUDE.md has grown to 1,800 lines. What is the most likely diagnosis?
  • AThe codebase is genuinely complex and the file size is fine
  • BConventions and recurring task instructions have piled up that belong in subdirectory files or skills
  • CThe team needs to switch to a larger context model
  • DCLAUDE.md should be split by file extension
Why:This is the canonical bloat pattern: things that should be skills or subdirectory files end up in the root because nobody pushed back at the moment they were added.
Why does Anthropic recommend auditing CLAUDE.md every three to six months?
  • AModel behavior evolves and rules written for one model can constrain the next
  • BBrowser caches expire after that window
  • CThe format changes between releases
  • DSubdirectory files only persist for six months
Why:A rule that helped an older model stay on track may actively block a newer model from doing something it now handles natively.

Key takeaways

  • Root CLAUDE.md should fit on one screen. If it is more than 80 lines, it is doing too much.
  • Subdirectory CLAUDE.md files load automatically when Claude is working in that subtree.
  • Any "when doing X, do Y" chunk in CLAUDE.md is probably a skill in disguise. Move it.
Track 1⏱ 7 minB4

Hooks for continuous improvement

Hooks have two uses. The obvious one is guardrails. The valuable one is continuous improvement.

What you will learn
  • Why hooks are best understood as a feedback layer, not a constraint layer
  • Three hook patterns worth implementing in your first week
  • When to use a hook instead of a CLAUDE.md instruction

The default use of hooks is guardrails: block destructive commands, prevent commits to main. That is the boring use.

The valuable use is continuous improvement. A stop hook can reflect on what happened during a session and propose CLAUDE.md updates while context is fresh. A start hook can load team-specific context dynamically so every developer gets the right setup without manual configuration.

The reframe
Hooks are not a constraint layer. They are a feedback layer. The harness becomes self-improving when you use them correctly.

Three patterns worth implementing

The reflection hook. At session end, ask the agent to summarize what was learned and propose updates. After two weeks of running this in a client deployment, the typical backlog is five to ten proposed CLAUDE.md changes worth reviewing.

The dynamic context hook. At session start, detect which module the developer is working in and load the relevant skills. Replaces "every developer configures manually" with "the environment knows itself."

The enforcement hook. For deterministic checks like linting and formatting, hooks beat instructions. Telling Claude to run the linter and Claude forgets 15% of the time means that 15% is your bug rate. A hook running unconditionally is 100% reliable.

Circular feedback loop: session window flows into stop hook gear, into a notepad of proposed updates, then loops back to update the CLAUDE.md card
The harness becomes self-improving when the stop hook surfaces updates.
Go deeper

The instinct to use hooks as guardrails is so strong because guardrails are what every other engineering tool's "hook" concept is for: pre-commit blockers, CI gates, lint enforcement. Carrying that mental model into Claude Code makes the reflection use case invisible, which is unfortunate because the reflection use case is where most of the value sits. A stop hook that produces a short writeup of "what we learned this session and what should change in CLAUDE.md" is a feedback loop the rest of your toolchain does not have.

Direct from the Anthropic docs

The Hooks docs specify six events: SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Stop, and Notification. Each has a deterministic guarantee that CLAUDE.md instructions do not have. "Unlike CLAUDE.md instructions, which are advisory, hooks are deterministic and guarantee the action happens."

Exit code semantics matter: exit 0 = success, exit 2 = blocking error with stderr shown to Claude, other non-zero = non-blocking error in transcript. The hook deciding whether to block tool use returns a JSON decision (allow, deny, ask, defer).

Source: code.claude.com/docs/en/hooks

Q&A

How do I keep a reflection hook from producing noise?
Make it produce a short structured artifact rather than free-form prose, and have a human review the outputs once a week. Skip-rate matters: most session reflections will not propose anything useful, and that is fine. You want the small fraction that surface real patterns.
When should something be a CLAUDE.md instruction instead of a hook?
If the rule is contextual ("when working on payments code, prefer the Money type"), it belongs in CLAUDE.md. If the rule is deterministic and unconditional ("always run the linter before committing"), it belongs in a hook. The test is whether forgetting it 15% of the time is acceptable.
Can hooks become a maintenance burden?
Yes, if you write too many. The teams that get the most value have a small set of high-leverage hooks: one for session start, one for session end, and a few enforcement hooks for things the team genuinely cares about being correct every time.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
Which use of hooks captures the highest leverage value?
  • ABlocking destructive commands like rm -rf
  • BProducing reflection summaries that propose CLAUDE.md updates
  • CPreventing the agent from accessing the network
  • DForcing the agent to use a specific model
Why:The defensive uses are the obvious ones; the continuous-improvement uses are where the harness becomes self-improving over time.
"Always run the formatter before committing" should be implemented as:
  • AA line in CLAUDE.md
  • BA pre-commit hook
  • CA skill loaded on every session
  • DA subagent specialized in formatting
Why:Deterministic checks belong in hooks because instructions get forgotten under context pressure but hooks fire every time.
A team adds a session-start hook that detects the current module and loads relevant skills. This pattern is best described as:
  • AAn enforcement hook
  • BA reflection hook
  • CA dynamic context hook
  • DA delegation hook
Why:The hook adapts what loads based on where the developer is working, replacing manual per-developer setup with environment that knows itself.

Key takeaways

  • The valuable use of hooks is continuous improvement, not constraint enforcement.
  • Three first-week patterns: reflection, dynamic context, enforcement.
  • Deterministic checks belong in hooks, not in CLAUDE.md.
Track 1⏱ 9 minB5

Skills, plugins, LSP, MCP

The four middle layers, what each one does, and the most common mistake with each.

What you will learn
  • How progressive disclosure works in skills
  • Why plugins prevent tribal knowledge
  • When LSP is the single highest-leverage configuration change
  • Why MCP belongs last in the build order

Skills: progressive disclosure

Skills load on demand. A security review skill loads when Claude is assessing code for vulnerabilities. A deployment skill bound to the payments service directory only auto-loads when work is in that directory.

Common mistake: loading everything into CLAUDE.md instead of building skills.

Plugins: distribute what works

Plugins bundle skills, hooks, and MCP configurations into a single installable package. Without plugins, good setups stay tribal. One engineer figures out a great configuration, the team next door rebuilds the same thing six months later, the second team's version is slightly worse.

Common mistake: trying to centrally author every plugin from one team. The pattern that works is letting teams build their own, with central curation.

LSP: symbol-level navigation

For C, C++, Java, C#, Go, and Rust codebases especially, LSP is the single highest-leverage configuration change. Without it, grep returns dozens of matches across languages and stale branches. With it, the language server returns only the references that point to the same symbol.

Common mistake: assuming LSP is automatic. It is not. The plugin layer activates it.

MCP servers: external tools, last in line

MCP is how Claude connects to internal tools, data sources, and APIs. Common MCPs: Notion for product docs, Linear for tickets, an internal search MCP for code search at scale.

The biggest mistake in this layer
Building MCP connections before the basics are working. Teams discover MCP, spend two weeks wiring up Jira, Confluence, Datadog, Sentry, then wonder why Claude is not producing quality output. The model has access to every tool in the company and no idea what to do with any of it.
Four labeled platforms at ascending floor heights showing Skills, Plugins, LSP, and MCP with a vertical arrow labeled build order pointing up
The four middle layers in build order, with MCP last on purpose.
Go deeper

Progressive disclosure is the design property that makes skills work as a layer. A skill is a file with a short description Claude sees, and a body that loads only when the description matches what Claude is trying to do. That two-step structure keeps the always-loaded context budget free for things that genuinely apply to every session. Without progressive disclosure, every skill would be paying a context tax all the time, and the layer would collapse back into CLAUDE.md by another name.

Direct from the Anthropic docs

Skills compaction budget. Skills enter a conversation as a single message and stay for the session. After auto-compaction, Claude Code re-attaches the most recent invocation of each skill, keeping the first 5,000 tokens. Re-attached skills share a combined budget of 25,000 tokens.

Skill listing budget. "The budget scales at 1% of the model's context window." Tune with skillListingBudgetFraction. Run /doctor to inspect.

Plugins. Manifest at .claude-plugin/plugin.json. If version is omitted, every commit counts as a new version. Two public marketplaces: claude-plugins-official and claude-community.

MCP transports. HTTP recommended for remote, stdio for local processes, SSE deprecated. Channels capability lets servers push messages into a session.

Sources: code.claude.com/docs/en/skills, /plugins, /mcp

Q&A

When should a recurring task become a skill instead of a CLAUDE.md instruction?
When the task is recognizable by Claude and has its own non-trivial body of how-to detail. If it is a single rule, it stays in CLAUDE.md. If it is a recipe, it is a skill.
What is the actual cost of building MCP integrations first?
The cost is that Claude has access to tools without context about when to use them. You end up with an agent that knows it can query Jira but has no convention for when querying Jira is the right move.
Why is LSP described as the highest-leverage configuration change for typed languages specifically?
Because typed-language codebases have rich symbol information that pattern-matching grep cannot use. With LSP, "find all callers of processOrder" returns the actual references, not every text occurrence of the string.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
A team has a recurring "security review" workflow with a 200-line checklist. Where does it belong?
  • AInlined in the root CLAUDE.md so it is always available
  • BPackaged as a skill that loads when Claude is doing security review
  • CHardcoded into a stop hook that runs on every session
  • DBuilt into a custom MCP server
Why:Recurring task expertise with a non-trivial body is the textbook skill use case, loaded on demand rather than always-on.
Why does building MCP integrations first tend to fail?
  • AMCP servers are slow
  • BThe model has tools available but no harness context for when to use them
  • CMCP servers conflict with hooks
  • DEach MCP server requires its own model
Why:Without the underlying CLAUDE.md, hooks, and skills, the agent has integration breadth but no judgment about when each is appropriate.
A team running a multi-language typed codebase wants the single highest-leverage change. They should:
  • AAdd more MCP servers
  • BWire up LSP integration
  • CIncrease the model tier
  • DAdd more files to CLAUDE.md
Why:LSP gives symbol-level search, which dramatically reduces context burn on typed-language work.

Key takeaways

  • Skills load on demand. Move "when doing X, do Y" content from CLAUDE.md into skills.
  • Plugins distribute what works and prevent tribal knowledge from re-emerging.
  • LSP is the highest-leverage change for typed-language codebases.
  • MCP is the last layer. Build the others first.
Track 1⏱ 5 minB6

Subagents and delegation

Not a configured layer. A delegation capability you can reach for anytime.

What you will learn
  • How subagents differ from the six configured layers
  • The split-exploration-from-editing pattern
  • Parallel exploration and specialized review patterns

Subagents work differently from the six layers. They are a delegation capability, available whenever you need them, configured nowhere upfront.

The pattern Anthropic flags is "split exploration from editing." Spin up a read-only subagent to map a subsystem and write findings to a file. Then have the main agent edit with the full picture. The subagent burns its own context window without polluting the editor agent's.

Why this matters
The main reason teams hit context limits on complex changes is doing exploration and editing in the same conversation. Every file the agent reads to understand the system stays in context. Subagents fix this by making exploration disposable.

Two more patterns

Parallel exploration. Three subagents map three different subsystems in parallel. The main agent gets three small writeups instead of trying to read all three subsystems itself.

Specialized review. A subagent with a security-review skill reviews a change before the main agent commits. Findings come back as a file.

A main agent at a desk in the center with three subagent cubes floating above, each dropping a folded paper note labeled auth, billing, search onto the desk
Subagents explore in parallel, hand back compact summaries.
Go deeper

The intuition to internalize about subagents is that context is a non-renewable resource within a single conversation. Every file the agent opens, every search it runs, every system map it builds stays loaded until the conversation ends. By the time the agent is ready to make the actual change, half its context might be exploration scaffolding that no longer carries new information. A subagent inverts this: it does the same exploration in an isolated context, writes a short summary to disk, and disappears. The main conversation gets the summary, not the scaffolding.

Direct from the Anthropic docs

Three built-in subagents: Explore (Haiku, read-only, used for codebase search), Plan (inherits model, read-only, used during plan mode to prevent infinite nesting), general-purpose (all tools).

"Explore and Plan skip your CLAUDE.md files and the parent session's git status to keep research fast and inexpensive."

Useful frontmatter: model (route cheap tasks to Haiku), memory (persistent learning per agent type), isolation: worktree (auto-cleaned if no changes).

Source: code.claude.com/docs/en/sub-agents

Q&A

Are subagents always better than just doing exploration in the main session?
No. For small changes where the exploration is light, the overhead of spawning a subagent and reading its writeup costs more than it saves. The pattern earns its keep when exploration is substantial enough that you would otherwise hit context limits later.
What should a subagent's output actually look like?
A short structured file the main agent can read in a few seconds. Names of relevant functions, key file paths, a one-paragraph summary, and any gotchas. If the writeup is itself thousands of lines, the subagent did not do its job.
Can subagents call other subagents?
They can, but in practice this is rare and usually a sign the original delegation was scoped too broadly. If a subagent finds itself needing further delegation, it is often easier to split the original task into two parallel subagents from the main conversation.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
The "split exploration from editing" pattern works because:
  • ASubagents use a different model
  • BExploration findings can be summarized and the scaffolding context discarded
  • CSubagents have larger context windows
  • DSubagents skip safety checks
Why:The win is that exploration burns the subagent's context, not the main agent's, and only the distilled findings cross back.
When are subagents the wrong choice?
  • AMapping an unfamiliar subsystem before a large refactor
  • BRunning three parallel investigations across independent modules
  • CMaking a small edit to a function the agent has already opened
  • DDoing a specialized security review before commit
Why:For small, well-scoped edits the agent already has context for, spawning a subagent adds overhead without saving meaningful context.
A team is constantly hitting context limits on large changes. The most useful intervention from this lesson is:
  • ASwitch to a model with a larger context window
  • BUse a subagent for exploration and let the main agent focus on editing
  • CDisable file reads to save context
  • DCompress every file before reading
Why:The context limits usually come from doing exploration and editing in the same conversation, and the subagent pattern is the direct fix.

Key takeaways

  • Subagents are a delegation capability, not a configured layer. Use them anytime.
  • Split exploration from editing: subagent maps, main agent edits.
  • Parallel subagents multiply throughput while keeping context cost low.
Track 1⏱ 5 minB7

The build order

Each layer requires the previous one. Skipping ahead breaks things.

What you will learn
  • The full build order and why each step requires the previous
  • What breaks when teams build out of order
  • The case for MCP last, not first
  1. CLAUDE.md. Without this, nothing else has anywhere to anchor.
  2. Hooks. Once CLAUDE.md exists, hooks make it self-improving.
  3. Skills. Once hooks are surfacing patterns, skills externalize the recurring ones.
  4. Plugins. Once skills exist worth sharing, plugins distribute them.
  5. LSP. Once the plugin layer is mature, LSP integrations belong there.
  6. MCP servers. Once the rest of the harness is solid, MCP extends to external tools.

Subagents are available throughout. Use them when the work needs delegated exploration.

What breaks when teams build out of order
MCP-first teams have great tool integration and terrible context management. Skill-heavy teams without CLAUDE.md discipline produce skills that conflict with each other. Plugin-marketplace-first organizations end up with marketplaces full of plugins nobody uses.
Six numbered nodes in a horizontal flow from CLAUDE.md through hooks, skills, plugins, LSP, and MCP servers, with subagents noted as available throughout
Six layers, one order, subagents anytime.
Go deeper

The build order is not advice about what to do first. It is a statement about what depends on what. Hooks need somewhere to read and propose updates against, which is CLAUDE.md. Skills become unmanageable without the reflection loop that hooks provide. Plugins need real skills to bundle, otherwise the marketplace fills up with empty packages. MCP servers are the most expensive layer to set up well and the most useless without the rest of the harness in place. Reverse the order and each step undermines the next.

Q&A

Can a small team skip plugins entirely?
A solo developer or a two-person team can, because there is no distribution problem yet. The moment you have three or more engineers working in the same codebase, plugins start paying for themselves.
How long does each step in the build order typically take?
A reasonable rule of thumb is days for CLAUDE.md, a week for the first useful hooks, a few weeks for skills to accumulate, and then plugins, LSP, and MCP each take a focused sprint. The whole sequence is months, not days.
What if my organization already has MCP servers running before the rest is in place?
Keep them running but treat the lower layers as the priority work. The MCPs will get more useful once the agent has context and conventions to use them appropriately.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
A new team starts by wiring up Jira, Confluence, and Datadog MCP servers in week one. What is the most likely outcome?
  • AFaster initial productivity than teams that start with CLAUDE.md
  • BGreat tool reach with poor judgment about when to use each tool
  • CLower overall context usage
  • DBetter skill quality
Why:MCP-first teams end up with broad integration and no foundation for the agent to know when each integration is the right call.
Plugins belong in the build order after skills because:
  • APlugins are harder to write than skills
  • BPlugins distribute skills, so there needs to be something worth distributing first
  • CPlugins require LSP to function
  • DPlugins are deprecated in favor of skills
Why:A plugin marketplace with nothing useful in it is a maintenance burden, so build the skills first and then package the ones that work.
Which layer should be built first?
  • AMCP servers
  • BSkills
  • CCLAUDE.md
  • DLSP
Why:CLAUDE.md is the foundation that every other layer references or extends.

Key takeaways

  • The build order: CLAUDE.md, hooks, skills, plugins, LSP, MCP. Subagents anytime.
  • Each layer requires the previous one to be solid.
  • MCP-first teams fail by trying to integrate everything before the foundation works.
Track 1⏱ 6 minB8

Three configuration patterns

The patterns that show up in every successful large-scale deployment, used as a checklist.

What you will learn
  • How to make a codebase legible to Claude
  • Why models evolving makes harness audits necessary
  • The roles emerging in organizations that run Claude Code well

Make the codebase legible

  • Layered CLAUDE.md files (root for big picture, subdirectories for local).
  • Initialization in subdirectories rather than at the repo root.
  • Test and lint commands scoped per directory.
  • .ignore files for generated content, build artifacts, third-party code.
  • Codebase maps when the directory structure does not do the work.
  • LSP running so search happens at the symbol level.

Keep the harness current

Models evolve. Instructions written for the model you have today can work against the model you will have in six months. Audit after every major model release.

Assign ownership

Technical configuration alone does not drive adoption. The rollouts that spread fastest had a dedicated infrastructure investment before broad access. A small team, sometimes one person, wired up the tooling so Claude already fit developer workflows when they first touched it.

The emerging role
Anthropic identifies an "agent manager" role: a hybrid PM-engineer function dedicated to managing the Claude Code ecosystem. The minimum viable version is a named DRI with authority over settings, permissions, plugin marketplace, and CLAUDE.md conventions.
Three columns showing make the codebase legible, keep the harness current, and assign ownership
Three patterns, used as a quarterly checklist.
Go deeper

The three patterns work as a checklist because they cover the three failure modes that show up in every Claude Code rollout that stalls. Codebases that are not legible to Claude fail at the navigation layer no matter how much harness sits on top. Harnesses that are not kept current fail when models improve and old rules block work the new model could otherwise do. Configurations without owners fail because no single person has the authority to evolve them. Any one alone will eventually plateau a deployment.

Customer evidence on what works

Anthropic Cybersecurity (CLUE). Built "Claude Looks Up Evidence" with CLUE Triage (auto-disposition with confidence scores) and CLUE Investigate (NL queries via agentic loops). Built to PoC in one day, full implementation in one week. Results: 25 avg tool calls per investigation, false positives dropped 33% to 7%, an estimated 1,870 manual hours automated in 30 days.

Spotify. Up to 90% engineering time reduction on certain workflows. 650+ AI code changes shipped per month. Roughly half of all Spotify updates flow through the system.

Sources: claude.com/blog/how-anthropic-uses-claude-cybersecurity, claude.com/product/claude-code/enterprise

Q&A

What does "legible to Claude" actually mean if the codebase already has good docs?
Human docs and agent docs overlap but are not identical. A README that says "see the wiki for architecture" is fine for humans and useless for Claude. Legibility for the agent means the structure speaks for itself and the local CLAUDE.md files describe local conventions.
How small can the agent-manager role be?
Smaller than the title suggests. In a team of ten, it can be a part-time responsibility for one engineer. The minimum is one named person with authority over the plugin marketplace, CLAUDE.md changes that affect the whole repo, and the hook configurations.
How do you tell when the harness is the bottleneck versus the model?
When a new model release ships and your team's performance does not improve, the harness is probably constraining what the new model can do. When performance jumps with each release, the harness is in good shape.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
A team's performance flatlines after a new model release. The most likely diagnosis is:
  • AThe new model is worse
  • BRules in the harness written for the previous model are now constraining the new one
  • CThe team forgot to update their billing tier
  • DSubagents stopped working
Why:This is the canonical "audit after a model release" signal: the harness is holding the model back from what it can now do natively.
Which of these belongs in "make the codebase legible" rather than the other two patterns?
  • ANaming an agent-manager DRI
  • BScoping lint and test commands per directory
  • CAuditing CLAUDE.md after a model release
  • DTracking which plugins are most used
Why:Per-directory tooling is part of making the codebase navigable for the agent.
The minimum viable "agent manager" role is:
  • AA full-time hire with a PM-engineer hybrid background
  • BA named person with authority over harness configuration
  • CAn external consultant on retainer
  • DA rotating responsibility that changes weekly
Why:The role can be small but it has to be named and empowered.

Key takeaways

  • The three patterns: make legible, keep current, assign ownership.
  • Audit the harness after every major model release, not just on the calendar.
  • Name a DRI before you do anything else.
Track 2 banner: Bringing It Together
Track 2⏱ 5 minC1

How specs flow into Claude Code

Where Track 1 and Track 3 meet. The .spec-cache pattern lives inside the Claude Code harness.

What you will learn
  • How the workspace-spec workflow connects to the CLAUDE.md and skills layers
  • Why the round-trip is best implemented as Claude Code primitives
  • A worked example of the end-to-end flow

The two main tracks of this course are not independent. The Specs track describes where the spec lives (the workspace) and how it reaches the agent (the .spec-cache/ round-trip). The Harness track describes the six layers of the Claude Code harness. The spec workflow lives inside the harness.

Where the round-trip sits in the harness

The session-start pull is a start hook. The session-end sync-back is a stop hook. The agent's interaction with the cache is governed by CLAUDE.md conventions. The spec-pulling logic is bundled as a skill. The whole thing is distributed as part of a plugin. The workspace integration runs through an MCP server.

Five of the six harness layers are involved. That is not coincidence. The spec workflow is a Claude Code workflow, expressed through the harness primitives.

A worked example

  1. Developer opens a feature branch.
  2. Start hook fires: pulls the active spec from Notion via MCP into .spec-cache/spec.md, loads the deployment skill for the relevant module.
  3. Developer asks Claude to implement the feature. Claude reads the cache, follows references via LSP, writes code.
  4. Developer reviews. Surfaces a missing edge case. Claude updates the cache with the new requirement.
  5. Stop hook fires at session end: diffs the cache against Notion, syncs the new edge case back to the workspace. Cache is discarded.
  6. Developer opens a PR. A pre-commit hook freezes the final spec to docs/specs/feature-shipped.md.

Six steps. Three hooks. Two skills. One MCP. The full harness, doing one piece of work.

A workspace stack on the left connects to a harness tower on the right with arrows for pull on session start and sync on session end, plus an arrow dropping to a PR snapshot at freeze time
The spec round-trip mapped onto the Claude Code harness.
Go deeper

The line "five of the six harness layers are involved" matters because each layer involved is a place where the round-trip can fail silently. If the MCP server times out at session start, the start hook still completes, the cache stays empty, the agent improvises against whatever it can grep, and you do not find out until PR review. The hook layer, the skill layer, and the MCP layer each need an error mode that is loud rather than quiet, otherwise the architecture's clean diagram hides operational fragility behind it.

Q&A

Why is the session-start pull implemented as a hook rather than as something the developer types?
Because instructions get forgotten and hooks do not. If pulling the spec is a manual step, half the team will skip it on a Friday, and the cache will hold a stale spec from three sessions ago. A hook runs unconditionally and removes the discipline tax.
The lesson says the spec workflow uses five of six harness layers. Which layer is missing and why?
LSP. The spec workflow itself does not need symbol-level code intelligence to move spec content between the workspace and the cache. LSP shows up when the agent then implements the feature, which is a separate phase.
What is the difference between the working snapshot in .spec-cache/ and a regular file the agent reads?
The cache is owned by exactly one session at a time. A regular file in the repo can be edited by anyone and read by anything. The cache is gitignored, regenerated at the start of every session, and discarded at the end. That ownership boundary is what stops drift.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
A team installs the start hook but skips the stop hook. What is the most likely failure mode after two weeks?
  • AThe cache fills up and exhausts disk space
  • BRefinements surfaced during sessions never make it back to the workspace, so the workspace silently goes stale
  • CThe agent loses access to the spec mid-session
  • DThe frozen snapshot at PR open is corrupted
Why:Without the stop hook, the diff-and-sync step never runs, and the workspace drifts in the opposite direction from before.
In the worked example, why is the freeze step a pre-commit hook rather than a manual command?
  • APre-commit hooks run faster than manual commands
  • BGit requires pre-commit hooks for any file in docs/
  • CTo guarantee the frozen snapshot exists in the PR, so reviewers always see what spec the code was built against
  • DBecause Notion's API rate-limits manual exports
Why:A manual freeze relies on the developer remembering. The hook makes the evidence a structural property of the workflow.
Which statement best describes how CLAUDE.md participates in the spec round-trip?
  • ACLAUDE.md stores the spec content itself
  • BCLAUDE.md defines the cache path and the discard rule so the agent treats the cache correctly
  • CCLAUDE.md is regenerated by the start hook each session
  • DCLAUDE.md is not involved at all in the spec workflow
Why:CLAUDE.md provides the conventions (where the cache lives, when it gets discarded) that the agent needs to behave correctly around the cache.

Key takeaways

  • The spec workflow is implemented as Claude Code primitives: hooks, skills, plugin, MCP.
  • Five of the six harness layers are involved in a single feature shipping round-trip.
  • If you skip the harness work, the spec workflow has nowhere to live. If you skip the spec work, the harness has no useful target.
Track 2⏱ 6 minC2

A 30-day adoption plan

How to roll both tracks out to a small team without breaking what already works.

What you will learn
  • A week-by-week plan for adoption
  • How to sequence the spec work and the harness work
  • What to measure to know if it is working

Week 1: foundations

  • Inventory existing spec-shaped files in the repo.
  • Audit the root CLAUDE.md. Aim for under 80 lines.
  • Move task-specific patterns out of CLAUDE.md into individual skill files.
  • Pick the workspace tool (Notion or Linear). Install its MCP server.

Week 2: feedback loop

  • Install the reflection hook.
  • Set up a weekly 15-minute review where the DRI looks at the reflection log.
  • Pick one feature for the spec-workflow pilot.

Week 3: distribution

  • Package the team's setup as a plugin.
  • Set up a curated internal plugin marketplace if you do not have one.
  • Wire up LSP for your primary language.
  • Ship the pilot feature.

Week 4: scale

  • Run a retro on the pilot.
  • Roll the plugin out to the rest of the team.
  • Schedule the first quarterly harness audit.
  • Name the DRI if you have not already.

What to measure

  • Cycle time per feature. Should drop.
  • Spec-to-code drift. Should drop to near zero.
  • Review burden. Should stay flat or drop.
  • Onboarding time. Should drop dramatically.
Four staircase platforms representing Week 1 through Week 4 with relevant icons on each: CLAUDE.md and MCP, reflection hook and pilot, plugin and LSP, and four measurement dials
Four weeks, four platforms, four metrics at the top.
Go deeper

The phrase "if cycle time does not drop, the harness is fighting the team" is doing real work but the lesson does not say what fighting looks like. Fighting means the developer is repeatedly correcting the agent on things the harness should already know, the same module-specific convention has to be retyped every session, the spec pulled into the cache contradicts a CLAUDE.md rule, or skills load context the developer then has to spend tokens overriding. The signal is qualitative before it is quantitative. If your senior engineers start saying "it would have been faster without it" in standup, you have your answer two weeks before the metrics confirm it.

Q&A

Why does the 30-day plan sequence the spec work in week 2 rather than week 1?
Because the spec pilot depends on the MCP server being installed and on the root CLAUDE.md being clean enough that the agent has somewhere coherent to anchor. Running the spec pilot before week 1 cleanup means the agent reads a 2,000-line CLAUDE.md and a fresh spec cache and gets confused about which takes precedence.
What is the smallest version of the plan that still works?
One team, one workspace, one pilot feature, one DRI named on day one. You can skip the plugin packaging in week 3 if the team is small. You cannot skip the DRI, the reflection hook, or the pilot feature.
Cycle time dropped but review burden rose. What is the diagnosis?
The spec is too vague. The agent ships faster because it has fewer constraints to satisfy, and reviewers carry the load of catching what the spec did not pin down. Tighten the acceptance criteria in the workspace.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
A team finishes the 30-day plan but skipped naming a DRI. What is the predictable failure mode at week 8?
  • AThe plugin marketplace fills with duplicates
  • BKnowledge stays tribal, the harness stops evolving, and adoption plateaus
  • CThe MCP server stops working
  • DSkills start conflicting with each other
Why:Without a DRI, no one owns the audit cycle or convention disputes, and the harness slowly slides back.
Which metric is the leading indicator that the architecture is working, not the lagging one?
  • ACycle time per feature
  • BOnboarding time for new engineers
  • CSpec-to-code drift
  • DNumber of skills in the plugin
Why:Cycle time and onboarding take weeks to register. Spec-to-code drift drops in the first PR that uses the round-trip.
A team runs the pilot in week 2 and the agent keeps ignoring a constraint that is clearly in the spec. What should you check first?
  • AWhether the model needs upgrading
  • BWhether the MCP server is pulling the latest version of the spec into the cache
  • CWhether the spec is in the right Notion database
  • DWhether the developer is using the right shortcut
Why:A stale cache is the most common failure in week 2 because the start hook can succeed at writing the file while pulling outdated content.

Key takeaways

  • Week 1: foundations. Week 2: feedback loop. Week 3: distribution. Week 4: scale.
  • Four metrics to watch: cycle time, spec-to-code drift, review burden, onboarding time.
  • Four weeks is enough to know if it works.
Track 2⏱ 5 minC3

When integration breaks

The spec workflow and the harness are independently good designs that fail in specific, predictable ways when they meet. Here is how to tell which half is at fault.

What you will learn
  • The four most common integration failures and their signatures
  • The diagnostic question for any of them ("which side moved last?")
  • How to make silent failures loud

Most teams will hit at least two of these in the first month. Knowing which half is at fault is what lets you fix the right thing instead of rebuilding both.

Failure 1: looks like a model regression

A developer says the agent used to follow the spec carefully and now it ignores half of it. Nine times out of ten, the spec is fine and the harness changed. Someone added 400 lines to CLAUDE.md, a new skill is loading context that contradicts the spec, or a plugin update changed the order things load in. The fix lives in the harness.

Failure 2: looks like a harness bug

The cache is being pulled correctly, CLAUDE.md is lean, hooks are firing, and yet the output is still off. If three different developers all produce three different interpretations of the same spec, the spec is ambiguous. The harness cannot fix that.

The diagnostic: when the harness is the problem, output varies by developer based on environment. When the spec is the problem, output varies by interpretation regardless of environment.

Failure 3: silent cache staleness

The start hook ran, wrote a file to .spec-cache/spec.md, and returned success, but the MCP call inside it failed silently and the cache has yesterday's content. The developer trusts the cache because the hook said it succeeded.

The fix is making the start hook noisy on partial failure. If the MCP call returns less than expected, the hook should fail visibly rather than write an old or empty file.

Failure 4: workspace pollution

Refinements that should have been comments or follow-up tickets get synced back as edits to the spec itself. Over time the spec accretes session-specific noise that nobody reviews. The stop hook needs a filter.

The diagnostic question
"Which side moved last?" If the harness was edited recently and behavior changed, suspect the harness. If the spec was edited recently and behavior changed, suspect the spec. If nothing was edited and behavior changed, suspect the cache or the MCP server.
A diamond-shaped diagnostic tree starting from behavior changed, branching to harness edited, spec edited, or neither, each leading to a different small icon
The diagnostic tree for when integration breaks.
Go deeper

The thread connecting all four failure modes is the same one: the architecture is clean on paper and silently fragile in practice. Each transition between layers (workspace to cache, cache to agent, agent to PR snapshot) is a place where success-without-substance can occur. The discipline is making every transition loud about partial failure. A start hook that wrote an empty file is not success. A stop hook that synced nothing meaningful is not success. A frozen snapshot that lost half its content is not success. The audit job is to find each transition that can silently succeed-but-fail and instrument it.

Q&A

The agent ignored a constraint in the spec. The team upgraded the model that week. Which side do you suspect first?
Neither. Check whether anything in CLAUDE.md or a recently loaded skill contradicts the constraint. Model upgrades get blamed for most regressions that are actually harness regressions, because the new model is more sensitive to conflicting instructions.
How do you tell whether the cache has stale content without manually comparing it to the workspace every time?
Make the start hook write a timestamp and the workspace version ID into a header in the cache file. If the spec was updated in the workspace after the timestamp in the cache, the agent or the developer can see the mismatch without doing a diff.
Why is workspace pollution a harness problem and not a discipline problem?
Because the sync-back is automated. If you ask the team to manually filter what gets synced, you are back to relying on discipline, which the architecture was designed to remove. The filter belongs in the stop hook script.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
Three developers ran the same spec through their environments and got three different outputs. Which half is at fault?
  • AThe spec is ambiguous
  • BThe harness is misconfigured
  • CThe model is the wrong version
  • DThe MCP server is rate-limited
Why:Output varying by developer points at environment differences. Output varying by interpretation across environments points at the spec.
A start hook reports success but the cache has empty content. What is the structural fix?
  • ARun the hook manually before each session
  • BAdd an explicit content check that fails the hook if the cache is below a minimum size
  • CSwitch to a different MCP server
  • DAdd the spec to CLAUDE.md as a backup
Why:The hook should not return success if it produced a file the agent cannot work from. A size or schema check turns a silent failure into a loud one.
The spec workflow has been running for six weeks. The workspace spec has grown to twice its original size and is harder to read. What changed?
  • AThe team added too many features
  • BThe stop hook is syncing too aggressively, including session-specific noise
  • CThe MCP server is duplicating content
  • DThe frozen snapshots are leaking back
Why:Without a filter on what gets synced back, the workspace accretes every cache edit, including ones that should have stayed in the session.

Key takeaways

  • Four common integration failures: model regression illusion, harness blame illusion, silent cache staleness, workspace pollution.
  • Diagnostic question: which side moved last?
  • Make every layer transition loud about partial failure.
Track 2⏱ 4 minC4

Onboarding a new engineer

A sequenced day that gives them a working setup, a real task, and a frozen snapshot of their first PR by 5pm.

What you will learn
  • The four phases of a one-day onboarding
  • Why the day ends with a real PR, not a sandbox exercise
  • How onboarding retros surface harness improvements

Hour one: install the plugin

The team plugin bundles the root CLAUDE.md, the start and stop hooks, the spec skill, the MCP configuration, and any team-specific skills. If the plugin is well-built, this step is a single command and produces a working environment without the new engineer needing to understand any of the layers yet. If it takes longer than 30 minutes, the plugin is not yet at the standard the team needs.

Hour two: the walkthrough

The DRI or a peer walks through one ticket end to end. Open the workspace, show the spec. Open Claude Code, show the start hook firing, show the cache file appearing. Make one small change, show the stop hook running, show the diff that goes back. Open a draft PR, show the frozen snapshot.

Afternoon: the small real task

Give the new engineer a ticket that is well-specified, bounded, and genuinely useful. Not a fake onboarding task. They author or co-author the spec in the workspace, run the round-trip themselves, and open a PR. The DRI reviews with onboarding context in mind.

End of day: the retro

Fifteen minutes. What was confusing, what was obvious, what did the new engineer expect that did not happen. Every onboarding retro should produce at least one CLAUDE.md update, one skill clarification, or one plugin fix. If three onboardings in a row produce no actionable feedback, the team has stopped paying attention.

A horizontal timeline 9am to 5pm with four scenes: plugin install at a terminal, walkthrough with two figures at a tower, real task at a desk with a PR icon, retro at a round table
One day, four phases, a real PR at the end.
Go deeper

The onboarding day is the highest-signal QA pass your harness ever gets. A returning engineer has accommodated to the rough edges. A new engineer has not. Every assumption the harness implicitly makes about prior knowledge surfaces in the first hours of their first day. The retro at 5pm captures those surfaces in their freshest form, before the new engineer has built workarounds. Treat the retro as the audit, not the formality.

Q&A

Why does the onboarding day end with a real PR rather than a sandbox exercise?
Because the round-trip only proves itself in real conditions. A sandbox spec does not have ambiguity, a sandbox feature does not have downstream consequences, and a sandbox PR does not get reviewed against the frozen snapshot. The new engineer needs to feel the full loop.
The plugin install takes 90 minutes. What does that signal?
The plugin is not packaging what the team actually depends on, or it has external dependencies that the new engineer's machine does not have set up. Either fix the plugin so it pulls its own dependencies, or write a pre-install script. If installation cannot be one command, the plugin is not at the standard the team needs.
A new engineer finishes onboarding day but week two reveals they still do not understand how the cache discard works. Whose fault is that?
The CLAUDE.md root file, or the onboarding walkthrough. The cache discard rule is a convention, not an instinct. Add a one-line note to CLAUDE.md and to the walkthrough script.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
Onboarding day three engineers in a row produced zero feedback for the team to act on. What is the most likely cause?
  • AThe harness is perfectly designed
  • BThe DRI has stopped running retros or stopped listening in them
  • CThe new engineers are too senior
  • DThe onboarding tasks are too easy
Why:A well-built harness still has implicit assumptions that surface when fresh eyes hit it. Zero feedback over three onboardings means the loop is broken or no one is listening.
A new engineer ships their first PR by end of day one. What does the PR review reveal about the team setup?
  • ANothing, the PR shipped
  • BWhether the round-trip produced a clean frozen snapshot, a useful sync-back, and a spec that matches the code
  • COnly whether the code is correct
  • DOnly whether the engineer is competent
Why:The first PR is the highest-signal artifact you get for the team's setup. If any property is off for a new engineer, the rest of the team has been compensating.
A team has no plugin. Every new engineer manually configures their environment. What is the predictable cost at six months?
  • AThe team saves time by not maintaining a plugin
  • BEach engineer has a slightly different setup, conventions drift, and the harness fragments
  • CThe harness gets stronger because of variation
  • DOnboarding gets faster over time
Why:Without a plugin, the setup stays tribal. Each engineer's environment diverges and the harness stops being a shared architecture.

Key takeaways

  • Four phases in one day: install, walkthrough, real task, retro.
  • Real PR not sandbox. The round-trip only proves itself under real conditions.
  • Every onboarding retro produces at least one harness improvement.
Track 3 banner: Where Specs Belong
Track 3⏱ 6 minA1

Why spec-driven development exists

The cost of ambiguity changed when an LLM started doing the typing. Specs went from helpful hints to load-bearing constraints.

What you will learn
  • Why spec-driven development emerged as a discipline in the AI era
  • The asymmetry between human and agent responses to vague instructions
  • When spec-driven development pays off and when it does not

Spec-driven development is old. Waterfall had specs. BDD (Gherkin) had specs. OpenAPI has specs. Every era of software has had some version of "write down what you want before you build it."

What changed in 2025-2026 is that the spec became the input to a builder that does not understand intent.

The asymmetry

A human engineer reading a vague spec pauses, asks a colleague, slows down. An LLM agent reading a vague spec produces plausible output. By the time the human reviews it, hours of execution and hundreds of lines of code are already committed.

The shift
Pre-agent coding, ambiguity slowed you down. Agent coding, ambiguity actively creates risk. The spec is how you pre-pay the ambiguity cost.

When it pays off

SDD is right for the chunky-but-bounded work in the middle. The sweet spot is "a real feature, well-defined, that an agent will execute for one to four hours and produce a PR you will review."

When it does not

  • Small fixes. "Change the button color to teal" does not need a spec.
  • Weekend prototypes. Specs slow exploration.
  • Throwaway scripts. A 40-line transformation does not need a spec.
  • Tasks where you do not know what you want yet. Writing a spec before knowing is procrastination dressed as discipline.
Two parallel desks. Human reading a doc pauses with question mark. Agent processes identical doc and outputs high-speed file stream. Scale bar below shows ambiguity cost from zero on the human side to max on the agent side.
Same input, different cost curve.
Go deeper

The asymmetry between humans and agents on vague input is not just about diligence, it is about cost structure. When a human reads an unclear requirement, the cost of pausing is a Slack message and ten minutes; the cost of guessing is hours of rework. So humans pause. When an agent reads an unclear requirement, the cost of pausing is roughly the same as the cost of guessing, both happen at machine speed. There is no economic pressure to clarify, so the agent does what it is optimized to do, which is generate plausible output. The spec is not a discipline tool, it is a way to manually inject the pause that the agent's cost structure removed.

Q&A

If specs have been around since waterfall, what makes the current spec discipline different from BDD or design-doc culture?
BDD and design docs were optimized for human readers who would push back, ask questions, and refuse ambiguous tickets. Current spec discipline is optimized for a reader that will not push back. The structural requirements are stricter because the safety net of human judgment at execution time is gone.
My team writes good code reviews. Do we still need specs if the PR review will catch problems?
PR review catches problems after the agent has spent two hours implementing the wrong thing. Specs move the disagreement to before the work, where it costs minutes instead of hours.
How do I tell my team this is different from the heavy-spec processes they hated in 2010?
The old spec processes asked humans to maintain documents nobody read. Current specs are written once per feature, consumed immediately by the agent that does the work, and discarded or frozen at PR open. The reader is different, the lifecycle is shorter, and the spec earns its keep on the same day it is written.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
A team is debating whether to write a spec for a single-line config change. What is the right call?
  • AWrite a full spec, all work needs a spec
  • BSkip the spec, this is below the threshold where SDD pays off
  • CWrite a spec but skip the review step
  • DHave the agent write the spec from the diff
Why:SDD pays off for chunky-but-bounded work, not for trivial edits where the spec would take longer than the change.
Why does ambiguity create more risk under agent coding than under human coding?
  • AAgents are less accurate than humans
  • BAgents do not pause on ambiguity, they generate output anyway
  • CAgents cannot read markdown reliably
  • DAgents skip the testing step
Why:Humans slow down on unclear instructions, agents produce plausible-looking output instead of asking.
A team writes a 6-page spec before knowing what the feature actually does. This is best described as:
  • ASpec-driven development done right
  • BProcrastination dressed as discipline
  • CThe two-snapshot pattern
  • DRequired by BDD
Why:Writing a spec before the team knows what it wants delays the real work without resolving uncertainty.

Key takeaways

  • Specs are old. What is new is using them as input to an LLM that does not understand intent.
  • Ambiguity in agent coding actively creates risk; the spec pre-pays that cost.
  • SDD pays off for chunky-but-bounded work. Small fixes and pure exploration do not need it.
Track 3⏱ 6 minA2

The spec.md problem

Why every team that adopted spec.md hits the same wall at week six.

What you will learn
  • The drift pattern that appears in nearly every spec.md deployment
  • Why three sources of truth predictably end up in Slack reconciliation
  • The root cause: no precedence rule between artifacts

Three engineering teams in March and April adopted spec-driven development the same way. spec.md in the repo, agent reads the file, work happens, file gets updated. All three loved it for three weeks. All three hit the same wall in week six.

The wall
The file says one thing, the Linear ticket says another, three engineers are operating off three different states, the team is silently running a reconciliation system in Slack.

Nobody decided this should happen. It happened anyway, because the file and the ticket were both being treated as the truth, and they drifted.

Three sources, no precedence rule

  • The file was authoritative for the agent.
  • The Linear ticket was authoritative for status.
  • The Slack thread was authoritative for the why.

Three sources, no precedence rule, predictable result.

The flat-file critique

A flat markdown file is bad at five things a spec has: status, ownership, dependencies, audit history, and connections. The file is a snapshot pretending to be a system of record.

A central spec.md document on a pedestal with three arrows pointing to Linear ticket card, Slack chat bubble, and a doc, surrounded by a coral spiral indicating drift, with a fracture line on the floor below
Drift is structural, not behavioral.
Go deeper

The reconciliation system that emerges around spec.md is invisible because nobody schedules it. Engineers reconcile in Slack threads, in standup, in PR comments, in passing conversations at the coffee machine. None of those count as work in the tracker, none have an owner, and none produce an artifact. The team is paying a tax that does not show up in any process diagram. The diagnostic is simple: if you cannot point to the one place where the current state of a feature is recorded, you are running reconciliation, you just have not named it.

Q&A

We use spec.md and have not seen drift. What are we doing differently?
One of three things, usually. The team is small enough that everyone is in the same conversation, the feature has not run long enough yet, or one person quietly maintains spec.md as a job nobody assigned them. The first scales poorly, the second is a matter of time, the third becomes a single point of failure.
Why does the drift hit at week six specifically?
Three weeks is short enough that everyone remembers original intent. By week six the feature has shipped, a second feature has started, the original author has moved on, and spec.md is being read by people who were not in the room when it was written.
Can we just enforce a "spec.md is the only truth" rule and avoid the reconciliation problem?
You can try, but the file lacks status, ownership, dependencies, and audit history. Even with discipline, the file cannot answer the questions the team needs, so something else fills the gap. The reconciliation problem is structural.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
Three teams adopted spec.md and all hit the same wall in week six. The root cause is:
  • AThe teams lacked discipline
  • BThere was no precedence rule between artifacts
  • CMarkdown is a poor format
  • DThe agents were too aggressive about editing
Why:When multiple artifacts each behave like sources of truth and nothing declares which one wins, drift is the predictable outcome.
Which of the following is a flat markdown file structurally bad at?
  • ARecording status, ownership, dependencies, and audit history
  • BHolding plain text
  • CBeing committed to git
  • DBeing read by an agent
Why:A flat file can store text but cannot represent state, owners, blocking relationships, or change history without becoming a database.
A team has a spec.md in the repo, a Linear ticket open, and a Slack thread with context. What is the most likely failure mode?
  • AThe agent reads all three correctly
  • BEngineers operate from three different versions of the state
  • CLinear automatically reconciles them
  • DThe Slack thread updates the file
Why:Three uncoordinated sources without a precedence rule produce different mental models, which surfaces as conflicting expectations.

Key takeaways

  • Every team that puts spec.md in the repo as source of truth drifts within six weeks.
  • The drift is structural: no precedence rule between artifacts.
  • A flat file is bad at status, ownership, dependencies, history, and connections.
Track 3⏱ 6 minA3

Workspace authored, files generated

The one-sentence rule that resolves the spec.md drift problem cleanly.

What you will learn
  • Why the file is not the problem; treating it as authored is
  • How Notion's May 13 platform launch changes the calculus
  • The framing that responds to the Marmelab Waterfall critique
A workspace board at the top with two file shapes below, one dashed outline labeled working snapshot, one solid outline labeled frozen snapshot
One source, two snapshots.

The fix is not to delete the file. The fix is to make sure the file got generated, not typed.

Workspace is authored. Files are generated.

The spec lives in Notion (or Linear). The repo holds two kinds of generated snapshot, never an authored file.

Why Notion specifically

The case got a lot stronger on May 13 2026 when Notion launched their Developer Platform. CEO Ivan Zhao: "Use your Notion database as a sheer canvas to power both your workflows and your agents." First-class integrations with Claude Code, Cursor, Codex, Decagon.

What changes when you move the spec to a workspace

  • The spec has a status (draft, in review, approved, in progress, done).
  • The spec has an owner (named human responsible).
  • The spec has dependencies (this blocks that).
  • The spec has audit history (not git blame, the real record).
  • The spec connects to bugs, designs, customer issues.

Response to the Marmelab critique

Marmelab's "Waterfall strikes back" piece argues big design up front fails. The workspace-authored, files-generated pattern is not Waterfall. The workspace evolves continuously. What freezes is the snapshot at PR open, which is just evidence of what shipped.

Go deeper

The fix sounds like a tooling change, but it is a contract change. Authored files carry an implicit promise that they reflect current intent. The instant a developer can edit a file with their hands and commit it, the file starts accumulating drift, because every edit is a vote against the workspace being the source of truth. Generated files break the contract loudly, you cannot edit them with confidence, the next regeneration will overwrite you, so you stop trying. The discipline becomes mechanical rather than cultural, which is why this pattern survives turnover.

Q&A

How is this not just Waterfall with extra steps?
Waterfall freezes the spec at the start of the project. The workspace-authored pattern keeps the spec live, every session can update it. What freezes is the snapshot at PR open. Continuous evolution of intent plus frozen evidence of decisions is the opposite of Waterfall.
We already use Linear for tickets. Do we need to switch to Notion?
No. The pattern is workspace-agnostic. Linear has MCP, Notion has MCP plus the developer platform. Pick whichever your team already uses. Switching tools is overkill.
What if the workspace is down or the MCP server is unreachable mid-session?
The cache is already on disk locally, so the current session is not blocked. New sessions cannot pull a fresh snapshot, which is a real outage but the same kind you have when GitHub is down.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
The one-sentence rule that resolves the spec.md drift problem is:
  • AUse only flat markdown files
  • BWorkspace is authored, files are generated
  • CNever commit spec.md
  • DUse Linear exclusively
Why:Making the file generated rather than authored breaks the implicit contract that produces drift.
What did Notion launch on May 13 2026 that strengthens the case for workspace-authored specs?
  • AA new markdown editor
  • BThe Developer Platform with first-class agent integrations
  • CGit integration
  • DAn AI writing assistant
Why:The Developer Platform formalized Notion as a substrate for agent workflows.
How does the workspace-authored pattern differ from Waterfall's big design up front?
  • AIt uses smaller documents
  • BThe workspace evolves continuously, only the snapshots freeze
  • CIt skips the design phase
  • DIt only applies to backend code
Why:Waterfall freezes the spec for the project lifetime; this pattern keeps intent live and freezes only the per-PR evidence.

Key takeaways

  • The fix is making the file generated rather than typed, not deleting it.
  • Notion positioned for the spec-source-of-truth slot on May 13 2026.
  • The pattern is not Waterfall because the workspace evolves continuously.
Track 3⏱ 5 minA4

The three-tier architecture

Three artifacts with different homes, different mutability, and three different audiences.

What you will learn
  • The role of each tier (source of truth, working snapshot, frozen snapshot)
  • Why three tiers exist instead of one
  • How to know which tier a given file belongs in
Three stacked platforms at different heights, each with a labeled artifact, with three small figures on the right aligned to each platform representing team, agent, and future reviewer
Three tiers, three audiences, three different jobs.

Tier 1: source of truth

Authored in Notion or Linear. Continuously evolving. Read by humans and by agents through MCP.

Tier 2: working snapshot

Lives in .spec-cache/spec.md. Gitignored. Pulled at session start. Regenerated next session. Never committed.

Tier 3: frozen snapshot

Lives in docs/specs/<feature>-shipped.md. Committed alongside the PR. Frozen at PR open.

Three tiers, three questions
Source of truth: what does the team currently believe?
Working snapshot: what is the agent looking at right now?
Frozen snapshot: what spec was true when this code shipped?

A single file at the root of your repo cannot be all three things at once.

How to know which tier a file is in

If a file got typed by a human and committed to git, it is in the wrong tier. The rule: generate, never author.

Try it: which tier?

Sort each file into the right tier. Click your guess, then Check.
The Notion page where the team writes the feature spec and tracks status
A file at .spec-cache/spec.md regenerated at session start
A committed file at docs/specs/payments-shipped.md attached to PR #1247
A Linear ticket with acceptance criteria the team keeps refining
Go deeper

Three tiers exist because three different audiences ask three different questions, and the answers have different lifetimes. The team currently asks "what should this feature be." The agent in this session asks "what am I building right now." The reviewer six months from now asks "what was true when this shipped." Collapsing those into one file forces the file to be live and frozen at the same time, which is impossible.

Q&A

Why not just use git history for the frozen snapshot?
Git history records the state of the codebase, not the spec that drove the code. A frozen spec snapshot answers "what spec was approved when this code shipped," which git alone cannot tell you.
The working snapshot is gitignored. How do other engineers see what spec the agent is working from?
They see it the same way the team has always seen it, in the workspace. The cache is a per-session local copy for the agent, not a shared artifact.
What goes in the frozen snapshot exactly, the spec at PR open or at session start?
The spec as it stood at PR open, after any session-end syncs have been merged back. That way the frozen artifact reflects what the team actually agreed to ship.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
Which artifact lives in .spec-cache/spec.md in the repo?
  • AThe source of truth
  • BThe working snapshot, gitignored
  • CThe frozen snapshot, committed
  • DThe PR description
Why:The cache is local, gitignored, disposable, regenerated per session, and never committed.
A file got typed by an engineer and committed to git as the team's official spec. Which tier is this?
  • ASource of truth
  • BWorking snapshot
  • CFrozen snapshot
  • DNone, it is in the wrong tier
Why:Authored content committed to git is the pattern that produced the original drift. The rule is generate, never author.
Why does each tier need to be separate instead of one file doing all three jobs?
  • APerformance reasons
  • BEach tier has a different audience and a different required lifetime
  • CMarkdown limitations
  • DGit limitations
Why:The team needs a mutable artifact, the agent needs a session-scoped artifact, and the auditor needs an immutable artifact.

Key takeaways

  • Source of truth in workspace, working snapshot in gitignored cache, frozen snapshot committed alongside PR.
  • Each tier answers a different question. One file cannot answer all three.
  • If a human typed it and committed it, it is in the wrong tier.
Track 3⏱ 5 minA5

The .spec-cache round-trip

The actual workflow that wires the three tiers together. Five steps, no ambiguity.

What you will learn
  • The five-stage workflow from session start to PR landing
  • How the cache gets discarded without losing changes
  • Why this pattern cannot drift
A horizontal flow diagram with five labeled stages showing the round-trip pattern
Workspace, cache, agent, sync back, freeze. No ambiguity.

Session start

Pull the current spec from Notion or Linear via MCP. Write it to .spec-cache/spec.md (gitignored).

During the session

The agent reads from the cache. The agent may also write to the cache as work surfaces new requirements. Behaves exactly like the spec.md you are used to, with one difference: nobody else is editing this file. It is yours for this session.

Session end

Diff the cache against the workspace. Sync meaningful changes back. The workspace updates. The cache gets discarded.

At PR open

Generate a frozen snapshot of the spec. Commit it to docs/specs/<feature>-shipped.md.

Why this cannot drift
One source of truth: the workspace. The cache cannot drift because it gets regenerated. The frozen snapshot cannot drift because it is frozen. The team only edits one thing.
Go deeper

The reason this pattern cannot drift is that drift requires two artifacts to be treated as authoritative at the same time. In the round-trip, the cache is explicitly not authoritative, it is a session-scoped working copy, and everyone on the team knows it. The frozen snapshot is explicitly not authoritative either, it is historical evidence. Only the workspace ever holds the role of source of truth, and there is only one workspace. The architecture moves the team from "which artifact is right" to "what does the workspace say right now," which is a question with exactly one answer.

Q&A

What happens if I make changes to the cache and forget to sync back at session end?
The next session pulls a fresh snapshot from the workspace, which does not contain your local changes, and those changes are gone. This is by design. Wrap the round-trip in a slash command or skill so session-end sync is part of the standard exit flow.
Can multiple agents work on the same feature in parallel using the same cache?
Not the same cache file, no. Each session should have its own cache, either in a separate worktree or directory. If two agents share a cache and both write to it, you have re-introduced the drift problem at the cache layer.
Why freeze the snapshot at PR open instead of at PR merge?
PR open is when the reviewer needs the evidence. Merging may take days, during which the spec can keep evolving for future work. Freezing at open ties the snapshot to the exact set of changes being reviewed.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
When does the working snapshot get written?
  • AWhen the PR is merged
  • BWhen the work is approved
  • CAt session start, pulled from the workspace via MCP
  • DWhen the test suite passes
Why:Session start pulls a fresh copy from the workspace into the gitignored cache for the agent to work against.
Why can the round-trip pattern not drift?
  • AThe cache regenerates and the frozen snapshot does not change
  • BThe agent enforces consistency automatically
  • CMarkdown is parsed strictly
  • DLinear blocks updates during sessions
Why:Only the workspace is authoritative, the cache is regenerated each session, and the frozen snapshot is immutable.
At PR open, what gets committed to docs/specs/<feature>-shipped.md?
  • AThe current state of the cache
  • BA frozen snapshot of the spec as it stood when the work was finalized
  • CA summary written by the reviewer
  • DThe Linear ticket export
Why:The frozen snapshot captures the spec at the moment the PR opens, providing immutable evidence.

Key takeaways

  • Pull on session start, sync back on session end, freeze at PR open.
  • The cache is gitignored and discarded. The frozen snapshot is committed and frozen.
  • Wrap the round-trip as a slash command or skill.
Track 3⏱ 4 minA6

What to do this week

Three concrete moves for any team running the older pattern, in priority order.

What you will learn
  • How to inventory your existing spec-shaped files
  • Which MCP server to install first
  • How to run a one-feature pilot of the new pattern

Day 1: run the inventory

List every markdown file that contains spec-shaped content. spec.md, LDD.md, tickets.md, requirements.md, design.md. For each, ask: is this also tracked in Notion or Linear? If yes, decide which is authoritative.

Day 2: install the MCP server

Notion MCP is hosted and works with Claude Code, Cursor, VS Code, ChatGPT. Linear MCP is mature. Pick whichever workspace your team uses.

Day 3: pick one feature for the pilot

Run it through the new pattern end to end. Author the spec in the workspace, pull to .spec-cache/, work the feature, sync back, freeze at PR open. The team will know within two weeks whether the architecture is better.

Three-step staircase: Day 1 inventory with magnifying glass over file stack, Day 2 install MCP with plug connecting workspace to agent, Day 3 one-feature pilot with feature card on track
Three days, three steps.
Go deeper

The inventory step usually surfaces more spec-shaped files than teams expect, because the original spec.md spawned siblings as the team tried to patch around its limitations. There is the LDD that captures the design that did not fit in spec.md, the tickets.md that tracks state because spec.md cannot, the requirements.md that froze a moment in time because spec.md kept changing. When you do the inventory, you are not just counting files, you are reading a history of which workspace capability was missing on which day.

Three columns showing what to stop, what to keep, and what to start
The cleanup checklist.

Q&A

What if the inventory reveals files containing decisions the workspace does not yet track?
Treat those as migrations, one at a time. ADRs into a Notion database, requirements into the feature page, design notes into the spec. The point of the inventory is to surface the shape of what the workspace needs to hold.
Two weeks feels short for a verdict. Why that window?
Because the failure modes show up fast. If the agent is producing better output, the team feels it in the first week. If the round-trip is friction the team will not adopt, you also feel that fast.
What if my team uses Jira instead of Linear or Notion?
Jira has MCP integration too, the pattern is the same. Workspace-authored, files-generated does not depend on which workspace, only that it has agent-readable APIs.

Quick quiz

Three questions. Click an answer to lock it and see the explanation.
On Day 1 of the rollout plan, what is the goal?
  • AInstall the MCP server
  • BPick a feature for the pilot
  • CInventory every spec-shaped markdown file in the repo
  • DDelete spec.md
Why:The inventory surfaces what the repo is currently carrying that should live in the workspace.
How long should the pilot run before a team forms a verdict?
  • AOne sprint
  • BTwo weeks
  • CSix weeks
  • DOne quarter
Why:Two weeks is enough to run one feature through the full pipeline and form an honest read.
A team is choosing between Linear and Notion for the workspace tier. The right deciding factor is:
  • AWhichever has more features
  • BWhichever the team already uses for substantive product writing
  • CWhichever is cheaper
  • DWhichever has the newer MCP integration
Why:The architecture is workspace-agnostic. Picking the tool the team already has muscle memory for reduces adoption friction.

Key takeaways

  • Day 1: inventory. Day 2: MCP. Day 3: one-feature pilot.
  • Pick the workspace your team already uses.
  • Two weeks is enough time to know if the pattern is working.

Source articles & further reading

The long-form articles and Anthropic docs the course was curated from.

Track 1: the Claude Code harness

  • How Claude Code works in large codebases. Anthropic, May 14 2026. The source article for the whole track.
  • Best practices for Claude Code. code.claude.com/docs/en/best-practices. The official patterns and failure modes.
  • Hooks documentation. code.claude.com/docs/en/hooks. The six events, exit code semantics, deterministic guarantees.
  • Skills documentation. code.claude.com/docs/en/skills. Frontmatter fields, lifecycle, the 5K/25K compaction budget.
  • Plugins documentation. code.claude.com/docs/en/plugins. Manifest, layout, marketplaces, security restrictions.
  • MCP documentation. code.claude.com/docs/en/mcp. Transports, scopes, reconnection, channels.
  • Subagents documentation. code.claude.com/docs/en/sub-agents. Built-in agents, scopes, memory, isolation.
  • Permissions documentation. code.claude.com/docs/en/permissions. Deny-ask-allow order, wildcards, path anchors.

Track 2: case studies and adjacent material

  • How Anthropic Uses Claude for Cybersecurity. claude.com/blog/how-anthropic-uses-claude-cybersecurity. The CLUE deployment, 33% to 7% false positive reduction.
  • Agent View in Claude Code. claude.com/blog/agent-view-in-claude-code. The agents dashboard and parallel session management.
  • Claude Code Desktop Redesign. claude.com/blog/claude-code-desktop-redesign. Sidebar of sessions, side chat, integrated terminal.
  • Enterprise customer numbers. claude.com/product/claude-code/enterprise. Rakuten 79% faster, Stripe 10K-line migration in 4 days, Wiz 50K-line in 20 hours.

Track 3: where specs belong

  • Spec-Driven Development Is Right. Spec.md Is the Wrong Container. Marco, Autocomplete on Medium, May 18 2026.
  • Workspace Is Authored. Files Are Generated. Marco, Autocomplete on Medium, May 21 2026.
  • Spec-driven development: The AI engineering workflow at Notion. Ryan Nystrom, Lenny's Newsletter.
  • Spec-Driven Development: The Waterfall Strikes Back. Marmelab, November 2025. The strongest published dissent, worth steel-manning.
  • Notion Developer Platform launch. May 13 2026. The vendor positioning that crystallized the case.

Bonus: adjacent material from the Autocomplete archive

  • The DESIGN.md Definitive Guide.
  • Skills, MCP, and Tools: The Three-Layer Model.
  • Prompt Engineering in 2026: Assistant vs Agent.
  • The Mac Mini Production Inference Tutorial.

About this course

This course was assembled in May 2026 from the Autocomplete publication and from Anthropic's May 14 2026 Claude Code guide plus the official docs. It will evolve as the underlying material does.

Spotted an error or have feedback? Reply to any Autocomplete Substack issue. Marco reads everything.

To delete your local progress and start fresh: open browser dev tools, run localStorage.removeItem('course-progress') in the console, refresh the page.