August 18, 2026·8 min read

I let agents run my SEO

The same command center that builds my sites now runs their SEO — as reversible, human-gated agent tasks. And the target it aims at has quietly moved.

By Andrew Pyle

SEO used to be a thing I did by hand — open the console, stare at a spreadsheet, edit a title tag, wait a month. Somewhere in the last year it stopped being handwork and became agent work. The same command center that builds and operates my sites now runs their SEO too: an agent reads the site, proposes a fix, and I approve it. This is the honest account of what that actually looks like, and of a second change hiding underneath it — the target the whole game aims at has moved.

I want to be precise about what "agentic SEO" means here, because the phrase is already being sold as something it isn't. It does not mean I typed "fix my SEO" and walked away. It means the diagnostic and the repair are both done by agents, and every change ships as a reversible, idempotent command that I review before it runs. Agents propose. I approve. That distinction is the entire safety model, and I'll come back to it.

01The cleanup

What the agents actually did to my site.

Start with the concrete, because the concept is only worth as much as the work under it. My personal site had accumulated the classic self-inflicted mess: a few dozen thin, AI-generated pages that were dragging a low-authority domain down as a set. The agent-run cleanup came in four moves, none of them exotic — each one a real management command in the repo, not a prompt and a prayer.

Prune the thin pages

Roughly 15 near-worthless AI-generated pages were set to noindex — hidden from search, not deleted. In the code that is a single field flip, noindex=True, which emits a <meta robots noindex,follow> tag and drops the page from the unified sitemap. Reversible on purpose: clear the flag and the page returns. A demotion recovery is a hypothesis, and I wanted an undo button if a pruned page turned out to matter.

Consolidate the cannibals

Dozens of overlapping pages were competing with each other for the same query. The command proposed 301 redirects to fold them into single strong survivors — many weak signals collapsed into one credible one. It refuses to run if a survivor is missing, unpublished, noindexed, or itself redirected, because a 301 pointing into a page that no longer answers is worse than the cannibalization it was meant to cure.

Deepen what was real

A handful of thin pages sat on genuinely real subjects. Those got rewritten with actual code and worked examples instead of templated filler — fewer words, more substance. Before it overwrites anything, the deepen command writes the original out to a pre-deepen backup file, so even the rewrite has an undo sitting next to it.

Fix the invisibility bug

A prerender bug meant 16 of my essays rendered blank to Googlebot — indexed as empty pages. Real writing that Google literally could not see. Fixing the serving layer that hands a crawler its HTML put them back on the map.

Read that list back. It is not "content generation at scale." It is closer to the opposite: subtraction, consolidation, and repair. The agent's job was to find the junk and the breakage, propose the surgical fix, and let me pull the trigger.

02Dry-run first

Every fix is a dry-run-first command.

The reason I trust an agent near my production SEO is that it can't actually surprise me. Each of those moves is an idempotent Django management command with the same three-part contract: it defaults to a dry run that only prints the plan, it applies changes only when I pass --apply, and it walks the change back with --revert. Safe to re-run, because a second run does nothing the first one didn't.

# the real consolidation command on this site — reversible by contract
python manage.py apply_seo_consolidation           # dry-run (default): prints the 301 plan, touches nothing
python manage.py apply_seo_consolidation --apply   # sets redirect_to on the satellites
python manage.py apply_seo_consolidation --revert  # clears exactly the redirects it set

The default is the safe thing. You have to opt in to change the world, and you can always opt back out. That is the whole reason the agentic loop is tolerable: the blast radius of a bad proposal is a diff I read and decline, not a live mistake I discover in Search Console three weeks later.

There is a second layer of caution underneath even that. Setting redirect_to on a satellite is a database write, but the 301 does not actually fire for a visitor until a separate step regenerates the edge redirect rules and the sitemap stops listing the page. So even --apply is staged: the database records the intent, and a later, equally reversible command turns it into a redirect anyone hits. Two commands have to agree before a reader is bounced.

03Beyond the blue link

Ranking in Google is no longer the whole job.

Here is the part that changes the strategy, not just the tooling. For twenty years "SEO" meant one thing: rank in Google's blue links. That's still real, but it's now a subset. A growing share of the questions my pages could answer never reach a page of blue links at all — they get answered inside an AI. So the field grew two new initials.

SEO gets you ranked. AEO gets you returned as the answer. GEO gets you cited by the model. They are three different targets, and they no longer move together.

AEO — answer engine optimization — is optimizing to be the answer an answer engine returns, not the tenth link under it. GEO — generative engine optimization — is optimizing to be the source a generative model cites when it writes its reply: ChatGPT, Claude, Perplexity. A user asks, the model answers, and either your work is in that answer or it isn't. There's no page two to climb to. You're cited or you're invisible.

04The shared root

The cure and the disease share a root cause.

This is the quiet joke of the whole exercise. The thing that earns AEO and GEO is the exact opposite of the thing that got my site demoted. Answer engines and generative models reward content that is specific, first-hand, and structured — writing that's easy to extract a clean claim from and easy to attribute. A model looking for something to cite wants a real number, a real method, a real result, stated plainly enough to lift.

Thin, templated, scaled content is unciteable by construction. It has nothing specific to extract and no author worth attributing. So the same pruning pass that lifts a Helpful-Content demotion also clears the ground for AEO and GEO. You are not doing two jobs. You're removing the same liability twice — once for the ranker, once for the model.

05Extractable by design

The constructive half is making the work extractable.

Pruning is only the subtractive half of the job. The constructive half is making the pages that survive easy for a model to lift a clean claim from — and that is a structural problem, not a word-count one. A page an answer engine can quote is one where the claim, the number, and the method sit in plain, well-attributed prose, wrapped in structured JSON-LD that tells a machine who wrote it and what it is about.

The internal-linking pass is part of the same discipline. A command wires editorial inline links between essays, and it only ever links to pages that are actually indexable — never to one I just noindexed, never to a page that now 301s away, and never to itself. That keeps the link graph honest: every edge points at something a crawler and a model can both still reach.

None of this rewards volume. It rewards a page that states one true thing well enough that a model can repeat it without hedging. The pruning, the deepening, and the linking all bend toward the same shape — fewer pages, each saying something specific a person wrote and a machine can safely quote.

06The human gate

This is human-gated, not autonomous.

I want to end on the boundary, because it's the thing most likely to be oversold. "Agentic SEO" invites the picture of a system that reads your analytics at 3 a.m. and rewrites your site while you sleep. That is not what this is, and I would not run that if I could.

The operator is the approval step. Every command dry-runs by default. Every change is reversible. The agent is very good at the parts that are search and diff and proposal. It is not trusted with the part that is judgment, and the dry-run default is what keeps that line drawn in code rather than in good intentions.

So the shape of the change is two things at once. The how moved: SEO became agent work, done as reversible commands a human approves, the same way I build everything else now. And the what moved: the goal is no longer only a rank in Google but a citation in an answer. The reassuring part is that both changes point the same direction. Specific, first-hand, structured work is what survives a Helpful-Content view, what an answer engine returns, and what a model cites. The scaled junk fails all three. I spent a year learning that the hard way, and the fix — for the ranker and the model both — was the same fix.