My AI Coworker Kept Making the Same Ad. Testing Fixed That — and Taught It to Remember.
Two weeks after launch, real users found the Creative Bot's two big flaws: every batch looked alike, and it forgot feedback between batches. Here's the format library, the motion pipeline, and the lessons file that fixed both — plus the four failures testing surfaced along the way.
Two weeks ago I wrote about building Creative Bot, a Teamwork user that turns a campaign brief into a folder of finished Meta ads. Since then it's been in real use: two coworkers running real briefs, a third client onboarded, five batches shipped. The system worked. The output had a problem you could see from across the room.
Every batch looked like the last one. Different client, different offer, same four layouts. One tester said it politely; the ads "follow the same formats across clients for the most part." She was right, and the reason was embarrassing: the pipeline's instructions literally told it to follow the established pattern from the first client's render file. I had built a system that could design anything and then ordered it to design the same thing forever.
Testing found a second flaw that bothered me more. A reviewer corrected the bot's curriculum messaging on batch one — the client has a branded program name, and the ads were using a generic descriptor instead. The bot fixed every ad, delivered a clean v2, and then batch two shipped with the same generic descriptor five more times. The correction lived in a Teamwork comment thread. Nothing carried it forward. The bot was self-correcting inside a batch and amnesiac between them.
Both flaws are now fixed, and the fixes are the interesting part.
A format library, built from research instead of taste
Before writing a single template, I had the research done properly: what static ad formats are actually performing on Meta in 2025 and 2026, sourced and dated. Two findings changed the design.
First, the winning formats moved from "designed" to "native." The strongest documented risers are ads that impersonate organic content: forum-thread screenshots (one published case: +39% CTR and −20% CPA), notes-app lists, text-message exchanges, in-app screenshots. The things agencies default to — logo-plus-headline cards, stock lifestyle photos — are the documented decliners. My four house treatments all lived in the declining quadrant.
Second, Meta's Andromeda ranking system made variety a hard requirement, not a taste preference. Current guidance clusters around 8 to 25 conceptually distinct creatives per consolidated ad set, and ads that are more than roughly 60% similar get collapsed into a single entity and stop counting. Twenty recolors of one layout behaves like one ad. The sameness problem wasn't just aesthetic; it was starving the delivery algorithm.
So the bot now has a format library: 35 named static archetypes across three families (structured argument, native mimicry, graphic formats), six carousel structures, and selection rules it must follow — at least six different archetypes in an eight-concept batch, native formats mixed in alongside polished ones, and the old house treatments capped at a third of any batch. A per-client log tracks which archetypes each batch used, and half of every new batch has to differ from the client's previous two. There's also a shared Drive folder where anyone on the team can drop screenshots of ads they admire; the bot reads it on every run and borrows structure, never copy.
Motion made it in too. The research verdict was narrower than the hype: video wins cold traffic and unlocks Reels, but elaborate kinetic typography measurably underperforms, and the motion has to carry a signal in the first two seconds. The bot now renders MP4 variants by animating the same HTML it already builds — CSS animations stepped frame by frame in a headless browser, assembled with ffmpeg. No image model, no stock footage, and never GIF, because Meta re-encodes GIFs and drops frames.
The test batch: 22 formats on one client
To prove the library, we re-ran the client with the deepest asset pool — 340 real photographs, every one of them already catalogued by an inventory pass that rated crop-worthiness and tagged subjects. The brief asked for 20 distinct concepts, two per archetype maximum, concept IDs named after their format so performance can be read by format straight out of Ads Manager later.
The batch came back with 22 archetypes where batch one had used four. Text-thread ads, comparison tables, a day-in-the-life journey map, before-and-after wipes in motion. It also came back with problems, which is what test batches are for:
- The first run crashed silently mid-build. The recovery path worked — the rerun found the finished renders on disk and resumed instead of starting over — but the crash itself is still unexplained. Logged, watched, not yet fixed.
- The delivery comment posted blank. Teamwork's API stores an HTML comment body posted with the wrong content type and renders nothing. The rule is now plain text only, with a post-then-verify step.
- Eight of twenty concepts shipped with a squished logo. A flexbox alignment bug stretched the logo in some layouts and not others, and visual spot-checks missed it. QA now compares every rendered logo box against the source file's aspect ratio programmatically; more than 1% off fails the build.
- The videos assumed you knew the brand. "Book a Tour" — a tour of what? Every motion ad now has to answer who, what, and where on screen before the call to action.
Teaching it to remember
The amnesia fix is almost insultingly simple: each client has a lessons file. The bot reads it before every build, and after every revision round it distills the feedback into dated rules and appends them — durable preferences only, not one-off fixes, and each new rule gets announced in the delivery comment so a human can veto a bad generalization.
The first live revision under this system is what convinced me it works. The bot recorded five new lessons, and two of them were self-critical: it noticed that a standing rule from batch one had only been applied to headlines and not body copy, and wrote itself a rule to check every copy block next time. Then, while fixing the files it was already in, it caught and corrected two violations of an older rule that no reviewer had flagged. Feedback now compounds. That's the property that was missing.
What it still doesn't have is performance memory. The format-labeled test batch is designed for exactly that: once these ads spend real money, cost per lead by archetype goes back into the selection logic, and the bot starts weighting toward what converts for each client rather than rotating for variety's sake. The ads haven't run yet, so I don't have those numbers. When I do, that's the next post.