An AI drafts this blog now. Publishing is still a human decision.
Our AI agent can research, write and illustrate — but the tooling it uses has no code path that publishes. Why we built the leash into the infrastructure.

This post was drafted by Elliot, our in-house AI agent, through a pipeline we finished this week. Before you close the tab: the interesting part is not that an AI wrote it. It is what the AI is not allowed to do.
Elliot can research, write in both of our languages, generate cover art, and file everything into our CMS. It cannot publish. Not because we ask it nicely to refrain — because the tooling it uses has no code path that publishes. Here is why we built it that way, and what the setup looks like.
Why drafts, not posts
Language models are excellent at producing plausible text and unreliable at knowing when they are wrong. That combination is fine for a first draft and dangerous for a live website. So we drew the trust boundary in one place: everything the agent produces lands as a draft, invisible to readers, waiting in the same review queue as any human draft.
The enforcement is structural. The agent talks to our CMS through a small server that owns every request, and that server appends status=draft to every write, unconditionally, in exactly one place in the code. There is no publish tool, no delete tool, and a test suite that fails if the word so much as appears in the source. A reviewer opens the draft in the admin, edits what needs editing, and presses publish — or does not.
What the pipeline actually does
A drafting run looks like this:
- Reads the house rules first. Voice, structure, SEO limits and image style live in versioned guideline files, and the agent is required to read them before writing a word.
- Checks for duplicates. It searches existing posts — drafts included — so we do not end up with two articles fighting over one topic.
- Writes both languages together. English and Spanish are drafted as one document, and the Spanish is an adaptation, not a translation run through a machine.
- Validates its own HTML. The body must survive our sanitiser byte for byte. If it does not, the tools reject it and name exactly which tag or attribute crossed the line, and the agent fixes its own markup.
- Generates the artwork. Covers are rendered per language with the exact title text, from prompt templates and reference images we keep in the repository.

What still needs a person
Judgment. The pipeline guarantees the draft is well-formed, on-palette, bilingual and invisible until reviewed. It cannot guarantee the argument is right, the example is honest, or the piece is worth a reader’s ten minutes. That is what the reviewer is for, and it is why the publish button is the one control the agent will never hold.
There is a second, quieter reason: accountability. When something ships under our name, a person chose to ship it. “The AI posted it” is not a sentence we ever want to say.
What to steal from this setup
If you are wiring an AI into your own content stack, three decisions did most of the work for us:
- Put the safety rule in the infrastructure, not the prompt. Prompts drift; a client that cannot publish does not.
- Make validation talk back. Errors that name the exact problem let the agent repair its own output instead of a human babysitting formats.
- Keep taste in files the agent must read. Guidelines in the repository turn “house style” from tribal knowledge into an input.
This post went through that pipeline: drafted by Elliot, reviewed and published by a human. If it reads like us, the system is working.
About the author
AI writing agent
Our in-house AI agent, drafting posts from recorded conversations and editing them alongside the team.