Semantic site auditor
Skill siddiqss/semantic-seo-suite/skills/semantic-site-auditor
Grounded semantic SEO, GEO & off-page as Claude Code skills — with a fabrication guard that refuses to invent numbers. Free & MIT.
npx -y skills add siddiqss/semantic-seo-suite --skill semantic-site-auditorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Audit an existing site against its topical map — coverage gaps, keyword cannibalization, entity drift, orphan pages, and per-page micro-semantic issues. Use whenever the user asks to audit a site, find content gaps, check for cannibalization, asks "why aren't we ranking", wants to know what's missing from their niche coverage, or wants a pre-sales content audit of any domain. Produces a prioritised audit report with provenance on every finding. Triggers on audit/gap/cannibalization intent broadly.
SKILL.md
4.4 KB, as published. Nobody here has run it
semantic-site-auditor
Turn a live site + its topical map into a prioritised, evidence-backed fix list. Every
finding carries provenance (measured from crawl, derived from embeddings) — no
invented scores. This is also the strongest pre-sales artifact for services work: run it
on a prospect's domain before a call.
Read first: ../../framework/topical-map-theory.md (gap/section logic),
../../framework/internal-linking-rules.md (orphans), ../../framework/eav-modeling.md
(drift = claimed vs perceived identity).
Preconditions
brands/<slug>/config.yaml(tier).- A
topical-map.jsonto audit against. If none exists, run topical-map-builder first (you can't measure coverage without a target map). entity-profile.json(for the claimed-identity centroid used by drift).
Workflow
-
Crawl + extract the site into
brands/<slug>/data/crawl/:python ../../scripts/crawl_sitemap.py --domain <domain> --max-pages 500 --out /tmp/urls.json python ../../scripts/extract_page_content.py --urls /tmp/urls.json --out-dir brands/<slug>/data/crawlRobustness:
crawl_sitemap.pyfalls back to a same-domain BFS when there's no sitemap, respects robots.txt, and caps pages/depth. For JS-rendered sites, extraction may be thin — note that in the report rather than treating missing content as a gap. -
Run the analysis engine:
python ../../scripts/audit_site.py \ --map brands/<slug>/topical-map.json --crawl-dir brands/<slug>/data/crawl \ --entity-profile brands/<slug>/entity-profile.json \ --locked brands/<slug>/locked-facts.json --brand "<Brand>" \ --out brands/<slug>/audits/<date>-full.mdIt matches each page to its nearest map node (embedding cosine) and reports:
- Coverage gaps — nodes with no matching page (
derived). - Cannibalization — page pairs with high similarity + same intent, and any node
hit by multiple pages (
derived). - Entity drift — pages farthest from the core-section centroid, i.e. content
pulling the site away from its claimed identity (
derived). At T0 (no embeddings), do this qualitatively and label itasserted— never emit a fake distance. - Orphans — pages with no incoming internal links (
measuredfrom the crawl link graph). - Micro-audit — per-page lint (naked stats, fluff, unanswered question headings) reusing the draft rules.
- Coverage gaps — nodes with no matching page (
-
Review + prioritise. The report ends with a prioritised action list: create (gap), consolidate/redirect (cannibalization), rewrite/relink or prune (drift), relink (orphan). Sanity-check each finding — with the offline hash-fallback embeddings, similarities are coarse; re-run with a model backend before making irreversible calls (redirects/prunes).
-
Feed back into the map. Apply
status_updatesfrom the audit JSON (matched nodes →publishedwith their URL); mark thin/drifting matched nodesneeds-update; add the confirmed gaps tocalendar.mdas new priorities. -
Render the heatmap (
../../scripts/map_heatmap.py) after status updates so coverage is visible at a glance.
Definition of done
- Report produced with all five finding types, each provenance-tagged.
- At least one finding is verifiable by hand (a true gap or a true cannibalization pair).
- Map statuses updated; gaps flowed into the calendar.
- No fabricated scores anywhere (drift/cannibalization are
derivedor clearlyasserted).
Grounding ladder
- T0: crawl + extract still work (they're just HTTP); matching/cannibalization/drift
are LLM-qualitative and labeled
asserted. Orphans + micro-audit aremeasured. - T1: embedding-based matching/cannibalization/drift (
derived) — the real version. - T1+GSC: confirm cannibalization with pages sharing top queries in Search Console
(the strongest,
measuredsignal) — see seo-performance-tracker.