{
  "scanId": "18883fb4-f057-4b70-9ba7-631d58947ef9",
  "verdict": "PASS",
  "bundleId": "e1dab400-58ec-45e9-8a84-cc627862e8fa",
  "findings": [
    {
      "code": "CONTENT_NEGOTIATION_MARKDOWN_NOT_SERVED",
      "state": "OPEN",
      "title": "The origin did not serve a markdown representation",
      "summary": "A request that preferred `text/markdown` was answered with text/html (HTTP 200) and no markdown alternate was declared. Serving a markdown representation is an agent-friendly convention rather than a requirement; this is informational and does not indicate that AI systems cannot access, understand, or cite the page, and provider consumption is not inferred.",
      "severity": "INFO",
      "findingId": "28c36087-212b-46cc-9651-aeffdf8a1af0",
      "limitations": [
        "The request asked for `Accept: text/markdown` and the origin answered HTTP 200 with text/html.",
        "CONTENT_NEGOTIATION_CONVENTION: convention — serving a markdown representation is a publishing convention, not a requirement; this records what was requested and what came back and never infers how a provider consumes content.",
        "Only the HTTP status, media type, bounded byte length, truncation flag and markup-prefix boolean are recorded; no response body is retained.",
        "Markdown detection uses the declared media type plus a 512-character body prefix check, so a mislabelled representation is recorded as declared.",
        "The response body was read with a 262144-byte bound.",
        "Only a Link header entry with rel=\"alternate\" and a markdown media type is recognised as the origin advertising an alternate markdown representation."
      ],
      "findingClass": "PRODUCTION",
      "observationRefs": [
        "9a4b81f8-7198-4b72-aaf2-9ae3f6b5a3f1"
      ],
      "remediationRefs": [],
      "protocolExecutionRefs": [
        "608a5588-1d3e-487c-9f89-434d9599dd70"
      ]
    },
    {
      "code": "CRAWLER_IDENTITY_NOT_VERIFIABLE",
      "state": "OPEN",
      "title": "Crawler identity was not verified by this scan",
      "summary": "Vendors publish machine-readable identity material for their crawlers (address ranges from OpenAI, Perplexity and Anthropic, and reverse-DNS and crawler documentation from Google), and no retrieved copy of that material was recorded in this bundle. For this audit, no retrieved copy of the vendors’ published identity material was available. A synthetic request sent from Generative Metrics’ own declared scan address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. Nothing in this finding says that any crawler did or did not visit the audited site. Verifying that requires a measurement only the site owner holds: server logs or edge telemetry recorded at the origin, which no external scan can substitute for. This is reported for information only: it never blocks the audit, never changes the verdict, and it carries no remediation.",
      "severity": "INFO",
      "findingId": "1d446551-351b-4366-9c09-595529fe4a89",
      "limitations": [
        "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
        "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
        "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
        "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
        "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
      ],
      "findingClass": "PRODUCTION",
      "observationRefs": [
        "ff9df710-f5d4-4d2f-89e6-116623c99537",
        "f598a60a-b811-4758-934c-0b6aaa49c657",
        "79a1da2b-8b31-4648-8e25-9e50a6e54c7a",
        "1134c914-4a21-426c-af51-97f2ea091b5c",
        "ecb030dc-23eb-496a-a928-50b9744dc22c",
        "fe453c6b-ac8b-4923-8811-b2ee3823be41",
        "aab7df17-f5ff-411b-ae1e-8464219458dd",
        "f6c406e5-16f0-4382-bae8-b02fe98390f9",
        "972c5f6e-2c55-41c3-865a-d98bd9ddf73b",
        "1eb39ab6-b4aa-46ec-910f-0cc3c576d354",
        "47810791-c778-4a0a-b539-8b81f57903ce",
        "4bf12f13-ffc1-42a3-9ae3-d3ed1f81ddd0"
      ],
      "remediationRefs": [],
      "protocolExecutionRefs": [
        "574690d8-175c-4cf8-a4e1-c34f539f8844"
      ]
    }
  ],
  "runState": "COMPLETE",
  "artifacts": [
    {
      "kind": "RAW_HTTP_RESPONSE",
      "sha256": "7b8c779350944cb95cd1e9e3c62c6d2af06280bce0a1f18bdb056374ab9f54eb",
      "finalUrl": "https://generativemetrics.com/",
      "redirects": [],
      "retention": "HASH_ONLY",
      "artifactId": "7f32e104-df44-45a5-8f3a-25481e2fadf2",
      "byteLength": 113448,
      "capturedAt": "2026-09-30T20:23:42.415Z",
      "httpStatus": 200,
      "storageRef": null,
      "contentType": "text/html",
      "limitations": [],
      "sha256Scope": "FULL",
      "requestedUrl": "https://generativemetrics.com",
      "bodyTruncated": false,
      "requestMethod": "GET",
      "representation": "RAW_HTTP",
      "responseHeaders": {
        "age": "0",
        "link": "</_next/static/media/13971731025ec697-s.p.woff2>; rel=preload; as=\"font\"; crossorigin=\"\"; type=\"font/woff2\", </_next/static/media/636a5ac981f94f8b-s.p.woff2>; rel=preload; as=\"font\"; crossorigin=\"\"; type=\"font/woff2\", </brand/gm-c2-icon-primary.svg>; rel=preload; as=\"image\"",
        "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding",
        "content-type": "text/html; charset=utf-8",
        "x-robots-tag": "all",
        "cache-control": "private, no-cache, no-store, max-age=0, must-revalidate",
        "cf-cache-status": "DYNAMIC",
        "content-encoding": "br"
      },
      "requestUserAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
      "redactedHeaderNames": [
        "alt-svc",
        "cf-ray",
        "connection",
        "content-security-policy",
        "date",
        "nel",
        "permissions-policy",
        "referrer-policy",
        "report-to",
        "server",
        "strict-transport-security",
        "transfer-encoding",
        "x-content-type-options",
        "x-frame-options",
        "x-matched-path",
        "x-vercel-cache",
        "x-vercel-id"
      ]
    },
    {
      "kind": "ROBOTS_TXT",
      "sha256": "e399a048308b86921490b7bda3600c50346ef9e555eab7a206860828de647a39",
      "finalUrl": "https://generativemetrics.com/robots.txt",
      "redirects": [],
      "retention": "HASH_ONLY",
      "artifactId": "6346afab-d93d-4078-a33d-aa278b166c57",
      "byteLength": 945,
      "capturedAt": "2026-09-30T20:23:43.329Z",
      "httpStatus": 200,
      "storageRef": null,
      "contentType": "text/plain",
      "limitations": [],
      "sha256Scope": "FULL",
      "requestedUrl": "https://generativemetrics.com/robots.txt",
      "bodyTruncated": false,
      "requestMethod": "GET",
      "representation": "POLICY_DOCUMENT",
      "responseHeaders": {
        "age": "0",
        "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch",
        "content-type": "text/plain",
        "x-robots-tag": "all",
        "cache-control": "public, max-age=14400, must-revalidate",
        "last-modified": "Wed, 30 Sep 2026 20:23:43 GMT",
        "cf-cache-status": "EXPIRED",
        "content-encoding": "br"
      },
      "requestUserAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
      "redactedHeaderNames": [
        "alt-svc",
        "cf-ray",
        "connection",
        "content-security-policy",
        "date",
        "nel",
        "permissions-policy",
        "referrer-policy",
        "report-to",
        "server",
        "strict-transport-security",
        "transfer-encoding",
        "x-content-type-options",
        "x-frame-options",
        "x-matched-path",
        "x-vercel-cache",
        "x-vercel-id"
      ]
    },
    {
      "kind": "LLMS_TXT",
      "sha256": "c7fea386c3255df50b77a3e6501ac0fb3ac43323498bc7ef985324895acbfb6a",
      "finalUrl": "https://generativemetrics.com/llms.txt",
      "redirects": [],
      "retention": "HASH_ONLY",
      "artifactId": "d773e5f5-21d6-4305-882f-7bd0332193ac",
      "byteLength": 5392,
      "capturedAt": "2026-09-30T20:23:42.343Z",
      "httpStatus": 200,
      "storageRef": null,
      "contentType": "text/plain",
      "limitations": [],
      "sha256Scope": "FULL",
      "requestedUrl": "https://generativemetrics.com/llms.txt",
      "bodyTruncated": false,
      "requestMethod": "GET",
      "representation": "POLICY_DOCUMENT",
      "responseHeaders": {
        "age": "0",
        "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding",
        "content-type": "text/plain; charset=utf-8",
        "x-robots-tag": "all",
        "cache-control": "public, max-age=3600",
        "cf-cache-status": "DYNAMIC",
        "content-encoding": "br"
      },
      "requestUserAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
      "redactedHeaderNames": [
        "alt-svc",
        "cf-ray",
        "connection",
        "content-security-policy",
        "date",
        "nel",
        "permissions-policy",
        "referrer-policy",
        "report-to",
        "server",
        "strict-transport-security",
        "transfer-encoding",
        "x-content-type-options",
        "x-frame-options",
        "x-matched-path",
        "x-vercel-cache",
        "x-vercel-id"
      ]
    },
    {
      "kind": "SITEMAP_XML",
      "sha256": "94b0ecb077c29f0cc23b6d3eeddb931e7eed6073879abcdd1eb0ae6864bdfdc9",
      "finalUrl": "https://generativemetrics.com/sitemap.xml",
      "redirects": [],
      "retention": "HASH_ONLY",
      "artifactId": "b6980199-4816-4483-8838-61d8ae759eca",
      "byteLength": 3296,
      "capturedAt": "2026-09-30T20:23:43.378Z",
      "httpStatus": 200,
      "storageRef": null,
      "contentType": "application/xml",
      "limitations": [],
      "sha256Scope": "FULL",
      "requestedUrl": "https://generativemetrics.com/sitemap.xml",
      "bodyTruncated": false,
      "requestMethod": "GET",
      "representation": "POLICY_DOCUMENT",
      "responseHeaders": {
        "age": "0",
        "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding",
        "content-type": "application/xml",
        "x-robots-tag": "all",
        "cache-control": "public, max-age=0, must-revalidate",
        "cf-cache-status": "DYNAMIC",
        "content-encoding": "br"
      },
      "requestUserAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
      "redactedHeaderNames": [
        "alt-svc",
        "cf-ray",
        "connection",
        "content-security-policy",
        "date",
        "nel",
        "permissions-policy",
        "referrer-policy",
        "report-to",
        "server",
        "strict-transport-security",
        "transfer-encoding",
        "x-content-type-options",
        "x-frame-options",
        "x-matched-path",
        "x-vercel-cache",
        "x-vercel-id"
      ]
    },
    {
      "kind": "RAW_HTTP_RESPONSE",
      "sha256": "8aaac352a4ff7d907f3a616d755c943c2b3a9ba064da1fc7c6739386c51fc497",
      "finalUrl": "https://generativemetrics.com/",
      "redirects": [],
      "retention": "HASH_ONLY",
      "artifactId": "e87e60a5-942e-4193-9689-c31d4d0d3773",
      "byteLength": 113448,
      "capturedAt": "2026-09-30T20:23:42.451Z",
      "httpStatus": 200,
      "storageRef": null,
      "contentType": "text/html",
      "limitations": [],
      "sha256Scope": "FULL",
      "requestedUrl": "https://generativemetrics.com/",
      "bodyTruncated": false,
      "requestMethod": "GET",
      "representation": "RAW_HTTP",
      "responseHeaders": {
        "age": "0",
        "link": "</_next/static/media/13971731025ec697-s.p.woff2>; rel=preload; as=\"font\"; crossorigin=\"\"; type=\"font/woff2\", </_next/static/media/636a5ac981f94f8b-s.p.woff2>; rel=preload; as=\"font\"; crossorigin=\"\"; type=\"font/woff2\", </brand/gm-c2-icon-primary.svg>; rel=preload; as=\"image\"",
        "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding",
        "content-type": "text/html; charset=utf-8",
        "x-robots-tag": "all",
        "cache-control": "private, no-cache, no-store, max-age=0, must-revalidate",
        "cf-cache-status": "DYNAMIC",
        "content-encoding": "br"
      },
      "requestUserAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
      "redactedHeaderNames": [
        "alt-svc",
        "cf-ray",
        "connection",
        "content-security-policy",
        "date",
        "nel",
        "permissions-policy",
        "referrer-policy",
        "report-to",
        "server",
        "strict-transport-security",
        "transfer-encoding",
        "x-content-type-options",
        "x-frame-options",
        "x-matched-path",
        "x-vercel-cache",
        "x-vercel-id"
      ]
    },
    {
      "kind": "RENDERED_DOM",
      "sha256": "3db77373047d427a458d401e3a5d0f2d47639e621c059c53d26d6b5441b4ac4c",
      "finalUrl": "https://generativemetrics.com/",
      "redirects": [],
      "retention": "HASH_ONLY",
      "artifactId": "0c126fb3-105e-4738-b790-5f5b69ed6d05",
      "byteLength": 113384,
      "capturedAt": "2026-09-30T20:23:37.066Z",
      "httpStatus": null,
      "storageRef": null,
      "contentType": "text/html",
      "limitations": [
        "Browser-derived artifact; HTTP status and response headers belong to the raw HTTP acquisition artifact."
      ],
      "sha256Scope": "FULL",
      "requestedUrl": "https://generativemetrics.com",
      "bodyTruncated": false,
      "requestMethod": "GET",
      "representation": "RENDERED_BROWSER",
      "responseHeaders": {},
      "requestUserAgent": null,
      "redactedHeaderNames": []
    },
    {
      "kind": "NO_JAVASCRIPT_DOM",
      "sha256": "deee9d61ada2ff2b5507deede88098f531a6573565279434764b8c149376e096",
      "finalUrl": "https://generativemetrics.com/",
      "redirects": [],
      "retention": "HASH_ONLY",
      "artifactId": "1f7b5730-5681-4bde-a304-033ba32673f0",
      "byteLength": 113421,
      "capturedAt": "2026-09-30T20:23:38.756Z",
      "httpStatus": null,
      "storageRef": null,
      "contentType": "text/html",
      "limitations": [
        "Browser-derived artifact; HTTP status and response headers belong to the raw HTTP acquisition artifact."
      ],
      "sha256Scope": "FULL",
      "requestedUrl": "https://generativemetrics.com",
      "bodyTruncated": false,
      "requestMethod": "GET",
      "representation": "NO_JAVASCRIPT_BROWSER",
      "responseHeaders": {},
      "requestUserAgent": null,
      "redactedHeaderNames": []
    }
  ],
  "createdAt": "2026-09-30T20:23:42.093Z",
  "targetUrl": "https://generativemetrics.com",
  "limitations": [
    "This profile tests documented public discovery controls; it does not prove indexing, retrieval, ranking, citation, training inclusion, or model use.",
    "User-initiated agents are informational because provider behavior may be context dependent.",
    "Informational actors never create blockers and are never required; an unmeasured informational actor is reported rather than inferred."
  ],
  "auditProfile": {
    "profileId": "public-ai-discovery",
    "displayName": "Public AI discovery compatibility",
    "limitations": [
      "This profile tests documented public discovery controls; it does not prove indexing, retrieval, ranking, citation, training inclusion, or model use.",
      "User-initiated agents are informational because provider behavior may be context dependent.",
      "Informational actors never create blockers and are never required; an unmeasured informational actor is reported rather than inferred."
    ],
    "profileVersion": "1.0.0",
    "actorRequirements": {
      "openai:gptbot": "INFORMATIONAL",
      "google:googlebot": "REQUIRED",
      "openai:oai-adsbot": "INFORMATIONAL",
      "anthropic:claudebot": "INFORMATIONAL",
      "google:google-agent": "INFORMATIONAL",
      "openai:chatgpt-user": "INFORMATIONAL",
      "openai:oai-searchbot": "REQUIRED",
      "anthropic:claude-user": "INFORMATIONAL",
      "google:google-extended": "INFORMATIONAL",
      "perplexity:perplexitybot": "REQUIRED",
      "anthropic:claude-searchbot": "REQUIRED",
      "perplexity:perplexity-user": "INFORMATIONAL"
    }
  },
  "bundleSha256": "a17de6676eb428950645d6ea7b5c50e2b977e711d7e3fb9e4cfe35156bafa407",
  "remediations": [],
  "schemaVersion": "gm-evidence-bundle/1.0.0",
  "verifications": [],
  "protocolExecutions": [
    {
      "actor": {
        "actorId": "gm:direct-http-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics direct HTTP probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "timeoutMs": 15000,
        "maxBodyBytes": 2097152,
        "maxRedirects": 10,
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": true,
      "startedAt": "2026-09-30T20:23:42.093Z",
      "finishedAt": "2026-09-30T20:23:42.415Z",
      "protocolId": "acquisition.http",
      "limitations": [],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "HTTP_RESPONSE",
          "value": {
            "finalUrl": "https://generativemetrics.com/",
            "cacheState": {
              "age": "0",
              "cache-control": "private, no-cache, no-store, max-age=0, must-revalidate",
              "cf-cache-status": "DYNAMIC"
            },
            "statusCode": 200,
            "contentType": "text/html",
            "bodyTruncated": false,
            "redirectCount": 0,
            "responseHeaders": {
              "age": "0",
              "link": "</_next/static/media/13971731025ec697-s.p.woff2>; rel=preload; as=\"font\"; crossorigin=\"\"; type=\"font/woff2\", </_next/static/media/636a5ac981f94f8b-s.p.woff2>; rel=preload; as=\"font\"; crossorigin=\"\"; type=\"font/woff2\", </brand/gm-c2-icon-primary.svg>; rel=preload; as=\"image\"",
              "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, accept-encoding",
              "content-type": "text/html; charset=utf-8",
              "x-robots-tag": "all",
              "cache-control": "private, no-cache, no-store, max-age=0, must-revalidate",
              "cf-cache-status": "DYNAMIC",
              "content-encoding": "br"
            },
            "capturedByteLength": 113448
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:42.415Z",
          "limitations": [
            "Cache-state headers (cache-control, age, cf-cache-status) were observed on this response; they describe this fetch only and do not establish what any other client or fetch would receive."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "d5bd8dc2-59e5-4c8e-82d2-2867163ccdcd",
          "protocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
    },
    {
      "actor": {
        "actorId": "gm:direct-http-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics direct HTTP probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "timeoutMs": 15000,
        "maxBodyBytes": 2097152,
        "maxRedirects": 10,
        "requestedUrl": "https://generativemetrics.com/robots.txt"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": true,
      "startedAt": "2026-09-30T20:23:42.094Z",
      "finishedAt": "2026-09-30T20:23:43.329Z",
      "protocolId": "acquisition.robots",
      "limitations": [],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_HTTP_RESPONSE",
          "value": {
            "finalUrl": "https://generativemetrics.com/robots.txt",
            "cacheState": {
              "age": "0",
              "cache-control": "public, max-age=14400, must-revalidate",
              "cf-cache-status": "EXPIRED"
            },
            "statusCode": 200,
            "contentType": "text/plain",
            "bodyTruncated": false,
            "redirectCount": 0,
            "responseHeaders": {
              "age": "0",
              "vary": "rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch",
              "content-type": "text/plain",
              "x-robots-tag": "all",
              "cache-control": "public, max-age=14400, must-revalidate",
              "last-modified": "Wed, 30 Sep 2026 20:23:43 GMT",
              "cf-cache-status": "EXPIRED",
              "content-encoding": "br"
            },
            "capturedByteLength": 945
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.329Z",
          "limitations": [
            "Cache-state headers (cache-control, age, cf-cache-status) were observed on this response; they describe this fetch only and do not establish what any other client or fetch would receive."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "9c01cfb8-1d77-4d85-8d6d-58bb0bd43e24",
          "protocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
    },
    {
      "actor": {
        "actorId": "gm:llms-txt-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics /llms.txt probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:42.094Z",
      "finishedAt": "2026-09-30T20:23:42.343Z",
      "protocolId": "acquisition.llms-txt",
      "limitations": [],
      "artifactRefs": [
        "d773e5f5-21d6-4305-882f-7bd0332193ac"
      ],
      "observations": [
        {
          "kind": "LLMS_TXT_STATUS",
          "value": {
            "valid": true,
            "status": 200,
            "present": true,
            "mediaType": "text/plain",
            "truncated": false,
            "byteLength": 5392,
            "titleHeadingObserved": true
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:42.343Z",
          "limitations": [],
          "artifactRefs": [
            "d773e5f5-21d6-4305-882f-7bd0332193ac"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "1d83377c-a27e-42cf-8220-c312456ffa90",
          "protocolExecutionId": "18ffe226-ac75-4845-bf44-281eb2f805d5"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "18ffe226-ac75-4845-bf44-281eb2f805d5"
    },
    {
      "actor": {
        "actorId": "gm:sitemap-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics /sitemap.xml probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:42.094Z",
      "finishedAt": "2026-09-30T20:23:43.379Z",
      "protocolId": "acquisition.sitemap",
      "limitations": [],
      "artifactRefs": [
        "b6980199-4816-4483-8838-61d8ae759eca"
      ],
      "observations": [
        {
          "kind": "SITEMAP_STATUS",
          "value": {
            "valid": true,
            "status": 200,
            "present": true,
            "urlCount": 19,
            "mediaType": "application/xml",
            "truncated": false,
            "byteLength": 3296,
            "sitemapIndex": false,
            "newestLastmod": "2026-09-19T00:00:00.000Z",
            "targetUrlListed": true
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.379Z",
          "limitations": [],
          "artifactRefs": [
            "b6980199-4816-4483-8838-61d8ae759eca"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "41704647-86dc-4306-bf56-ce1f41538f08",
          "protocolExecutionId": "dff0d780-0dad-43cd-9778-15e725bbee08"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "dff0d780-0dad-43cd-9778-15e725bbee08"
    },
    {
      "actor": {
        "actorId": "gm:content-negotiation-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics content-negotiation probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "acceptHeader": "text/markdown",
        "maxBodyBytes": 262144,
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:42.094Z",
      "finishedAt": "2026-09-30T20:23:42.451Z",
      "protocolId": "content.negotiation",
      "limitations": [
        "The request asked for `Accept: text/markdown` and the origin answered HTTP 200 with text/html.",
        "CONTENT_NEGOTIATION_CONVENTION: convention — serving a markdown representation is a publishing convention, not a requirement; this records what was requested and what came back and never infers how a provider consumes content.",
        "Only the HTTP status, media type, bounded byte length, truncation flag and markup-prefix boolean are recorded; no response body is retained.",
        "Markdown detection uses the declared media type plus a 512-character body prefix check, so a mislabelled representation is recorded as declared.",
        "The response body was read with a 262144-byte bound.",
        "Only a Link header entry with rel=\"alternate\" and a markdown media type is recognised as the origin advertising an alternate markdown representation."
      ],
      "artifactRefs": [
        "e87e60a5-942e-4193-9689-c31d4d0d3773"
      ],
      "observations": [
        {
          "kind": "CONTENT_NEGOTIATION",
          "value": {
            "status": 200,
            "mediaType": "text/html",
            "truncated": false,
            "byteLength": 113448,
            "acceptHeader": "text/markdown",
            "requestedUrl": "https://generativemetrics.com",
            "bodyStartsWithMarkup": true,
            "htmlRepresentationServed": true,
            "advertisedMarkdownAlternate": false,
            "markdownRepresentationServed": false,
            "advertisedMarkdownAlternateTarget": null
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:42.451Z",
          "limitations": [
            "The request asked for `Accept: text/markdown` and the origin answered HTTP 200 with text/html.",
            "CONTENT_NEGOTIATION_CONVENTION: convention — serving a markdown representation is a publishing convention, not a requirement; this records what was requested and what came back and never infers how a provider consumes content.",
            "Only the HTTP status, media type, bounded byte length, truncation flag and markup-prefix boolean are recorded; no response body is retained.",
            "Markdown detection uses the declared media type plus a 512-character body prefix check, so a mislabelled representation is recorded as declared.",
            "The response body was read with a 262144-byte bound.",
            "Only a Link header entry with rel=\"alternate\" and a markdown media type is recognised as the origin advertising an alternate markdown representation."
          ],
          "artifactRefs": [
            "e87e60a5-942e-4193-9689-c31d4d0d3773"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "9a4b81f8-7198-4b72-aaf2-9ae3f6b5a3f1",
          "protocolExecutionId": "608a5588-1d3e-487c-9f89-434d9599dd70"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "608a5588-1d3e-487c-9f89-434d9599dd70"
    },
    {
      "actor": {
        "actorId": "gm:direct-http-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics direct HTTP probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "rawArtifactId": "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "renderedCapturedAt": "2026-09-30T20:23:37.066Z",
        "noJavaScriptCapturedAt": "2026-09-30T20:23:38.756Z",
        "renderedCaptureTimestampSource": "PLAYWRIGHT_SERVICE",
        "renderedRepresentationRequested": true,
        "noJavaScriptCaptureTimestampSource": "PLAYWRIGHT_SERVICE",
        "noJavaScriptRepresentationRequested": true
      },
      "stage": "EXTRACTION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": true,
      "startedAt": "2026-09-30T20:23:43.390Z",
      "finishedAt": "2026-09-30T20:23:43.512Z",
      "protocolId": "representation.raw-rendered",
      "limitations": [
        "Byte and hash comparisons do not establish semantic equivalence.",
        "Browser-rendered and no-JavaScript artifacts describe Generative Metrics probes, not universal crawler behavior.",
        "Raw HTTP and browser-rendered artifacts are sequential observations, not the same network response."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "0c126fb3-105e-4738-b790-5f5b69ed6d05",
        "1f7b5730-5681-4bde-a304-033ba32673f0"
      ],
      "observations": [
        {
          "kind": "REPRESENTATION_BYTE_COMPARISON",
          "value": {
            "rawHttpBytes": 113448,
            "captureSkewMs": 5349,
            "semanticEquivalence": "NOT_EVALUATED",
            "renderedBrowserBytes": 113384,
            "rawToRenderedByteRatio": 1.0006,
            "noJavaScriptBrowserBytes": 113421,
            "noJavaScriptCaptureSkewMs": 3659,
            "rawAndRenderedHashesEqual": false
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.512Z",
          "limitations": [
            "Byte and hash comparisons do not establish semantic equivalence.",
            "Browser-rendered and no-JavaScript artifacts describe Generative Metrics probes, not universal crawler behavior.",
            "Raw HTTP and browser-rendered artifacts are sequential observations, not the same network response."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2",
            "0c126fb3-105e-4738-b790-5f5b69ed6d05",
            "1f7b5730-5681-4bde-a304-033ba32673f0"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "9e1b5666-3224-40f4-867d-1db1a08396b3",
          "protocolExecutionId": "6f9eaf60-6e5a-466f-8ac2-722b039a6cb3"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "6f9eaf60-6e5a-466f-8ac2-722b039a6cb3"
    },
    {
      "actor": {
        "actorId": "openai:oai-searchbot",
        "purpose": "SEARCH",
        "provider": "OpenAI",
        "displayName": "OAI-SearchBot",
        "productToken": "OAI-SearchBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot)",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": true,
      "startedAt": "2026-09-30T20:23:43.512Z",
      "finishedAt": "2026-09-30T20:23:43.512Z",
      "protocolId": "policy.robots",
      "limitations": [
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "openai:oai-searchbot",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "SEARCH",
            "applicability": "APPLIES",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.512Z",
          "limitations": [
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "ab327f3d-0a4c-444e-b214-ffa50fd9e05d",
          "protocolExecutionId": "7f81fec9-d078-4749-8f23-783a364664a4"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "7f81fec9-d078-4749-8f23-783a364664a4"
    },
    {
      "actor": {
        "actorId": "anthropic:claude-searchbot",
        "purpose": "SEARCH",
        "provider": "Anthropic",
        "displayName": "Claude-SearchBot",
        "productToken": "Claude-SearchBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-SearchBot/1.0; +https://www.anthropic.com/clausearchbot)",
        "documentationUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": true,
      "startedAt": "2026-09-30T20:23:43.513Z",
      "finishedAt": "2026-09-30T20:23:43.513Z",
      "protocolId": "policy.robots",
      "limitations": [
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "anthropic:claude-searchbot",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "SEARCH",
            "applicability": "APPLIES",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.513Z",
          "limitations": [
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "07fe38bf-798b-4740-97b7-4aabbd66edd9",
          "protocolExecutionId": "12b0074d-8138-41db-b659-6931e2dfc394"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "12b0074d-8138-41db-b659-6931e2dfc394"
    },
    {
      "actor": {
        "actorId": "google:googlebot",
        "purpose": "SEARCH",
        "provider": "Google",
        "displayName": "Googlebot",
        "productToken": "Googlebot",
        "probeUserAgent": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
        "documentationUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": true,
      "startedAt": "2026-09-30T20:23:43.513Z",
      "finishedAt": "2026-09-30T20:23:43.513Z",
      "protocolId": "policy.robots",
      "limitations": [
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "google:googlebot",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "SEARCH",
            "applicability": "APPLIES",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.513Z",
          "limitations": [
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "506b9600-6803-4202-80f3-e5e782fd229e",
          "protocolExecutionId": "502e4bad-859a-4bd7-b54a-672d1a40f351"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "502e4bad-859a-4bd7-b54a-672d1a40f351"
    },
    {
      "actor": {
        "actorId": "perplexity:perplexitybot",
        "purpose": "SEARCH",
        "provider": "Perplexity",
        "displayName": "PerplexityBot",
        "productToken": "PerplexityBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)",
        "documentationUrl": "https://docs.perplexity.ai/docs/resources/perplexity-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": true,
      "startedAt": "2026-09-30T20:23:43.513Z",
      "finishedAt": "2026-09-30T20:23:43.513Z",
      "protocolId": "policy.robots",
      "limitations": [
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "perplexity:perplexitybot",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "SEARCH",
            "applicability": "APPLIES",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.513Z",
          "limitations": [
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "246b9a13-9590-4e5e-a738-c121c2e52cb4",
          "protocolExecutionId": "68ed7ae4-1808-402b-9d54-4359c76facf3"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "68ed7ae4-1808-402b-9d54-4359c76facf3"
    },
    {
      "actor": {
        "actorId": "openai:gptbot",
        "purpose": "TRAINING",
        "provider": "OpenAI",
        "displayName": "GPTBot",
        "productToken": "GPTBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.0; +https://openai.com/gptbot)",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.513Z",
      "finishedAt": "2026-09-30T20:23:43.513Z",
      "protocolId": "policy.robots",
      "limitations": [
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "openai:gptbot",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "TRAINING",
            "applicability": "APPLIES",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.513Z",
          "limitations": [
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "18058cbf-314c-4f8e-b62d-1488e47a2a44",
          "protocolExecutionId": "7918cd55-b8e0-4758-b38f-eabc5f650d45"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "7918cd55-b8e0-4758-b38f-eabc5f650d45"
    },
    {
      "actor": {
        "actorId": "anthropic:claudebot",
        "purpose": "TRAINING",
        "provider": "Anthropic",
        "displayName": "ClaudeBot",
        "productToken": "ClaudeBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)",
        "documentationUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.robots",
      "limitations": [
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "anthropic:claudebot",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "TRAINING",
            "applicability": "APPLIES",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "c9cf7c9b-9101-4e65-a7c4-f5aa149a374f",
          "protocolExecutionId": "3934435d-783e-41e5-b03a-b6fbe530907d"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "3934435d-783e-41e5-b03a-b6fbe530907d"
    },
    {
      "actor": {
        "actorId": "google:google-extended",
        "purpose": "TRAINING_AND_GROUNDING",
        "provider": "Google",
        "displayName": "Google-Extended",
        "productToken": "Google-Extended",
        "documentationUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "CONTROL_TOKEN"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.robots",
      "limitations": [
        "This product token expresses a downstream-use preference and is not a distinct HTTP crawler identity.",
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "google:google-extended",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [
              "This product token expresses a downstream-use preference and is not a distinct HTTP crawler identity."
            ],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "TRAINING_AND_GROUNDING",
            "applicability": "CONTROL_TOKEN",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "This product token expresses a downstream-use preference and is not a distinct HTTP crawler identity.",
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "3bbc7574-189c-4f63-b635-488a1ca9784b",
          "protocolExecutionId": "3142259f-f562-4e57-b82c-b89aa16b7076"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "3142259f-f562-4e57-b82c-b89aa16b7076"
    },
    {
      "actor": {
        "actorId": "openai:chatgpt-user",
        "purpose": "USER_ACTION",
        "provider": "OpenAI",
        "displayName": "ChatGPT-User",
        "productToken": "ChatGPT-User",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.robots",
      "limitations": [
        "This user-initiated actor may not use robots.txt as a universal access control; the directive is reported without inferring actual access.",
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "openai:chatgpt-user",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [
              "This user-initiated actor may not use robots.txt as a universal access control; the directive is reported without inferring actual access."
            ],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "USER_ACTION",
            "applicability": "CONTEXT_DEPENDENT",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "This user-initiated actor may not use robots.txt as a universal access control; the directive is reported without inferring actual access.",
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "013e58b2-00ff-4d96-ba0e-1b71ba21e082",
          "protocolExecutionId": "2884607e-472c-4553-bac1-1fe365ace6b4"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "2884607e-472c-4553-bac1-1fe365ace6b4"
    },
    {
      "actor": {
        "actorId": "anthropic:claude-user",
        "purpose": "USER_ACTION",
        "provider": "Anthropic",
        "displayName": "Claude-User",
        "productToken": "Claude-User",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +Claude-User@anthropic.com)",
        "documentationUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.robots",
      "limitations": [
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "anthropic:claude-user",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "USER_ACTION",
            "applicability": "APPLIES",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "86d42d64-bbfc-4de6-acbb-d9d8f599338c",
          "protocolExecutionId": "36a30a74-152b-4742-afb8-fc5c680d16a9"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "36a30a74-152b-4742-afb8-fc5c680d16a9"
    },
    {
      "actor": {
        "actorId": "perplexity:perplexity-user",
        "purpose": "USER_ACTION",
        "provider": "Perplexity",
        "displayName": "Perplexity-User",
        "productToken": "Perplexity-User",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)",
        "documentationUrl": "https://docs.perplexity.ai/docs/resources/perplexity-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.robots",
      "limitations": [
        "This user-initiated actor may not use robots.txt as a universal access control; the directive is reported without inferring actual access.",
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "perplexity:perplexity-user",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [
              "This user-initiated actor may not use robots.txt as a universal access control; the directive is reported without inferring actual access."
            ],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "USER_ACTION",
            "applicability": "CONTEXT_DEPENDENT",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "This user-initiated actor may not use robots.txt as a universal access control; the directive is reported without inferring actual access.",
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "81474ad5-473a-4b5b-8144-73253ec4f244",
          "protocolExecutionId": "bace2c55-f5c4-44bd-82a1-4b86a4fd11f1"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "bace2c55-f5c4-44bd-82a1-4b86a4fd11f1"
    },
    {
      "actor": {
        "actorId": "google:google-agent",
        "purpose": "USER_ACTION",
        "provider": "Google",
        "displayName": "Google-Agent",
        "productToken": "Google-Agent",
        "documentationUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-user-triggered-fetchers",
        "documentationVerifiedAt": "2026-09-21",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.robots",
      "limitations": [
        "This user-initiated actor may not use robots.txt as a universal access control; the directive is reported without inferring actual access.",
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "google:google-agent",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [
              "This user-initiated actor may not use robots.txt as a universal access control; the directive is reported without inferring actual access."
            ],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "USER_ACTION",
            "applicability": "CONTEXT_DEPENDENT",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "This user-initiated actor may not use robots.txt as a universal access control; the directive is reported without inferring actual access.",
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "cb5af5e7-f0b4-4275-8002-69c2fb0cc802",
          "protocolExecutionId": "ea0c106b-70a2-4498-ad5c-ae2c507115b6"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "ea0c106b-70a2-4498-ad5c-ae2c507115b6"
    },
    {
      "actor": {
        "actorId": "openai:oai-adsbot",
        "purpose": "ADS_VALIDATION",
        "provider": "OpenAI",
        "displayName": "OAI-AdsBot",
        "productToken": "OAI-AdsBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-AdsBot/1.0; +https://openai.com/adsbot",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-09-21",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "targetUrl": "https://generativemetrics.com",
        "robotsAcquisitionProtocolExecutionId": "77c2b931-6939-45c1-854a-ffd987b9944e"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.robots",
      "limitations": [
        "No robots.txt behaviour is documented for this actor, so the directive is reported without inferring actual access.",
        "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
      ],
      "artifactRefs": [
        "6346afab-d93d-4078-a33d-aa278b166c57"
      ],
      "observations": [
        {
          "kind": "ROBOTS_POLICY_DECISION",
          "value": {
            "actorId": "openai:oai-adsbot",
            "decision": "ALLOWED_BY_RULES",
            "warnings": [
              "No robots.txt behaviour is documented for this actor, so the directive is reported without inferring actual access."
            ],
            "targetPath": "/",
            "matchedRule": {
              "pattern": "/",
              "directive": "ALLOW",
              "sourceLine": 32
            },
            "actorPurpose": "ADS_VALIDATION",
            "applicability": "CONTEXT_DEPENDENT",
            "accessInference": "NOT_ESTABLISHED",
            "matchedUserAgents": [
              "amazonbot",
              "bytespider",
              "ccbot",
              "chatgpt-user",
              "claude-searchbot",
              "claude-user",
              "claudebot",
              "google-agent",
              "google-extended",
              "googlebot",
              "gptbot",
              "oai-adsbot",
              "oai-searchbot",
              "perplexity-user",
              "perplexitybot"
            ],
            "sitemapDeclarations": {
              "urls": [
                "https://generativemetrics.com/sitemap.xml"
              ],
              "listTruncated": false,
              "totalDeclared": 1
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "No robots.txt behaviour is documented for this actor, so the directive is reported without inferring actual access.",
            "Sitemap: directives declared in robots.txt are recorded as declared; the listed URLs were not fetched and their presence was not validated."
          ],
          "artifactRefs": [
            "6346afab-d93d-4078-a33d-aa278b166c57"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "58d0ca81-67c4-4bad-8175-d936dc8afed9",
          "protocolExecutionId": "35919e2a-dd01-4242-bfdd-ed5a4b5e4d13"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "35919e2a-dd01-4242-bfdd-ed5a4b5e4d13"
    },
    {
      "actor": {
        "actorId": "openai:oai-searchbot",
        "purpose": "SEARCH",
        "provider": "OpenAI",
        "displayName": "OAI-SearchBot",
        "productToken": "OAI-SearchBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot)",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "actorId": "openai:oai-searchbot",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "SEARCH",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "af419f8b-10ac-46f7-ba9e-602a9ce033ba",
          "protocolExecutionId": "7a87ae95-c05f-44d1-8980-96904cbc3aad"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "7a87ae95-c05f-44d1-8980-96904cbc3aad"
    },
    {
      "actor": {
        "actorId": "anthropic:claude-searchbot",
        "purpose": "SEARCH",
        "provider": "Anthropic",
        "displayName": "Claude-SearchBot",
        "productToken": "Claude-SearchBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-SearchBot/1.0; +https://www.anthropic.com/clausearchbot)",
        "documentationUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "actorId": "anthropic:claude-searchbot",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "SEARCH",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "4afed63e-0c2b-4aea-90de-1a64b6a8a986",
          "protocolExecutionId": "c688387f-7f21-498b-917c-281a16650317"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "c688387f-7f21-498b-917c-281a16650317"
    },
    {
      "actor": {
        "actorId": "google:googlebot",
        "purpose": "SEARCH",
        "provider": "Google",
        "displayName": "Googlebot",
        "productToken": "Googlebot",
        "probeUserAgent": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
        "documentationUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "actorId": "google:googlebot",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "SEARCH",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "74df024a-5b33-48aa-87f4-8389b9ba7e77",
          "protocolExecutionId": "ae49b226-f6a7-4e8e-95ca-86a36a1e9082"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "ae49b226-f6a7-4e8e-95ca-86a36a1e9082"
    },
    {
      "actor": {
        "actorId": "perplexity:perplexitybot",
        "purpose": "SEARCH",
        "provider": "Perplexity",
        "displayName": "PerplexityBot",
        "productToken": "PerplexityBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)",
        "documentationUrl": "https://docs.perplexity.ai/docs/resources/perplexity-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "actorId": "perplexity:perplexitybot",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "SEARCH",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "a0a772af-b475-4880-b526-bfcc91af6dd0",
          "protocolExecutionId": "ab4e5851-32ea-40c2-b3cf-ce5917f3e16b"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "ab4e5851-32ea-40c2-b3cf-ce5917f3e16b"
    },
    {
      "actor": {
        "actorId": "openai:gptbot",
        "purpose": "TRAINING",
        "provider": "OpenAI",
        "displayName": "GPTBot",
        "productToken": "GPTBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.0; +https://openai.com/gptbot)",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "actorId": "openai:gptbot",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "TRAINING",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "e85ecbaa-4506-4fa5-bdc2-80760f35b03b",
          "protocolExecutionId": "d622daac-7687-4733-bc14-f6ad4f3f992f"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "d622daac-7687-4733-bc14-f6ad4f3f992f"
    },
    {
      "actor": {
        "actorId": "anthropic:claudebot",
        "purpose": "TRAINING",
        "provider": "Anthropic",
        "displayName": "ClaudeBot",
        "productToken": "ClaudeBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)",
        "documentationUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "actorId": "anthropic:claudebot",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "TRAINING",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "c08383d2-c0a8-4a6c-afdb-b130d3aa239f",
          "protocolExecutionId": "5b3425f7-305c-4306-a729-7b1204e007e7"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "5b3425f7-305c-4306-a729-7b1204e007e7"
    },
    {
      "actor": {
        "actorId": "google:google-extended",
        "purpose": "TRAINING_AND_GROUNDING",
        "provider": "Google",
        "displayName": "Google-Extended",
        "productToken": "Google-Extended",
        "documentationUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "CONTROL_TOKEN"
      },
      "input": {
        "actorId": "google:google-extended",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "TRAINING_AND_GROUNDING",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred.",
        "This actor is a downstream-use control token, not a distinct HTTP fetcher: the response headers were read from the audit’s own fetch, and no header exposure specific to this actor was measured. The observation is recorded as not applicable to this actor rather than as a measured absence."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "NOT_APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred.",
            "This actor is a downstream-use control token, not a distinct HTTP fetcher: the response headers were read from the audit’s own fetch, and no header exposure specific to this actor was measured. The observation is recorded as not applicable to this actor rather than as a measured absence."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "8665071f-c1b4-4b83-8ef4-e8dbb0948f2f",
          "protocolExecutionId": "5f76fa7b-e9a6-4442-bdcc-be4928fe1671"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "5f76fa7b-e9a6-4442-bdcc-be4928fe1671"
    },
    {
      "actor": {
        "actorId": "openai:chatgpt-user",
        "purpose": "USER_ACTION",
        "provider": "OpenAI",
        "displayName": "ChatGPT-User",
        "productToken": "ChatGPT-User",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "actorId": "openai:chatgpt-user",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "USER_ACTION",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.514Z",
      "finishedAt": "2026-09-30T20:23:43.514Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.514Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "e1747645-44cb-468a-822d-47eacccc52aa",
          "protocolExecutionId": "931f590c-1a40-4184-8ccd-2ac7e87d195c"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "931f590c-1a40-4184-8ccd-2ac7e87d195c"
    },
    {
      "actor": {
        "actorId": "anthropic:claude-user",
        "purpose": "USER_ACTION",
        "provider": "Anthropic",
        "displayName": "Claude-User",
        "productToken": "Claude-User",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +Claude-User@anthropic.com)",
        "documentationUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "actorId": "anthropic:claude-user",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "USER_ACTION",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.542Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "df7e99e8-d72c-4de6-9e74-1447cda02559",
          "protocolExecutionId": "35ae3628-6cb9-470e-95a3-f7b94e12d929"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "35ae3628-6cb9-470e-95a3-f7b94e12d929"
    },
    {
      "actor": {
        "actorId": "perplexity:perplexity-user",
        "purpose": "USER_ACTION",
        "provider": "Perplexity",
        "displayName": "Perplexity-User",
        "productToken": "Perplexity-User",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)",
        "documentationUrl": "https://docs.perplexity.ai/docs/resources/perplexity-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "actorId": "perplexity:perplexity-user",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "USER_ACTION",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.542Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "b23a911a-3b47-4db7-8b6b-e582c9e294ee",
          "protocolExecutionId": "8d82f737-05e3-4a78-a890-76212f7cb625"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "8d82f737-05e3-4a78-a890-76212f7cb625"
    },
    {
      "actor": {
        "actorId": "google:google-agent",
        "purpose": "USER_ACTION",
        "provider": "Google",
        "displayName": "Google-Agent",
        "productToken": "Google-Agent",
        "documentationUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-user-triggered-fetchers",
        "documentationVerifiedAt": "2026-09-21",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "actorId": "google:google-agent",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "USER_ACTION",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.542Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "911e0741-51db-4ad9-832a-770b479234d0",
          "protocolExecutionId": "5b77e0fd-6e1a-4914-a925-b93ea1caa2f0"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "5b77e0fd-6e1a-4914-a925-b93ea1caa2f0"
    },
    {
      "actor": {
        "actorId": "openai:oai-adsbot",
        "purpose": "ADS_VALIDATION",
        "provider": "OpenAI",
        "displayName": "OAI-AdsBot",
        "productToken": "OAI-AdsBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-AdsBot/1.0; +https://openai.com/adsbot",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-09-21",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "actorId": "openai:oai-adsbot",
        "targetUrl": "https://generativemetrics.com",
        "policyScope": "OBSERVATION_ONLY",
        "actorPurpose": "ADS_VALIDATION",
        "httpAcquisitionProtocolExecutionId": "c0b34bc4-ce5d-4374-a1fe-3688b0c4b599"
      },
      "stage": "POLICY",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "policy.ai-usage-headers",
      "limitations": [
        "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "AI_USAGE_HEADER_POLICY",
          "value": {
            "xRobotsTag": {
              "tokens": [
                "all"
              ],
              "present": true,
              "recognizedReviewTokens": []
            },
            "policyScope": "OBSERVATION_ONLY",
            "applicability": "APPLICABLE",
            "tdmReservation": {
              "present": false,
              "normalizedValue": null
            },
            "recognizedSignalsPresent": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.542Z",
          "limitations": [
            "Observed response headers are policy signals only; provider compliance, access denial, training behavior, indexing, and citation impact are not inferred."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DIRECT",
          "observationId": "fd4384e8-6989-4095-a051-686c6f3594b4",
          "protocolExecutionId": "1099160c-a577-4b39-b0fd-25085a1f80de"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "1099160c-a577-4b39-b0fd-25085a1f80de"
    },
    {
      "actor": {
        "actorId": "openai:oai-searchbot",
        "purpose": "SEARCH",
        "provider": "OpenAI",
        "displayName": "OAI-SearchBot",
        "productToken": "OAI-SearchBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot)",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "productToken": "OAI-SearchBot",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "openai:oai-searchbot",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "OAI-SearchBot",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot)",
            "responseByteLength": 113448,
            "requestUserAgentSource": "VENDOR_PUBLISHED"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:40.384Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "a5f248e9-1a84-426c-8a6d-4e9ded4e00d1",
          "protocolExecutionId": "fd0deae4-7a68-4f8a-9752-99158063918f"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "fd0deae4-7a68-4f8a-9752-99158063918f"
    },
    {
      "actor": {
        "actorId": "anthropic:claude-searchbot",
        "purpose": "SEARCH",
        "provider": "Anthropic",
        "displayName": "Claude-SearchBot",
        "productToken": "Claude-SearchBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-SearchBot/1.0; +https://www.anthropic.com/clausearchbot)",
        "documentationUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "productToken": "Claude-SearchBot",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "anthropic:claude-searchbot",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "Claude-SearchBot",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-SearchBot/1.0; +https://www.anthropic.com/clausearchbot)",
            "responseByteLength": 113448,
            "requestUserAgentSource": "VENDOR_PUBLISHED"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:40.052Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "d2e31b95-9876-4875-befe-c9cbc9431b4f",
          "protocolExecutionId": "3963908c-282c-494c-a64e-bc8ae4c5bfac"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "3963908c-282c-494c-a64e-bc8ae4c5bfac"
    },
    {
      "actor": {
        "actorId": "google:googlebot",
        "purpose": "SEARCH",
        "provider": "Google",
        "displayName": "Googlebot",
        "productToken": "Googlebot",
        "probeUserAgent": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
        "documentationUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "productToken": "Googlebot",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "google:googlebot",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "Googlebot",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
            "responseByteLength": 113448,
            "requestUserAgentSource": "VENDOR_PUBLISHED"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:40.590Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "29252216-b6ab-4d97-af2f-c03e392d9c85",
          "protocolExecutionId": "ee209cd5-79ae-462e-97a4-309ee5aa6a4d"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "ee209cd5-79ae-462e-97a4-309ee5aa6a4d"
    },
    {
      "actor": {
        "actorId": "perplexity:perplexitybot",
        "purpose": "SEARCH",
        "provider": "Perplexity",
        "displayName": "PerplexityBot",
        "productToken": "PerplexityBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)",
        "documentationUrl": "https://docs.perplexity.ai/docs/resources/perplexity-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "productToken": "PerplexityBot",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "perplexity:perplexitybot",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "PerplexityBot",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)",
            "responseByteLength": 113448,
            "requestUserAgentSource": "VENDOR_PUBLISHED"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:40.909Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "e26af40a-e264-4282-8a18-1dd07002c156",
          "protocolExecutionId": "709b7dcb-90f0-49bf-aaa6-3ec4a31c26b1"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "709b7dcb-90f0-49bf-aaa6-3ec4a31c26b1"
    },
    {
      "actor": {
        "actorId": "openai:gptbot",
        "purpose": "TRAINING",
        "provider": "OpenAI",
        "displayName": "GPTBot",
        "productToken": "GPTBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.0; +https://openai.com/gptbot)",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "productToken": "GPTBot",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "openai:gptbot",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "GPTBot",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.0; +https://openai.com/gptbot)",
            "responseByteLength": 113448,
            "requestUserAgentSource": "VENDOR_PUBLISHED"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.116Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "e4a15618-bb8f-4328-8afd-a151c9206fdf",
          "protocolExecutionId": "90c08b7d-82bd-4294-a947-778e305979cc"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "90c08b7d-82bd-4294-a947-778e305979cc"
    },
    {
      "actor": {
        "actorId": "anthropic:claudebot",
        "purpose": "TRAINING",
        "provider": "Anthropic",
        "displayName": "ClaudeBot",
        "productToken": "ClaudeBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)",
        "documentationUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "productToken": "ClaudeBot",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "anthropic:claudebot",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "ClaudeBot",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)",
            "responseByteLength": 113448,
            "requestUserAgentSource": "VENDOR_PUBLISHED"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.363Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "e06bc4c4-fdb6-4fce-8e0a-81f8ad2a35c3",
          "protocolExecutionId": "80f5188c-42a4-40a8-87b0-20b19960cca3"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "80f5188c-42a4-40a8-87b0-20b19960cca3"
    },
    {
      "actor": {
        "actorId": "google:google-extended",
        "purpose": "TRAINING_AND_GROUNDING",
        "provider": "Google",
        "displayName": "Google-Extended",
        "productToken": "Google-Extended",
        "documentationUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "CONTROL_TOKEN"
      },
      "input": {
        "productToken": "Google-Extended",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "NOT_APPLICABLE",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "CONTROL_TOKEN: convention — this token is a declared preference, not a distinct HTTP crawler identity, so no request was sent."
      ],
      "artifactRefs": [],
      "observations": [],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "3b1938d6-c03c-46b6-93fa-7f9def59e9cc"
    },
    {
      "actor": {
        "actorId": "openai:chatgpt-user",
        "purpose": "USER_ACTION",
        "provider": "OpenAI",
        "displayName": "ChatGPT-User",
        "productToken": "ChatGPT-User",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "productToken": "ChatGPT-User",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "openai:chatgpt-user",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "ChatGPT-User",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot",
            "responseByteLength": 113448,
            "requestUserAgentSource": "VENDOR_PUBLISHED"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.486Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "1b77f282-fd3f-4771-817d-8ff00fd766fc",
          "protocolExecutionId": "ec218dc7-0cbc-4d44-8b75-02065adb92db"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "ec218dc7-0cbc-4d44-8b75-02065adb92db"
    },
    {
      "actor": {
        "actorId": "anthropic:claude-user",
        "purpose": "USER_ACTION",
        "provider": "Anthropic",
        "displayName": "Claude-User",
        "productToken": "Claude-User",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +Claude-User@anthropic.com)",
        "documentationUrl": "https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "APPLIES"
      },
      "input": {
        "productToken": "Claude-User",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "anthropic:claude-user",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "Claude-User",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +Claude-User@anthropic.com)",
            "responseByteLength": 113448,
            "requestUserAgentSource": "VENDOR_PUBLISHED"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.565Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "6c096fac-cf7b-4cf1-ba77-33d44f7a2d51",
          "protocolExecutionId": "871906dc-5cb5-454a-886d-733686881d6b"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "871906dc-5cb5-454a-886d-733686881d6b"
    },
    {
      "actor": {
        "actorId": "perplexity:perplexity-user",
        "purpose": "USER_ACTION",
        "provider": "Perplexity",
        "displayName": "Perplexity-User",
        "productToken": "Perplexity-User",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)",
        "documentationUrl": "https://docs.perplexity.ai/docs/resources/perplexity-crawlers",
        "documentationVerifiedAt": "2026-07-26",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "productToken": "Perplexity-User",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "perplexity:perplexity-user",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "Perplexity-User",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)",
            "responseByteLength": 113448,
            "requestUserAgentSource": "VENDOR_PUBLISHED"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.703Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "99a49c20-7ff2-4302-9706-04e29834a288",
          "protocolExecutionId": "753e0ee8-d111-4ab5-b2a0-29fd042b71a4"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "753e0ee8-d111-4ab5-b2a0-29fd042b71a4"
    },
    {
      "actor": {
        "actorId": "google:google-agent",
        "purpose": "USER_ACTION",
        "provider": "Google",
        "displayName": "Google-Agent",
        "productToken": "Google-Agent",
        "documentationUrl": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-user-triggered-fetchers",
        "documentationVerifiedAt": "2026-09-21",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "productToken": "Google-Agent",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "google:google-agent",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "Google-Agent",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Google-Agent",
            "responseByteLength": 111869,
            "requestUserAgentSource": "PRODUCT_TOKEN_FALLBACK"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.965Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "782ca915-eccd-42b3-8511-57220f4ebd50",
          "protocolExecutionId": "e3295d95-664b-45da-9d68-62558b493302"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "e3295d95-664b-45da-9d68-62558b493302"
    },
    {
      "actor": {
        "actorId": "openai:oai-adsbot",
        "purpose": "ADS_VALIDATION",
        "provider": "OpenAI",
        "displayName": "OAI-AdsBot",
        "productToken": "OAI-AdsBot",
        "probeUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-AdsBot/1.0; +https://openai.com/adsbot",
        "documentationUrl": "https://developers.openai.com/api/docs/bots",
        "documentationVerifiedAt": "2026-09-21",
        "robotsPolicyApplicability": "CONTEXT_DEPENDENT"
      },
      "input": {
        "productToken": "OAI-AdsBot",
        "requestedUrl": "https://generativemetrics.com"
      },
      "stage": "ACQUISITION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.542Z",
      "finishedAt": "2026-09-30T20:23:43.542Z",
      "protocolId": "access.actor-probe",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_ACCESS_RESULT",
          "value": {
            "actorId": "openai:oai-adsbot",
            "httpStatus": 200,
            "failureCause": null,
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "OAI-AdsBot",
            "bodyTruncated": false,
            "classification": "REACHED",
            "requestUserAgent": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-AdsBot/1.0; +https://openai.com/adsbot",
            "responseByteLength": 113448,
            "requestUserAgentSource": "VENDOR_PUBLISHED"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:42.026Z",
          "limitations": [
            "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
            "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
            "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
            "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
            "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
            "Observed from Generative Metrics’ own network vantage with a single unauthenticated GET carrying the actor’s vendor-documented User-Agent; it does not prove what the provider’s systems experience or do."
          ],
          "artifactRefs": [],
          "evidenceClass": "DIRECT",
          "observationId": "5a5c4eb5-1498-4e83-a93c-53163a919c15",
          "protocolExecutionId": "fb372364-53d2-416f-a1d3-69779897e691"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "fb372364-53d2-416f-a1d3-69779897e691"
    },
    {
      "actor": {
        "actorId": "gm:actor-content-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics per-actor content probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
        "requestedUrl": "https://generativemetrics.com",
        "actorsCompared": 11,
        "minComparableWords": 100,
        "materialDivergenceRatio": 0.5,
        "actorsWithCollectedFacts": 11,
        "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH"
      },
      "stage": "EXTRACTION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.987Z",
      "finishedAt": "2026-09-30T20:23:43.987Z",
      "protocolId": "content.actor-extraction",
      "limitations": [
        "Probe results are single-request HTTP observations taken at scan time from Generative Metrics’ own servers; they do not observe or predict what any provider’s systems actually experience or do.",
        "Classifications are categorical execution states derived from the HTTP status alone; they are never scores. Enforcement for required actors is also recorded as sealed access.actor-probe evidence, where an uncorroborated denial is recorded as indeterminate (WARNING) and a robots.txt policy denial remains the deterministic production blocker.",
        "Probes deliberately do not consult robots.txt (the audit measures the declared-versus-enforced gap) and send no disclosure header (measurement neutrality).",
        "Each probe carries the actor’s vendor-documented canonical User-Agent; where a vendor publishes no fixed User-Agent string, the documented product token is sent instead and the fallback is recorded on the probe row (userAgentSource).",
        "Bounded content facts (machine-extracted word count, one hash of the extracted text, bounded flags) are computed from the same probe response bodies and are compared with the scanner’s own fetch by the content.actor-extraction protocol. No response body text is retained, and these facts state what our probe received under an actor’s documented identity — never what that provider’s systems receive.",
        "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
        "ACTOR_CONTENT_PROBE_SCOPE: convention — a request carrying a documented product token is not that provider’s system: our single probe’s address, headers, timing and cadence differ from the provider’s own fetchers, so this states what OUR probe received under that name and never what the provider receives.",
        "ACTOR_CONTENT_DIVERGENCE_CONVENTION: convention — a divergence is reported when the smaller machine-extracted word count is below 0.5 of the larger and the larger count is at least 100 words. This mirrors the raw-versus-rendered main-content convention in this protocol set; it is a reporting convention, not a score, not a quality threshold and never a verdict input.",
        "ACTOR_CONTENT_EXTRACTED_ONLY: convention — both sides are measured with the same extractor (linkedom_readability/text_extraction_v1). Raw-body and whole-document hashes are never the signal, because nonces, timestamps, personalisation and cache variation change bytes without changing extractable content; extracted-text hashes are recorded for both sides and a hash difference alone is never reported.",
        "The probe request carries the actor’s product token as its user agent and no Accept header, while the scanner’s own fetch sends its own user agent and an Accept header; a divergence can also be caused by that difference, so it is reported for review rather than assigned to the actor name alone.",
        "Only HTML representations are compared; a probe response that declared another media type (for example markdown) is recorded as not comparable rather than as a divergence.",
        "Only machine-extracted word counts, extracted-text hashes and bounded flags are retained from the probe response; no response body text and no raw body hash leaves the probe phase.",
        "ACTOR_CONTENT_BASELINE_UNAVAILABLE: convention — the scanner’s own fetch produced no machine-extracted main-content text for this URL, so there was nothing to compare the per-actor content against."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "openai:oai-searchbot",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:40.384Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "OAI-SearchBot",
            "actorProvider": "OpenAI",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:40.384Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the OAI-SearchBot product token; they are not evidence about OpenAI’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "1143ec6c-401e-4166-869d-dee304fe7f4e",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        },
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "anthropic:claude-searchbot",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:40.052Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "Claude-SearchBot",
            "actorProvider": "Anthropic",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:40.052Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the Claude-SearchBot product token; they are not evidence about Anthropic’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "5e919c42-030a-4f59-b769-00f60c66e41c",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        },
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "google:googlebot",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:40.590Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "Googlebot",
            "actorProvider": "Google",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:40.590Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the Googlebot product token; they are not evidence about Google’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "f35b3486-05e0-405d-8899-5b83ccdb1161",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        },
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "perplexity:perplexitybot",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:40.909Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "PerplexityBot",
            "actorProvider": "Perplexity",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:40.909Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the PerplexityBot product token; they are not evidence about Perplexity’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "fdb091b8-ac32-410c-960e-36315c739fb8",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        },
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "openai:gptbot",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:41.116Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "GPTBot",
            "actorProvider": "OpenAI",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.116Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the GPTBot product token; they are not evidence about OpenAI’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "61a60485-4f62-4790-9a36-58ab155b70ff",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        },
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "anthropic:claudebot",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:41.363Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "ClaudeBot",
            "actorProvider": "Anthropic",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.363Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the ClaudeBot product token; they are not evidence about Anthropic’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "7f8bca18-4ca7-4d70-aecb-2a9597518369",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        },
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "openai:chatgpt-user",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:41.486Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "ChatGPT-User",
            "actorProvider": "OpenAI",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.486Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the ChatGPT-User product token; they are not evidence about OpenAI’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "112fad67-854c-4bc2-bf95-117d411ce84d",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        },
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "anthropic:claude-user",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:41.565Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "Claude-User",
            "actorProvider": "Anthropic",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.565Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the Claude-User product token; they are not evidence about Anthropic’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "2902937c-a87f-43b1-8d6b-0b707790bd3e",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        },
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "perplexity:perplexity-user",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:41.703Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "Perplexity-User",
            "actorProvider": "Perplexity",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.703Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the Perplexity-User product token; they are not evidence about Perplexity’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "f7ef9c61-d0aa-46ea-aac6-d8fb9b8156ae",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        },
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "google:google-agent",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:41.965Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "Google-Agent",
            "actorProvider": "Google",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:41.965Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the Google-Agent product token; they are not evidence about Google’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "649790a6-f95c-4620-a2c1-e0b571e2b6b9",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        },
        {
          "kind": "ACTOR_CONTENT_EXTRACTION",
          "value": {
            "actorId": "openai:oai-adsbot",
            "httpStatus": 200,
            "observedAt": "2026-09-30T20:23:42.026Z",
            "contentType": "text/html",
            "probeVantage": "GENERATIVE_METRICS_PROBE_REQUEST",
            "productToken": "OAI-AdsBot",
            "actorProvider": "OpenAI",
            "bodyTruncated": false,
            "actorWordCount": 1260,
            "wordCountRatio": 1,
            "accessGateSignal": null,
            "baselineWordCount": 1260,
            "extractionOutcome": "EXTRACTED",
            "textSha256Differs": false,
            "actorContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "comparisonAvailable": true,
            "materiallyDivergent": false,
            "baselineContentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
            "contentFactsCollected": true,
            "contentComparisonReason": null,
            "providerSystemsTookPart": false,
            "comparisonBaselineSource": "GENERATIVE_METRICS_SCANNER_DIRECT_FETCH",
            "statesWhatProviderReceives": false,
            "wordCountDivergenceDirection": "NONE"
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:42.026Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — this records only what Generative Metrics’ own probe request carrying the actor’s declared product token received from the audited URL at scan time. No provider system took part in this observation, and it does not state what that provider’s crawler, or any other system, receives.",
            "ACTOR_CONTENT_ACTOR_SCOPE: convention — the word count and hash recorded here are what the Generative Metrics probe received while carrying the OAI-AdsBot product token; they are not evidence about OpenAI’s systems and do not describe what that actor receives from the provider’s side."
          ],
          "artifactRefs": [],
          "evidenceClass": "DERIVED",
          "observationId": "0baff619-53d3-4827-ad49-be2a595041e4",
          "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "6b45a98a-b7b8-4870-a738-1b8fc6278d67"
    },
    {
      "actor": {
        "actorId": "gm:direct-http-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics direct HTTP probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "rawArtifactId": "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "renderedArtifactId": "0c126fb3-105e-4738-b790-5f5b69ed6d05",
        "noJavaScriptArtifactId": "1f7b5730-5681-4bde-a304-033ba32673f0"
      },
      "stage": "EXTRACTION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": true,
      "startedAt": "2026-09-30T20:23:43.599Z",
      "finishedAt": "2026-09-30T20:23:43.599Z",
      "protocolId": "extraction.main-content",
      "limitations": [
        "Main-content extraction uses a deterministic Readability implementation and does not prove extraction by a downstream AI system.",
        "Readability scores are intentionally excluded from this protocol because language support is not universal.",
        "containment convention: a fixed disclosed 90% — the same threshold on every site and every scan; containment describes the relationship between the rendered and no-JavaScript extractions, not intent."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "0c126fb3-105e-4738-b790-5f5b69ed6d05",
        "1f7b5730-5681-4bde-a304-033ba32673f0"
      ],
      "observations": [
        {
          "kind": "MAIN_CONTENT_COMPARISON",
          "value": {
            "raw": {
              "excerpt": "Can AI systems read your site? Stop assuming. Audit the evidence.Your site looks complete in a browser. Our audit fetches it the way GPTBot, ClaudeBot, and PerplexityBot do — and shows you what each one actually gets, page by page, with evidence you can check.For AI-visibility, growth, and content teams accountable for what machines can actually retrieve. We audit the GEO layer; we do not sell ran…",
              "outcome": "EXTRACTED",
              "hasTitle": true,
              "listCount": 0,
              "scopeRule": "linkedom_readability: @mozilla/readability deterministically selects a single main-content subtree from the full document; the recorded main content is that subtree's text, and no main content is identified when no subtree qualifies.",
              "wordCount": 1260,
              "byteLength": 9256,
              "tableCount": 0,
              "linkDensity": 0.2532,
              "scopeElement": "div",
              "contentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
              "hasDescription": true,
              "paragraphCount": 1,
              "detectedLanguage": "en",
              "extractionMethod": "linkedom_readability",
              "extractionVersion": "text_extraction_v1"
            },
            "rendered": {
              "excerpt": "Can AI systems read your site? Stop assuming. Audit the evidence.Your site looks complete in a browser. Our audit fetches it the way GPTBot, ClaudeBot, and PerplexityBot do — and shows you what each one actually gets, page by page, with evidence you can check.For AI-visibility, growth, and content teams accountable for what machines can actually retrieve. We audit the GEO layer; we do not sell ran…",
              "outcome": "EXTRACTED",
              "hasTitle": true,
              "listCount": 0,
              "scopeRule": "linkedom_readability: @mozilla/readability deterministically selects a single main-content subtree from the full document; the recorded main content is that subtree's text, and no main content is identified when no subtree qualifies.",
              "wordCount": 1260,
              "byteLength": 9256,
              "tableCount": 0,
              "linkDensity": 0.2532,
              "scopeElement": "div",
              "contentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
              "hasDescription": true,
              "paragraphCount": 1,
              "detectedLanguage": "en",
              "extractionMethod": "linkedom_readability",
              "extractionVersion": "text_extraction_v1"
            },
            "noJavaScript": {
              "excerpt": "Can AI systems read your site? Stop assuming. Audit the evidence.Your site looks complete in a browser. Our audit fetches it the way GPTBot, ClaudeBot, and PerplexityBot do — and shows you what each one actually gets, page by page, with evidence you can check.For AI-visibility, growth, and content teams accountable for what machines can actually retrieve. We audit the GEO layer; we do not sell ran…",
              "outcome": "EXTRACTED",
              "hasTitle": true,
              "listCount": 0,
              "scopeRule": "linkedom_readability: @mozilla/readability deterministically selects a single main-content subtree from the full document; the recorded main content is that subtree's text, and no main content is identified when no subtree qualifies.",
              "wordCount": 1260,
              "byteLength": 9256,
              "tableCount": 0,
              "linkDensity": 0.2532,
              "scopeElement": "div",
              "contentSha256": "4eae4f135231da84a21a30ef1776f3e53b6812e3a6dd9fbfeaab773d9497157c",
              "hasDescription": true,
              "paragraphCount": 1,
              "detectedLanguage": "en",
              "extractionMethod": "linkedom_readability",
              "extractionVersion": "text_extraction_v1"
            },
            "containmentPct": 100,
            "rawWordDeficit": 0,
            "rawToRenderedWordRatio": 1,
            "renderedToNoJavaScriptWordRatio": 1
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.599Z",
          "limitations": [
            "Main-content extraction uses a deterministic Readability implementation and does not prove extraction by a downstream AI system.",
            "Readability scores are intentionally excluded from this protocol because language support is not universal.",
            "containment convention: a fixed disclosed 90% — the same threshold on every site and every scan; containment describes the relationship between the rendered and no-JavaScript extractions, not intent."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2",
            "0c126fb3-105e-4738-b790-5f5b69ed6d05",
            "1f7b5730-5681-4bde-a304-033ba32673f0"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "4ebb592c-d9a7-491e-89be-5de6477dab79",
          "protocolExecutionId": "0d5ad716-fd31-4037-a2fb-bf0c0124e1d0"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "0d5ad716-fd31-4037-a2fb-bf0c0124e1d0"
    },
    {
      "actor": {
        "actorId": "gm:direct-http-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics direct HTTP probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "rawArtifactId": "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "maxPropertyChecks": 100,
        "materialProperties": [
          "description",
          "headline",
          "name"
        ],
        "renderedArtifactId": "0c126fb3-105e-4738-b790-5f5b69ed6d05"
      },
      "stage": "INTERPRETATION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": true,
      "startedAt": "2026-09-30T20:23:43.930Z",
      "finishedAt": "2026-09-30T20:23:43.930Z",
      "protocolId": "structured-data.visible-consistency",
      "limitations": [
        "Visible consistency checks cover bounded name, headline, and description string properties only.",
        "A visible string match does not prove semantic correctness or downstream use.",
        "The absence of structured data is not automatically a defect.",
        "Structured-data objects synthesized from OpenGraph meta tags are excluded from visible-text checks; a meta description is metadata, not body copy.",
        "Materiality for the raw structured-data deficit decision uses a fixed disclosed list of schema types — the same list on every site and every scan: Article, NewsArticle, BlogPosting, Product, Organization, LocalBusiness, FAQPage, HowTo, BreadcrumbList, WebSite, Offer, Review, Event, Recipe. Landmark roles (WPHeader, WPFooter, SiteNavigationElement, WebPageElement) are excluded from materiality."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "0c126fb3-105e-4738-b790-5f5b69ed6d05"
      ],
      "observations": [
        {
          "kind": "STRUCTURED_DATA_COMPARISON",
          "value": {
            "raw": {
              "diagnostics": {
                "fatalParserError": false,
                "jsonLdBlocksFound": 4,
                "jsonLdBlocksFailed": 0,
                "jsonLdBlocksParsed": 4,
                "ogObjectsExtracted": 0,
                "rdfaObjectsExtracted": 0,
                "jsonLdObjectsExtracted": 4,
                "microdataObjectsExtracted": 0
              },
              "schemaCount": 4,
              "schemaTypes": [
                "FAQPage",
                "Organization",
                "SoftwareApplication",
                "WebSite"
              ]
            },
            "rendered": {
              "diagnostics": {
                "fatalParserError": false,
                "jsonLdBlocksFound": 4,
                "jsonLdBlocksFailed": 0,
                "jsonLdBlocksParsed": 4,
                "ogObjectsExtracted": 0,
                "rdfaObjectsExtracted": 0,
                "jsonLdObjectsExtracted": 4,
                "microdataObjectsExtracted": 0
              },
              "schemaCount": 4,
              "schemaTypes": [
                "FAQPage",
                "Organization",
                "SoftwareApplication",
                "WebSite"
              ]
            },
            "materialSchemaTypes": [
              "Article",
              "NewsArticle",
              "BlogPosting",
              "Product",
              "Organization",
              "LocalBusiness",
              "FAQPage",
              "HowTo",
              "BreadcrumbList",
              "WebSite",
              "Offer",
              "Review",
              "Event",
              "Recipe"
            ],
            "materialPropertyChecks": [
              {
                "path": "$[0].name",
                "property": "name",
                "valueSha256": "f9e6f2740f940e8b841abcf8a640dc57fab63a9e9e9685094db5b0eedf4d7813",
                "visibleMatch": true
              },
              {
                "path": "$[1].name",
                "property": "name",
                "valueSha256": "f9e6f2740f940e8b841abcf8a640dc57fab63a9e9e9685094db5b0eedf4d7813",
                "visibleMatch": true
              },
              {
                "path": "$[1].publisher.name",
                "property": "name",
                "valueSha256": "f9e6f2740f940e8b841abcf8a640dc57fab63a9e9e9685094db5b0eedf4d7813",
                "visibleMatch": true
              },
              {
                "path": "$[2].name",
                "property": "name",
                "valueSha256": "f9e6f2740f940e8b841abcf8a640dc57fab63a9e9e9685094db5b0eedf4d7813",
                "visibleMatch": true
              },
              {
                "path": "$[2].offers.description",
                "property": "description",
                "valueSha256": "0586ae236a7df88b0232791b454294a23d7a1d82d81c89389517dd8bf51b3445",
                "visibleMatch": true
              },
              {
                "path": "$[3].mainEntity[0].name",
                "property": "name",
                "valueSha256": "4531f7a13bae238d674d8746ef706d6665db474db027bb3ffc1f59363f5f51ff",
                "visibleMatch": true
              },
              {
                "path": "$[3].mainEntity[1].name",
                "property": "name",
                "valueSha256": "e8876bd0883f5f1a906c10abd8cad7be4af8589e0730aff5a932bec5e235d57c",
                "visibleMatch": true
              },
              {
                "path": "$[3].mainEntity[2].name",
                "property": "name",
                "valueSha256": "1c276a22fb72ebdc7b0ed153da9bf3ac2bf04d476d4e92090c500cbd6190988e",
                "visibleMatch": true
              },
              {
                "path": "$[3].mainEntity[3].name",
                "property": "name",
                "valueSha256": "328a210596d950c9381b38e265a6cfc7f04a279c8ef2182303fdb77b930d967c",
                "visibleMatch": true
              },
              {
                "path": "$[3].mainEntity[4].name",
                "property": "name",
                "valueSha256": "e2464ca2ba8d3369b5c5edfcf7bac5eb7eaa521b5d1096a846d67ed1e61e1079",
                "visibleMatch": true
              },
              {
                "path": "$[3].mainEntity[5].name",
                "property": "name",
                "valueSha256": "e048f5c52443f8bfa23b70c8219d47cb3590a9f33c59fd1f7d11802493faead4",
                "visibleMatch": true
              },
              {
                "path": "$[3].mainEntity[6].name",
                "property": "name",
                "valueSha256": "25d0427e8e4e7463e473bb0aab7863fe535336e99ec30bcd9eba67da910f292f",
                "visibleMatch": true
              },
              {
                "path": "$[3].mainEntity[7].name",
                "property": "name",
                "valueSha256": "74ce0454b59d43b234119c4ed304a54a7f71b8f63a1e0bd5cff183728899d301",
                "visibleMatch": true
              },
              {
                "path": "$[3].mainEntity[8].name",
                "property": "name",
                "valueSha256": "2809c80fa4908ccac22fda059e096b76ab47dbab983c67e31603d03ae5776ded",
                "visibleMatch": true
              }
            ],
            "propertyChecksTruncated": false,
            "materialTypesAfterRender": [
              "FAQPage",
              "Organization",
              "WebSite"
            ],
            "excludedLandmarkSchemaTypes": [
              "WPHeader",
              "WPFooter",
              "SiteNavigationElement",
              "WebPageElement"
            ],
            "unmatchedMaterialPropertyCount": 0,
            "schemaOnlyAfterBrowserRendering": false,
            "openGraphSynthesizedSchemasExcludedFromVisibleTextChecks": 0
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.930Z",
          "limitations": [
            "Visible consistency checks cover bounded name, headline, and description string properties only.",
            "A visible string match does not prove semantic correctness or downstream use.",
            "The absence of structured data is not automatically a defect.",
            "Structured-data objects synthesized from OpenGraph meta tags are excluded from visible-text checks; a meta description is metadata, not body copy.",
            "Materiality for the raw structured-data deficit decision uses a fixed disclosed list of schema types — the same list on every site and every scan: Article, NewsArticle, BlogPosting, Product, Organization, LocalBusiness, FAQPage, HowTo, BreadcrumbList, WebSite, Offer, Review, Event, Recipe. Landmark roles (WPHeader, WPFooter, SiteNavigationElement, WebPageElement) are excluded from materiality."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2",
            "0c126fb3-105e-4738-b790-5f5b69ed6d05"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "d340f758-50b6-49e3-bb43-4dc035b0763c",
          "protocolExecutionId": "66b21d94-e049-48d0-9ab5-04b09faba50a"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "66b21d94-e049-48d0-9ab5-04b09faba50a"
    },
    {
      "actor": {
        "actorId": "gm:direct-http-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics direct HTTP probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "rawArtifactId": "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "maxSchemaTypes": 100,
        "organizationFields": [
          "name",
          "url",
          "logo"
        ],
        "renderedArtifactId": "0c126fb3-105e-4738-b790-5f5b69ed6d05"
      },
      "stage": "INTERPRETATION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.951Z",
      "finishedAt": "2026-09-30T20:23:43.951Z",
      "protocolId": "structured-data.completeness",
      "limitations": [
        "Completeness checks cover raw-versus-rendered schema type presence and three bounded Organization identity fields only.",
        "Organization identity fields are recorded as booleans; property values are not stored.",
        "The absence of an Organization node is not automatically a defect."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "0c126fb3-105e-4738-b790-5f5b69ed6d05"
      ],
      "observations": [
        {
          "kind": "STRUCTURED_DATA_COMPLETENESS",
          "value": {
            "rawTypes": [
              "FAQPage",
              "Organization",
              "SoftwareApplication",
              "WebSite"
            ],
            "renderedTypesOnly": [],
            "organizationIdentity": {
              "fields": {
                "url": true,
                "logo": true,
                "name": true
              },
              "present": true,
              "missingFields": []
            }
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.951Z",
          "limitations": [
            "Completeness checks cover raw-versus-rendered schema type presence and three bounded Organization identity fields only.",
            "Organization identity fields are recorded as booleans; property values are not stored.",
            "The absence of an Organization node is not automatically a defect."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2",
            "0c126fb3-105e-4738-b790-5f5b69ed6d05"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "7b239a00-2bbb-40e9-ac32-67dfb88bb8fa",
          "protocolExecutionId": "bb5e127e-3c4a-48db-bec6-326f76936881"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "bb5e127e-3c4a-48db-bec6-326f76936881"
    },
    {
      "actor": {
        "actorId": "gm:direct-http-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics direct HTTP probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "observedAt": "2026-09-30T20:23:42.415Z",
        "rawArtifactId": "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "acceptedFormats": [
          "YYYY-MM-DD",
          "ISO-8601-WITH-TIMEZONE",
          "IMF-FIXDATE"
        ]
      },
      "stage": "INTERPRETATION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": true,
      "startedAt": "2026-09-30T20:23:43.971Z",
      "finishedAt": "2026-09-30T20:23:43.971Z",
      "protocolId": "freshness.dates",
      "limitations": [
        "Free-form dates in visible prose are intentionally excluded from authoritative freshness evidence.",
        "Age is reported as evidence and is not converted into a universal stale/fresh score.",
        "STALE: convention — a newest supported date older than 365 days is labelled STALE for information only; the threshold is a Generative Metrics convention, not a published standard, and the label never changes the audit verdict."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2"
      ],
      "observations": [
        {
          "kind": "DATE_EVIDENCE",
          "value": {
            "stale": false,
            "status": "UNDATED",
            "validDates": [],
            "contradiction": false,
            "newestAgeDays": null,
            "newestDateUtc": null,
            "oldestDateUtc": null,
            "rejectedDates": [],
            "staleAgeDaysThreshold": 365
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.971Z",
          "limitations": [
            "Free-form dates in visible prose are intentionally excluded from authoritative freshness evidence.",
            "Age is reported as evidence and is not converted into a universal stale/fresh score.",
            "STALE: convention — a newest supported date older than 365 days is labelled STALE for information only; the threshold is a Generative Metrics convention, not a published standard, and the label never changes the audit verdict."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "cc0e3b24-5200-4b5b-b25a-d9c5dfa6daa6",
          "protocolExecutionId": "e84d5af4-7cc7-4e10-a70e-536e13284449"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "e84d5af4-7cc7-4e10-a70e-536e13284449"
    },
    {
      "actor": {
        "actorId": "gm:crawler-identity-verification",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics crawler identity verification",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "requestedUrl": "https://generativemetrics.com",
        "actorsAssessed": 12,
        "verificationState": "RANGES_UNAVAILABLE",
        "verificationSource": "VENDOR_PUBLISHED_RANGES_VS_SYNTHETIC_PROBE",
        "verificationPerformed": false,
        "rangeDocumentsDeclared": 6,
        "rangeDocumentsRetrieved": 0,
        "rangeSourceDeclarations": [
          {
            "vendor": "OpenAI",
            "sourceId": "openai:gptbot-json",
            "coversActorIds": [
              "openai:gptbot"
            ],
            "documentationUrl": "https://openai.com/gptbot.json"
          },
          {
            "vendor": "OpenAI",
            "sourceId": "openai:searchbot-json",
            "coversActorIds": [
              "openai:oai-searchbot"
            ],
            "documentationUrl": "https://openai.com/searchbot.json"
          },
          {
            "vendor": "OpenAI",
            "sourceId": "openai:chatgpt-user-json",
            "coversActorIds": [
              "openai:chatgpt-user"
            ],
            "documentationUrl": "https://openai.com/chatgpt-user.json"
          },
          {
            "vendor": "OpenAI",
            "sourceId": "openai:adsbot-json",
            "coversActorIds": [
              "openai:oai-adsbot"
            ],
            "documentationUrl": "https://openai.com/adsbot.json"
          },
          {
            "vendor": "Perplexity",
            "sourceId": "perplexity:perplexitybot-json",
            "coversActorIds": [
              "perplexity:perplexitybot"
            ],
            "documentationUrl": "https://www.perplexity.ai/perplexitybot.json"
          },
          {
            "vendor": "Anthropic",
            "sourceId": "anthropic:bots-json",
            "coversActorIds": [
              "anthropic:claudebot",
              "anthropic:claude-searchbot",
              "anthropic:claude-user"
            ],
            "documentationUrl": "https://claude.com/crawling/bots.json"
          }
        ],
        "rangeSnapshotRefreshedAt": null,
        "declaredProbeSourceAddress": null,
        "declaredProbeSourceDeclaration": "GM_SCAN_EGRESS_ADDRESS_NOT_DECLARED",
        "declaredProbeSourceEvidenceClass": "DECLARED",
        "customerSideMeasurementInputAvailable": false
      },
      "stage": "VERIFICATION",
      "state": "NOT_APPLICABLE",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.987Z",
      "finishedAt": "2026-09-30T20:23:43.987Z",
      "protocolId": "identity.crawler-verification",
      "limitations": [
        "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
        "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
        "VENDOR_PUBLISHED_RANGES: convention — the vendor identity documents are retrieved out of band by a scheduled refresh; only a payload hash, a bounded entry count and a shape verdict are recorded, and no document body is stored in the evidence bundle.",
        "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
        "CRAWLER_IDENTITY_REMEDIATION_EXCLUDED: convention — this execution carries no remediation and no verification-protocol reference, so it can never reach a VERIFIED outcome. A verified outcome would require a customer-side measurement input (server logs or edge telemetry) that does not exist in this protocol set.",
        "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
        "RANGES_UNAVAILABLE: convention — no retrieved copy of the vendor-published identity material was available to this audit (the out-of-band refresh cache was cold, absent, or the document could not be retrieved), so no availability fact is recorded for those actors."
      ],
      "artifactRefs": [],
      "observations": [
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "openai:oai-searchbot",
            "productToken": "OAI-SearchBot",
            "actorProvider": "OpenAI",
            "documentShape": null,
            "declaredSourceId": "openai:searchbot-json",
            "declaredSourceUrl": "https://openai.com/searchbot.json",
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "RANGES_UNAVAILABLE",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "ff9df710-f5d4-4d2f-89e6-116623c99537",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "anthropic:claude-searchbot",
            "productToken": "Claude-SearchBot",
            "actorProvider": "Anthropic",
            "documentShape": null,
            "declaredSourceId": "anthropic:bots-json",
            "declaredSourceUrl": "https://claude.com/crawling/bots.json",
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "RANGES_UNAVAILABLE",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "f598a60a-b811-4758-934c-0b6aaa49c657",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "google:googlebot",
            "productToken": "Googlebot",
            "actorProvider": "Google",
            "documentShape": null,
            "declaredSourceId": null,
            "declaredSourceUrl": null,
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "NO_PUBLISHED_RANGES_FOR_ACTOR",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "79a1da2b-8b31-4648-8e25-9e50a6e54c7a",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "perplexity:perplexitybot",
            "productToken": "PerplexityBot",
            "actorProvider": "Perplexity",
            "documentShape": null,
            "declaredSourceId": "perplexity:perplexitybot-json",
            "declaredSourceUrl": "https://www.perplexity.ai/perplexitybot.json",
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "RANGES_UNAVAILABLE",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "1134c914-4a21-426c-af51-97f2ea091b5c",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "openai:gptbot",
            "productToken": "GPTBot",
            "actorProvider": "OpenAI",
            "documentShape": null,
            "declaredSourceId": "openai:gptbot-json",
            "declaredSourceUrl": "https://openai.com/gptbot.json",
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "RANGES_UNAVAILABLE",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "ecb030dc-23eb-496a-a928-50b9744dc22c",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "anthropic:claudebot",
            "productToken": "ClaudeBot",
            "actorProvider": "Anthropic",
            "documentShape": null,
            "declaredSourceId": "anthropic:bots-json",
            "declaredSourceUrl": "https://claude.com/crawling/bots.json",
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "RANGES_UNAVAILABLE",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "fe453c6b-ac8b-4923-8811-b2ee3823be41",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "google:google-extended",
            "productToken": "Google-Extended",
            "actorProvider": "Google",
            "documentShape": null,
            "controlTokenNote": "This actor is a declared preference token rather than an HTTP fetcher, so no request-based identity comparison is possible even in principle.",
            "declaredSourceId": null,
            "declaredSourceUrl": null,
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "NO_PUBLISHED_RANGES_FOR_ACTOR",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "aab7df17-f5ff-411b-ae1e-8464219458dd",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "openai:chatgpt-user",
            "productToken": "ChatGPT-User",
            "actorProvider": "OpenAI",
            "documentShape": null,
            "declaredSourceId": "openai:chatgpt-user-json",
            "declaredSourceUrl": "https://openai.com/chatgpt-user.json",
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "RANGES_UNAVAILABLE",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "f6c406e5-16f0-4382-bae8-b02fe98390f9",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "anthropic:claude-user",
            "productToken": "Claude-User",
            "actorProvider": "Anthropic",
            "documentShape": null,
            "declaredSourceId": "anthropic:bots-json",
            "declaredSourceUrl": "https://claude.com/crawling/bots.json",
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "RANGES_UNAVAILABLE",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "972c5f6e-2c55-41c3-865a-d98bd9ddf73b",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "perplexity:perplexity-user",
            "productToken": "Perplexity-User",
            "actorProvider": "Perplexity",
            "documentShape": null,
            "declaredSourceId": null,
            "declaredSourceUrl": null,
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "NO_PUBLISHED_RANGES_FOR_ACTOR",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "1eb39ab6-b4aa-46ec-910f-0cc3c576d354",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "google:google-agent",
            "productToken": "Google-Agent",
            "actorProvider": "Google",
            "documentShape": null,
            "declaredSourceId": null,
            "declaredSourceUrl": null,
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "NO_PUBLISHED_RANGES_FOR_ACTOR",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "47810791-c778-4a0a-b539-8b81f57903ce",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        },
        {
          "kind": "CRAWLER_IDENTITY_VERIFICATION",
          "value": {
            "actorId": "openai:oai-adsbot",
            "productToken": "OAI-AdsBot",
            "actorProvider": "OpenAI",
            "documentShape": null,
            "declaredSourceId": "openai:adsbot-json",
            "declaredSourceUrl": "https://openai.com/adsbot.json",
            "documentRetrieved": null,
            "verificationState": "RANGES_UNAVAILABLE",
            "documentByteLength": null,
            "documentHttpStatus": null,
            "probeSourceAddress": null,
            "documentRetrievedAt": null,
            "documentFailureCause": null,
            "publishedPrefixCount": null,
            "publishedRangesState": "RANGES_UNAVAILABLE",
            "documentBodyTruncated": null,
            "documentPayloadSha256": null,
            "vendorSystemsTookPart": false,
            "verificationPerformed": false,
            "canVerifyVendorCrawler": false,
            "probeSourceEvidenceClass": "DECLARED",
            "publishedIpv4PrefixCount": null,
            "publishedIpv6PrefixCount": null,
            "customerSideMeasurementInputAvailable": false
          },
          "result": "NOT_OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "VANTAGE_LIMITATION: convention — Generative Metrics observes from its own network vantage with a single synthetic request sent from its own declared scan address. A request from our address can never confirm that traffic claiming a crawler name is that vendor’s crawler, because the vendor’s fleet uses its own address ranges, reverse DNS, edge signatures and script behaviour. No verification result is claimed, in either direction, by this protocol.",
            "PROBE_SOURCE_DECLARED: convention — Generative Metrics’ own probe source address is a DECLARED self-report supplied as an input, never a measured observation, so it can never be read as evidence about a vendor’s crawler.",
            "VERIFICATION_NOT_PERFORMED: convention — this protocol records the state of the published identity material. It performs no match and no mismatch between a request and an address range, and its observation result is INDETERMINATE whenever a verification cannot be made. Every state reachable from Generative Metrics’ vantage is such a case.",
            "Only a payload hash, a bounded prefix count and a shape verdict are recorded for each vendor document; no document body and no address value leaves the retrieval phase.",
            "VANTAGE_LIMITED: convention — the vendor-published identity material is in hand for at least one audited actor, and the verification itself still cannot be performed from Generative Metrics’ vantage. The material is recorded so a site owner can use it directly with their own traffic measurements."
          ],
          "artifactRefs": [],
          "evidenceClass": "DECLARED",
          "observationId": "4bf12f13-ffc1-42a3-9ae3-d3ed1f81ddd0",
          "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "574690d8-175c-4cf8-a4e1-c34f539f8844"
    },
    {
      "actor": {
        "actorId": "gm:direct-http-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics direct HTTP probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "basis": "RENDERED_DOCUMENT",
        "rawArtifactId": "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "renderedArtifactId": "0c126fb3-105e-4738-b790-5f5b69ed6d05"
      },
      "stage": "INTERPRETATION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.987Z",
      "finishedAt": "2026-09-30T20:23:43.987Z",
      "protocolId": "content.structure",
      "limitations": [
        "Counts are HTML tag counts in the rendered document; they measure structure, not text quality.",
        "A skipped heading level is counted only between adjacent heading tags in document order.",
        "JS-only pages are measured from the rendered DOM, so client-rendered structure is included.",
        "Fingerprint facts (empty headings, headings with no content beneath them, duplicated heading texts, fewest words under a heading) are divergence aids, not findings; section words count text in leaf paragraphs, list items, and table cells, each counted once."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "0c126fb3-105e-4738-b790-5f5b69ed6d05"
      ],
      "observations": [
        {
          "kind": "CONTENT_STRUCTURE_FACTS",
          "value": {
            "h1Count": 1,
            "h2Count": 10,
            "h3Count": 17,
            "listCount": 2,
            "tableCount": 0,
            "minSectionWords": 10,
            "emptyHeadingCount": 0,
            "otherHeadingCount": 0,
            "headingOrderViolations": 0,
            "duplicateHeadingTextsCount": 0,
            "headingsWithoutContentCount": 0
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.987Z",
          "limitations": [
            "Counts are HTML tag counts in the rendered document; they measure structure, not text quality.",
            "A skipped heading level is counted only between adjacent heading tags in document order.",
            "JS-only pages are measured from the rendered DOM, so client-rendered structure is included.",
            "Fingerprint facts (empty headings, headings with no content beneath them, duplicated heading texts, fewest words under a heading) are divergence aids, not findings; section words count text in leaf paragraphs, list items, and table cells, each counted once."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2",
            "0c126fb3-105e-4738-b790-5f5b69ed6d05"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "98418712-d05c-4059-ac1c-61b0c5862ac0",
          "protocolExecutionId": "96e58027-c99b-4924-baec-f3213f06f44d"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "96e58027-c99b-4924-baec-f3213f06f44d"
    },
    {
      "actor": {
        "actorId": "gm:direct-http-probe",
        "purpose": "UNSPECIFIED",
        "provider": "Generative Metrics",
        "userAgent": "GenerativeMetrics/1.0 (+https://generativemetrics.com)",
        "displayName": "Generative Metrics direct HTTP probe",
        "robotsPolicyApplicability": "NOT_APPLICABLE"
      },
      "input": {
        "rawArtifactId": "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "renderedFinalUrl": "https://generativemetrics.com/",
        "renderedArtifactId": "0c126fb3-105e-4738-b790-5f5b69ed6d05"
      },
      "stage": "INTERPRETATION",
      "state": "SUCCEEDED",
      "failure": null,
      "required": false,
      "startedAt": "2026-09-30T20:23:43.996Z",
      "finishedAt": "2026-09-30T20:23:43.996Z",
      "protocolId": "metadata.signals",
      "limitations": [
        "Canonical and anchor facts are read from the rendered document’s HTML tags only.",
        "The canonical URL is resolved at scan time against the response’s final URL; a redirect chain that changes between scans changes the resolved value, so the recorded URL is observed-at-scan-time.",
        "Internal links are anchors resolving to the same hostname with a leading \"www.\" ignored; other subdomains count as external.",
        "Anchor traversal is bounded at 5000 anchors; non-http(s) and unresolvable hrefs are not counted.",
        "A canonical URL pointing at a different address can be intentional (for example paginated or syndicated pages)."
      ],
      "artifactRefs": [
        "7f32e104-df44-45a5-8f3a-25481e2fadf2",
        "0c126fb3-105e-4738-b790-5f5b69ed6d05"
      ],
      "observations": [
        {
          "kind": "METADATA_SIGNAL_FACTS",
          "value": {
            "canonicalPresent": true,
            "externalLinkCount": 0,
            "internalLinkCount": 41,
            "canonicalResolvedUrl": "https://generativemetrics.com/",
            "canonicalSelfConsistent": true
          },
          "result": "OBSERVED",
          "producedAt": "2026-09-30T20:23:43.996Z",
          "limitations": [
            "Canonical and anchor facts are read from the rendered document’s HTML tags only.",
            "The canonical URL is resolved at scan time against the response’s final URL; a redirect chain that changes between scans changes the resolved value, so the recorded URL is observed-at-scan-time.",
            "Internal links are anchors resolving to the same hostname with a leading \"www.\" ignored; other subdomains count as external.",
            "Anchor traversal is bounded at 5000 anchors; non-http(s) and unresolvable hrefs are not counted.",
            "A canonical URL pointing at a different address can be intentional (for example paginated or syndicated pages)."
          ],
          "artifactRefs": [
            "7f32e104-df44-45a5-8f3a-25481e2fadf2",
            "0c126fb3-105e-4738-b790-5f5b69ed6d05"
          ],
          "evidenceClass": "DERIVED",
          "observationId": "67854d8d-ae5f-448d-9943-99b0cfa185ba",
          "protocolExecutionId": "c4db68e6-1ad1-4cb1-8e15-e5fcbc10615f"
        }
      ],
      "protocolVersion": "1.0.0",
      "protocolExecutionId": "c4db68e6-1ad1-4cb1-8e15-e5fcbc10615f"
    }
  ],
  "protocolSetVersion": "gm-ai-consumer-compat/1.7.0"
}
