# Top Five Test Plans

The first five systems are OpenAI, Google, Microsoft, Anthropic, and Perplexity.
Each test should be run against the same local or public URL set, with the same
timestamp window and raw log export format.

## Shared Test URLs

- `/lab/root`: observed server-side HTML page.
- `/lab/depth/0`: crawl-depth entry page.
- `/track/resource/pixel.gif`: image beacon.
- `/track/resource/style.css`: CSS resource.
- `/track/event`: JavaScript capability event endpoint.
- `/robots.txt`: crawler policy.
- `/sitemap.xml`: discovery hint.

## Shared Evidence To Collect

- Server HTML request.
- Tracking-pixel request tied to the same attempt id.
- First-party on-page analytics event tied to the same attempt id.
- Subresource requests linked by parent event id.
- Client capability event, if any.
- Crawl depth and traversal order.
- User-agent and all relevant request headers.
- IP, later enriched with CIDR, ASN, reverse DNS, and provider range match.
- Absence evidence after a fixed wait window.

For every test, compare the server log, tracking pixel, and analytics event.
This makes HTML-only retrieval, no-resource retrieval, and no-JavaScript
retrieval visible instead of ambiguous.

## Test 1: OpenAI / ChatGPT

### Hypotheses

- `OAI-SearchBot` and `GPTBot` identify by user-agent and published OpenAI IP
  ranges.
- `ChatGPT-User` appears only after a user-triggered request from ChatGPT.
- User-triggered fetches may retrieve HTML and selected resources, but should
  not be assumed to execute JavaScript.

### Trigger Methods

1. Ask ChatGPT: "Open this URL and summarize what it says:
   `http://HOST/lab/root`."
2. Ask ChatGPT Search: "Search for this exact URL and summarize it:
   `http://HOST/lab/root`."
3. After public deployment, allow time for automatic indexing and check for
   `OAI-SearchBot` and `GPTBot`.

### Fingerprint Signals

- Strong: UA contains `OAI-SearchBot`, `GPTBot`, or `ChatGPT-User` AND IP is in
  the matching OpenAI JSON range.
- Medium: UA contains an OpenAI bot string but IP enrichment is missing.
- Behavioral: HTML-only vs resource fetch vs JavaScript event distinguishes
  crawler, fetcher, and browser-backed agent.

### Initial Certainty Model

- 95%: matching OpenAI UA plus matching official IP range.
- 75%: matching OpenAI UA only.
- 55%: matching OpenAI IP range only plus behavior consistent with retrieval.
- Below 50%: generic browser UA with no OpenAI network match.

## Test 2: Google / Gemini

### Hypotheses

- Googlebot automatic crawling is verifiable by user-agent, IP range, reverse
  DNS, and forward DNS.
- User-triggered Google fetchers may ignore robots.txt and behave differently
  from Googlebot.
- Gemini answers may rely on Google Search infrastructure rather than a
  distinct Gemini crawler.

### Trigger Methods

1. Request indexing/discovery through a public URL and sitemap.
2. Ask Gemini or Google AI mode about a public experiment URL.
3. Compare visits to robots-disallowed and robots-allowed pages.

### Fingerprint Signals

- Strong: Google UA plus IP in Google crawler/fetcher range plus valid reverse
  and forward DNS.
- Medium: Google UA plus IP range match.
- Behavioral: HTTP caching headers, resource fetching, crawl depth, and robots
  behavior.

### Initial Certainty Model

- 97%: Google UA plus IP range plus reverse/forward DNS verification.
- 90%: Google UA plus official IP range.
- 70%: Google UA only.
- 55%: Google IP/fetcher range only with matching behavior.

## Test 3: Microsoft / Bing / Copilot

### Hypotheses

- Bingbot is the primary public identity for Bing and Copilot web retrieval.
- Copilot answers may come from the Bing index rather than a live Copilot
  crawler.
- `BingPreview` may fetch pages for previews and behave differently from
  `bingbot`.

### Trigger Methods

1. Submit or expose a public URL and sitemap.
2. Ask Copilot to summarize the public experiment URL.
3. Compare immediate live fetches with later Bingbot crawl events.

### Fingerprint Signals

- Strong: `bingbot` or `BingPreview` UA plus IP in
  `https://www.bing.com/toolbox/bingbot.json`.
- Medium: Microsoft/Bing UA only.
- Behavioral: automatic crawl depth vs user-triggered preview fetch.

### Initial Certainty Model

- 95%: Bing UA plus Microsoft-published IP range.
- 75%: Bing UA only.
- 55%: Microsoft/Bing IP range only plus matching crawl behavior.

## Test 4: Anthropic / Claude

### Hypotheses

- `ClaudeBot`, `Claude-SearchBot`, and `Claude-User` represent separate use
  cases.
- Claude user-triggered retrieval may not behave like automatic indexing.
- Anthropic IP list can confirm origin, but role needs UA and behavior.

### Trigger Methods

1. Ask Claude to summarize the experiment URL.
2. Ask Claude to follow links from `/lab/depth/0`.
3. After public deployment, watch for `ClaudeBot` and `Claude-SearchBot`.

### Fingerprint Signals

- Strong: Claude UA plus IP in `https://claude.com/crawling/bots.json`.
- Medium: Claude UA only.
- Behavioral: user-triggered retrieval should correlate with the exact prompt
  timestamp.

### Initial Certainty Model

- 95%: Claude UA plus Anthropic IP range.
- 75%: Claude UA only.
- 60%: Anthropic IP range plus exact prompt-time correlation.

## Test 5: Perplexity

### Hypotheses

- `PerplexityBot` is search/discovery and should respect robots.txt.
- `Perplexity-User` is user-triggered and may ignore robots.txt.
- Perplexity should expose distinct IP range lists for the two roles.

### Trigger Methods

1. Ask Perplexity to summarize the exact experiment URL.
2. Ask Perplexity to search for the site by name after public deployment.
3. Compare access to robots-allowed and robots-disallowed pages.

### Fingerprint Signals

- Strong: `PerplexityBot` UA plus IP in `perplexitybot.json`, or
  `Perplexity-User` UA plus IP in `perplexity-user.json`.
- Medium: Perplexity UA only.
- Behavioral: user-triggered fetch timestamp matches prompt.

### Initial Certainty Model

- 95%: Perplexity UA plus matching official IP range for that role.
- 78%: Perplexity UA only.
- 65%: Perplexity IP range plus exact prompt-time correlation.

## Cross-System Tests

### HTML-Only Test

Expected result:

- HTTP clients and some AI fetchers request only `/lab/root`.
- Rendering systems request CSS/images.
- JavaScript-capable browsers send `/track/event`.

### Crawl-Depth Test

Expected result:

- Search crawlers may follow links beyond depth 1.
- User-triggered assistants may stop at the requested page.
- Browser-backed agents may fetch visible resources but not crawl deep unless
  instructed.

### Robots Variant Test

Expected result:

- Automatic crawlers should respect robots rules.
- User-triggered fetchers may ignore robots rules depending on provider policy.

### Noindex/Nosnippet/Nofollow Test

Expected result:

- Some systems will fetch pages but not index or cite them.
- Some user-triggered fetchers may retrieve content despite indexing controls.

### Cookie Consent Test

Expected result:

- Some AI retrieval clients may read visible HTML behind a consent popup without
  accepting.
- Some browser-backed agents may execute JavaScript but not click accept or
  reject.
- Some systems may report only the consent text and ignore page content.
- Automatic crawlers and user-triggered fetchers may behave differently.

Record whether the server saw only the HTML request, or also tracking-pixel,
analytics, and subresource events.
