traffic-change-diagnosis — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited traffic-change-diagnosis (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The specialist version of the diagnostic method, applied to one question: why did traffic (sessions, pageviews, unique visitors) move?
Read analytics-diagnostic-method first if you haven't. This skill assumes you already know MECE, triangulation, sample size, and Pyramid presentation. It adds the traffic-specific fingerprints and drill paths.
analytics-profile.md if present. The profile tells you the expected monthly traffic range and known measurement gaps. Both matter: a "spike" from 200 to 400 sessions/day on a <1k/month site is plausibly random; the same shape on a 1M/month site is an event.analytics-diagnostic-method. Below ~300 observations per bucket, most "changes" are noise.Walk in this order. Cheap checks first.
Traffic change
├── 1. Measurement (check first, always)
│ ├── Tracking regression (script missing, container unpublished, CSP block)
│ ├── Bot filter toggle (inclusion/exclusion changed)
│ └── Attribution shift (referrer policy, cookie policy, cross-domain)
├── 2. Time shape (what does the curve look like?)
│ ├── Cliff (single hour/day step) → discrete event
│ ├── Ramp (gradual over days/weeks) → campaign / SEO / decay
│ ├── Spike (single-day anomaly) → bot burst, viral, outage resolved
│ └── Cyclic (weekly/monthly pattern change) → seasonality, campaign cadence
├── 3. Channel
│ ├── One channel moved → campaign / algo / platform change
│ ├── All channels moved proportionally → measurement or site-wide issue
│ └── One channel grew, another shrank → mix shift (use Simpson's check)
├── 4. Cohort
│ ├── New users changed, returning didn't → acquisition-side change
│ ├── Returning changed, new didn't → retention / email / loyalty change
│ └── Both changed → site-wide or measurement
└── 5. Content / page
├── One page moved → deploy, SEO page, content change
├── Many pages moved proportionally → site-wide (nav, header, domain)
└── Entry pages moved, deep pages didn't → acquisition landing changeReal diagnostic work is pattern recognition. These are the fingerprints you'll see most often. Recognising the shape narrows the tree in one glance.
Shape: cliff, single channel-agnostic, usually correlated with a deploy or config change.
Signals:
Fix path: check recent deploys, CSP/script-src headers, tag manager container version, and adblock-block-rate if your tool exposes it.
When to suspect it first: if the drop is >20% and happened in a single hour, measurement regression is the single most likely cause.
Shape: spike, usually short (hours to days), often concentrated in one country/ASN/referrer.
Signals:
semalt.com, darodar.com, obvious fake domains).Context: Imperva's 2023 Bad Bot Report found 27.7% of all 2022 web traffic was bad bots. Roughly another 17% was good bots (search crawlers). So ~45% of raw traffic is non-human by default; your filters shape what you see.
Fix path: don't treat bot traffic as a "drop in quality". Filter it out, then re-examine. If the filter just changed (you turned bot exclusion on or off recently), the "change" is entirely a filter event.
Shape: cliff at deploy time, usually affects one section of the site.
Signals:
Fix path: check the deploy log, check the affected URLs for status-code changes, check for missing redirects from old paths. Fast to confirm, fast to fix.
Shape: step change (up at campaign start, down at end), concentrated in one channel.
Signals:
Fix path: confirm with the ads team / spend data. "Down" is fine if planned; "down" is bad if they didn't plan to cut.
Shape: gradual ramp down over weeks or months, concentrated in organic search.
Signals:
Fix path: this isn't an emergency, it's a content project. Don't promise a fix in a week.
Shape: step change or fast ramp, concentrated in one channel (usually organic or one paid platform).
Signals:
Fix path: wait ~2 weeks to see if Google rolls back partially (they sometimes do). Don't panic-ship content changes in week one.
Shape: sharp spike, usually a day or two, then decays.
Signals:
Fix path: no fix needed. Capture email/signup while the spike is live. Measure the retention tail at 7, 30, 90 days to see what you actually got.
Shape: cyclic or predictable ramp, repeats annually or monthly.
Signals:
Fix path: none. Note it. Don't action it.
Do these before anything else. Each takes seconds:
If any of these fail, the branch is "measurement" and you're done with the tree for now. Fix the data, then re-investigate.
The shape of the drop contains most of the information. Always get a timeseries at two granularities: daily for the last ~30 days, and hourly for the last ~72 hours.
| Shape | Likely branch |
|---|---|
| Step down at a specific hour | Deploy, outage, platform policy change, tracking regression |
| Gradual decline over days | SEO decay, audience fatigue, competitor ramp |
| Single-day spike then back to baseline | Bot burst, viral event, alert firing on a stale data point |
| Weekly pattern amplitude changed | Campaign cadence change, seasonality kicking in |
| Absent data for a specific window | Tool outage, pipeline lag, not a real drop |
A non-trivial fraction of raw traffic is bots. Before concluding a real traffic change, verify the filter setup hasn't changed.
If the answer to any of these is "actually yes, the filter just changed", the traffic change is purely a reporting artifact. Not a real event.
Sample size rules from analytics-diagnostic-method apply. Two traffic-specific additions:
VERDICT: <one sentence: what the change is, what caused it>
EVIDENCE:
- <time shape + specific numbers>
- <channel / cohort / page split that localizes the cause>
- <triangulation: second source of data that agrees>
WHAT TO DO NEXT:
- <action, ranked by impact>
CAVEATS:
- <sample size, measurement limits, unresolved alternatives>If the diagnosis is "measurement regression", don't just say "it's broken". Say which page/event/tag, when it broke, what the fix is, and what the actual underlying traffic number is now that you've accounted for the regression.
User: pageviews dropped ~40% starting April 19, what's going on?
Agent:
[Measurement first]
- Realtime dashboard: ~60% of normal hourly pageviews right now.
- Event-to-pageview ratio: events dropped only 12% over the same window.
Pageviews dropped disproportionately more than events. That's suspicious.
- Server access log sanity: request count to app routes is ~flat.
- Deploy log: app deploy on April 19 at 14:02 UTC.
This fingerprints F3 (deploy-correlated drop) with an F1 (tracking regression) overlay.
[Time shape]
Daily chart: cliff at April 19, not a ramp. Hourly chart: drop starts at
14:00-15:00 UTC April 19, exactly aligned with deploy.
[Channel split]
All channels dropped ~proportionally (Direct -42%, Organic -39%,
Paid -38%). Proportional drop across channels means site-wide or
measurement, not a channel issue.
[Page split]
The drop is concentrated on pages under `/blog/*`. Those pages got
restructured in the deploy. Redirects exist but the new page template
is missing the analytics snippet include.
[Triangulation]
- Server logs: blog request volume is normal.
- Database: blog content loads fine.
- Analytics: blog pageviews showing near zero since the deploy.
VERDICT: The April 19 deploy removed the analytics snippet from the new
blog template. Traffic is not actually down; only blog pageview tracking
broke. Real site traffic is roughly flat week-over-week.
EVIDENCE:
- Event-to-pageview ratio shift (events -12%, pageviews -40%) rules out
a real traffic drop.
- The drop is site-wide in the analytics tool but blog-specific in
server logs, localizing the break to blog page tracking.
- Timing aligns to the minute with the April 19 14:02 UTC deploy.
WHAT TO DO NEXT:
- Add the analytics snippet back to the new blog template (one-line fix
in the layout file). ETA: today.
- Backfill the missing blog pageviews from server logs if your reporting
has to cover this week. Otherwise note the gap.
- Add a post-deploy smoke test: `curl -s <blog page> | grep <analytics
snippet ID>`. Prevents the next regression.
CAVEATS:
- Non-blog tracking looks healthy, but run the same snippet-presence
check across all page templates to confirm this is the only break.The method above is platform-neutral. For specific MCP calls per workflow row (realtime sanity, time shape, period comparison, channel localization, geo/device splits, event firing checks), load the tool-map for the active platform: see tool-maps/ and the tool_map: field in analytics-profile.md. If the field is missing, run analytics-profile-setup to set it.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.