seo-audit-full — Advanced Full SEO Audit
This skill runs a full single-page SEO audit from the seo-audit-full directory.
It does not route to seo-audit when only a URL is provided.
When to Use This Skill
Use seo-audit-full when the user asks for:
- "seo-audit-full"
- "full SEO audit"
- "advanced SEO audit"
- "technical SEO audit"
- "deep audit"
- "comprehensive SEO review"
- "audit everything"
URL-only requests are valid. When external datasets are not supplied, run the full public-signal workflow and clearly note missing data sources in the report.
Input Expected
| Input | Required | Notes | |-------|----------|-------| | Page URL | Yes | The primary page to audit | | Primary keyword | Recommended | Improves content relevance scoring | | PageSpeed API key | Yes | Ask the user for it at the start; run without it if unavailable | | Raw HTML or page content | Optional | Enables more accurate content checks when supplied | | GSC / crawl / analytics data | Optional | Include when supplied, otherwise mark unavailable | | Competitor benchmark data | Optional | Include when supplied |
At the start of a full audit, ask the user for a PageSpeed Insights API key:
For PageSpeed checks, please provide a Google PageSpeed Insights API key.
Get one here: https://developers.google.com/speed/docs/insights/v5/get-started
Open "Acquiring and using an API key" → "Get a Key".
If you do not provide one, I will still run the audit and mark the PageSpeed
module with instructions for getting a key if the API is quota-limited.
Architecture: Full = Core + Performance + Advanced
┌─────────────────────────────────────────────────────────────┐
│ seo-audit-full Workflow │
│ │
│ Phase 1: Run core scripts (./scripts/) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ check-site.py → robots.txt, sitemap, 404, URL │ │
│ │ check-page.py → title, H1, meta desc, slug │ │
│ │ check-schema.py → JSON-LD validation │ │
│ │ fetch-page.py → raw HTML for analysis │ │
│ └──────────────────────────────────────────────────────┘ │
│ ↓ │
│ Phase 2: Run performance + full-only scripts (./scripts/) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ check-pagespeed.py → Lighthouse scores + metrics │ │
│ │ check-social.py → OG Tags + Twitter Card │ │
│ │ (more scripts added here as modules grow) │ │
│ └──────────────────────────────────────────────────────┘ │
│ ↓ │
│ Phase 3: LLM-only advanced checks │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ E-E-A-T content quality scoring │ │
│ │ Duplicate content signals │ │
│ │ Anchor text quality assessment │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Output
Produce an Advanced Full SEO Audit Report by filling the template at assets/report-template.html, then save it to a file — never print raw HTML to the terminal.
File naming: reports/<hostname>-<slug>-full-audit.html
https://example.com/blog/best-tools → reports/example-com-blog-best-tools-full-audit.html
https://example.com/ → reports/example-com-full-audit.html
After saving, tell the user:
✅ Full Report saved → reports/example-com-full-audit.html
Open it now? (yes / no)
If yes → run: open reports/example-com-full-audit.html
Template placeholders — fill each independently:
| Placeholder | Content |
|---|---|
| {{summary_verdict}} | One sentence: total checks run, how many failed/warned/passed |
| {{summary_critical_html}} | <li> per critical item, or <li class="summary-empty">None</li> |
| {{summary_warnings_html}} | <li> per warning item, or <li class="summary-empty">None</li> |
| {{summary_passing_html}} | <li> per passing check, or <li class="summary-empty">None</li> |
| {{pagespeed_checks_html}} | Full PageSpeed module using check-pagespeed.py output |
| {{site_checks_html}} | Site-level check tables |
| {{eeat_checks_html}} | E-E-A-T trust page table |
| {{page_checks_html}} | Page-level check tables, including full-only additions |
| {{priority_actions_html}} | Ordered priority action list |
| {{insights_html}} | Optional finding walkthrough cards |
Scripts
Run full scripts from this directory. All output is structured JSON — use it directly as evidence.
Dependencies: pip install requests
Phase 1: Core scripts
# 1. site-level checks (robots.txt + sitemap.xml + 404 + URL canonicalization)
python scripts/check-site.py https://example.com
# 2. page-level checks (H1, title, meta description, canonical, URL slug)
python scripts/check-page.py https://example.com --keyword "primary keyword"
# 3. fetch raw HTML for downstream scripts
python scripts/fetch-page.py https://example.com --output /tmp/page.html
# 4. JSON-LD schema validation
python scripts/check-schema.py --file /tmp/page.html
Phase 2: Full-only scripts
# 5. PageSpeed / Lighthouse checks
python scripts/check-pagespeed.py https://example.com --strategy mobile --timeout 180 --api-key "USER_PROVIDED_KEY"
# If no key was provided, run without --api-key and report any quota/API-key error.
# 6. Social tags: OG + Twitter Card validation
python scripts/check-social.py --file /tmp/page.html
# Or directly from URL:
python scripts/check-social.py https://example.com
Each script exits with code 0 (all pass/warn) or 1 (any fail/error).
PageSpeed can take 200 seconds. Use a 180-second timeout by default. If it
still times out, mark the Page Speed module as error and state that the
PageSpeed API timed out; do not treat that as confirmed page performance failure.
If PageSpeed fails because no API key was provided or Google returns a quota/API
key error, keep the audit running and render the PageSpeed module as error with
this instruction:
Get a PageSpeed API key at https://developers.google.com/speed/docs/insights/v5/get-started → "Acquiring and using an API key" → "Get a Key".
Scope — Full Audit Check Whitelist
Full runs its own core checks plus the full-only items marked ★ below.
Site-Level Checks (in {{site_checks_html}})
Core checks:
- robots.txt · sitemap.xml · 404 Handling · URL Canonicalization · i18n / hreflang
Page Speed Checks (in {{pagespeed_checks_html}})
Full-only:
- Lighthouse category scores: Performance · Accessibility · Best Practices · SEO
- Lab metrics: FCP · LCP · TBT · CLS · Speed Index
- Final URL and screenshot availability
E-E-A-T Checks (in {{eeat_checks_html}})
Core checks:
- About Us · Contact · Privacy Policy · Terms of Service · Media/Partners (only if present)
Contact logic (Contact row only):
- A dedicated
/contactpage is not required - Pass if contact is reachable via any of: dedicated contact page (HTTP 200) · About page with contact details · footer/nav mailto, email, social links, or contact form
- Fail only when no contact pathway exists anywhere on the site
- Missing
/contactalone is not a fail when About or footer/nav already expose contact info
E-E-A-T infrastructure rules — two layers per trust page:
- Layer 1 — Exists: HTTP 200 for the trust page URL (Contact uses Contact-specific rules above)
- Layer 2 — Reachable: linked from footer or main nav
| Page | Required | |---|---| | About Us | Yes | | Contact | Yes — dedicated page optional; About or footer/nav contact details satisfy this | | Privacy Policy | Yes | | Terms of Service | Yes | | Media / Partners | No — include only if present |
Status rules (About, Privacy, Terms, Media/Partners):
- Page missing (non-200) → Fail
- Page exists but not linked in footer/nav → Warn
- Page exists and linked in footer/nav → Pass
- Optional page missing → skip, do not include row
Contact-specific rules:
- Try common paths (
/contact,/contact-us) — HTTP 200 counts as Exists - If no contact page, check the About page body for email, social, or contact details
- Also scan homepage footer and nav for
mailto:, visible email, social links, or a contact form - Exists Pass if any contact pathway is found
- Exists Fail only when no contact information is found anywhere
- Reachable Pass if a contact page link or contact details appear in footer/nav
- Reachable Warn if contact is only reachable inside About page content, not directly in footer/nav
- Do not recommend creating
/contactwhen About or footer already expose contact info
Page-Level Checks (in {{page_checks_html}}), output in this exact order:
Core checks: URL Slug · Title Tag · Meta Description · H1 Tag · Canonical Tag · Image Alt Text · Word Count · Keyword Placement · Heading Structure · Internal Links · Schema (JSON-LD)
★ Full-only additions:
- OG Tags — og:title, og:description, og:image, og:type, og:url presence and validity
- Twitter Card — twitter:card type, title/description/image (with OG fallback detection)
How to Use Script JSON Output
Same rules across full audit modules — map each field's status directly to the report check table:
status→pass/warn/fail/error→ badge in reportdetail→ starting point for Evidence line- Do not contradict script output unless you have additional observable evidence
For check-social.py output:
og.status→ OG Tags row statustwitter_card.status→ Twitter Card row statusog.fields.*→ individual field details for the detail celltwitter_card.fields.*→ individual field details, note fallback fields
For check-pagespeed.py output:
status→ overall Page Speed statuscategory_status→ Lighthouse Scores badge statusmetric_status→ Core Lab Metrics badge statusfinal_url→ Final URL linecategories.performance.score→ Performance scorecategories.accessibility.score→ Accessibility scorecategories["best-practices"].score→ Best Practices scorecategories.seo.score→ SEO scorecompact_metrics.fcp.display_value→ FCPcompact_metrics.lcp.display_value→ LCPcompact_metrics.tbt.display_value→ TBTcompact_metrics.cls.display_value→ CLScompact_metrics.si.display_value→ Speed Indexscreenshottruthy → Screenshot available
Do not use overall status for the Lighthouse Scores badge. Category scores use
Lighthouse thresholds: 90–100 pass, 50–89 warn, 0–49 fail. Example: Performance
60, Accessibility 84, Best Practices 100, SEO 100 means category_status is
warn. If LCP or Speed Index fails, metric_status and overall status may be
fail while the Lighthouse Scores panel remains warn.
Inside {{pagespeed_checks_html}}, include a short Priority Actions list after
the score/metric cards. Keep it to 2–4 concise items based on failing or warning
PageSpeed fields:
- LCP slow → optimize hero media, preload critical image, reduce render-blocking CSS
- Speed Index slow → defer non-critical scripts and reduce above-the-fold JS/CSS
- TBT high → split long tasks and delay third-party tags
- Performance score warning/fail → prioritize the biggest Lighthouse opportunities
Always include the official diagnostic link:
https://pagespeed.web.dev/
LLM Review Instructions
Core LLM reviews
Resolve every llm_review_required: true field before writing the report:
H1 semantic judgment, Title keyword position, URL Slug evaluation, and Meta
Description quality must all receive an explicit judgment.
Full-only LLM checks
OG Tags quality (always review):
og:title : Does it differ meaningfully from <title>? It should be optimized for social sharing.
og:description : Is it compelling for social feeds? Different focus than meta description is OK.
og:image : Is the URL an actual image path (not a page URL)?
Twitter Card completeness:
If twitter:card is "summary_large_image", twitter:image (or og:image fallback) must be
at least 300x157px. Flag if the image URL looks like a small icon or favicon.
Recommended Workflow
- Acknowledge full scope — confirm this is a full audit
- Infer primary keyword — read the page H1, title, and first paragraph unless the user provided one
- Phase 1: Run core scripts — check-site → check-page → fetch-page → check-schema
- Phase 2: Run full-only scripts — check-pagespeed → check-social
- Core checks — 404 handling, URL canonicalization, E-E-A-T trust pages, i18n/hreflang
- PageSpeed checks — summarize Lighthouse category scores and lab metrics
- LLM-only advanced checks — E-E-A-T content quality, duplicate content signals, anchor text quality
- Summarize findings — Evidence / Impact / Fix format
- Priority actions — top 5 highest-impact fixes with effort/impact tags
- Render report — save to
reports/<hostname>-<slug>-full-audit.html
Report Detail Writing Rules
Use strict formatting:
Pass → one short phrase. No lists, no elaboration.
Warn → one <div class="detail-issue"> with ≤2 bullet points. One <div class="detail-fix">.
Fail → same as Warn. Lead with the exact failure.
Mandatory Finding Format
**Finding: [Finding Title]**
- **Evidence:** [Observable fact, data point, or marked assumption]
- **Impact:** [SEO / UX consequence]
- **Fix:** [Actionable recommendation with example]
For Priority Actions, add effort/impact tags:
1. [High Impact / Low Effort] Fix og:image — social shares currently show no preview.
Reference Files
- Detailed audit modules and field definitions: references/REFERENCE.md
- Final HTML report template: assets/report-template.html
- PageSpeed validation script: scripts/check-pagespeed.py
- Social tags validation script: scripts/check-social.py
- Core scripts: scripts/ (check-site, check-page, check-schema, fetch-page)
Scan to join WeChat group