Commands
| Command | What it does |
/seo drift baseline <url> [--label NAME] | Captures the current state of a page and stores it as a labeled snapshot in SQLite |
/seo drift compare <url> [--against LABEL] | Fetches current page state and diffs against the most recent (or labeled) baseline, returning a severity-tagged report |
/seo drift history <url> | Lists every baseline for the URL with timestamps and surfaces drift between consecutive captures |
Severity Tiers
Every rule fires at one of three severity levels. The level drives both visual signal in the report and exit code in CI.
| Tier | Meaning | Examples |
| CRITICAL | SEO-breaking change. Likely traffic loss. Fix immediately. | Canonical flipped to wrong URL, robots noindex added, schema block removed, hreflang return tag broken, status code changed to 4xx/5xx |
| WARNING | Potential impact. Investigate within a sprint. | Meta description length swung beyond healthy range, h1 text changed, OG image removed, h2 hierarchy reordered, internal anchor distribution shifted |
| INFO | Awareness only. May be intentional. Track for trend. | Minor copy edits to title, image alt text rewritten, OG description tweaked, schema block reformatted but semantically equivalent |
CI Integration
The skill exits non-zero on critical drift. Wire it into your deploy pipeline so a regression fails the build before it ships to production. Sample shell snippet for a typical pre-deploy + post-deploy flow:
#!/usr/bin/env bash
# pre-deploy.sh: capture current production state as a baseline
/seo drift baseline https://example.com --label "pre-deploy-$(git rev-parse --short HEAD)"
# ... deploy happens ...
# post-deploy.sh: compare new production state against the baseline we just took
/seo drift compare https://example.com --against "pre-deploy-$(git rev-parse --short HEAD)"
# exits non-zero on critical drift, fails the build, blocks the next stage
The SQLite database (.seo-drift.db) lives in the project root and should be committed to the repo so every developer and every CI run shares the same baseline history. Baselines are deterministic, so two runs against an unchanged page produce identical snapshots.
What Gets Captured
Each baseline records the SEO-critical fields below. The 17 comparison rules operate on subsets of these fields.
- Title tag and meta description
- Canonical URL, meta robots, and hreflang (including return tags)
- Heading hierarchy: h1, h2, h3 arrays
- JSON-LD schema blocks (parsed and hashed)
- Open Graph and Twitter Card tags
- Core Web Vitals via PageSpeed Insights (optional, skip with
--skip-cwv)
- HTTP status code
- SHA-256 hashes of full HTML body and schema content for fast change detection