SKILL.md
Technical SEO Audit
Technical SEO is binary at the base: either crawlers can fetch, render, and index the page, or nothing else you do matters. Audit in that order.
The nine categories
| # | Category | Core checks |
|---|---|---|
| 1 | Crawlability | robots.txt valid, sitemap referenced, accidental noindex, crawl depth <=3 clicks, AI crawler policy |
| 2 | Indexability | canonicals self-referencing, duplicates, thin content, hreflang, index bloat |
| 3 | Security | HTTPS enforced, valid cert, no mixed content, security headers |
| 4 | URL structure | clean descriptive URLs, no redirect chains, consistent trailing slashes |
| 5 | Mobile | viewport tag, 48px touch targets, 16px base font, no horizontal scroll |
| 6 | Core Web Vitals | LCP <2.5s, INP <200ms, CLS <0.1, 75th percentile field data |
| 7 | Structured data | detect and validate, then hand off to claude-seo-schema |
| 8 | JS rendering | critical content in initial HTML, canonical/robots parity between raw and rendered HTML |
| 9 | IndexNow | supported for Bing/Yandex/Naver, recommend for faster non-Google indexing |
Full per-category detail, the AI crawler table, and the JS rendering rules live in references/technical-checks.md. Read it before scoring any category you are not certain about.
Workflow
- Fetch the homepage and key templates. Record status codes, redirect hops, and response headers.
- Fetch
/robots.txtand the sitemap. Check both exist, parse, and agree with each other. - Walk the nine categories in order. For each, record pass/warn/fail plus specific findings with URLs as evidence.
- Check CWV with field data when available (PageSpeed Insights / CrUX). Lab data is a fallback, label it as such. Use INP, never FID, FID is retired.
- Score each category 0-100 and produce an overall technical score.
- Bucket findings: Critical (blocks indexing, fix now), High (fix within a week), Medium (fix within a month), Low (backlog).
Verification
Run curl -sI https://<domain>/ | head -20. Expect a 200 (or a single 301 to the canonical host, then 200), plus strict-transport-security present. A redirect chain longer than one hop, a missing HSTS header, or an HTTP 200 on the non-canonical host each go in the findings, not in a footnote.
Then run curl -s https://<domain>/robots.txt. Expect a parseable file that does not Disallow: / for User-agent: * and does reference the sitemap. If robots.txt is missing, flag it and continue the audit, that alone does not block.
Good vs Bad
Bad: "Site speed could be improved. Consider optimizing images." No metric, no threshold, no priority.
Good: "LCP is 4.1s on mobile field data (threshold 2.5s): High. Largest element is an unoptimized 1.8MB hero PNG served without width/height. Convert to WebP, add explicit dimensions, preload it. Re-test in field data after 28 days."
Footguns
- Auditing raw HTML on a JS-rendered site. You will report missing content that renders fine, or miss canonical conflicts between raw and rendered HTML. Fix: compare initial HTML against rendered output for canonical, robots meta, and structured data. Google may honor either version when they conflict.
- Citing FID. It is removed from every Chrome tool. Fix: INP only.
- Treating a blocked AI crawler as a search problem. Blocking Google-Extended does not affect Google Search or AI Overviews, those use Googlebot. Fix: use the crawler table in references/technical-checks.md before advising blocks.
- Trusting lab CWV as truth. Lab and field data diverge. Fix: prefer field data, and say which one you used.
- Flagging error-page meta tags injected by JS. Google does not render JS on non-200 pages, so those tags are invisible anyway. Fix: check the HTTP status first.
Completion checklist
- [ ] All nine categories scored with evidence URLs
- [ ] curl checks run, results in findings
- [ ] CWV uses INP, data source labeled field or lab
- [ ] Findings bucketed Critical/High/Medium/Low
- [ ] Schema findings handed to claude-seo-schema, not duplicated
Any box unchecked: not done. Fix or say so.