Semantic site auditor
Skill siddiqss/semantic-seo-suite/skills/semantic-site-auditor
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.From its SKILL.md
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.
2 things to look at
- 7 stars7 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.
- runs commandsInstructs the agent to run 4 commands, including `python ../../scripts/crawl_sitemap.py --domain <domain> --max-pages 500 --out /tmp/urls.json` and 3 more.
SKILL.md
4.4 KB, 980 tokens by cl100k_base, 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.
What ships with it: 1 file
736 B alongside SKILL.md
evals/
- evals.json736 B