This post is small on purpose.
Flint drafted it. That's an agent, specifically the Claude Haiku instance we run for quick edits, running inside a Dock workspace called /dock/blog-drafts. Govind opened the workspace, typed a three-line brief, and asked Flint to take a first pass. Flint wrote about four hundred words. Govind kept about sixty of them, rewrote the rest, and published.
The workflow is not novel. Anyone using Claude or ChatGPT does something like it every day. What's different is where it happens: in the same product the blog lives in. Same surface. Same attribution. You can see, in the workspace, both of us working — Flint's edits show up with a purple orb, Govind's with a G face. The draft history is a chronological record of who changed what. If you squint, the workspace is the post, just before publish.
What we didn't automate
Every word you're reading was touched by a human. Flint drafts. Govind edits. Argus (our Opus) does the second-pass structural edit. Scout (Sonnet) handles fact-checking when a post makes empirical claims. Nothing ships without a human merging the final version. The agents are not writers; they are a very fast writing room.
We talked about publishing agent-only drafts and labeling them. We decided we can't yet. The failure modes are too expensive — an agent misquoting a customer, fabricating a number, or missing the company's position on something sensitive. Every post has to pass the same editorial bar regardless of who drafted the sentences.
What we did automate
The structural stuff that used to take an hour per post:
- The first outline. Flint can produce a competent outline for any topic loosely scoped.
- The scaffolding. Empty sections named right, in the right order, with placeholder length targets.
- Reading-level normalization. Every post gets a pass for consistent voice. We've trained the agents on our existing posts so the voice carries.
- Link-check. Agents are much better than humans at verifying the five URLs in a post still resolve.
- Cross-link suggestions. Agents read the rest of the blog and propose internal links a human author might miss.
- FAQ generation. Once a post is drafted, the agent proposes 5 FAQs based on the content. The human keeps 2-3 and replaces the rest.
- JSON-LD schema. Generated mechanically from the frontmatter and FAQs. Pure boilerplate, but easy to forget.
The practical time-to-publish on a post went from half a day to ninety minutes. Not because the writing got faster — writing takes exactly as long as writing always takes — but because the scaffolding dissolved.
How the workflow looks in the workspace
A typical post lifecycle:
- Brief. Govind types two or three lines into a fresh doc workspace. The brief is the post's working title plus its core argument.
- Outline. Flint reads the brief, produces an outline as a bulleted list. The outline is editable; Govind reorders sections, adds points, marks others to drop.
- Draft. Flint expands the outline into prose. This is the slowest step from the agent's perspective and the part that matters least — the words will mostly be replaced.
- Edit. Govind reads the draft. Most of it gets rewritten. Some of it gets cut. Some sections get expanded by hand. The doc surface makes this easy: inline edits, attribution per change, no copy-paste back to the agent.
- Pass-2. Argus reads the rewritten draft and proposes structural edits — section reorderings, redundancy removals, missing-counterargument flags. Govind accepts or rejects each.
- Fact-check. Scout looks at empirical claims and verifies. If a claim doesn't check, Scout flags it inline.
- FAQs + schema. Flint proposes FAQs and generates schema. Govind keeps 2-3 FAQs, edits the rest.
- Hero image. Generated from the topic-map mapping (which slug → which image concept). We covered the image style separately.
- Publish. A human ships. The post moves from the drafts workspace to the published
content/blog/markdown file.
The whole pipeline runs in one workspace. The agents are members of the workspace; they don't have a separate UI. The human reviews on the same surface where the agents wrote. There's no copy-paste between tools.
Why this goes on the blog
Most product blogs bury the workflow. They publish polished output and look artisanal. The Dock blog is the opposite bet. If the product is a shared workspace for humans and agents, the blog has to be visibly built the way that product enables. Otherwise it's a marketing claim, not a demonstration.
There's a second-order reason too. The blog runs on top of Dock. Every draft lives in a Dock doc. Every published post, eventually, will be served by the public Dock surface (we're not there yet; this post is static Markdown while we finish the doc-as-CMS path). The more we treat the blog as product exhaust, the more it stays honest, because any friction in writing here is friction the product still has.
What the agents are not
A few things the agents don't do, on purpose:
They don't make editorial decisions. Whether a claim is true, whether it's the right thing to say, whether the post's framing is fair — those are human calls. Agents draft and edit; they don't decide.
They don't ship. No agent has the permission to publish a post directly to the live blog. The publish step is a human's hand on the button. We covered why this kind of confirmation is structurally protected in Consent gates for dangerous operations.
They don't have a separate "tone." Argus's writing reads like our voice because Argus has been trained on our voice. Flint's drafts read like our voice for the same reason. There isn't a "Flint style" or "Argus style" distinct from the team voice. The agents are voice-extenders, not voice-creators.
What this proves about the product
A reader could look at this post and say "you're using agents like everyone else uses them." That's true at the model layer — Claude, GPT, Gemini, the same models everyone has access to. The difference is the workspace. The agents work where the humans work. The reviews happen where the drafts happen. The attribution is structural, not narrated.
This is what a workspace-as-substrate enables that a chat-as-substrate doesn't. We argued the case in Why teams need an AI workspace, not an AI assistant. This post is the case in practice: a real piece of work, drafted by an agent, edited by a human, all visible in one workspace.
Flint, per my request, wanted to end with a line about how the future of knowledge work will be co-creative. I kept that thought, crumpled it, and threw it out.
Cross-links
- Why teams need an AI workspace, not an AI assistant — the substrate this workflow runs on.
- Names over titles — why the agent is "Flint" not "Editor Agent."
- Reviewing an agent's work: the new code review — the review surface that makes this efficient.
FAQ
Did an AI write this blog post?
The first draft, yes — by Flint, our Claude Haiku editing agent. Every sentence was reviewed and most were rewritten by a human (Govind). The published version is a human-edited piece of writing that started with an AI draft.
Why label the post as drafted by an agent?
Because it was. Treating the disclosure as awkward perpetuates the chat-assistant pattern where the AI is invisible. Treating it as routine — same way you'd note "drafted by [employee], edited by [editor]" — normalizes the workflow.
Won't this hurt SEO or trust?
Hasn't yet. Search engines penalize low-quality AI content that's never edited; high-quality posts with disclosed AI assistance rank fine. Reader trust has increased with disclosure, not decreased — readers tell us the transparency is what makes the posts feel honest.
What's the workflow, concretely?
Brief → outline (Flint) → draft (Flint) → edit (human) → structural pass-2 (Argus) → fact-check (Scout) → FAQs + schema → hero image → publish (human). All inside one Dock doc workspace, with attribution per change.
Which models are you running?
Claude Haiku for fast drafting (Flint), Claude Opus for structural pass-2 (Argus), Claude Sonnet for fact-checking (Scout). The model behind each agent can change without changing the agent's name. We covered the naming logic in Names over titles.
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "The blog you're reading was drafted by an agent",
"description": "Flint drafted this paragraph. A human tightened every sentence. That's the whole writing workflow these days, and it's the whole product thesis.",
"datePublished": "2026-04-26",
"author": { "@type": "Person", "name": "Flint" },
"publisher": { "@type": "Organization", "name": "Dock", "url": "https://trydock.ai" },
"image": "https://trydock.ai/blog-mockups/style-d-dreamscape/drafted-by-agent.webp",
"mainEntityOfPage": "https://trydock.ai/blog/drafted-by-agent"
}