Skill Tracer
Skills › Marketing Skills › marketing-loops › seo-operator.md

seo-operator.md

110 lines · skills/marketing-loops/references/seo-operator.md at 88c79f6

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# The SEO Operator
2
3A recipe for handing an agent the whole SEO job for one site, run from the site's own repo on a schedule. It doesn't add new mechanics. It bundles the SEO loops from the catalog, gives them one shared memory, and sets the rules that keep an always-on agent useful instead of busy.
4
5Use it when the user wants SEO run for them rather than advice about SEO, and the agent can work in the repo that builds the marketing site. If the site lives in a hosted builder with no repo access, run the same loops in draft mode and hand the changes to a human.
6

The SEO Operator

A recipe for handing an agent the whole SEO job for one site, run from the site's own repo on a schedule. It doesn't add new mechanics. It bundles the SEO loops from the catalog, gives them one shared memory, and sets the rules that keep an always-on agent useful instead of busy.

Use it when the user wants SEO run for them rather than advice about SEO, and the agent can work in the repo that builds the marketing site. If the site lives in a hosted builder with no repo access, run the same loops in draft mode and hand the changes to a human.

Raw lines 1 to 6
7## Before the first run
8
9Settle five things with the owner and write them at the top of the operator brief (below):
11| Setting | What to capture |
12|---------|-----------------|
13| **Site** | The production URL |
14| **Conversion** | The one action that counts (trial, demo request, purchase). Traffic that never reaches it isn't the goal |
15| **Competitors** | 3–8 names, or permission to find them from the SERPs and AI answers |
16| **Ship mode** | "Open a PR for review" (default) or "merge when checks pass." Auto-merge needs the owner's explicit say-so; see `loop-guardrails.md` |
17| **Data access** | Which of Search Console, analytics, a rank or backlink tool, and an AI-visibility tool the agent can read |
19Then confirm the foundation: tracking works (the tracking-QA loop), and `.agents/product-marketing.md` exists. If it doesn't, build it with the `product-marketing` skill first. The operator reads product facts from there; it doesn't keep a second copy.

Before the first run

Settle five things with the owner and write them at the top of the operator brief (below):

SettingWhat to capture
SiteThe production URL
ConversionThe one action that counts (trial, demo request, purchase). Traffic that never reaches it isn't the goal
Competitors3–8 names, or permission to find them from the SERPs and AI answers
Ship mode"Open a PR for review" (default) or "merge when checks pass." Auto-merge needs the owner's explicit say-so; see loop-guardrails.md
Data accessWhich of Search Console, analytics, a rank or backlink tool, and an AI-visibility tool the agent can read

Then confirm the foundation: tracking works (the tracking-QA loop), and .agents/product-marketing.md exists. If it doesn't, build it with the product-marketing skill first. The operator reads product facts from there; it doesn't keep a second copy.

Raw lines 7 to 20
Names a skill product-marketing :19
21## Shared memory
23Agents start every run with no memory, so everything the operator knows lives in files. Use the loop-state convention (`.agents/loops/`) for run logs, plus one folder for SEO working files:
25```
26.agents/seo/
27 brief.md # the five settings above + any owner preferences
28 claims.md # claims ledger: each customer-facing fact, its source of truth, the pages that state it
29 queries.csv # query map: query, intent, page, status (live / planned / gap), position, last checked
30 queue.md # work queue, ranked by expected conversions per hour of effort
31 prompts.md # AI prompt panel by awareness stage, with each run's results
32 snapshots/ # competitor sitemaps and key pages, for diffing
33 reports/ # one file per weekly report
34.agents/loops/seo-operator.log # one line per run, acted or not
35```
37Two rules make the query map work. **Every page owns one primary query**, and **every query has at most one page.** Two pages chasing the same query is a defect: merge them and redirect the weaker one. A query with no page is a gap and goes in the queue.
39Every fact in `claims.md` cites where it came from (a file in the product repo, the live pricing page). Facts from memory don't go in.

Shared memory

Agents start every run with no memory, so everything the operator knows lives in files. Use the loop-state convention (.agents/loops/) for run logs, plus one folder for SEO working files:

.agents/seo/
  brief.md          # the five settings above + any owner preferences
  claims.md         # claims ledger: each customer-facing fact, its source of truth, the pages that state it
  queries.csv       # query map: query, intent, page, status (live / planned / gap), position, last checked
  queue.md          # work queue, ranked by expected conversions per hour of effort
  prompts.md        # AI prompt panel by awareness stage, with each run's results
  snapshots/        # competitor sitemaps and key pages, for diffing
  reports/          # one file per weekly report
.agents/loops/seo-operator.log   # one line per run, acted or not

Two rules make the query map work. Every page owns one primary query, and every query has at most one page. Two pages chasing the same query is a defect: merge them and redirect the weaker one. A query with no page is a gap and goes in the queue.

Every fact in claims.md cites where it came from (a file in the product repo, the live pricing page). Facts from memory don't go in.

Raw lines 21 to 40
41## Run schedule
43| Every run (daily, or on each deploy) | Weekly | Monthly |
44|---|---|---|
45| Site health crawl | Striking-distance push | Rebuild the query map (keyword-gap) |
46| Claim drift | Ranking-drop watch | Content decay |
47| Ship the top item in the queue | Indexing check | Comparison-page review (`competitors` asset audit) |
48| Append to the run log | Internal linking | Backlink prospecting + directory submissions |
49| | AI-answer check | One free-tool candidate (`free-tools`) |
50| | Competitor watch (sitemap diff) | |
51| | Weekly report | |
53Each cell is a catalog loop or a step defined below; run it with that loop's self-check, state, and stop rules. Skip any loop whose data isn't connected and say so in the report.
55**Site health crawl.** Fetch the sitemap and request every URL. Flag non-200s, redirect chains, wrong canonicals, stray `noindex`, robots blocks, broken internal links, orphan pages, duplicate or missing titles and descriptions, and pages whose main content isn't in the server-rendered HTML. The `seo-audit` skill covers each check.
57**Indexing check.** Compare the sitemap to what Search Console reports as indexed. For each unindexed URL, find the cause (thin, duplicate, orphaned, blocked, canonicalized elsewhere) and fix that, not the symptom. If indexing can't be verified, report "not verified." Never report a page as indexed without checking.
59**Competitor watch.** Diff each competitor's sitemap against last week's snapshot to see what they published, then check which of those pages rank. Queue a response only where you can build a better page, not for every page they ship.

Run schedule

Every run (daily, or on each deploy)WeeklyMonthly
Site health crawlStriking-distance pushRebuild the query map (keyword-gap)
Claim driftRanking-drop watchContent decay
Ship the top item in the queueIndexing checkComparison-page review (competitors asset audit)
Append to the run logInternal linkingBacklink prospecting + directory submissions
AI-answer checkOne free-tool candidate (free-tools)
Competitor watch (sitemap diff)
Weekly report

Each cell is a catalog loop or a step defined below; run it with that loop's self-check, state, and stop rules. Skip any loop whose data isn't connected and say so in the report.

Site health crawl. Fetch the sitemap and request every URL. Flag non-200s, redirect chains, wrong canonicals, stray noindex, robots blocks, broken internal links, orphan pages, duplicate or missing titles and descriptions, and pages whose main content isn't in the server-rendered HTML. The seo-audit skill covers each check.

Indexing check. Compare the sitemap to what Search Console reports as indexed. For each unindexed URL, find the cause (thin, duplicate, orphaned, blocked, canonicalized elsewhere) and fix that, not the symptom. If indexing can't be verified, report "not verified." Never report a page as indexed without checking.

Competitor watch. Diff each competitor's sitemap against last week's snapshot to see what they published, then check which of those pages rank. Queue a response only where you can build a better page, not for every page they ship.

Raw lines 41 to 60
Names a skill competitors :47
Names a skill free-tools :49
Names a skill seo-audit :55
61## The first run
631. **Learn the repo.** How routes and posts are created, and where titles, meta descriptions, canonicals, the sitemap, robots.txt, and structured data come from. Add pages the way the repo already does.
642. **Learn the product** from the code and the live site until you can explain it better than the homepage does. Fill `claims.md`.
653. **Build the query map** from buyers, not search volume: the problems they search, category terms, competitor names, "alternative" and "vs" queries, integrations, use cases, pre-purchase questions.
664. **Crawl the site** and log every problem.
675. **Write the queue**, then ship the top three fixes in the agreed ship mode, so the first run ends with real changes instead of a plan.

The first run

  1. Learn the repo. How routes and posts are created, and where titles, meta descriptions, canonicals, the sitemap, robots.txt, and structured data come from. Add pages the way the repo already does.
  2. Learn the product from the code and the live site until you can explain it better than the homepage does. Fill claims.md.
  3. Build the query map from buyers, not search volume: the problems they search, category terms, competitor names, "alternative" and "vs" queries, integrations, use cases, pre-purchase questions.
  4. Crawl the site and log every problem.
  5. Write the queue, then ship the top three fixes in the agreed ship mode, so the first run ends with real changes instead of a plan.
Raw lines 61 to 68
69## Operating rules
71- **The output is changes to the site.** A memo recommending a fix isn't progress; a PR with the fix is. Research earns its place only when it produces a change.
72- **Finish before starting.** Ship the change in progress before opening the next one. Half-done drafts don't rank.
73- **No guessing past missing data.** When a source isn't connected, note it in the report with what connecting it would make possible, then work with what exists. Don't fill gaps with estimates presented as data.
74- **The product is the source of truth.** When a page and the product disagree, change the page. Never change the product, its pricing, or its claims to match marketing.
75- **Escalate repeat failures.** If the same fix fails twice, stop, record what was tried, and raise it in the report.
76- **Check before shipping.** Run the repo's lint, type check, and build, then load each changed page and look at it.
77- **Don't break what earns.** Never delete, noindex, or redirect a page that gets traffic or has backlinks without the owner's approval.
78- **Drafts only for anything outward-facing.** Outreach emails, directory listings, social posts, and new accounts are drafted for the owner to send. See `loop-guardrails.md`.

Operating rules

  • The output is changes to the site. A memo recommending a fix isn't progress; a PR with the fix is. Research earns its place only when it produces a change.
  • Finish before starting. Ship the change in progress before opening the next one. Half-done drafts don't rank.
  • No guessing past missing data. When a source isn't connected, note it in the report with what connecting it would make possible, then work with what exists. Don't fill gaps with estimates presented as data.
  • The product is the source of truth. When a page and the product disagree, change the page. Never change the product, its pricing, or its claims to match marketing.
  • Escalate repeat failures. If the same fix fails twice, stop, record what was tried, and raise it in the report.
  • Check before shipping. Run the repo's lint, type check, and build, then load each changed page and look at it.
  • Don't break what earns. Never delete, noindex, or redirect a page that gets traffic or has backlinks without the owner's approval.
  • Drafts only for anything outward-facing. Outreach emails, directory listings, social posts, and new accounts are drafted for the owner to send. See loop-guardrails.md.
Raw lines 69 to 79
80## The writing gate
82Before writing any new page, read the current top results for its query and write one sentence on what the new page will have that none of them do: original data, a real example from the product, a working tool, a clearer answer. If you can't write that sentence, don't write the page. This is the same information-gain test as in `content-strategy`.
84Then:
85- Answer the query in the first two sentences, then add detail.
86- Use what only this company has: product screenshots, real numbers, the owner's opinions. If none exist for a topic, ask for them in the report rather than writing around the gap.
87- Never invent a statistic, quote, customer, review, price, or benchmark.
88- Ship each new page with the checklist in `seo-audit`'s [rankings push reference](https://github.com/coreyhaines31/marketingskills/blob/main/skills/seo-audit/references/rankings-push.md): internal links from at least three existing pages, title, meta description, canonical, sitemap entry, structured data where it fits.
89- Draft one social post per new article, built on its single most useful point (`social`).

The writing gate

Before writing any new page, read the current top results for its query and write one sentence on what the new page will have that none of them do: original data, a real example from the product, a working tool, a clearer answer. If you can't write that sentence, don't write the page. This is the same information-gain test as in content-strategy.

Then:

  • Answer the query in the first two sentences, then add detail.
  • Use what only this company has: product screenshots, real numbers, the owner's opinions. If none exist for a topic, ask for them in the report rather than writing around the gap.
  • Never invent a statistic, quote, customer, review, price, or benchmark.
  • Ship each new page with the checklist in seo-audit's rankings push reference: internal links from at least three existing pages, title, meta description, canonical, sitemap entry, structured data where it fits.
  • Draft one social post per new article, built on its single most useful point (social).
Raw lines 80 to 90
Names a skill content-strategy :82
Names a skill seo-audit :88
Names a skill social :89
91## The weekly report
93One screen, written to `.agents/seo/reports/YYYY-MM-DD.md`:
95```markdown
96## SEO week of [date]
97**Shipped:** [each change, with its URL]
98**Moved:** [clicks, impressions, positions, conversions vs last week, each with its source]
99**Broken:** [open problems, worst first]
100**Next:** [top 3 queue items]
101**Need from you:** [at most 3 asks: data access, approvals, facts or screenshots only the owner has]
102```
104If a number can't be sourced, leave it out rather than estimating it.

The weekly report

One screen, written to .agents/seo/reports/YYYY-MM-DD.md:

## SEO week of [date]
**Shipped:** [each change, with its URL]
**Moved:** [clicks, impressions, positions, conversions vs last week, each with its source]
**Broken:** [open problems, worst first]
**Next:** [top 3 queue items]
**Need from you:** [at most 3 asks: data access, approvals, facts or screenshots only the owner has]

If a number can't be sourced, leave it out rather than estimating it.

Raw lines 91 to 105
106## When not to run an operator
108- **The site has almost no search demand to win** (a brand-new category, a tiny niche). Spend on positioning and distribution first.
109- **No one will review the PRs.** An operator in PR mode with no reviewer just builds a backlog of stale branches. Use a weekly manual run instead.
110- **Tracking is broken.** Fix it first. Every loop above reads from it.

When not to run an operator

  • The site has almost no search demand to win (a brand-new category, a tiny niche). Spend on positioning and distribution first.
  • No one will review the PRs. An operator in PR mode with no reviewer just builds a backlog of stale branches. Use a weekly manual run instead.
  • Tracking is broken. Fix it first. Every loop above reads from it.
Raw lines 106 to 110