Transparency dashboard
Citation reach — weekly aggregated metrics
How often Policy Window content is fetched by AI agents (Claude, ChatGPT, Perplexity, Gemini, Copilot, NotebookLM) and classic search crawlers, aggregated by week. Counterpart to /wiki/influence-tracker (which logs editorially-verified citations); this page documents fetches in aggregate without per-user data.
Aggregation not live yet. The route-visit recorder presently covers internal dashboard routes only. Extending it to wiki routes requires a schema migration (adding a uaCategory column to RouteVisit) and a beacon-source change; both are scheduled as a follow-up. See saved-plan §8 sequencing.
Per saved plan §8, AI-agent UA classification is a charter-compliant aggregate-only mechanism. The classifier (a pure function, no storage) is shipped + pinned today so the page is ready to render real numbers once the aggregator catches up. Expect first non-trivial numbers within 7–14 days of the aggregator going live.
Last 7 days
Aggregate fetch count across all wiki routes, grouped by User-Agent category. Total fetches in the window: 0.
| User-Agent category | Fetches (last 7d) |
|---|---|
| Claude (Anthropic) | 0 |
| ChatGPT / GPTBot (OpenAI) | 0 |
| Perplexity | 0 |
| Gemini / Google-Extended | 0 |
| Copilot (Microsoft) | 0 |
| NotebookLM (Google) | 0 |
| Anthropic SDK (programmatic) | 0 |
| OpenAI SDK (programmatic) | 0 |
| Googlebot (search index) | 0 |
| Bingbot (search index) | 0 |
| Human browser | 0 |
| Unknown bot / other | 0 |
Last 28 days
Relative fetch volume per UA category over the past 4 weeks. Bars are scaled to the largest row in the window; a flat zero band means no data is being aggregated yet (see banner above). Rendered as inline SVG (no charting dependency, no client JS, no third-party analytics).
What this tells us
The counts here measure fetch volume, not citation quality. A high Claude or ChatGPT row means those agents are pulling Policy Window pages into their response context; it does not mean the agent used the content in a final answer, attributed it correctly, or surfaced it to the end user. For verified citations, see /wiki/influence-tracker. What the numbers do not capture: CDN / edge caches (a cached page served downstream produces no PW hit), fetches that strip or spoof the User-Agent, fetches routed through corporate VPNs or proxies that overwrite the UA, and direct API consumers using /wiki/api rather than the wiki HTML surface (those are tracked separately).
What we don't collect
- No IP addresses. The classifier reads the User-Agent header at request time and discards it after mapping to a category bucket.
- No cookies for this purpose. The categorisation runs before any session lookup; anonymous and authenticated visitors are bucketed identically.
- No browser fingerprints. We do not collect screen size, fonts, plugins, canvas hashes, or any other fingerprint signal.
- No per-user tracking. The aggregate counts are the only output; no row in any table is attributable to an individual visitor, session, or device.
- No third-party analytics. No Google Analytics, no Plausible, no Fathom, no Segment, no Mixpanel. The dashboard is rendered server-side from a first-party aggregate query.
See charter §7.7 (charter limit on covert persuasion + observational metrics) and /privacy (data-handling disclosures) for the binding statements.
Methodology
The classifier is a pure function that maps a raw User-Agent string to one of 12 buckets: Claude (Anthropic), ChatGPT / GPTBot (OpenAI), Perplexity, Gemini / Google-Extended, Copilot (Microsoft), NotebookLM (Google), Anthropic SDK (programmatic), OpenAI SDK (programmatic), Googlebot (search index), Bingbot (search index), Human browser, Unknown bot / other. Patterns are sourced from each AI vendor's published crawler documentation (Anthropic, OpenAI, Google, Perplexity, Microsoft) as of 2026-05-31. Order of checks matters — more specific AI-agent patterns are tested before classic search crawlers, and the Mozilla / WebKit / Gecko fallback is the last positive bucket before "unknown bot".
Source file: src/lib/observability/ai-agent-ua.ts. Pin test that locks the classifier's contract: src/__tests__/ai-agent-ua-pin.test.ts. When a new AI agent appears with a distinct UA pattern, adding it requires updating both files and is captured in the changelog.