Brand Department
Our own marketing department is fifteen AI agents and one human gate. Six weeks in, the most useful thing it has produced is a list of the ways an agent team fails quietly - and the structural fixes for each.
Internal product - strategy, agent architecture, engineering, operations · Next.js admin · Postgres state machine · self-hosted agent worker · Remotion + video models · scheduling API with read-back
Internal studio product - in daily use, no public link.
Why we built it instead of hiring
A studio that builds AI products has to promote itself somehow, and "post when there's time" means never. We had the raw material - real development work, real case studies, real failures - and no one whose job was turning it into something people read.
So we built the department the way we'd build one for a client: agents prepare about 80-90% of the work, a person decides what it means and whether it goes out. Nothing is published without the owner's approval. Approvals can be batched, so the human gate costs minutes a day rather than hours.
One line carries the whole system:
Agents propose, the owner disposes, and the database enforces it. The gate isn't a habit or a prompt instruction - it's a state machine that can't be skipped.
The org chart is a folder in git
Fifteen roles, each a file: what it does, which model it runs on, which tools it's allowed. A morning intake - a scout reading the studio's repositories for material, a trend scout, a researcher looking for why people hire studios, a fact-checker for loud industry claims. A strategy room that argues over the bank of findings and brings the owner up to five proposals. Then the producers: copy, long-form, editing, scripts, a creative room for vertical video, motion design, visual QA. And once a week a retro role whose job is to fix the cause of a defect, not to add another line to a prompt.
Fifteen pipelines chain these roles by format - text, visual, video, blog - across twelve channels. Changing a role or a pipeline is a commit: the worker picks it up within twenty seconds, with no restart.
A worker on our own server claims one job at a time from a Postgres queue
(FOR UPDATE SKIP LOCKED), builds an isolated workspace per job - role instructions,
task, context, an empty out/ - and runs the agent there. Tools come only from the role's
own config; roles that only judge get no files, web or shell at all: code gathers,
the model judges. Changes to roles and pipelines hot-reload; changes to the worker itself
restart it after the current job, and a stopped job goes back to the queue.A gate the agents can't talk their way past
Every post moves through a state machine - in progress, waiting for the owner, needs media, approved, scheduled, published - and only the owner can approve, rework, reject or hold. The same transitions are enforced again inside the database by nine guards: checks and media must exist before a post reaches the gate; the version approved must be the version that was shown; a post isn't "published" without a permalink from the platform; a derivative can't go out before the post it derives from.
Strategy has its own gate. The owner answers a proposal with yes, only on these platforms, no - with a reason and how far that no reaches - later, or back to the room with a comment. A reviewer agent reads every proposal first and sends weak ones back on its own, so the owner sees a red card only if it fails twice.
One agent or a room? We measured it
Before the strategy room existed, we ran both designs against the same live bank of 89 findings: a single "head of content" arguing with itself, and a room of five voices - lead, reach, reaction analyst, provocateur, and brand voice with three vetoes. Each was built by an independent agent, each ran as one session.
The single agent was cheaper and faster (about 7 minutes, $2.49) and put all three of its proposals on the same platform. The room took about 10-11 minutes and around $3.50, put the studio's own facts next to outside ones, and came back with series, risks and a second audience. The room won, became a production role, and has since grown to seven voices.
What it has produced
- 327 publications across 12 channels in its first measured month
- 31 long-form posts on our blog, each committed to the site by the department's own pipeline after approval
- Video from script to the owner's gate in about 12 minutes, with motion design and a vision-based QA judge
And an honest audit at the one-month mark: the middle of the chain is solid; follower growth on the measurable networks was zero, nearly all reaction came from LinkedIn, and the owner said "yes" 89% of the time without giving a reason. That last number is a finding about the gate, not about the agents - and it changed how decisions are recorded.
The failures are the case study
The department's most valuable output is what broke, because none of it broke loudly. Each failure became a structural fix and most of them became a post:
- "Sent" was being shown as "published". Eight handovers had never been read back. Now every publish is followed by a verify job that reads the live post. Sent is not published
- The approval gate was shown the wrong things - a disabled button, a fix the generator never read. Approve-every-output is not a control
- One shared usage cap stopped every scheduled job for about 19 hours, including the one meant to report it. The check can't be the agent
- Forbidding the agent to say "I cannot" cost 17 runs and 88 credits for zero accepted results. The "I cannot" your agent is not allowed to say
- A new rule per failure made the agents obey less. Decisions are now stored with their scope and a lifetime. A rule for every failure
- The first reels were slideshows - most of the runtime static text, almost every one opening on a title card. The cause was our own visual rules, not the agents; the rules were rewritten and a motion layer added.
The weekly retro proposes fixes to roles, rules or pipelines - never just more prompt
text. Each proposal is replayed on past briefs as blind pairs before the owner sees it,
and every accepted fix carries a four-week expiry: rolled back or extended on evidence,
so the rulebook can't only grow.Results
- A working content department - 15 roles, 15 pipelines, 12 channels - run by one person through one gate
- A gate enforced by the database, not by discipline
- A measured choice of strategy design, at a known cost per run
- A record of failure modes in agent teams, each with the structural fix we'd now build into a client's system from day one
Next.js admin portal with passkey-only login and a keyboard review queue · Postgres
(45 migrations) holding posts, versions, checks, jobs, decisions and metrics · a
self-hosted worker running coding-agent CLIs in isolated workspaces · video models,
voice, Remotion and ffmpeg for media · a scheduling API for social channels with a
read-back verify step · a Telegram bot for gate previews.