DEV Community

Cover image for When Agents Outnumber Editors
Tony Spiro
Tony Spiro

Posted on Originally published at cosmicjs.com

When Agents Outnumber Editors

There is a ratio inside every content team that nobody tracks: how many things get written by people versus how many get written by software. For most teams that number was zero for a long time. Then it was a rounding error. Now, on a lot of teams, it has quietly crossed one to one.

Once agents outnumber editors, the shape of the job changes. Drafts become cheap and abundant. The scarce resource is the judgment required to decide what deserves to ship. If your workflow was built around the old bottleneck, it will break in a specific and predictable way: a queue of plausible-looking drafts nobody has time to verify.

The mechanics of what an agent is allowed to touch are a separate subject, and we covered those in AI Agent Write Access: The 4 Real Controls You Get With Your CMS, including the two controls we do not ship yet. This post is about what happens upstream of any of those settings: how the daily work of a content team reorganizes itself once the ratio flips, and which four operating habits have to change with it.

The ratio flips faster than the process does

A two-person content team with four agents running scheduled jobs can produce more drafts in a week than the two humans can carefully read. Reading a 1,500-word post closely, checking its claims against primary sources, and verifying its links takes real time. Generating it takes minutes.

So the throughput ceiling moves from writing to reviewing, and every process decision should follow that move. The goal is to make review fast and to make bad output structurally hard to publish.

Shift 1: scope becomes a commissioning decision

The most common mistake is giving one agent broad access to everything and hoping the prompt holds. Prompts drift. Keys do not.

When you spin up a new agent, treat its scope the way you would treat a job description rather than a configuration screen you fill in afterward:

  • Write down the object types each agent is expected to touch, and put that list in its instructions. A social copy agent has no reason to touch your pricing page object, and it should be told so explicitly.
  • Default every agent to draft output. Publishing should be a separate, deliberate action taken by someone accountable for it.
  • Separate read keys from write keys in your environment. An agent that only summarizes traffic never needs a write key at all.
  • Keep destructive operations off the table unless a human explicitly asks for them in that session.

Be clear with yourself about which of these are enforced and which are conventions. In Cosmic today, the enforced boundary is the key an agent holds: read-only or read-write across the bucket. There is no per-object-type permission setting, so "this agent only touches blog posts" is an instruction you give and a habit you audit, not a rule the platform enforces for you. That is exactly why the read-key/write-key split matters so much, and why draft-by-default carries real weight.

Shift 2: review becomes the throughput ceiling

Draft status is the cheapest safety mechanism you have. It costs nothing and it catches everything. The habit that has to change is calendar-level: review is now the work you schedule your week around, rather than a step you tack onto the end of someone else's.

That means the review queue has to be a real surface your team sees without remembering to check the dashboard. Pull it with the TypeScript SDK and render it wherever your team already works:

import { createBucketClient } from '@cosmicjs/sdk';

const cosmic = createBucketClient({
  bucketSlug: process.env.COSMIC_BUCKET_SLUG!,
  readKey: process.env.COSMIC_READ_KEY!,
});

const recent = await cosmic.objects
  .find({ type: 'blog-posts' })
  .props('id,title,slug,status,created_at,metadata.author')
  .status('any')
  .sort('-created_at')
  .limit(25);

const reviewQueue = recent.objects.filter((post) => post.status === 'draft');
Enter fullscreen mode Exit fullscreen mode

Approval is then an explicit write, with a key that only your review surface holds:

import { createBucketClient } from '@cosmicjs/sdk';

const cosmic = createBucketClient({
  bucketSlug: process.env.COSMIC_BUCKET_SLUG!,
  readKey: process.env.COSMIC_READ_KEY!,
  writeKey: process.env.COSMIC_WRITE_KEY!,
});

await cosmic.objects.updateOne(objectId, {
  status: 'published',
  metadata: { last_updated: new Date().toISOString().slice(0, 10) },
});
Enter fullscreen mode Exit fullscreen mode

Two details matter more than they look. First, read the object back after a write and confirm the field actually stored the value you sent. A write that reports success while dropping a field is the kind of bug that ships a post with an empty meta description. Second, use explicit object IDs for relationship fields such as tags and category. Slugs can collide across object types and resolve to the wrong record.

Shift 3: attribution becomes a weekly number

When five agents and two humans all touch the same bucket, "who wrote this" turns into an operational question you have to answer quickly. You need it to debug a bad claim, to retire an underperforming agent, and to answer the inevitable question about how much of the site is machine-written.

Cosmic Insights attributes traffic by the actor who created the underlying object, splitting results across human users, agents, and automations. That answers a question most teams cannot answer at all: is the agent-authored content earning attention, or just filling the index?

Run that report before you scale an agent up, and put it on the same cadence as your traffic review. An agent producing thirty posts a month that collectively earn less traffic than three human posts is a cost, and the fix is usually narrower scope rather than more volume.

Shift 4: the content model does the editing you no longer have time for

The content model is the only guardrail that applies to every writer equally, human or machine. A required field is required for everyone. A select field with five options cannot be answered with a sixth. Every rule you move into the model is a review comment you never have to write again.

Things worth encoding in the model rather than in a prompt:

  • Required SEO fields. If seo_title and seo_description are required, no agent can ship a post without them.
  • Character limits. A maxlength on the meta description enforces the limit at write time.
  • Select options in place of free text. Category, content type, and funnel stage should be closed sets.
  • A verification field. For anything that cites a third party, a required last_verified date makes staleness visible.
  • Required relationships. An author reference on every post means attribution is always captured.

Every one of these turns a review comment you would otherwise write by hand into a validation error the agent has to resolve before the object saves. Given that write access is bucket-wide rather than scoped per type, the model is doing more enforcement work than most teams realize.

The failure modes to watch for

Four patterns show up repeatedly once agent volume rises:

  1. Near-duplicate content. Two agents, or the same agent on two runs, produce posts that target the same query. They then compete with each other in search. Search your own bucket before commissioning anything new.
  2. Confidently stale third-party claims. An agent reuses a competitor price or feature limit from an older draft. The rule that fixes this is simple: any claim about another product must be re-verified against that vendor's live page in the same run that writes the sentence.
  3. Invented specificity. Round numbers, benchmark figures, and customer counts that no source supports. Require a link next to every number.
  4. Drift from the house voice. Individually fine, collectively recognizable as machine output. Keep an explicit list of banned constructions and check drafts against it.

A fifth one is worth naming because it caught us while writing this post: an agent describing your own product's capabilities from memory instead of from current documentation. The first version of this article claimed Cosmic could scope an agent's write access to a single object type. It cannot. Apply the same verification rule to your own product that you apply to competitors.

Each of these is an argument for putting the gate before publication rather than after a correction.

What this does to headcount

The interesting outcome is that the team does not grow the way you would expect. Output rises while headcount stays flat, and the roles that remain shift toward editing, verification, and deciding what to commission.

Customers describe the same pattern when a CMS stops requiring a developer for routine changes. As Maximilian Wuhr, Co-Founder at FINN, put it: "Cosmic is: us never having to ask a developer to change anything on the backend of our website."

If you do add a reviewer, the cost is predictable. Cosmic plans include a set number of team members (Free includes 2, Builder 3, Team 5, Business 10), and additional users are $29 per user per month. Current plan details are on the pricing page.

Getting started

If you are heading toward this ratio, the sequence that works is: tighten the content model first, make draft the default second, build the review queue third, and add agents fourth.

Cosmic gives you the pieces for all four. The headless CMS provides the content model and validation, the REST API and TypeScript SDK provide the review surface, the MCP server connects Claude, Cursor, or any MCP client directly to your content, and Insights tells you whether any of it is working. If you want the specific permission controls behind all of this, we documented each one and how to verify it.

Start free with a Cosmic account, no credit card required.

Originally published at cosmicjs.com.

Top comments (0)