.claude/skills/ci-analytics-pollution/SKILL.md
Debug unexplained analytics traffic from CI/CD pipelines hitting production. Use when: (1) Analytics show traffic to URLs that match test patterns like /this-page-does-not-exist, /test-route, or 404 test paths, (2) Traffic has near 1:1 session-to-user ratio suggesting automated hits, (3) Traffic correlates with deploy frequency, (4) HeadlessChrome or Playwright appears in user agents. Covers Playwright, Cypress, and other e2e test frameworks running against production URLs.
npx skillsauth add Dbochman/dotfiles ci-analytics-pollutionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
E2E tests configured to run against production URLs (for post-deploy verification) generate real analytics hits, polluting your data with synthetic traffic. This is especially problematic when tests hit non-existent routes for 404 verification.
Suspect CI pollution when you see:
/this-page-does-not-exist, /test-*, etc.)HeadlessChrome, Playwright, Puppeteer, CypressIdentify suspicious URLs in analytics
Look for: /this-page-does-not-exist, /404-test, /non-existent, etc.
Search codebase for those URLs
grep -r "this-page-does-not-exist" --include="*.ts" --include="*.js"
Check if tests are in e2e/integration test files
# Common locations
tests/e2e/
cypress/integration/
playwright/
Find workflows that set production BASE_URL
grep -r "BASE_URL.*production-domain.com" .github/workflows/
grep -r "baseURL.*production-domain.com" playwright.config.*
Correlate traffic timing with CI runs
For Playwright:
# .github/workflows/post-deploy-check.yml
- name: Run smoke tests on production
run: npx playwright test --grep-invert="404" # Skip 404 tests
For Cypress:
- name: Run smoke tests
run: npx cypress run --spec "cypress/e2e/smoke/**" --env SKIP_404=true
Detect and tag CI sessions via custom dimension:
// analytics.ts
const isCI = /HeadlessChrome|Playwright|Puppeteer|Cypress/.test(navigator.userAgent);
gtag('set', { 'traffic_type': isCI ? 'ci' : 'human' });
Then filter in your analytics dashboard by traffic_type != 'ci'.
// Only init analytics for real users
if (!navigator.userAgent.includes('HeadlessChrome')) {
initializeAnalytics();
}
After implementing:
Symptom: 374 sessions to /this-page-does-not-exist in GA4
Investigation:
# Found in test file
grep -r "this-page-does-not-exist" tests/
# tests/e2e/console-errors.spec.ts:172: await page.goto(`${BASE_URL}/this-page-does-not-exist`);
# Found workflow running against production
grep -r "BASE_URL" .github/workflows/
# .github/workflows/console-check.yml:55: BASE_URL: https://production-site.com
Root cause: Post-deploy workflow ran full Playwright suite including 404 test
Fix: Added --grep-invert="404" to skip 404 tests in production checks
smoke (production-safe) vs full (all tests)@production-safe tag to mark tests that can run against live sitestools
Use exact configured Reolink cameras through the local Home Hub for availability and power status, fresh stills, visual commentary, protected Dylan/Julia/household sharing, and reversible spotlight control. Supports trusted owner tasks and explicitly scoped proactive automations; not for Nest or Ring cameras, arbitrary recipients, recordings, account changes, or raw camera APIs.
data-ai
Privately manage Dylan and Julia's household plant inventory and care history by physical location, bed, and exact Flower Cam view. Use for confirmed plant onboarding from camera conversations, camera- or bed-filtered inventory, record corrections, individual or whole-bed care, and private filtered exports. Pair with reolink-camera when an owner asks about plants visible in Flower Cam images.
testing
Inspect and control the physically secured Reachy Mini at Crosstown through ClawBody. Use for requests to check Reachy, look around, express an emotion, play any official emotion or dance preset, speak proactively, mute or unmute its microphone, stop movement, or describe what its camera sees.
tools
Handle Reachy/iMessage handoffs, selective durable memory, forgetting, and diagnostics; automatic context comes from the gateway plugin.