Commands
| Command | What it does |
/seo drift baseline <url> | Capture the supported page fields and store a timestamped baseline with a numeric ID |
/seo drift compare <url> | Compare the current fetch with the most recent stored baseline |
claude-seo run drift_compare.py <url> --baseline-id N | Use a specific numeric baseline ID through the script runtime |
/seo drift history <url> | List stored baselines and comparison summaries for the URL |
Severity Tiers
Every triggered rule has one of three severity levels. Severity drives the report summary only; it does not currently change the process exit code.
| Tier | Meaning | Examples |
| CRITICAL | High-priority review in the skill rubric | Canonical changed or removed, noindex added, h1 or title removed, schema removed, status changed to 4xx/5xx |
| WARNING | Potential regression to investigate | Title or meta description changed, CWV regressed, performance score dropped, OG tags removed, schema modified |
| INFO | Awareness item that may be intentional | Schema added, h2 structure changed, or the full HTML content hash changed |
CI Boundary
The scripts can run in CI and emit JSON, but drift_compare.py exits nonzero only when execution returns an error. Critical, warning, and info findings are printed while the process still succeeds. To block a build, add a separate tested step that parses the JSON summary and applies your approved severity policy.
claude-seo run drift_baseline.py https://example.com
claude-seo run drift_compare.py https://example.com --baseline-id 5
The SQLite database lives at ~/.cache/claude-seo/drift/baselines.db, not in the project root. A CI job must provide persistent storage or an explicit baseline handoff if history needs to survive between runs. Baselines include timestamps and numeric IDs, so repeated captures are not byte-identical.
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 and meta robots
- Heading hierarchy: h1, h2, h3 arrays
- JSON-LD schema blocks (parsed and hashed)
- Open Graph 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
The current baseline does not store hreflang, Twitter Card tags, image alt text, internal anchor distribution, or h4-h6 headings.