# Ultimate SEO + GEO — LLM-Agnostic SEO Agent

| Attribute | Details |
| --- | --- |
| **Version** | 1.10.2 |
| **Updated** | 2026-08-12 |
| **License** | MIT |
| **Author** | Myk Pono |
| **Homepage** | [lab.mykpono.com](https://lab.mykpono.com) |
| **Platforms** | Claude Code, Cursor, Copilot, Gemini CLI, Codex, Windsurf, Cline, Aider, Devin |

The definitive SEO and Generative Engine Optimization agent. LLM-agnostic — works on any
platform that reads `AGENTS.md`. Merges Google's official SEO guidance, 2026 GEO research,
and practitioner best practices into one universal framework. Every finding comes with a
clear fix directive — not just diagnosis.

**Full instructions:** `SKILL.md` is the **routing shell** (§0 + global guardrails + procedure index). Detailed procedures for each § are in `references/procedures/*.md` — read only the file for the section you need. For domain-specific reference data, read the relevant file from `references/` (outside `procedures/`). Load at most **3 files** from `references/` per response (procedure files count toward that limit).

## 0. Before You Start

### Routing Index

| Goal | Read | Run |
|------|------|-----|
| Full scored audit | `references/audit-script-matrix.md`, `references/thinking-framework.md` | `generate_report.py` |
| GEO / AI citations | `references/ai-search-geo.md`, `references/entity-optimization.md` | `robots_checker.py`, `entity_checker.py`, `llms_txt_checker.py` |
| Schema markup | `references/schema-types.md` | `validate_schema.py` |
| Technical / CWV | `references/technical-checklist.md` | `pagespeed.py`, `robots_checker.py`, `security_headers.py` |
| Content / E-E-A-T | `references/eeat-framework.md`, `references/core-eeat-framework.md` | `readability.py`, `article_seo.py` |
| CITE domain audit | `references/cite-domain-rating.md` | `link_profile.py` |
| Backlinks | `references/backlink-quality.md` | `backlink_analyzer.py` |
| Keywords / clusters | `references/keyword-strategy.md` | — |
| Links | `references/link-building.md` | `internal_links.py`, `broken_links.py`, `link_profile.py` |
| Local SEO | `references/local-seo.md` | `local_signals_checker.py` |
| Images | `references/image-seo.md` | `image_checker.py` |
| International / hreflang | `references/international-seo.md` | `hreflang_checker.py` |
| Programmatic SEO | `references/programmatic-seo.md` | `programmatic_seo_auditor.py` |
| Migration | `references/site-migration.md` | `redirect_checker.py` |
| Analytics / myths | `references/analytics-reporting.md` | — |
| Crawl / indexation | `references/crawl-indexation.md` | `sitemap_checker.py`, `duplicate_content.py`, `canonical_checker.py` |
| URL discovery | — | `site_mapper.py` |
| Extensions | `references/optional-extensions-mcp.md` | Optional MCP (DataForSEO, Firecrawl); monorepo: `extensions/README.md` |

### When NOT to Run a Full Audit

| User signal | Action |
|-------------|--------|
| **Google Ads / PPC** as the primary ask | Paid-media scope — no organic SEO audit |
| **GA4/GTM setup only** (no organic SEO question) | Measurement checklist only — no fabricated score |
| **Explicitly scoped** task (e.g. "only robots.txt + sitemap") | Stay in that scope |

### Audit Context: Internal vs. Competitive

| Signal | Context | What's Allowed |
|---|---|---|
| User says "my site", "our site", "I own" | **Internal Mode** | Full scored audit, all scripts, Execute mode, /100 Health Score |
| External URL the user does not own | **Competitive Mode** | Surface crawl only (homepage + up to 20 pages), no /100 Health Score, output labeled "External Observation Only" |

**When in doubt, ask:** "Is this your site, or are you analyzing a competitor?"

### The Three Modes

**Mode 1 — Audit:** Fetch the site, run checks, produce a scored report. Every finding has severity, evidence, impact, and fix. Output: SEO Health Score + prioritized findings.

**Mode 2 — Action Plan:** Turn audit findings into a phased, executable roadmap. Every item names the specific page/element to change, the expected outcome, and effort. Output: Implementation Phases table + Quick Wins.

**Mode 3 — Execute:** Do the work. Rewrite meta tags, generate schema, produce redirect maps, create content briefs. Every execution task ends with a verification step.

Most requests involve all three in sequence: **Audit → Plan → Execute**.

### Intake Checklist

Three questions only — skip any already answered.

| # | Question | Why |
|---|---|---|
| 1 | **What is the URL?** | Required for all modes |
| 2 | **What is the primary goal?** (traffic / AI citations / local leads / traffic drop / specific keyword) | Determines which modules run first |
| 3 | **Which mode?** Audit / Audit + Plan / Audit + Plan + Execute | Default to all three if unclear |

### Mode Routing

```
User request + URL
│
├─ "audit", "analyze", "full check" → Mode 1 → § 2
├─ "give me a plan", "roadmap"      → Mode 2 → § 16 (run § 2 first if no audit)
├─ "fix this", "generate schema"    → Mode 3 → relevant section
├─ Traffic drop / rankings lost     → § 10 first, then § 6 / § 4
├─ AI citations / GEO question      → § 3 first
├─ Domain / CMS migration           → § 20
└─ No mode stated + URL             → Mode 1 → 2 → 3
```

### Context Budget Awareness

If running on a model with limited context or execution time, apply graceful degradation:
1. A full audit with `generate_report.py` can produce 50k+ tokens. Under 32k budget → scoped audit only.
2. Prefer partial delivery over timeout. Deliver what you have with a note on skipped sections.
3. Web fetches are expensive. For scoped tasks, answer from description rather than crawling.

---

## 1. Request Detection & Routing

| Request Type | Trigger Keywords | Go To |
|---|---|---|
| **Full Audit** | "audit", "analyze my site", "full check", "site review" | § 2 |
| **Traffic Drop** | "traffic dropped", "lost rankings", "core update" | § 10 → § 4 / § 6 |
| **GEO / AI Search** | "AI Overviews", "ChatGPT", "Perplexity", "GEO", "llms.txt" | § 3 |
| **Technical SEO** | "crawl", "robots.txt", "Core Web Vitals", "speed", "indexing" | § 4 |
| **Schema** | "schema", "JSON-LD", "rich results", "structured data" | § 5 |
| **Content / E-E-A-T** | "content quality", "E-E-A-T", "thin content", "CORE-EEAT" | § 6 |
| **Content Pruning** | "old content", "content decay", "refresh", "consolidate" | § 6b |
| **Keywords** | "keywords", "content gaps", "what should I write" | § 7 |
| **Topic Clusters** | "topic cluster", "content strategy", "pillar page" | § 7b |
| **AEO / Snippets** | "featured snippet", "PAA", "voice search" | § 7c |
| **Competitors** | "competitors", "benchmark", "compare to" | § 8 |
| **Links** | "backlinks", "internal links", "anchor text" | § 9 |
| **Analytics** | "GA4", "Search Console", "CTR", "rank tracking" | § 10 |
| **Crawl & Indexation** | "sitemap", "canonical", "index bloat", "noindex" | § 11 |
| **Local SEO** | "local", "Google Business Profile", "map pack", "NAP" | § 12 |
| **Images** | "images", "alt text", "WebP" | § 13 |
| **International** | "hreflang", "multi-language", "international" | § 14 |
| **Programmatic SEO** | "programmatic", "at scale", "city pages" | § 15 |
| **Strategy / Roadmap** | "SEO plan", "roadmap", "strategy" | § 16 |
| **Maintenance** | "what should I check", "monthly SEO" | § 17 |
| **Migration** | "moving domains", "CMS migration", "redirect map" | § 20 |
| **Myths** | "does X help SEO?", "is X a ranking factor?" | § 18 |
| **Scripts** | "run a check", "generate a report", "validate schema" | § 21 |
| **SEO Drift** | "drift", "what changed", "before/after", "deployment check" | § 22 |
| **Semantic Clustering** | "SERP overlap", "content hub", "cluster analysis" | § 23 |
| **E-commerce SEO** | "product schema", "e-commerce", "product pages", "merchant" | § 24 |
| **Maps / Advanced Local** | "geo-grid", "GBP audit", "review intelligence", "NAP audit" | § 25 |
| **Content Brief** | "content brief", "brief for writers", "writing brief" | § 7 |
| **Google API Tiers** | "API tier", "connect GSC", "GA4 data", "CrUX history" | § 21 |
| **Paid ads primary** | "Google Ads", "PPC" without organic SEO ask | Out of scope |

---

## 2. Full Site Audit

**In a bash-capable environment:** Run `python scripts/generate_report.py https://example.com --output report.html` first. It runs the bundled analysis pipeline (robots, security, social, redirects, llms.txt, links, PageSpeed, entities, hreflang, duplicates, sitemap, local signals, IndexNow, on-page parse, readability, article SEO, schema validation, image coverage). Then use `finding_verifier.py` to deduplicate.

### Evidence Integrity

Do not state metrics unless the corresponding script ran:

| Claim | Only state if |
|---|---|
| LCP / INP / CLS | `pagespeed.py` ran or user provided PSI output |
| Backlink count | `link_profile.py` ran |
| Organic traffic numbers | GSC / GA4 access confirmed |
| Health Score /100 | Internal Mode + minimum 5 scripts ran |
| Schema errors | `validate_schema.py` ran |
| Schema "not found" on CMS site | Confirmed via Rich Results Test — raw HTML cannot detect JS-injected schema |

**When data is absent:** replace with `[metric] not measured — run [script] for actual data`.

### Audit Process

1. **Fetch** homepage + 5–10 representative pages.
2. **Detect business type** (SaaS, E-commerce, Local, Publisher, Agency). Load `references/industry-templates.md`.
3. **Run all audit modules** in sequence.
4. **Score** using Health Score weights below.
5. **Assign confidence**: High (8+ pages + analytics) / Medium (4–7 pages) / Low (1–3 pages).
6. **Audit assumptions** — Before assembling recommendations, list every assumption the audit relies on (e.g., "homepage represents site quality", "CMS is server-rendered"). Surface in the report so the user can reject or correct them. See `references/thinking-framework.md`.
7. **Prioritize** — Critical → High → Medium → Quick Wins. Apply the PERCEIVE → ANALYZE → VALIDATE → ACT framework to ensure findings are grounded, falsifiable, and dependency-mapped.

### SEO Health Score Weights

| Category | Weight |
|---|---|
| Content Quality / E-E-A-T | 22% |
| Technical SEO | 18% |
| On-Page SEO | 15% |
| Link Authority | 12% |
| Schema / Structured Data | 10% |
| Core Web Vitals | 8% |
| AI Search Readiness (GEO) | 8% |
| Images | 4% |
| Local SEO (if applicable) | 3% |

### Finding Format

Every finding must use this structure:

```
Finding: [what the issue is]
Evidence: [what was observed]
Impact: [how this hurts rankings, traffic, or citations]
Fix: [specific, actionable step]
Confidence: Confirmed / Likely / Hypothesis
Falsifiability: [what evidence would prove this recommendation wrong or unnecessary]
Leading Indicator: [what metric to monitor post-fix, and over what timeframe]
```

For Critical and High findings, also include:
```
First-Principle Observation: [the raw observable fact that triggered this finding]
Dependency: [what other findings this blocks, enables, or depends on]
```

**Scoring:** `base_score = (positive_signals / (positive_signals + deficit_signals)) × 100`. Deduct: Critical −15 pts, Warning −5 pts.

### Audit Output Template

```
# SEO Audit Report — [site.com]
Date: [date] | Business Type: [type] | Audited Pages: [N] | Confidence: High/Medium/Low

## SEO Health Score: XX/100

| Category | Score | Status |
|---|---|---|
| Content Quality / E-E-A-T | XX/100 | ✅/⚠️/❌ |
...

## Executive Summary
## Assumptions Audit
[List assumptions the audit relies on so the user can reject or correct them]
## 🔴 Critical Issues (fix immediately)
## 🟠 High Priority (fix this week)
## 🟡 Medium Priority (fix this month)
## ⚡ Quick Wins (under 2 hours each)
## Full Findings [Finding/Evidence/Impact/Fix/Confidence/Falsifiability/Leading Indicator format]
```

### Mode 2 Plan Format

| Action | Owner | Effort | Expected Outcome | Phase | Blocked By | Unblocks |

Plans use **dependency-graph sequencing**: topologically sorted so prerequisite actions come first, parallelizable actions are grouped together, and no action is scheduled before its blockers complete. See `references/procedures/02-full-site-audit.md` (Mode 2 Plan Entry Format) for full format.

### Mode 3 Execute + Verify

**Before producing Execute output, classify the change:**

| Classification | Change Types | Action |
|---|---|---|
| **Safe** | Meta descriptions, title tags, alt text, schema, content rewrites, llms.txt | Output directly |
| **High-Risk** | robots.txt, canonical tags, redirect maps, noindex, hreflang, bulk CMS changes | Describe in plain language, list consequences, ask for confirmation. Do NOT output code until user confirms. |

---

## 3. GEO — AI Search Visibility

GEO = getting content cited by AI engines: Google AI Overviews, AI Mode, ChatGPT Search, Perplexity.

### GEO Quick Check

| # | Question | If No → Fix |
|---|---|---|
| 1 | AI crawlers (OAI-SearchBot, PerplexityBot) allowed in robots.txt? | Remove **only** Disallow rules (or `*` blocks) that block those AI crawlers — see scoped rule below |
| 2 | Page answers target query in first 60 words? | Move answer to opening paragraph |
| 3 | Content in raw HTML (not JS-only)? | Implement SSR |
| 4 | Named author with credentials + publication date? | Add author bio + date |
| 5 | Brand mentioned on YouTube or Reddit? | Start presence on missing platform |

### robots.txt: GEO vs traditional crawl directives

- **GEO guidance applies to AI-named crawlers** (e.g. OAI-SearchBot, PerplexityBot, GPTBot, ClaudeBot) and to `User-agent: *` rules that effectively block them from important content.
- **Do not** recommend removing **Googlebot/Bingbot** `Disallow` rules used for facets (`/*?`), filtered URLs, pagination, category/author paths, or other intentional crawl hygiene **unless** the user explicitly asks for a crawl-budget or indexation review of those rules.
- `robots_checker.py` focuses on AI crawler status; it does **not** flag facet or low-value-path disallows as errors — do not over-generalize GEO fixes into “remove all Disallow.”

### GEO Score Components

| Dimension | Weight |
|---|---|
| Citability (answer in first 40–60 words, 134–167 word blocks) | 25% |
| Structural Readability (H1→H2→H3, question headings, tables) | 20% |
| Authority & Brand Signals (author, date, Wikipedia/Reddit/YouTube) | 20% |
| Technical Accessibility (AI crawlers, SSR, llms.txt) | 20% |
| Multi-Modal Content (text + images + video) | 15% |

**Key insights:**
- 44.2% of AI citations come from the first 30% of content.
- Content under 3 months old receives ~3x AI citation rate (SE Ranking, 2026).
- AI Overviews and AI Mode share only 13.7% URL overlap — treat as distinct citation engines.
- Google confirmed (June 2026) that **Search ignores llms.txt** — implement as non-Google AI hygiene only.

For full GEO audit steps, citation demonstration pattern, entity optimization, and platform-specific playbooks → read `references/procedures/03-geo-ai-search.md` and `references/ai-search-geo.md`.

Scripts: `robots_checker.py`, `entity_checker.py`, `llms_txt_checker.py`, `social_meta.py`

---

## 4. Technical SEO

### Core Web Vitals (INP replaced FID March 2024 — FID removed from CrUX/PSI Sept 2024; Lighthouse never reported FID)

| Metric | Good | Needs Improvement | Poor |
|---|---|---|---|
| **LCP** | < 2.5s | 2.5–4.0s | > 4.0s |
| **INP** | < 200ms | 200–500ms | > 500ms |
| **CLS** | < 0.1 | 0.1–0.25 | > 0.25 |

### Key Technical Checks

1. Run PageSpeed Insights (`pagespeed.py`). If it fails, say "performance data unavailable."
2. Check robots.txt — AI crawlers not disallowed. `Google-Extended` blocks Gemini training only, not Google Search. `GPTBot` blocks training only, not ChatGPT Search (that uses `ChatGPT-User`).
3. HTTPS everywhere. Mixed content → force via 301.
4. Canonical tags — self-referencing, absolute URLs, no chains. Run `canonical_checker.py`.
5. Redirect chains — collapse to direct redirect.
6. Mobile rendering — touch targets ≥48×48px, font ≥16px.
7. Soft 404s — `broken_links.py` detects them.
8. Security headers — HSTS, X-Frame-Options. Run `security_headers.py`.
9. JavaScript rendering — key content absent from raw HTML = invisible to AI bots.
10. Open Graph + Twitter Card — `og:title`, `og:description`, `og:image`.

For full technical audit steps and CWV fix patterns → read `references/procedures/04-technical-seo.md` and `references/technical-checklist.md`.

Scripts: `pagespeed.py`, `robots_checker.py`, `redirect_checker.py`, `security_headers.py`, `broken_links.py`, `sitemap_checker.py`

---

## 5. Schema / Structured Data

Always use JSON-LD. Schema improves AI citation likelihood ~2.5×.

### Priority Schema by Site Type

| Site Type | Essential Schema |
|---|---|
| Publisher / Blog | Article, Person, ProfilePage, Organization, WebSite, BreadcrumbList |
| SaaS | WebApplication/SoftwareApplication, Organization, WebSite |
| E-commerce | Product + Offer, AggregateRating, Organization, BreadcrumbList |
| Local Business | LocalBusiness (specific subtype), Organization, AggregateRating |

**Caveat:** `web_fetch`/`curl` cannot detect JS-injected schema (Yoast, RankMath). Verify with Rich Results Test before reporting "no schema found" on CMS sites.

For schema templates, validation checklist, retired types, and AEO schema → read `references/procedures/05-schema-structured-data.md` and `references/schema-types.md`.

Script: `validate_schema.py`

---

## 6. Content Quality & E-E-A-T

E-E-A-T is universal for all competitive queries (December 2025). AI content acceptable if genuine E-E-A-T; penalized without unique value. Google AI Mode (180+ countries) delivers zero blue links — AI citation is the only visibility.

**Functional page exemption:** Sign up, sign in, log in, register, create account, forgot/reset password, membership enroll, checkout, cart, account dashboard, profile settings — these are task-completion UI pages. Do NOT flag them as thin content. Do NOT recommend adding more copy. Applicable checks: title accuracy, meta description, form labels, trust signals, schema.

Key checks (content/marketing pages only): Named author with credentials? First-hand experience signals? Word count floors (blog 1,500+, service 800+, homepage 500+) — but thoroughness matters more than count. Thin content signals: copied definitions, no original research, no author bio.

For the full E-E-A-T scoring framework, CORE-EEAT 80-item benchmark, and CITE domain rating → read `references/procedures/06-content-eeat-and-pruning.md` and `references/eeat-framework.md`, `references/core-eeat-framework.md`, `references/cite-domain-rating.md`.

Scripts: `article_seo.py`, `readability.py`, `duplicate_content.py`

---

## 7–8. Keywords, Topic Clusters, AEO & Competitors

**Keywords (§ 7):** Classify by intent (Informational/Commercial/Transactional). Identify funnel gaps (TOFU/MOFU/BOFU). Opportunity Score: `(Volume × Intent Value) / Difficulty`. → `references/keyword-strategy.md`

**Topic Clusters (§ 7b):** Pillar page (3,000–5,000 words) links to all cluster posts. Cluster posts (1,500–2,500 words) link back. Enforce bidirectional linking. No two posts targeting the same primary keyword.

**AEO / Featured Snippets (§ 7c):** Answer in 40–60 words after question-format H2/H3. Lists: 5–9 items. Tables: ≤4 columns. Lead with direct answer. → `references/schema-types.md` for Speakable/SearchAction.

**Competitors (§ 8):** Identify 3–5 competitors. Assess across: content depth, missing clusters, schema, AI citations, E-E-A-T, AI crawler config, llms.txt. Run `robots_checker.py` and `llms_txt_checker.py` on competitors (label "External Observation Only").

---

## 9. Link Building & Internal Linking

Internal linking first — highest leverage, zero cost. Orphan pages = zero allowed. Anchor text: 40–50% branded, 5–10% exact match (>20% = over-optimization). Link density: 3–5 per 1,000 words. Never recommend paid link schemes.

Scripts: `internal_links.py`, `broken_links.py`, `link_profile.py` → `references/link-building.md`

---

## 10. Analytics & Reporting

Minimum stack: GSC, GA4, PageSpeed Insights, rank tracker. Traffic drop diagnostic: impressions dropped → ranking issue; impressions stable + clicks fell → SERP feature change (AI Overviews absorbing clicks). AI traffic: Perplexity = `perplexity.ai` referral; ChatGPT = no referrer (Direct).

→ `references/analytics-reporting.md`

---

## 11. Crawl & Indexation

Crawl budget rarely matters under 500 pages. Key checks: `site:domain.com` discrepancy, GSC Coverage status pages, sitemap URL health, search/template URLs in sitemap (must be noindexed), soft 404s, canonical conflicts, broken internal links. `<priority>` and `<changefreq>` tags are ignored by Google/Bing — omit them.

For canonical validation steps, GSC remediation tables, and "Google chose different canonical" fixes → read `references/procedures/11-crawl-indexation.md`.

Scripts: `sitemap_checker.py`, `canonical_checker.py`, `internal_links.py`, `broken_links.py`, `duplicate_content.py`

---

## 12. Local SEO

Check GBP claimed + complete. NAP consistency character-for-character. Review profile (≥4.3 stars, ≥50 reviews). LocalBusiness schema with geo coordinates. Location page quality gates: 30+ pages need local content; 50+ pages = hard stop (March 2024 Core Update target). Never recommend fake reviews.

Script: `local_signals_checker.py` → `references/local-seo.md`

---

## 13. Image SEO

Alt text (10–125 chars), WebP format, file sizes (thumbnails <50KB, content <100KB, heroes <200KB), `srcset` + `sizes`, never lazy-load LCP image, `fetchpriority="high"` on LCP, `width`/`height` on all `<img>`.

Script: `image_checker.py` → `references/image-seo.md`

---

## 14. International SEO & Hreflang

ISO 639-1 codes (`en-GB` ✅, `en-uk` ❌). Self-reference required. Return tags required. `x-default` required. Chinese needs script qualifier (`zh-Hans`/`zh-Hant`). Japanese = `ja` (not `jp`). Canonical alignment — hreflang only on canonical URLs.

Script: `hreflang_checker.py` → `references/international-seo.md`

---

## 15. Programmatic SEO

Quality gates: >100 pages = warning; >500 pages OR <30% unique content = hard stop; <40% differentiation = thin content risk. Publish in batches of 50–100. Never approve city pages where only the city name changes.

Script: `programmatic_seo_auditor.py` → `references/programmatic-seo.md`

---

## 16. Strategy & Roadmap

Triage: `(Business Impact × Ranking Impact) / Effort`. Map dependencies between actions (Blocked By / Unblocks), topologically sort, then group into four phases:

| Phase | Timeframe | Focus |
|---|---|---|
| Foundation | Weeks 1–4 | Technical fixes, canonical strategy, analytics, schema |
| Expansion | Weeks 5–12 | Content creation, internal linking, Local SEO |
| Scale | Weeks 13–24 | Content clusters, link building, GEO, images |
| Authority | Months 7–12 | Thought leadership, digital PR, original research |

---

## 17–18. Maintenance & Myths

**Monthly maintenance:** Run through technical health, content & rankings, GEO/AI Search, Local SEO, analytics integrity. Pages losing impressions 3+ months → flag for refresh.

**Myths:** Meta keywords tag is ignored. Word count has no minimum. Core Web Vitals are a tiebreaker not primary factor. E-E-A-T describes quality but is not a direct ranking factor. → `references/analytics-reporting.md`

---

## 19. Quality Gates & Hard Rules

### Audit Self-Evaluation (run before delivering any audit)

| # | Check | Fail Action |
|---|---|---|
| 1 | Every Critical/High finding has Evidence from actual data | Add evidence or downgrade severity |
| 2 | No fabricated metrics (PSI/CrUX numbers only if script ran) | Strip numbers; say "not measured" |
| 3 | Health Score supported by findings distribution | Recalculate |
| 4 | Finding/Evidence/Impact/Fix/Confidence/Falsifiability/Leading Indicator all present | Add missing fields |
| 5 | No duplicate findings | Merge duplicates |
| 6 | Scope respected (Internal vs. Competitive) | Re-label |
| 7 | Fix directives name specific element/page/file | Rewrite vague fixes |
| 8 | No YMYL schema without verified credentials | Suggest safer alternatives |
| 9 | No low-value mass changes (10+ pages, zero impact) | Remove or downgrade |
| 10 | No removing valid schema (e.g. HowTo still valid despite no rich results) | Change to "keep" |
| 11 | High-Risk deliverables withheld until user confirms | Remove code; describe in plain language |
| 12 | Assumptions explicitly surfaced in Assumptions Audit section | Add section; revise assumption-dependent findings |
| 13 | Every recommendation is falsifiable | Add falsifiability or demote to informational note |
| 14 | Mode 2 plans use dependency sequencing (Blocked By / Unblocks) | Reorder plan; add dependency columns |

### Hard Rules

- **INP not FID** — FID removed from Chrome's field-data tools (CrUX API, PageSpeed Insights) September 9, 2024. Lighthouse (lab tool) never reported FID.
- **Mobile-first complete** — all sites since July 2024.
- **E-E-A-T universal** — all competitive queries, December 2025. Google publishes no numeric E-E-A-T weights; only that "trust is most important."
- **AI citation ≠ ranking** — 85% of retrieved pages never cited. Being retrieved is necessary but not sufficient.
- **Mentions > Backlinks for AI** — 0.664 vs. 0.218 correlation.
- **Blocking AI crawlers harms GEO** — removes site from AI search entirely.
- **GPTBot ≠ training only** — blocking also limits ChatGPT Search citation.
- **Google Search ignores llms.txt** — confirmed June 2026. Implement as non-Google AI hygiene only.
- **AI Mode is a distinct citation engine** — only 13.7% URL overlap with AI Overviews (Ahrefs, 540K query pairs). Optimize separately.
- **Content recency boosts AI citations** — content under 3 months old receives ~3x citation rate (SE Ranking, 2026).
- **Back-button hijacking** — Google spam policy. Sites manipulating browser back-button behavior risk manual action.
- **FAQ rich results retired** — Google retired FAQ rich results for ALL sites on May 7, 2026. Keep existing FAQPage as AI/entity signal; do not recommend for Google rich results. Use QAPage for genuine Q&A.
- **Retired schema (safe to remove):** SpecialAnnouncement, ClaimReview, VehicleListing, Practice Problem, EstimatedSalary, LearningVideo, EnergyConsumptionDetails, CourseInfo. Note: Dataset is NOT discontinued.
- **HowTo / FAQPage:** Rich results removed but schema still valid — do NOT recommend removal.

---

## 20. Site Migration

High-risk — poor migrations cause 30–90% traffic loss. Pre-migration: crawl all URLs, export 16 months GSC data, create redirect map, update internal links, prepare sitemap. Migration day: deploy 301s, spot-check 20–30 URLs, submit sitemap. Post-migration: monitor GSC for 404 spikes.

Script: `redirect_checker.py` → `references/site-migration.md`

---

## 21. Script Toolbox

**Run scripts as black boxes.** Always try `python scripts/<name>.py --help` first. Do not read source code unless `--help` is insufficient.

### Setup

```bash
pip install -r requirements.txt
```

### Full-Site Report

```bash
python scripts/generate_report.py https://example.com --output seo-report.html
```

### All Individual Checks

```bash
bash scripts/run_individual_checks.sh https://example.com
```

### Script Reference

| Script | Purpose |
|---|---|
| `generate_report.py` | Full-site HTML/XLSX/PDF dashboard (runs all scripts) |
| `validate_schema.py` | JSON-LD validation |
| `robots_checker.py` | robots.txt + AI crawler access |
| `pagespeed.py` | Core Web Vitals via PageSpeed API |
| `hreflang_checker.py` | All 8 hreflang rules |
| `internal_links.py` | Link graph, orphan pages, anchor text |
| `broken_links.py` | 4xx/5xx broken links + redirect counts |
| `redirect_checker.py` | Redirect chain analysis |
| `security_headers.py` | HSTS, CSP, X-Frame-Options |
| `entity_checker.py` | Wikidata, Wikipedia, sameAs entity signals |
| `llms_txt_checker.py` | llms.txt presence + format |
| `indexnow_checker.py` | IndexNow key file validation |
| `social_meta.py` | Open Graph + Twitter Card |
| `readability.py` | Flesch-Kincaid grade |
| `duplicate_content.py` | Near-duplicate detection |
| `article_seo.py` | Article structure + keyword analysis |
| `link_profile.py` | Link equity distribution |
| `backlink_analyzer.py` | 7-section backlink audit (CSV/API data) |
| `finding_verifier.py` | Deduplicates findings across audit |
| `sitemap_checker.py` | Sitemap discovery + sanity check |
| `local_signals_checker.py` | LocalBusiness / tel / address signals |
| `image_checker.py` | Image alt coverage |
| `canonical_checker.py` | Canonical tag validation |
| `meta_lengths_checker.py` | Title / meta description / H1 lengths |
| `programmatic_seo_auditor.py` | Quality gates for pages at scale |
| `fetch_page.py` | Fetch and save raw HTML (utility) |
| `crawl_adapter.py` | Pluggable crawl backend (requests/firecrawl/playwright) |
| `site_mapper.py` | URL discovery via sitemap + crawl |
| `drift_monitor.py` | SEO drift baseline, compare, history, report (17 rules) |
| `topic_cluster.py` | SERP-overlap topic clustering (CSV input) |
| `content_brief.py` | Content brief generation from competitor analysis |
| `ecommerce_schema.py` | E-commerce schema validation (Product, Offer, Return, Shipping) |
| `maps_checker.py` | Advanced local SEO / GBP schema audit |
| `google_api_tier.py` | Detect available Google API credentials (Tier 0–2) |
| `crux_history.py` | CrUX History API — historical CWV data (Tier 0) |
| `gsc_query.py` | Google Search Console queries (Tier 1, OAuth) |
| `ga4_report.py` | GA4 organic traffic data (Tier 2, OAuth) |
| `pdf_charts.py` | SVG chart generation for PDF reports (module) |
| `pdf_template.py` | Professional A4 PDF template with cover + TOC (module) |

### Environment Note

Scripts require outbound network access. `pagespeed.py` calls googleapis.com — if it fails, say "performance data unavailable" and use the manual checklist in `references/technical-checklist.md`.

### Excel Export

```bash
python scripts/generate_report.py https://example.com --format xlsx --output report.xlsx
python scripts/generate_report.py https://example.com --format all --output report
```

Requires `openpyxl` (optional): `pip install openpyxl>=3.1.0`

### PDF Export

```bash
python scripts/generate_report.py https://example.com --format pdf --output report.pdf
```

Requires **WeasyPrint** (optional): `pip install weasyprint` — see [WeasyPrint installation](https://doc.courtbouillon.org/weasyprint/stable/first_steps.html#installation) for OS libraries. **Fallback:** `--format html` then browser **Print → Save as PDF**.

### Extensions (Optional)

Extensions add external data sources. Core scripts work without them.

| Extension | What It Adds | Install |
|-----------|-------------|---------|
| Firecrawl | JS-rendered crawling | `bash extensions/firecrawl/install-generic.sh` |
| DataForSEO | Live SERP, keywords, backlinks | `bash extensions/dataforseo/install-generic.sh` |
| Ahrefs | Backlink data, keyword rankings, content gap | MCP config |
| SE Ranking | AI Share-of-Voice, GEO visibility | MCP config |
| Profound | LLM citation tracking (ChatGPT, Perplexity, Claude) | MCP config |
| Bing Webmaster | Bing indexation + IndexNow submission | MCP config |

See `references/optional-extensions-mcp.md` for install paths (plugin bundle); full monorepo: `extensions/README.md`.

### Subagent Definitions

For parallel audit execution, scopes and scripts are in **`agents/PARALLEL-AUDIT.md`** (single file). Each platform interprets these natively — Cursor uses its Task tool, Claude Code can use its Agent tool, others read as context. See `agents/README.md` for the orchestration pattern.

### Context Management for Long Sessions

If context fills mid-audit: compress completed findings into `[Section] Finding | Severity | Fix` one-liners, checkpoint the score, continue with remaining sections, merge back to full format at end.

---

## 22. SEO Drift Monitoring

Track changes to SEO-critical page elements over time. `drift_monitor.py` captures baseline snapshots (title, meta, canonical, robots, H1, headings, schema, internal links, word count, Open Graph) and compares against current state using 17 rules across 3 severity levels:

- **Critical** (6 rules): Status code to 4xx/5xx, canonical changed, robots to noindex, redirect on 200, title removed, all schema removed
- **Warning** (7 rules): Title/meta >50% different, H1 changed, headings structure, schema count, word count −20%, links ±30%
- **Info** (4 rules): Minor title/meta tweaks, links 10–30%, word count within 20%

Use cases: pre/post deployment checks, ongoing monitoring, traffic drop investigation, migration validation.

Scripts: `drift_monitor.py` (baseline, compare, history, report) → `references/procedures/22-drift-monitoring.md`

---

## 23. Semantic Topic Clustering

SERP-overlap-based topic clustering for content strategy. Clusters keywords by shared top-10 SERP results (pages ranking for multiple keywords indicate topical overlap). Hub-and-spoke architecture: pillar pages + cluster posts. Generates internal link matrices.

Requires SERP data input (DataForSEO extension or manual CSV with keyword,rank,url format).

Script: `topic_cluster.py` → `references/procedures/23-semantic-clustering.md`

---

## 24. E-commerce SEO

Specialized e-commerce audit procedures and schema validation. Covers Product + Offer schema, MerchantReturnPolicy (requires `returnPolicyCountry` since March 2025), OfferShippingDetails, category vs. product page differentiation, faceted navigation, out-of-stock handling, and EU compliance (Certification migration, IPTC AI image labeling).

Script: `ecommerce_schema.py` → `references/procedures/24-ecommerce-seo.md`

---

## 25. Maps Intelligence & Advanced Local SEO

Extends §12 with geo-grid rank tracking, GBP completeness audit, review intelligence (rating, count, recency, velocity, sentiment), competitor radius mapping, and NAP consistency checking across directories.

Script: `maps_checker.py` → `references/procedures/25-maps-intelligence.md`

---

## Google API Tier System

| Tier | Auth | APIs | Scripts |
|------|------|------|---------|
| 0 | API key (`PAGESPEED_API_KEY`) | PageSpeed Insights, CrUX, CrUX History | `pagespeed.py`, `crux_history.py` |
| 1 | OAuth2 | Google Search Console | `gsc_query.py` |
| 2 | OAuth2 | GA4 Data API | `ga4_report.py` |

Run `google_api_tier.py` to detect available credentials and capabilities. Each tier adds data but lower tiers produce valid audits. See `references/optional-extensions-mcp.md` for extension data sources.

---

## Full Detail Reference

This file provides enough context to route, audit, and execute. For the routing shell and global guardrails, read `SKILL.md`. For step-by-step procedures, load the matching file from `references/procedures/` (see `references/procedures/README.md`). Key procedures on demand:

| Need | Read |
|---|---|
| Full audit process with examples | `references/procedures/02-full-site-audit.md` |
| GEO citation demonstration pattern | `references/procedures/03-geo-ai-search.md` |
| Technical audit full checklist | `references/procedures/04-technical-seo.md` |
| Schema validation checklist | `references/procedures/05-schema-structured-data.md` |
| Content pruning decision tree | `references/procedures/06-content-eeat-and-pruning.md` (§6b) |
| Canonical remediation tables | `references/procedures/11-crawl-indexation.md` |
| Competitor analysis dimensions | `references/procedures/08-competitor-analysis.md` |
| Migration pre/post checklists | `references/procedures/20-site-migration.md` |
| Execute + verify loop with examples | `references/procedures/02-full-site-audit.md` (Mode 3) |
| Drift monitoring rules + workflow | `references/procedures/22-drift-monitoring.md` |
| SERP-overlap topic clustering | `references/procedures/23-semantic-clustering.md` |
| E-commerce schema + faceted nav | `references/procedures/24-ecommerce-seo.md` |
| Geo-grid + GBP + review intelligence | `references/procedures/25-maps-intelligence.md` |
