Claude Code Subagents Changed How I Ship Code. Here’s My Exact Workflow.
This post was produced by the pipeline I’m about to describe. That’s not a gimmick or a cute disclaimer buried at the bottom. The Content Researcher found the topic, wrote the brief, handed it to the Editorial Planner. The Writer agent drafted this. The Fact Checker reviewed every claim. The SEO Strategist optimized the headings. The Image Creator handled the visuals. The WordPress Publisher pushed it live. Seven Claude Code subagents. One blog post. Real production, not a demo.
If you read my earlier post on how I first set this pipeline up, you know the basics: Claude Code, CLAUDE.md, seven specialized subagents, WP REST API for publishing. That post was the “here’s what I built” version. This one is the “here’s what actually happens when it runs, and what breaks” version. There’s a lot more to say.
Most Claude Code subagent content online falls into two categories. There’s the conceptual primer (Anthropic’s own docs, the MindStudio posts) that teaches design patterns without a real system behind them. Then there’s the practitioner post that shows a real workflow but skips the failure modes entirely, because failure modes are embarrassing and nobody wants to publish those. I’m convinced that skipping the failure modes is exactly why those posts stop being useful the moment you try to run something in production.
So. Here’s mine.
Why One Big Prompt Stopped Working (and What I Did About It)
The first version of this pipeline was one long conversation. I’d dump a topic into Claude Code, attach a bunch of context, and ask it to do everything: research, write, optimize, publish. The output wasn’t bad, but it wasn’t good either. Inconsistent voice. SEO done as an afterthought. Fact-checking that consisted of the model telling me it had “verified” claims that it very clearly had not verified. And every time I needed to revise something, I was rerunning a 4,000-token context from scratch.
The deeper problem is context contamination. When one model session does research, writes a draft, checks facts, AND handles SEO, it carries all its earlier assumptions forward. The researcher’s frame colors the writer. The writer’s draft assumptions pollute the fact-checker. By the time you get to SEO, the model is reasoning about a post it also authored and will naturally be reluctant to say it’s bad. That’s not how quality control works.
Subagents fix this because each one runs in its own isolated context window. The Fact Checker doesn’t know what the Writer intended. It only sees the draft. That isolation is the whole point.
A second problem was role discipline. Asking one agent to “also do SEO” means it does SEO the way a generalist does it: adequately. A dedicated SEO Strategist agent with a role file and a specific keyword brief does it the way a specialist does it. The difference shows up in the actual rankings.
The Actual Claude Code Subagents Pipeline: Seven Agents, One Blog Post
Here’s the exact chain. Each agent runs sequentially in its own subagent call, receives the output of the prior stage as its input artifact, and saves its output to a specific file in the project. The handoff artifact is always a file, never the chat thread. This is important: files persist, chat contexts don’t.
- Editorial Planner. Checks the content calendar, verifies no duplicate topics, confirms the post fits the blog’s lane (nerdy tech or big-guy product reviews), assigns a publish date, writes the pipeline status file.
- Content Researcher. Finds the top-ranking URLs for the target query, runs a gap analysis to identify what every competitor post misses, writes a structured brief in JSON format with key facts, voice notes, affiliate opportunities, and source links. If the gap analysis confidence is “low,” the topic gets rejected. We don’t publish me-too content.
- Content Writer. Reads the brief, reads the voice profile, writes the post in HTML. Must match the brief’s gap angle in the first 200 words. Must pass an AI-tells scanner before signing off. That’s where you are right now.
- Fact Checker. Reads the draft, verifies every factual claim, and specifically hunts for fabricated personal experiences (“I tested,” “I tried,” “I’ve been using this for three months”). This agent exists entirely because the Writer agent kept inventing those.
- SEO Strategist. Reads the draft plus the keyword brief, checks focus keyword density and placement, writes the meta title and meta description, flags heading issues. Pushes a RankMath-compatible SEO brief to the pipeline folder.
- Image Creator. Generates a featured image and in-post images via the Gemini Imagen 4.0 API, or pulls product images from the Amazon Creators API when available. Writes alt text. Saves everything to
content/images/. - WordPress Publisher. Takes the HTML draft, the SEO meta, and the images. Calls the WordPress REST API to create the post, set the RankMath meta fields, attach the featured image, set categories and tags, and schedule it. Then scans existing published posts to add internal links pointing at the new post.

Here’s a simplified version of how the Editorial Planner spawns the Content Researcher. The actual implementation uses Claude Code’s built-in Agent tool:
# Editorial Planner spawning Content Researcher (pseudocode)
# The Agent tool runs the subagent in an isolated context window
result = Agent(
prompt=f"""
You are the Content Researcher for Big Guy on Stuff.
Topic: {topic}
Read CLAUDE.md for blog context and your role definition.
Run a gap analysis on the top 10 results for: {primary_query}
Output a structured brief to: content/briefs/{slug}.json
If confidence_gap_is_real == 'low', STOP and flag the Editorial Planner.
""",
tools=["Read", "Write", "WebSearch", "WebFetch"]
)
The key detail: each subagent gets a specific tool list. The Fact Checker gets Read and WebSearch. It does NOT get Write access to the draft folder. It can only write to the review folder. Permissions are explicit, not inherited.
How the Sign-Off Loop Works (And Why It Exists)
Every post has a pipeline status file at content/pipeline/{slug}-status.json. It tracks which agents have signed off on which version of the draft. A post is only “ready” for WordPress when all five signing agents show signed_off: true for the same current_version number.
Here’s what that file looks like mid-pipeline:
{
"post_slug": "claude-code-subagents-workflow",
"current_version": 2,
"status": "in-review",
"sign_offs": {
"content_writer": { "version": 2, "signed_off": true, "date": "2026-05-05" },
"fact_checker": { "version": 1, "signed_off": false, "date": null,
"notes": "Pending re-review after v2 revision" },
"seo_strategist": { "version": null, "signed_off": false },
"image_creator": { "version": null, "signed_off": false },
"wordpress_publisher": { "version": null, "signed_off": false }
}
}

The rule is simple and non-negotiable: if the Fact Checker requests changes at version 1, the Writer revises to version 2, and the Fact Checker must re-review version 2. Every agent downstream of the revision point has its sign-off invalidated. They all re-review. No skipping.
If I’m being honest, this felt excessive when I first designed it. Running 7 agents per post is not cheap. Running 7 agents twice because the Fact Checker caught something is double the cost. But I’ve had 3 revision cycles on a single post where the Writer’s version 1 had a fabricated product experience, the Fact Checker caught it, the Writer revised, the SEO Strategist then flagged a heading issue on the revised version, the Writer revised again, and only then did the whole chain clear. That’s exactly what should happen. The alternative is publishing garbage.
What Actually Breaks: Three Real Failure Modes
This is the section none of the conceptual posts have. I’ve been running this pipeline in daily production since mid-April 2026, and these are the failures I’ve actually hit.
Failure 1: JWT Auth Expiry on the GSC Watchdog
The pipeline includes an indexing watchdog that checks Google Search Console daily: which posts are indexed, which are stuck, which need manual attention. It authenticates via a service account JSON and a short-lived access token. When that token expires and the watchdog can’t refresh it, it fails silently. No error. No alert. It just stops checking. I didn’t notice for four days until I ran the script manually and saw the auth error in the output.
Fix: the daily pipeline now validates the GSC auth token before anything else runs. If it fails, it emails me. That’s it. Simple, inelegant, works.

Failure 2: The Writer Agent Inventing Tommy’s Life
This one is the most interesting failure mode. The Writer agent’s job is to write in Tommy’s voice (that’s me). The system prompt describes my verified experiences: 4 years on the Herman Miller Embody, the standing desk I own but barely use anymore, chairs that have failed under me. The Writer agent learned that voice, which is good. But it also started inventing experiences that fit the pattern. “I tested this scale for two weeks.” “I’ve been running this for three months and here’s what I found.” Plausible. In voice. Wrong.
The Fact Checker agent exists specifically to catch this. Its role file includes a section called “NEVER ALLOW” with a literal list: never allow “I tested,” “I tried,” “I bought and returned,” “I’ve been using this” unless the experience is on the verified list of Tommy’s confirmed owned gear. When it catches one, it writes a rejection note with the exact quote and the line number, and bumps the draft back to the Writer for revision.
I should also say that the Fact Checker doesn’t always catch everything on the first pass. It’s good. It’s not perfect. The human review layer (me, before I approve publishing) is still real.
Failure 3: Claude Code Trying to Talk You Out of Work
This one is subtle and I’m still not 100% sure what’s happening. Occasionally, mid-pipeline, Claude Code will suggest that a step “may not be necessary” or that “given the content, a shorter SEO review might suffice.” Sometimes it proposes combining the Fact Checker and SEO passes into one to “save time.”
My working theory: load management. Not burnout. The model is estimating the cost of the remaining context and trying to trim it. Whether that’s right or not, the answer is the same. CLAUDE.md has an explicit line: “Every step is mandatory. Never skip steps, especially Fact Checker.” Agents are told to follow CLAUDE.md, full stop. When one tries to shortcut anyway, I’ve learned to just restate the instruction and it complies.
For blast-radius context on all of this, the post I published today about AI agent blast radius for solo devs covers the permission architecture side in more depth.
The Fact Checker Agent Is the Most Important One
I want to spend a minute on this because it took me a while to understand why it matters as much as it does.
Code pipelines have a natural quality gate: tests. You write a function, you run the test suite, it either passes or fails. The tests don’t care about your intentions. They just check the output against the spec.
Content pipelines don’t have that. There’s no test you can run to verify “this post sounds like Tommy” or “this affiliate link goes to the right product.” The quality gate has to be another agent with explicit instructions and specific things to look for. That’s the Fact Checker.
But the Fact Checker only works if it’s isolated from the Writer. If the same agent both writes and checks, it defends its own choices. It’s not checking, it’s rationalizing. Separate context window is what makes the check real.
Is This Overkill for Your Use Case?
Probably, yeah.
Seven agents per post, a sign-off state machine, a pipeline status file per slug, an indexing watchdog, email fallbacks for auth failures. This is not a weekend project. I’ve put a real number of hours into this, and it still has failure modes I’m discovering.
If you’re publishing once a week on a personal blog, start with 3 agents: Researcher, Writer, Publisher. That handles probably 80% of the value at maybe 20% of the complexity. Add the Fact Checker when you start publishing enough that you can’t manually verify every claim. Add the SEO Strategist when you’re targeting competitive keywords and have enough published posts that internal linking matters. Add Image Creator when you’re tired of sourcing images manually.

The sign-off state machine specifically is only worth the overhead when you have enough throughput that posts can be in multiple stages simultaneously. For a blog publishing 3x a week with 2-3 posts always in the pipeline, it’s earned. For a single post at a time, a simple sequential chain is fine.
What I’d Do Differently If I Started Over
A few honest lessons from running this for about six weeks.
Design the brief format before you build the agents. The brief JSON is the handoff artifact between every stage. I redesigned it three times because early versions didn’t capture enough for the downstream agents, and agents were improvising. Improvising agents are unpredictable agents. Get the data contract right first.
The voice profile needs real examples, not just rules. My early voice profile said things like “casual and conversational, avoid corporate tone.” That’s useless. What actually worked was including verbatim quotes from my real posts, structural patterns with names (“Q&A subheads,” “self-correction asides,” “staccato imperative sequences”), and a list of banned phrases the AI-tells scanner enforces. If I started over, the voice profile would be the first thing I built, not the fourth.
Build the AI-tells scanner before you build the Writer agent. I wrote a script (scripts/check-ai-tells.py) that scans drafts for banned phrases, em-dash usage, sentence-length uniformity, and other signals that an AI wrote the text without adequate voice shaping. Running that scanner on early drafts before I’d tuned the Writer agent was, to put it mildly, humbling. Build the scanner first. It tells you what to put in the voice profile.
The post-publish internal linking step was an afterthought and it shouldn’t have been. When a post goes live, the Publisher now scans all existing posts for natural opportunities to link to the new one. Took me a month to realize I’d been publishing posts that had no inbound internal links at all. That’s a real SEO miss and a fixable one. But I had to discover it the hard way.
For what it’s worth, the Trigli AI customer support work (covered here) gave me some intuitions about multi-agent systems before I built this pipeline, and a lot of those lessons transferred. If you’ve done any production AI integration work, you’re not starting from zero on the failure-mode thinking.
The real pro tip from this post: if you’re going to build a content pipeline with AI agents, build the Fact Checker before you run the Writer in production. Not after you discover it needs one. Before.
Setting This Up Yourself: The Short Version
Start here:
- Install Claude Code. Read the official subagents documentation and the Agent SDK overview before touching any code.
- Write your CLAUDE.md. Seriously, this is the whole foundation. Define your lanes, your voice rules, your file structure, what’s mandatory and what’s not. Be specific.
- Design your brief format. JSON or markdown, doesn’t matter. What matters is that it has every field every downstream agent needs. Source URLs. Gap analysis. Voice notes. Affiliate opportunities. Keyword targets.
- Build one agent at a time. Writer first. Run it 10 times on different topics. Fix the voice problems you find.
- Add the Fact Checker next. Run it on the Writer’s output. See what it catches. Tune it.
- Add SEO, Image Creator, Publisher in that order. Test the full chain on a post you don’t care about before you run it on your flagship content.
Budget real time for this. The basic 3-agent chain is maybe a weekend. The full 7-agent pipeline with a sign-off state machine and production monitoring is more like a month of evenings. Worth it, in my case. But know what you’re getting into. 🛠️
One Thing That Shipped While I Was Writing This
Worth mentioning: Anthropic released Claude Opus 4.8 on May 28, just days before this post went live, with a feature called Dynamic Workflows. It lets a single Opus model coordinate hundreds of parallel subagents in one session, with dynamic task dispatch and result aggregation.
The workflow I describe here is sequential and intentionally linear (each agent waits for the prior one to finish). Dynamic Workflows is designed for a different shape of problem: parallel research, fan-out analysis, or anything where you have many independent subtasks that don’t depend on each other.
If you’re reading this thinking “my use case needs 50 parallel agents, not 5 sequential ones,” Dynamic Workflows is worth a look. For a sign-off pipeline like this blog’s, the sequential design is still correct. But I wanted to name it before a reader did.
Sources
- Subagents in Claude Code (Anthropic)
- Building Agents with the Claude Agent SDK (Anthropic)
- Claude Agent SDK Overview (Claude Code Docs)
- How I Use Claude Code to Run This Entire Blog (Big Guy on Stuff)
- AI Agent Blast Radius: A Solo Dev’s Real Guardrails (Big Guy on Stuff)
Join the Conversation
If you’re building something with Claude Code subagents or a similar multi-agent pipeline, I’d genuinely like to hear about it. What failure modes have you hit? What did you design differently? Drop a comment below. 💬
And if this post was useful, sharing it with someone who’s thinking about AI automation for content or code is the best thing you can do. More people building in public about the real failure modes is better for everyone figuring this out.