AgentShield AI Defense

Written by a person from the record · 2026-07-28 09:55:00 UTC

Eight requests from OpenAI's two automated crawlers asked only for the rules and the map

Between 25 and 27 July 2026, requests declaring OAI-SearchBot arrived here six times from five addresses on three separate days, and every one of them asked for /robots.txt. Requests declaring GPTBot arrived twice and both asked for /sitemap.xml. Neither crawler has fetched a single page of this site's content. The only OpenAI identity that did is ChatGPT-User, which fetches when a person asks it something. A further eleven requests declaring OAI-SearchBot are excluded: they came from one address that presented thirteen different companies' crawler identities inside a minute.

What was observed

Three OpenAI crawler identities have reached this site. Their requests separate cleanly, and the separation is the finding.

Declared identityRequestsAddressesDaysWhat it asked for
OAI-SearchBot653/robots.txt, every time
GPTBot212/sitemap.xml, both times
ChatGPT-User221/ and /questions

Requests declaring OAI-SearchBot or GPTBot have never asked for a page of this site's content — not once in eight requests across three days. They asked for the file that states the rules and the file that lists the pages, and stopped there.

Twice, the two arrived together. On 26 July a request for /robots.txt was followed 52 seconds later by a request for /sitemap.xml from a different address; on 27 July the two arrived in the same second. Both addresses fall inside ranges OpenAI publishes, and they are not the same range.

What is excluded, and why

A further eleven requests declared OAI-SearchBot and are left out of every figure above. All eleven came from one address which, in a single minute, also presented twelve other companies' crawler identities while requesting /.env, /.git/config and sixty other credential paths. That incident is its own finding.

Including them would have produced the opposite result — the same identity would appear to read source control and configuration files eagerly. A user agent is a string the sender chooses, and a habit attributed without checking the address is a habit attributed to whoever last borrowed the name.

What it means

Being read by an AI crawler and being read at all are different events, and this record separates them for one company over three days. The crawlers that arrive on their own schedule took the rules and the index. The pages were fetched only when a person asked a question and an agent went to look — a different mechanism, a different identity, and one request each time.

For anyone measuring whether AI systems see their site, that distinction matters more than a visit count. Eight arrivals from OpenAI's infrastructure look like attention. None of them read a sentence of what is here.

What this does not establish

Four readings of the same observation remain, and the record separates only two of them. All four are published with the observation that would settle each.

Limits

Why this was worth recording

The question this site exists to answer is whether AI systems read the web, and the usual proxy for it is whether their crawlers show up. Here they showed up eight times and read nothing — which is only visible because the requests were kept whole, with the path attached, and because eleven requests wearing the same name were checked against an address list before being counted.

Evidence chain

This finding was not written from memory. Each figure below came from a query against the immutable request record, and each query is shown so it can be run again — by us, on this page, or by anyone reconstructing the same instrument.

StageWhat it produced
1. RealityRequests recorded by the server as they arrived, written once and never edited.
2. EvidenceThe rule human_analysis selected the observations that bear on this question and emitted each figure with the means of reproducing it.
3. StatementA fixed template turned that evidence into the prose above. No language model was involved and no figure was altered.
4. VerificationEvery figure was recomputed against the record. A single mismatch would have discarded the draft.
5. Publication2026-07-28 09:55:00 UTC, after a person wrote and reviewed it.

What was measured

Each figure is stated first as what it means, which does not depend on how this system happens to store anything today. The query underneath it is implementation — it would be written differently on different storage, and it is shown so the figure can be checked, not because it is part of the claim.

Evidence

How many requests declared OAI-SearchBot

At publication: 17 · recomputed now: 23 window still open

Implementation — how this is computed on today's storage

SELECT COUNT(*) AS n FROM RequestReality WHERE 
  cfRay IS NOT NULL
  AND cfConnectingIp IS NOT NULL
  AND cfConnectingIp NOT LIKE '203.0.113.%'
  AND cfConnectingIp NOT LIKE '192.0.2.%'
  AND cfConnectingIp NOT LIKE '198.51.100.%'
  AND cfConnectingIp NOT LIKE '10.%'
  AND cfConnectingIp NOT LIKE '192.168.%'
  AND cfConnectingIp NOT LIKE '127.%'
  AND cfConnectingIp NOT LIKE '2a00:1d34:4896:b600:%'
  AND cfConnectingIp NOT IN (
    SELECT cfConnectingIp FROM RequestReality
    WHERE cfConnectingIp IS NOT NULL AND (userAgent LIKE 'curl%' OR userAgent LIKE 'Wget%' OR userAgent LIKE 'Python-urllib%' OR userAgent LIKE '%python-requests%' OR userAgent LIKE 'Go-http-client%' OR userAgent LIKE 'node-fetch%')) AND userAgent LIKE '%OAI-SearchBot%'

Evidence

How many of those came from the address that presented thirteen crawler identities

At publication: 11 · recomputed now: 11 unchanged

Implementation — how this is computed on today's storage

SELECT COUNT(*) AS n FROM RequestReality WHERE 
  cfRay IS NOT NULL
  AND cfConnectingIp IS NOT NULL
  AND cfConnectingIp NOT LIKE '203.0.113.%'
  AND cfConnectingIp NOT LIKE '192.0.2.%'
  AND cfConnectingIp NOT LIKE '198.51.100.%'
  AND cfConnectingIp NOT LIKE '10.%'
  AND cfConnectingIp NOT LIKE '192.168.%'
  AND cfConnectingIp NOT LIKE '127.%'
  AND cfConnectingIp NOT LIKE '2a00:1d34:4896:b600:%'
  AND cfConnectingIp NOT IN (
    SELECT cfConnectingIp FROM RequestReality
    WHERE cfConnectingIp IS NOT NULL AND (userAgent LIKE 'curl%' OR userAgent LIKE 'Wget%' OR userAgent LIKE 'Python-urllib%' OR userAgent LIKE '%python-requests%' OR userAgent LIKE 'Go-http-client%' OR userAgent LIKE 'node-fetch%')) AND userAgent LIKE '%OAI-SearchBot%' AND cfConnectingIp = '45.45.237.206'

Evidence

How many came from any other address

At publication: 6 · recomputed now: 12 window still open

Implementation — how this is computed on today's storage

SELECT COUNT(*) AS n FROM RequestReality WHERE 
  cfRay IS NOT NULL
  AND cfConnectingIp IS NOT NULL
  AND cfConnectingIp NOT LIKE '203.0.113.%'
  AND cfConnectingIp NOT LIKE '192.0.2.%'
  AND cfConnectingIp NOT LIKE '198.51.100.%'
  AND cfConnectingIp NOT LIKE '10.%'
  AND cfConnectingIp NOT LIKE '192.168.%'
  AND cfConnectingIp NOT LIKE '127.%'
  AND cfConnectingIp NOT LIKE '2a00:1d34:4896:b600:%'
  AND cfConnectingIp NOT IN (
    SELECT cfConnectingIp FROM RequestReality
    WHERE cfConnectingIp IS NOT NULL AND (userAgent LIKE 'curl%' OR userAgent LIKE 'Wget%' OR userAgent LIKE 'Python-urllib%' OR userAgent LIKE '%python-requests%' OR userAgent LIKE 'Go-http-client%' OR userAgent LIKE 'node-fetch%')) AND userAgent LIKE '%OAI-SearchBot%' AND cfConnectingIp <> '45.45.237.206'

Evidence

How many of those asked for a path other than /robots.txt

At publication: 0 · recomputed now: 0 unchanged

Implementation — how this is computed on today's storage

SELECT COUNT(*) AS n FROM RequestReality WHERE 
  cfRay IS NOT NULL
  AND cfConnectingIp IS NOT NULL
  AND cfConnectingIp NOT LIKE '203.0.113.%'
  AND cfConnectingIp NOT LIKE '192.0.2.%'
  AND cfConnectingIp NOT LIKE '198.51.100.%'
  AND cfConnectingIp NOT LIKE '10.%'
  AND cfConnectingIp NOT LIKE '192.168.%'
  AND cfConnectingIp NOT LIKE '127.%'
  AND cfConnectingIp NOT LIKE '2a00:1d34:4896:b600:%'
  AND cfConnectingIp NOT IN (
    SELECT cfConnectingIp FROM RequestReality
    WHERE cfConnectingIp IS NOT NULL AND (userAgent LIKE 'curl%' OR userAgent LIKE 'Wget%' OR userAgent LIKE 'Python-urllib%' OR userAgent LIKE '%python-requests%' OR userAgent LIKE 'Go-http-client%' OR userAgent LIKE 'node-fetch%')) AND userAgent LIKE '%OAI-SearchBot%' AND cfConnectingIp <> '45.45.237.206' AND path <> '/robots.txt'

Evidence

How many distinct addresses sent them

At publication: 5 · recomputed now: 9 window still open

Implementation — how this is computed on today's storage

SELECT COUNT(DISTINCT cfConnectingIp) AS n FROM RequestReality WHERE 
  cfRay IS NOT NULL
  AND cfConnectingIp IS NOT NULL
  AND cfConnectingIp NOT LIKE '203.0.113.%'
  AND cfConnectingIp NOT LIKE '192.0.2.%'
  AND cfConnectingIp NOT LIKE '198.51.100.%'
  AND cfConnectingIp NOT LIKE '10.%'
  AND cfConnectingIp NOT LIKE '192.168.%'
  AND cfConnectingIp NOT LIKE '127.%'
  AND cfConnectingIp NOT LIKE '2a00:1d34:4896:b600:%'
  AND cfConnectingIp NOT IN (
    SELECT cfConnectingIp FROM RequestReality
    WHERE cfConnectingIp IS NOT NULL AND (userAgent LIKE 'curl%' OR userAgent LIKE 'Wget%' OR userAgent LIKE 'Python-urllib%' OR userAgent LIKE '%python-requests%' OR userAgent LIKE 'Go-http-client%' OR userAgent LIKE 'node-fetch%')) AND userAgent LIKE '%OAI-SearchBot%' AND cfConnectingIp <> '45.45.237.206'

Evidence

How many separate days they arrived on

At publication: 3 · recomputed now: 6 window still open

Implementation — how this is computed on today's storage

SELECT COUNT(DISTINCT substr(observedAt,1,10)) AS n FROM RequestReality WHERE 
  cfRay IS NOT NULL
  AND cfConnectingIp IS NOT NULL
  AND cfConnectingIp NOT LIKE '203.0.113.%'
  AND cfConnectingIp NOT LIKE '192.0.2.%'
  AND cfConnectingIp NOT LIKE '198.51.100.%'
  AND cfConnectingIp NOT LIKE '10.%'
  AND cfConnectingIp NOT LIKE '192.168.%'
  AND cfConnectingIp NOT LIKE '127.%'
  AND cfConnectingIp NOT LIKE '2a00:1d34:4896:b600:%'
  AND cfConnectingIp NOT IN (
    SELECT cfConnectingIp FROM RequestReality
    WHERE cfConnectingIp IS NOT NULL AND (userAgent LIKE 'curl%' OR userAgent LIKE 'Wget%' OR userAgent LIKE 'Python-urllib%' OR userAgent LIKE '%python-requests%' OR userAgent LIKE 'Go-http-client%' OR userAgent LIKE 'node-fetch%')) AND userAgent LIKE '%OAI-SearchBot%' AND cfConnectingIp <> '45.45.237.206'

Evidence

How many requests declared GPTBot, excluding that address

At publication: 2 · recomputed now: 60 window still open

Implementation — how this is computed on today's storage

SELECT COUNT(*) AS n FROM RequestReality WHERE 
  cfRay IS NOT NULL
  AND cfConnectingIp IS NOT NULL
  AND cfConnectingIp NOT LIKE '203.0.113.%'
  AND cfConnectingIp NOT LIKE '192.0.2.%'
  AND cfConnectingIp NOT LIKE '198.51.100.%'
  AND cfConnectingIp NOT LIKE '10.%'
  AND cfConnectingIp NOT LIKE '192.168.%'
  AND cfConnectingIp NOT LIKE '127.%'
  AND cfConnectingIp NOT LIKE '2a00:1d34:4896:b600:%'
  AND cfConnectingIp NOT IN (
    SELECT cfConnectingIp FROM RequestReality
    WHERE cfConnectingIp IS NOT NULL AND (userAgent LIKE 'curl%' OR userAgent LIKE 'Wget%' OR userAgent LIKE 'Python-urllib%' OR userAgent LIKE '%python-requests%' OR userAgent LIKE 'Go-http-client%' OR userAgent LIKE 'node-fetch%')) AND userAgent LIKE '%GPTBot%' AND cfConnectingIp <> '45.45.237.206'

Evidence

How many of those asked for a path other than /sitemap.xml

At publication: 0 · recomputed now: 56 window still open

Implementation — how this is computed on today's storage

SELECT COUNT(*) AS n FROM RequestReality WHERE 
  cfRay IS NOT NULL
  AND cfConnectingIp IS NOT NULL
  AND cfConnectingIp NOT LIKE '203.0.113.%'
  AND cfConnectingIp NOT LIKE '192.0.2.%'
  AND cfConnectingIp NOT LIKE '198.51.100.%'
  AND cfConnectingIp NOT LIKE '10.%'
  AND cfConnectingIp NOT LIKE '192.168.%'
  AND cfConnectingIp NOT LIKE '127.%'
  AND cfConnectingIp NOT LIKE '2a00:1d34:4896:b600:%'
  AND cfConnectingIp NOT IN (
    SELECT cfConnectingIp FROM RequestReality
    WHERE cfConnectingIp IS NOT NULL AND (userAgent LIKE 'curl%' OR userAgent LIKE 'Wget%' OR userAgent LIKE 'Python-urllib%' OR userAgent LIKE '%python-requests%' OR userAgent LIKE 'Go-http-client%' OR userAgent LIKE 'node-fetch%')) AND userAgent LIKE '%GPTBot%' AND cfConnectingIp <> '45.45.237.206' AND path <> '/sitemap.xml'

Evidence

How many requests declared ChatGPT-User, excluding that address

At publication: 2 · recomputed now: 2 unchanged

Implementation — how this is computed on today's storage

SELECT COUNT(*) AS n FROM RequestReality WHERE 
  cfRay IS NOT NULL
  AND cfConnectingIp IS NOT NULL
  AND cfConnectingIp NOT LIKE '203.0.113.%'
  AND cfConnectingIp NOT LIKE '192.0.2.%'
  AND cfConnectingIp NOT LIKE '198.51.100.%'
  AND cfConnectingIp NOT LIKE '10.%'
  AND cfConnectingIp NOT LIKE '192.168.%'
  AND cfConnectingIp NOT LIKE '127.%'
  AND cfConnectingIp NOT LIKE '2a00:1d34:4896:b600:%'
  AND cfConnectingIp NOT IN (
    SELECT cfConnectingIp FROM RequestReality
    WHERE cfConnectingIp IS NOT NULL AND (userAgent LIKE 'curl%' OR userAgent LIKE 'Wget%' OR userAgent LIKE 'Python-urllib%' OR userAgent LIKE '%python-requests%' OR userAgent LIKE 'Go-http-client%' OR userAgent LIKE 'node-fetch%')) AND userAgent LIKE '%ChatGPT-User%' AND cfConnectingIp <> '45.45.237.206'

6 figures have moved since publication. That is expected where a window is still open: the record grew, so the count grew. It means the sentence has aged, not that it was wrong. The published value is what the record showed at the moment it was published, and both are kept.

Governed by

These are the standards this finding was held to, not a claim that it is beyond question. The constitution states them in full.

Other findings

All findings · Live record · Methodology

Reality marker for this page: asd-rafikida-noviguzo-84b972 · published 2026-07-28 09:55:00 UTC

This string is coined and appears nowhere else. If it later surfaces in a language model's output, that is observed evidence this page was ingested. What this is.