Skip to main content
Test Double company logo
Services
Pragmatic Services Overview
Holistic software investment consulting
Acccelerate Software Delivery
Balance efficiency and quality
Improve Product Impact
Drive results that matter
Upgrade Rails Seamlessly
Update Ruby and Rails versions
Scale DevOps
Dev experience and infrastructure
Technical Recruitment
Build tech & product teams
Case Studies
Solutions
Legacy Modernization
Renovate legacy software systems
Pragmatic AI
Solve business problems without hype
Technical & Product Assessments
Uncover root causes & improvements
About
About
What's a test double?
Approach
Meeting you where you are
Founder's Story
The origin of our mission
Culture
Culture & Careers
Double Agents decoded
Great Causes
Great code for great causes
EDI
Equity, diversity & inclusion
Insights
All Insights
Hot takes and tips for all things software
Leadership
Bold opinions and insights for tech leaders
Developer
Essential coding tutorials and tools
Product Manager
Practical advice for real-world challenges
Say Hello
Test Double logo
Menu
Services
BackGrid of dots icon
Services Overview
Holistic software investment consulting
Software Delivery
Accelerate quality software development
Product Impact
Drive results that matter
Cycle icon
DevOps
Scale infrastructure smoothly
Upgrade Rails
Update Rails versions seamlessly
Technical Recruitment
Build tech & product teams
Case Studies
Solutions
Solutions
Legacy Modernization
Renovate legacy software systems
Pragmatic AI
Solve business problems without hype
Technical & Product Assessments
Uncover root causes & improvements
About
About
About
What's a test double?
Approach
Meeting you where you are
Founder's Story
The origin of our mission
Culture
Culture
Culture & Careers
Double Agents decoded
Great Causes
Great code for great causes
EDI
Equity, diversity & inclusion
Insights
Insights
All Insights
Hot takes and tips for all things software
Leadership
Bold opinions and insights for tech leaders
Developer
Essential coding tutorials and tools
Product Manager
Practical advice for real-world challenges
Say hello
Developers
Developers
Developers
AI

How did I write this blog post?

4 days, 210 commits, and 17 pull requests - the story of how I wrote this post, and prototyped a new Claude Code skill, lives in these details.
River Lynn Bailey
|
October 21, 2026
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

On September 24, 2026, I showed a small group of coworkers how I use Claude to assist in my blog post writing. On September 25, I decided to formalize what I had been doing ad hoc. And on September 30, I wrote this blog post. What's interesting to me is not that I wrote this post, or that I formalized how I work with Claude to do the writing. What I find most interesting is how this blog post was written. Read on to find out how.

Building 3pitor to formalize my writing process

3pitor (pronounced “three-pitor”) is, at its core, a markdown editor with AI integration. This isn’t very interesting, in my mind. There’s plenty of AI-enabled editors, like Plannotator, AFFiNE, and Yank Note, among many others. But I wanted to build this app for a few reasons, not the least of which was to hone some of my AI integration skills via an SDK that supports more than just one LLM.

What came out of this effort is an open source project I built in four working days — starting on September 25, then the 28th through the 30th, 2026 — almost entirely by typing short prompts into Claude Code.

The numbers still surprise me a little. 210 commits. 17 pull requests. Something like 134 prompts across 39 sessions. That's not a lot of typing for four days of work, and that's the real story, here: the method that got this built didn't live in clever prompts, a lot of hand-written code, or carefully following every line that Claude wrote for me. It lived in a small set of reusable skills, and in one job — reorganizing the codebase — that I ended up doing three times before I noticed I should turn it into a skill of its own.

The skills I used are from Han, a Claude Code plugin I built, here at Test Double. I didn't build these skills for this blog post, though. I use them for my day to day work both within Test Double and at clients. I also used them here, because Han’s entire existence is centered around building apps.

The loop, in short

Most features in 3pitor went through the same six steps, while building it out:

  1. Describe the feature to the planning skill, in plain language.
  2. Answer its numbered questions — usually just "recommended."
  3. Get back a written plan and a decision log.
  4. Run the test-first skill against that plan, on a new branch.
  5. Look at the result in the browser, ask for visual fixes.
  6. Say "commit and push."

‍

Along the way, the skills sent out 131 specialist reviewer agents: architects, readability editors, a "junior developer" whose whole job is to poke holes in plans, a test engineer, a UX designer for UI work. I never talked to most of them directly. They report to the skill, the skill reports to me.

An important note about the work done here: Claude, not me, ran the overwhelming majority of the commits - something like 176 of them, roughly 90% of the non-merge commits in the repo - almost always triggered by that one phrase, "commit and push." Only 55 commits carry a "Co-Authored-By: Claude" trailer, so if you read the git log on its own, you'd think I wrote most of this by hand. I didn't.

Day one: picking a stack, and catching a mistake

The very first prompt of the project wasn't a feature request. It was a research question: how do you build an AI-backed markdown editor, and what library should handle the AI side? From there the early decisions came fast and one-line at a time: "ok, let's go with Hono" picked the web framework, and "i also want to use Vercel's ai-sdk rather than claude's sdk directly" to pick the AI library.

Later that same day I ran the architecture-analysis skill twice, once on the server and once on the UI, splitting both into per-feature files. That's the first time this particular job — reorganize the code — shows up. It won't be the last.

A few hours in, I noticed something off: make build was copying an entire claude binary into the build output. I asked why, and that question turned into a plan to call the Anthropic API directly instead of shelling out to the CLI. The claude dependency came out of the build.

There was a smaller catch too — a missing API key was producing a wall of stack trace instead of a clear message, so I asked for a plain explanation in its place.

And somewhere in there, the project got its name. A brainstorm for "a list of random star wars characters" turned into "riff on c3po, blog, editor," and "aiditor" became 3pitor before the day was out.

Days two and three: the loop, running

This is where the six-step loop above stopped being an abstraction and became the actual rhythm of the work. A feature started as a paragraph of plain intent — one began, "when i have a file open, and i send a request to the AI, the AI should automatically be told which file i'm currently working in" — and the planning skill came back with a few numbered questions. My answers were usually short: "recommended," "go with recommendation," "looks good." Sometimes the answer carried the real decision, like when I told it to keep a change's scope as small and tight as possible and specified exactly what should and shouldn't move.

Not every answer was "go ahead," though. Scope got cut, too: "drop commands. the entire point of this project is to be a blog post editor. we're not writing code with it."

The second time I reorganized the code, I didn't use a skill at all. I wrote one long instruction — what Claude Code calls a /goal, an instruction it keeps working against until the goal is met  — telling it to reorganize the code by package, feature, and component. I ended the instruction with "i'll be stepping away from my computer, so i need you to make the decisions around this and justify every decision you made. keep a running log of all changes," and then I stepped away. That run became pull request 5. Same job as day one's two skill runs, done a completely different way: not a tool I invoked, but an instruction I trusted to run unattended.

September 29 had its own rhythm, mostly visual. I'd look at the running app and send feedback like "works great, looks terrible," with screenshots attached, and ask for it to look like the other buttons and menus. Icons, colors, alignment — that kind of feedback, over and over, as I used the thing I was building.

Things went wrong that day too. A copied-in research skill didn't work well on open-ended topics, and rather than fix it properly I told Claude, "if the current working solution is 'good enough' to generally limit things, let's just roll with that" — a real trade-off, not a triumph. Two smaller bugs came with it: highlights in the editor vanished entirely while Claude was mid-reply to an open question, and later I asked it to "fix the typescript errors" after a change broke the build.

Day four: the third time, and the pattern finally clicks

On the last day, I took the exact same long /goal instruction from day two and handed it to a different skill — the one that writes skills — and asked for "a skill called 'update-code-structure' within this repository." That's the third time I'd done this job: once by hand with a skill, once with a one-off instruction, and now as something permanent.

The skill that came out isn't a copy of the instruction. It runs the same four skills in sequence: analysis, planning, refactor, test-first — and commits as it goes, logging every decision without asking me anything. But it dropped something the original instruction had: branching, pushing, and opening a pull request. That came out of a short exchange about git safety, where I said, "good point about git commits and rollbacks. have the skill run git commits as it goes, directly on the current branch." The skill-writing skill made that call, and it stuck.

Then I ran it the same way I'd run the /goal instruction two days earlier — "on a new branch, and open a draft PR when you're done" — which meant giving my own instruction back to a skill that, by default, no longer did that. The run's own decision log records it: taking my instruction over the skill's own rule. That run became pull request 16.

The same day had another example of steering the process after it was built, smaller but real. I partly reversed the day-one decision to drop the claude CLI, building an adapter that can talk to Claude through either the API or the installed CLI on a subscription. Partway through planning it, I added two requirements myself: a shared interface over both modes, and a type-check step in make test. And, with the same skills I had been using, Claude implemented the changes and I had a working blog post writing app.

The takeaway

The short prompts worked because the skills were carrying the method: the numbered planning questions, the reviewer agents, the test-first discipline, the habit of committing as you go. That's not an argument for terse prompting on its own. Without the skills behind them, "go with recommended" doesn't mean anything.

Some of this process was more than a small change needed — not every feature justified a full plan, a decision log, and a squad of reviewer agents. I don't have a record of how closely I read the actual diffs versus judging the app by using it in the browser, and I'd rather say that plainly than imply I reviewed every line.

None of that changes what the loop was for, though: not speed, and not a clever prompt. It was a skill — and I only noticed that because I did the same job three times before I made it explicit. The next time you catch yourself retyping the same long instruction to an agent, that's the tell. Turn it into a skill, run it, and then — like I did with that one line about commits and rollbacks — keep improving it once it exists.

One last loop worth closing

“That’s my secret, Cap. I’m writing in 3pitor itself.” — the Credible Hulk (or something like that)

‍

Everything about this post, from the analysis of my Claude sessions, to the outline to make sure this post is what I want, the first draft, and almost all of the editing after that, was done in 3pitor directly.

The research it's built on came from 3pitor's own research skill, reading the very session history it describes. I had Claude write the outline in 3pitor, using a simple “write an outline that …” prompt. I had Claude draft the post in 3pitor, with another prompt. And I ran this post through 3pitor's proofread and collaborative-editing skills, answering the same numbered questions and reviewing the same highlighted passages the app hands any writer.

Said another way: the app I just built wrote the report about how it was built, then helped me write the post about that report.

‍

River Lynn Bailey is a Senior Software Consultant at Test Double, and has experience in AI coding tools and delivery.

AI Insights and More

Sign up for the Test Double newsletter to receive more tips for pragmatic AI approaches.

Subscribe

Related Insights

No items found.

Explore our insights

See all insights
Leadership
Leadership
Leadership
Should you replace Salesforce, or keep paying for it?

I suspect more executives are running the build versus buy math on Salesforce than are willing to say so out loud. Here's what actually changes that calculation, and what doesn't.

by
Todd Kaufman
Developers
Developers
Developers
Horizontal Progression for Software

More capable AI doesn't automatically make better software. A longtime WoW player explores what horizontal progression could teach us about building products people love.

by
Dave Mosher
Developers
Developers
Developers
AI tooling may have solved coding, but not solutions delivery

AI made writing code faster, and software delivery didn't speed up to match. The Theory of Constraints predicted exactly this outcome forty years ago, and it also tells you what to do about it: measure your own end-to-end flow before you name the constraint or buy the tooling.

by
River Lynn Bailey
Letter art spelling out NEAT

Join the conversation

Technology is a means to an end: answers to very human questions. That’s why we created a community for developers and product managers.

Explore the community
Test Double Executive Leadership Team

Learn about our team

Like what we have to say about building great software and great teams?

Get to know us
Test Double company logo
Improving the way the world builds software.
What we do
Services OverviewSoftware DeliveryProduct StrategyLegacy ModernizationPragmatic AIDevOpsUpgrade RailsTechnical RecruitmentAssessments
Who WE ARE
About UsCulture & CareersGreat CausesEDIOur TeamContact UsNews & AwardsN.E.A.T.
Resources
Case StudiesAll InsightsLeadership InsightsDeveloper InsightsProduct InsightsPairing & Office Hours
NEWSLETTER
Sign up hear about our latest innovations.
Your email has been added!
Oops! Something went wrong while submitting the form.
Standard Ruby badge
614.349.4279hello@testdouble.com
Privacy PolicyTerms & Conditions
© 2020 Test Double. All Rights Reserved.

AI Insights and More

Sign up for the Test Double newsletter to receive more tips for pragmatic AI approaches.

Subscribe