Building an AI Content Pipeline That Doesn't Publish Slop
Where language models genuinely help a publishing workflow, where they quietly destroy it, and how to wire the difference.

Every publisher has now run the experiment: point a model at a keyword list, generate two hundred articles, watch the traffic graph. It works for about a quarter, and then it does not, and the cleanup costs more than the content ever earned.
That does not make the tooling useless. It makes the placement of the tooling the entire question. Here is the split that has held up.
Where models genuinely help
- Research compression. Summarising twenty sources into a working brief with the disagreements flagged.
- Structural editing. "Which of these sections repeats itself?" is a question models answer well.
- Metadata drafting. Titles and descriptions against a character budget, ten variants in a second.
- Mechanical transforms. Alt text drafts, internal-link suggestions from an existing corpus, schema generation.
- Coverage analysis. Comparing your article against the top results and listing what is missing.
The common thread: every one of these produces an input to a human decision rather than output that ships unread.
Where they quietly destroy things
Wholesale drafting is the obvious failure, but the expensive one is subtler: generated internal linking at scale. A model that invents plausible anchor text pointing at plausible URLs will produce hundreds of confident 404s, and you will not notice for a quarter.
The second failure is voice. Models converge on a register — balanced, hedged, faintly enthusiastic. Publish enough of it and your archive reads like everyone else's, which is the opposite of the reason to have an archive.
The pipeline
Concretely, this is the shape I build for clients. Four stages, one human gate that cannot be automated away.
| Stage | Automated | Human |
|---|---|---|
| Brief | Source gathering, gap analysis, outline draft | Approves angle |
| Draft | Section scaffolds, code samples, data pulls | Writes the argument |
| Polish | Metadata variants, alt text, link candidates | Selects and edits |
| Publish | Schema, sitemap, revalidation, distribution | Signs off |
const candidates = await client.fetch<LinkTarget[]>(
`*[_type == "post" && _id != $id]{ _id, title, "slug": slug.current }`,
{ id: post._id },
);
// The model may only choose from candidates it was given.
const chosen = await suggestLinks({ body: post.body, candidates });
const resolved = chosen.filter((c) =>
candidates.some((candidate) => candidate._id === c._id),
);What to measure
Not volume. Two numbers tell you whether the pipeline is working: time from brief to publish, and the share of published articles that still get traffic six months later. Automation that improves the first while wrecking the second is a machine for generating future work.
The goal is not to publish more. It is to spend the same hours on the parts of publishing that only a person can do.
If you want the technical foundation underneath this — the schema, the references, the revalidation — start with Portable Text That Ranks.
// tagged


