Phase 4: Drift Monitoring

The audit produces a point-in-time snapshot. Drift monitoring converts that snapshot into something you can detect regressions against.

What /seo-drift adds

The seo-drift skill captures a SHA-256-hashed baseline of 13 SEO-critical elements per URL: title, meta description, canonical, meta robots, H1/H2/H3 arrays, JSON-LD schema, Open Graph, Core Web Vitals, HTTP status, and HTML/Schema content hashes. Comparison applies 17 rules across 3 severity levels (CRITICAL / WARNING / INFO).

Setup and baseline verification

Use the complete shared script bundle and setup checks in the runbook §1 before capture (--with-drift --seo-bundle "<bundle>"). Run baseline and compare through that same managed runtime. A minimum verification is:

python "<bundle>/scripts/runtime.py" run drift_baseline.py <url> --skip-cwv
python "<bundle>/scripts/runtime.py" run drift_compare.py <url> --baseline-id <saved-id> --skip-cwv

Replace <saved-id> with the returned baseline ID. --skip-cwv is for this verification or unavailable performance evidence; it does not measure Core Web Vitals. Record any omitted performance evidence and preserve separately collected performance results. Require successful capture and comparison, a persisted baseline row in the reported SQLite database, and a comparison referencing that ID. Inspect the captured status/title/headings/canonical/schema against the page evidence; a successful exit with empty or wrong fields is not a valid baseline. Record the absolute database path, URL set, timestamp, baseline IDs, source revision, comparison result, and field coverage. Raw-response-only captures must be labelled as such; they cannot establish rendered coverage for JS-dependent pages. Preserve this initial snapshot, and add a separate post-fix baseline after implementation. If capture or comparison fails, mark drift unavailable with the repair action; do not silently substitute manual JSON and mark the step complete.

Commands

CommandPurposeWhen to run
/seo drift baseline <url>Capture current SEO state as a “known good” snapshotEnd of audit (lock the post-fix state); before any planned deployment or migration
/seo drift compare <url>Diff current page state against the stored baselineMonthly for retainer clients; after every production deployment
/seo drift history <url>Show change history for a URLRetrospectives; ranking-drop investigations

When to run baseline capture

Audit contextBaseline timing
One-off audit (no retainer)Capture the initial snapshot at runbook §3.18 and hand over its database path, URL list, and repeat command. A retainer is not required to preserve a useful starting point.
Retainer engagement startingPreserve the initial audit snapshot; add a separate baseline on the top 10-20 commercially important URLs after Tier 1 fixes ship.
Pre-migrationCapture baseline of all top organic landing pages on the current site before launch.
Pre-deploymentOptionally baseline before any significant template/theme/plugin change.

Monthly retainer workflow

  1. /seo drift compare <url> against each baselined URL
  2. Triage: review CRITICAL findings promptly and agree any escalation with the client; WARNINGs roll up into the monthly report
  3. For any CRITICAL or WARNING: judge whether the change was intentional (re-baseline) or accidental (escalate to dev)
  4. After intentional changes, re-baseline

What drift does NOT replace

  • Rank tracking — drift watches on-page state, not SERP position
  • GSC monitoring — drift doesn’t see crawl errors or index status
  • Squirrel Scan — drift watches 13 elements per URL; Squirrel Scan covers 230+ rules across 18 categories
  • Content quality judgment — the skill diffs strings; you judge whether the new string is better
Keep the judgment manual. Resist the temptation to put drift on a cron + email-alert hook. Most findings will be intentional changes or non-actionable noise. The retainer value is you triaging the noise and surfacing the 2-3 things per month that actually need action.