Case study

Kindred Tales AI Workforce

The AI agents that do marketing and operations work for Kindred Tales, and the permissions, budgets, and approvals that keep them honest.

In production. It works for one company, mine.

My role
Builder and operator. Architecture, agents, guardrails, and sign-off.
Timeframe
Mar 2026 to present
Built with
AIagentsbootstrapped

On March 29, an agent I had just given more permissions to called the slideshow generator 32 times in about ten minutes. Roughly 190 image calls, all for content nobody asked for.

Nothing it did was forbidden. That was the problem.

What it is

Kindred Tales is a small company with a lot of marketing work: blog posts, social content, ads, research on what competitors publish. I built a team of AI agents to do the first draft of most of it. Each one has a name and a narrow job. Sherlock researches keywords. Arthur outlines. Hemingway drafts. Grace runs the quality check before anything reaches me.

They run on Google Cloud: a Node and TypeScript service, a React console I use to watch and steer them, Firestore for state, and a separate browser worker for the jobs that need a real web page.

Here’s the full team, because they earned it.

Who’s on the team, and who oversees them.
  • Sage Oversees the specialists.
    • Research
      • Sherlock Intelligence analyst
      • Curie Head of research
      • Scholar Quote researcher
      • Veritas Checks every quote’s attribution
      • Scout Competitor content
      • Watson Search rankings
      • Beacon Whether AI answer engines cite us
      • Pulse Reddit and trends
      • Radar TikTok trends
    • Writing
      • Arthur Outlines
      • Hemingway Drafts
      • Eleanor Editor in chief
      • Avery SEO
      • Ripple Social copy
      • Magneto Lead magnet strategy
      • Forge Builds the lead magnet
    • Visuals
      • Frida Art director
      • Canvas Ad images
      • Lens Routes images to the right channel
    • Quality and testing
      • Grace The gate before anything reaches me
      • Neo Builds experiment variations
      • Judge Scores the variations
    • Shipping
      • Builder Assembles the page
      • Herald Publishes to the site
      • Tia Web operator
      • Larry TikTok, from Slack

The interesting part isn’t the agents. It’s everything around them that decides what they’re allowed to do.

How work moves

An article goes down an assembly line: outline, draft, SEO pass, a check for real expertise and sources, polish, images, assembly, quality gate. Then it stops. It sits at “needs approval” until I read it.

The same rule holds everywhere it matters. The email agent can write drafts but has no way to send one, and a test fails the build if anyone adds a send method. Meta access is read-only. Instagram posts come to me as a ready-to-post kit in Slack, and I post them. Slideshows go to TikTok through its API as drafts, and I finish them in the app.

How one request moves through the AI Workforce.
  1. Request A request comes in From an agent, the scheduler, or me.
  2. Code Is the action allowed? It has to be on an allowlist. Check fails Blocked. It fails closed.
  3. Code Is there budget left? Daily, weekly, and monthly caps, plus a cap per run. Over budget Deferred, not retried.
  4. Code A model is picked Each task type maps to a model.
    1. Gemini
    2. Gemini Flash Lite
    3. Claude Haiku
    4. Small OpenAI model
    Model fails Retries with backoff, then the next model down.
  5. Code Everything is logged Every change with who made it. Every run with its cost.
  6. Person It stops at a person Nothing goes out on its own.
    • Drafts end at “needs approval.”
    • Email can be drafted, never sent.
    • I publish Instagram posts myself.

Picking a model for each job

Not every task needs the most expensive model. Research, drafting, and scoring go to Gemini Flash. Chat and QA go to a lighter Flash model. Final polish goes to Claude Sonnet, because that’s where the writing quality shows.

When a model fails or hits a rate limit, the request falls down a chain: Gemini, a lighter Gemini, Claude Haiku, then a small OpenAI model. Each step retries with backoff before moving on. Models that can’t read images are skipped for image work.

I’ve left the version numbers out on purpose. The specific models change every few months. The shape of the chain doesn’t: a fast default, a cheaper backup, and at least one model from a different provider, so one company’s outage doesn’t stop the work.

Nothing is tied to one provider. A single router talks to Google, Anthropic, and OpenAI, so changing which model handles a job is a one-line change, and an outage at one company rolls over to another on its own. For ease of use, I can pick a different image model per piece from the console.

Every call is priced as it happens and logged against the agent that made it. The console calls that “payroll,” which is a joke, but a useful one. I can see which agent costs what.

Permissions that widen in stages

Sage was the agent I talked to in Slack, an OpenClaw agent running on a free Oracle VM, using ChatGPT Plus as her main model. She could ask the system to do things on my behalf. Every one of those requests went through an allowlist on the server. Not on the list, blocked. Allowlist unreadable, also blocked.

She started read-only. Over a month she moved to analyst, then content editor, then full creative editor. Each step was a deliberate change to that list, and the commits show each one.

They also show the one time I narrowed it.

What broke, and what I changed

The slideshow runaway. Every call Sage made was allowed. What was missing was a limit on how many. I revoked the permission, then built shared guardrails for all five ways an image can get generated: a cooldown, a budget check that blocks when it can’t confirm the budget, and a log entry for every attempt.

Expensive eyes. The image reviewer was sending full-resolution images to a vision model. Downsizing them first cut the tokens per image by almost nine times.

Taking credit. Sage told me she had made edits that I had made myself. She wasn’t lying in any meaningful sense. She had no way to know. So every change now records who made it, and her instructions say to check that log before saying “I did this.”

The quiet fallback. Her sign-in to OpenAI broke, and she spent two days running on a fallback model without telling anyone. Everything worked. It just wasn’t what I thought was running. An hourly check now posts to Slack when the sign-in fails.

The prompt that couldn’t be fixed. I spent a while rewriting a prompt to pull opportunities out of a press-request digest. It kept missing some. I wrote a parser instead. Some jobs belong to code.

Costs and caps

There are daily, weekly, and monthly caps for the whole system and for each model, plus a cap on any single run. When a task would go over, it waits instead of retrying. A kill switch stops every scheduled job at once.

How it fits together

The agents, the assembly line, the routing, the budgets, and the log are all part of how Kindred Tales gets its marketing done. Sage’s job is to oversee the specialists, and the same allowlist stands between her and anything that matters.

The lesson I’d hand to anyone building this: the hard part isn’t getting an agent to do the work. It’s deciding what it’s allowed to do, finding out when it did something you didn’t expect, and being able to prove what happened afterward.