{
  "version": 2,
  "generatedAt": "2026-09-07T11:01:50.434Z",
  "profile": "primary",
  "baseUrl": "https://crawler-test-site.uk.sitebulb.com",
  "environmentCapabilities": [],
  "profiles": [
    {
      "id": "primary",
      "baseUrl": "https://crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "The primary crawler test site serving most fixture routes.",
      "available": true
    },
    {
      "id": "robots-allow-all",
      "baseUrl": "https://robots-allow-all.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin whose robots.txt allows all user agents everywhere.",
      "available": false
    },
    {
      "id": "robots-block-all",
      "baseUrl": "https://robots-block-all.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "Origin whose robots.txt disallows all crawling.",
      "available": false
    },
    {
      "id": "robots-blank-disallow",
      "baseUrl": "https://robots-blank-disallow.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin whose robots.txt has a blank Disallow value (allow all).",
      "available": false
    },
    {
      "id": "robots-allow-override",
      "baseUrl": "https://robots-allow-override.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin whose robots.txt mixes Disallow with a more specific Allow override.",
      "available": false
    },
    {
      "id": "robots-crawl-delay",
      "baseUrl": "https://robots-crawl-delay.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin whose robots.txt declares a Crawl-delay.",
      "available": false
    },
    {
      "id": "robots-sitemap",
      "baseUrl": "https://robots-sitemap.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin whose robots.txt declares Sitemap references.",
      "available": false
    },
    {
      "id": "robots-patterns",
      "baseUrl": "https://robots-patterns.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin whose robots.txt uses wildcard and end-anchor patterns.",
      "available": false
    },
    {
      "id": "robots-multiple-agents",
      "baseUrl": "https://robots-multiple-agents.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin whose robots.txt declares several user-agent groups with different rules.",
      "available": false
    },
    {
      "id": "robots-ai-specific",
      "baseUrl": "https://robots-ai-specific.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "Origin whose robots.txt targets AI crawler user agents specifically.",
      "available": false
    },
    {
      "id": "robots-malformed",
      "baseUrl": "https://robots-malformed.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "Origin serving a syntactically broken robots.txt.",
      "available": false
    },
    {
      "id": "robots-404",
      "baseUrl": "https://robots-404.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin whose robots.txt returns HTTP 404.",
      "available": false
    },
    {
      "id": "robots-500",
      "baseUrl": "https://robots-500.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "Origin whose robots.txt returns HTTP 500.",
      "available": false
    },
    {
      "id": "robots-bom",
      "baseUrl": "https://robots-bom.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin whose robots.txt begins with a UTF-8 byte-order mark.",
      "available": false
    },
    {
      "id": "robots-large",
      "baseUrl": "https://robots-large.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "Origin serving an oversized robots.txt to exercise size limits.",
      "available": false
    },
    {
      "id": "robots-redirect",
      "baseUrl": "https://robots-redirect.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin whose robots.txt redirects before serving content.",
      "available": false
    },
    {
      "id": "llms-valid",
      "baseUrl": "https://llms-valid.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin serving a well-formed llms.txt.",
      "available": false
    },
    {
      "id": "llms-optional",
      "baseUrl": "https://llms-optional.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin serving an llms.txt that uses only optional sections.",
      "available": false
    },
    {
      "id": "llms-missing",
      "baseUrl": "https://llms-missing.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "Origin with no llms.txt at all.",
      "available": false
    },
    {
      "id": "llms-malformed",
      "baseUrl": "https://llms-malformed.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "Origin serving a malformed llms.txt.",
      "available": false
    },
    {
      "id": "host-www",
      "baseUrl": "https://www.canonical.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "The www variant of the host-canonicalisation pair.",
      "available": false
    },
    {
      "id": "host-apex",
      "baseUrl": "https://canonical.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "The apex variant of the host-canonicalisation pair.",
      "available": false
    },
    {
      "id": "host-www-to-apex",
      "baseUrl": "https://www.redirect-apex.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "A www host that redirects every request to its apex equivalent.",
      "available": false
    },
    {
      "id": "host-www-to-apex-target",
      "baseUrl": "https://redirect-apex.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "The apex target of the www-to-apex redirect host.",
      "available": false
    },
    {
      "id": "host-apex-to-www",
      "baseUrl": "https://redirect-www.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "An apex host that redirects every request to its www equivalent.",
      "available": false
    },
    {
      "id": "host-apex-to-www-target",
      "baseUrl": "https://www.redirect-www.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "The www target of the apex-to-www redirect host.",
      "available": false
    },
    {
      "id": "host-subdomain",
      "baseUrl": "https://cross-origin.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "A controlled cross-origin subdomain for cross-host fixtures.",
      "available": false
    },
    {
      "id": "host-case",
      "baseUrl": "https://casehost.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "A host for hostname case-normalisation fixtures.",
      "available": false
    },
    {
      "id": "host-idn",
      "baseUrl": "https://xn--bcher-kva.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "An internationalised (punycode) hostname.",
      "available": false
    },
    {
      "id": "tls-valid",
      "baseUrl": "https://tls-valid.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "A host with a valid TLS certificate, the control for the TLS variants.",
      "available": false
    },
    {
      "id": "tls-self-signed",
      "baseUrl": "https://tls-self-signed.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "A host presenting a self-signed certificate.",
      "available": false
    },
    {
      "id": "tls-expired",
      "baseUrl": "https://tls-expired.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "A host presenting an expired certificate.",
      "available": false
    },
    {
      "id": "tls-hostname-mismatch",
      "baseUrl": "https://tls-mismatch.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "A host presenting a certificate for a different hostname.",
      "available": false
    },
    {
      "id": "protocol-edge",
      "baseUrl": "https://protocol-edge.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "A host for protocol edge cases (HTTP versions, compression, raw URLs).",
      "available": false
    },
    {
      "id": "http-only",
      "baseUrl": "https://http-only.crawler-test-site.uk.sitebulb.com",
      "risk": "moderate",
      "summary": "A plain-HTTP host with no redirect to HTTPS.",
      "available": false
    },
    {
      "id": "cdn-assets",
      "baseUrl": "https://cdn.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "A CDN-style asset origin for crawl-scope subresource fixtures.",
      "available": false
    },
    {
      "id": "tracking-stub",
      "baseUrl": "https://tracking.crawler-test-site.uk.sitebulb.com",
      "risk": "safe",
      "summary": "A third-party-style tracking-stub origin for crawl-scope fixtures.",
      "available": false
    },
    {
      "id": "fingerprinting",
      "baseUrl": "https://fingerprint.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "A host that varies behaviour on client fingerprint signals.",
      "available": false
    },
    {
      "id": "streaming",
      "baseUrl": "https://streaming.crawler-test-site.uk.sitebulb.com",
      "risk": "risky",
      "summary": "A host serving chunked, slow-body, SSE, and WebSocket responses.",
      "available": false
    }
  ],
  "fixtures": [
    {
      "id": "http-status-100-continue",
      "title": "HTTP 100 Continue",
      "summary": "Emits a real interim 100 Continue before the final response; needs wire-level server support.",
      "route": "/tests/http-status/informational/100-continue",
      "method": "GET",
      "group": "http-status-codes",
      "profile": "protocol-edge",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:http-status-100-continue:final"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "contentRef": "http-status-codes/informational",
      "robotsStanzas": []
    },
    {
      "id": "http-status-101-switching-protocols",
      "title": "HTTP 101 Switching Protocols",
      "summary": "A protocol-upgrade endpoint a crawler must record without treating it as HTML.",
      "route": "/tests/http-status/informational/101-switching-protocols",
      "method": "GET",
      "group": "http-status-codes",
      "profile": "streaming",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 101,
        "expectedHeaders": [],
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin",
        "streaming"
      ],
      "sitebulbHintIds": [],
      "contentRef": "http-status-codes/informational",
      "robotsStanzas": []
    },
    {
      "id": "redirect-loop-self",
      "title": "Redirect loop — self",
      "summary": "Entry point of a self-referencing redirect loop a crawler must detect and abandon.",
      "route": "/tests/redirects/loops/self",
      "method": "GET",
      "group": "redirects",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 302,
        "expectedHeaders": [],
        "expectedLocation": "/tests/redirects/loops/self",
        "maxFollowCount": 1,
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "redirects/redirect-loops",
      "robotsStanzas": []
    },
    {
      "id": "redirect-loop-two-step-a",
      "title": "Redirect loop — two-step-a",
      "summary": "Entry point of a two-step redirect loop a crawler must detect and abandon.",
      "route": "/tests/redirects/loops/two-step-a",
      "method": "GET",
      "group": "redirects",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 302,
        "expectedHeaders": [],
        "expectedLocation": "/tests/redirects/loops/two-step-b",
        "maxFollowCount": 2,
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "redirects/redirect-loops",
      "robotsStanzas": []
    },
    {
      "id": "redirect-loop-three-step-a",
      "title": "Redirect loop — three-step-a",
      "summary": "Entry point of a three-step redirect loop a crawler must detect and abandon.",
      "route": "/tests/redirects/loops/three-step-a",
      "method": "GET",
      "group": "redirects",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 302,
        "expectedHeaders": [],
        "expectedLocation": "/tests/redirects/loops/three-step-b",
        "maxFollowCount": 3,
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "redirects/redirect-loops",
      "robotsStanzas": []
    },
    {
      "id": "redirect-meta-external",
      "title": "Meta refresh — external target",
      "summary": "An HTTP 200 page whose meta refresh points at the configured external example URL.",
      "route": "/tests/redirects/meta/external",
      "method": "GET",
      "group": "redirects",
      "profile": "primary",
      "implementationType": "astro-page",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": true,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:redirect-meta-external:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [
          {
            "kind": "refresh-meta",
            "value": "0; url=https://example.com/",
            "source": "raw"
          }
        ],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "redirects/meta-refresh",
      "robotsStanzas": []
    },
    {
      "id": "redirect-meta-loop",
      "title": "Meta refresh — loop",
      "summary": "An HTTP 200 page whose meta refresh points back at itself, a client-side refresh loop.",
      "route": "/tests/redirects/meta/loop",
      "method": "GET",
      "group": "redirects",
      "profile": "primary",
      "implementationType": "astro-page",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:redirect-meta-loop:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [
          {
            "kind": "refresh-meta",
            "value": "0; url=/tests/redirects/meta/loop",
            "source": "raw"
          }
        ],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "redirects/meta-refresh",
      "robotsStanzas": []
    },
    {
      "id": "redirect-meta-malformed-url",
      "title": "Meta refresh — malformed URL",
      "summary": "An HTTP 200 page whose meta refresh target is deliberately not a parseable URL.",
      "route": "/tests/redirects/meta/malformed-url",
      "method": "GET",
      "group": "redirects",
      "profile": "primary",
      "implementationType": "astro-page",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:redirect-meta-malformed-url:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [
          {
            "kind": "refresh-meta",
            "value": "0; url=ht!tp://::malformed::/destination",
            "source": "raw"
          }
        ],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "redirects/meta-refresh",
      "robotsStanzas": []
    },
    {
      "id": "redirect-js-onclick",
      "title": "JavaScript redirect — onclick only",
      "summary": "An HTTP 200 page that only redirects when its link is clicked; rendering alone must not navigate.",
      "route": "/tests/redirects/javascript/onclick",
      "method": "GET",
      "group": "redirects",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:redirect-js-onclick:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:redirect-js-onclick:raw"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "redirects/javascript-redirects",
      "robotsStanzas": []
    },
    {
      "id": "robots-root-block-all",
      "title": "Root robots.txt — block all",
      "summary": "An origin whose robots.txt disallows all crawling for every user agent.",
      "route": "/robots.txt",
      "method": "GET",
      "group": "robots-protocol",
      "profile": "robots-block-all",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/plain; charset=utf-8",
        "bodyMarkers": [
          "User-agent: *",
          "Disallow: /"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "robotsStanzas": []
    },
    {
      "id": "robots-ai-specific",
      "title": "Root robots.txt — AI crawler-specific rules",
      "summary": "A robots.txt whose rules target AI crawler user agents specifically.",
      "route": "/robots.txt",
      "method": "GET",
      "group": "robots-protocol",
      "profile": "robots-ai-specific",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/plain; charset=utf-8",
        "bodyMarkers": [
          "User-agent: GPTBot",
          "User-agent: ClaudeBot",
          "Disallow: /"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "robotsStanzas": []
    },
    {
      "id": "robots-malformed",
      "title": "Root robots.txt — malformed syntax",
      "summary": "A syntactically broken robots.txt that crawlers must tolerate.",
      "route": "/robots.txt",
      "method": "GET",
      "group": "robots-protocol",
      "profile": "robots-malformed",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/plain; charset=utf-8",
        "bodyMarkers": [
          "Disallow /missing-colon"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "robotsStanzas": []
    },
    {
      "id": "robots-500",
      "title": "Root robots.txt — HTTP 500",
      "summary": "An origin whose robots.txt request fails with HTTP 500.",
      "route": "/robots.txt",
      "method": "GET",
      "group": "robots-protocol",
      "profile": "robots-500",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 500,
        "expectedHeaders": [],
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "robotsStanzas": []
    },
    {
      "id": "robots-large",
      "title": "Root robots.txt — oversized file",
      "summary": "A robots.txt larger than the practical 500KiB parsing limit.",
      "route": "/robots.txt",
      "method": "GET",
      "group": "robots-protocol",
      "profile": "robots-large",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/plain; charset=utf-8",
        "bodyMarkers": [
          "User-agent: *"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "robotsStanzas": []
    },
    {
      "id": "robots-conflict-blocked-canonical",
      "title": "Conflict — canonical points at a robots-blocked page",
      "summary": "A crawlable page whose canonical link targets a page disallowed by robots.txt.",
      "route": "/tests/robots/conflicts/canonical-to-blocked",
      "method": "GET",
      "group": "robots-protocol",
      "profile": "primary",
      "implementationType": "astro-page",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:robots-conflict-blocked-canonical:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [
          {
            "kind": "canonical-html",
            "value": "/tests/robots/conflicts/blocked-target",
            "source": "raw"
          }
        ],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "robots-protocol/overview",
      "robotsStanzas": [
        {
          "userAgent": "*",
          "rules": [
            {
              "directive": "disallow",
              "path": "/tests/robots/conflicts/blocked-target"
            }
          ],
          "sitemapRefs": []
        }
      ]
    },
    {
      "id": "canonical-target-robots-blocked",
      "title": "Canonical — target is robots-blocked",
      "summary": "An HTML page whose canonical nominates a URL disallowed by robots.txt.",
      "route": "/tests/canonicals/to-robots-blocked",
      "method": "GET",
      "group": "canonical-tags",
      "profile": "primary",
      "implementationType": "astro-page",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:canonical-target-robots-blocked:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [
          {
            "kind": "canonical-html",
            "value": "https://crawler-test-site.uk.sitebulb.com/tests/canonicals/blocked-target",
            "source": "raw"
          }
        ],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [
        "CanonicalPointsToDisallowedUrls"
      ],
      "contentRef": "canonical-tags/overview",
      "robotsStanzas": [
        {
          "userAgent": "*",
          "rules": [
            {
              "directive": "disallow",
              "path": "/tests/canonicals/blocked-target"
            }
          ],
          "sitemapRefs": []
        }
      ]
    },
    {
      "id": "canonical-external",
      "title": "Canonical — external domain",
      "summary": "An HTML page whose canonical nominates a URL on an external domain.",
      "route": "/tests/canonicals/external-domain",
      "method": "GET",
      "group": "canonical-tags",
      "profile": "primary",
      "implementationType": "astro-page",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": true,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:canonical-external:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [
          {
            "kind": "canonical-html",
            "value": "https://example.com/",
            "source": "raw"
          }
        ],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [
        "CanonicalPointsToExternalUrl"
      ],
      "contentRef": "canonical-tags/overview",
      "robotsStanzas": []
    },
    {
      "id": "links-onclick-no-anchor",
      "title": "onclick navigation without an anchor",
      "summary": "A button whose onclick sets window.location; no anchor element exists.",
      "route": "/tests/links/javascript/onclick-no-anchor",
      "method": "GET",
      "group": "links",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:links-onclick-no-anchor:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:links-onclick-no-anchor:rendered"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "links/javascript-links",
      "robotsStanzas": []
    },
    {
      "id": "links-iframe-cross-domain",
      "title": "Cross-domain iframe",
      "summary": "A page embedding an iframe served from the controlled cross-origin subdomain.",
      "route": "/tests/links/iframes/cross-domain",
      "method": "GET",
      "group": "links",
      "profile": "primary",
      "implementationType": "astro-page",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:links-iframe-cross-domain:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "contentRef": "links/iframes",
      "robotsStanzas": []
    },
    {
      "id": "links-10000-unique",
      "title": "10,000 unique anchors",
      "summary": "A streamed page containing exactly 10,000 unique internal anchors.",
      "route": "/tests/links/large/10000-unique",
      "method": "GET",
      "group": "links",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:links-10000-unique:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "robotsStanzas": []
    },
    {
      "id": "urls-very-long",
      "title": "Very long URL",
      "summary": "A page whose single anchor targets a deterministically generated 1800-character URL.",
      "route": "/tests/urls/length/long-generated",
      "method": "GET",
      "group": "urls-normalisation",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:urls-very-long:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": [
          {
            "href": "/tests/urls/length/echo?p=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            "source": "raw",
            "discoverable": true
          }
        ]
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "urls-normalisation/overview",
      "robotsStanzas": []
    },
    {
      "id": "js-delay-5000",
      "title": "Content delayed by 5000ms",
      "summary": "A setTimeout of exactly 5000ms appends the rendered marker, beyond most default render timeouts.",
      "route": "/tests/javascript/delays/5000ms",
      "method": "GET",
      "group": "javascript-rendering",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:js-delay-5000:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:js-delay-5000:rendered"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "javascript-rendering/overview",
      "robotsStanzas": []
    },
    {
      "id": "js-noindex-injected",
      "title": "Meta robots noindex injected by JavaScript",
      "summary": "An inline script inserts a meta robots noindex after load; the raw bytes carry no noindex token.",
      "route": "/tests/javascript/proof/noindex-injected",
      "method": "GET",
      "group": "javascript-rendering",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:js-noindex-injected:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:js-noindex-injected:rendered"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [
          {
            "kind": "meta-robots",
            "value": "noindex",
            "source": "rendered"
          }
        ],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "javascript-rendering/noindex-proof",
      "robotsStanzas": []
    },
    {
      "id": "js-click-reveal",
      "title": "Content revealed on click",
      "summary": "A button with id sb-action exists in the raw HTML; only clicking it appends the rendered marker and revealed content.",
      "route": "/tests/javascript/events/click-reveal",
      "method": "GET",
      "group": "javascript-rendering",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:js-click-reveal:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:js-click-reveal:rendered"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "javascript-rendering/overview",
      "robotsStanzas": []
    },
    {
      "id": "js-infinite-scroll",
      "title": "Bounded infinite scroll",
      "summary": "Scrolling to the bottom appends one content batch per pass, hard-bounded at 3 batches; the first batch carries the rendered marker.",
      "route": "/tests/javascript/events/infinite-scroll",
      "method": "GET",
      "group": "javascript-rendering",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:js-infinite-scroll:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:js-infinite-scroll:rendered"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "javascript-rendering/events",
      "robotsStanzas": []
    },
    {
      "id": "js-shadow-closed",
      "title": "Content inside a closed shadow root",
      "summary": "A closed shadow root holds runtime-built hidden text; the outer rendered marker only confirms attachment happened.",
      "route": "/tests/javascript/shadow-dom/closed",
      "method": "GET",
      "group": "javascript-rendering",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:js-shadow-closed:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:js-shadow-closed:rendered"
        ],
        "absentRenderedMarkers": [
          "sb-fixture:js-shadow-closed:hidden"
        ],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "javascript-rendering/shadow-dom",
      "robotsStanzas": []
    },
    {
      "id": "js-service-worker",
      "title": "Service worker registration",
      "summary": "The page registers a scoped passthrough service worker and appends the rendered marker on successful registration.",
      "route": "/tests/javascript/service-worker/cache-control",
      "method": "GET",
      "group": "javascript-rendering",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:js-service-worker:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:js-service-worker:rendered"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "https"
      ],
      "sitebulbHintIds": [],
      "contentRef": "javascript-rendering/overview",
      "robotsStanzas": []
    },
    {
      "id": "headers-content-type-missing",
      "title": "Content-Type missing entirely",
      "summary": "Serves a complete HTML body with no Content-Type header at all.",
      "route": "/tests/http-headers/content-type/missing",
      "method": "GET",
      "group": "http-headers",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [
          {
            "name": "Content-Type",
            "absent": true
          }
        ],
        "bodyMarkers": [
          "sb-fixture:headers-content-type-missing:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "http-headers/content-negotiation-and-type",
      "robotsStanzas": []
    },
    {
      "id": "headers-zstd",
      "title": "Compression — zstd encoded response",
      "summary": "Serves HTML with Content-Encoding: zstd negotiated at the proxy layer.",
      "route": "/tests/http-headers/compression/zstd",
      "method": "GET",
      "group": "http-headers",
      "profile": "protocol-edge",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [
          {
            "name": "Content-Encoding",
            "value": "zstd"
          }
        ],
        "bodyMarkers": [
          "sb-fixture:headers-zstd:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin",
        "compression-control"
      ],
      "sitebulbHintIds": [],
      "contentRef": "http-headers/compression-and-transfer",
      "robotsStanzas": []
    },
    {
      "id": "headers-chunked",
      "title": "Chunked transfer encoding",
      "summary": "Serves HTML with Transfer-Encoding: chunked and no Content-Length.",
      "route": "/tests/http-headers/transfer/chunked",
      "method": "GET",
      "group": "http-headers",
      "profile": "streaming",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [
          {
            "name": "Transfer-Encoding",
            "value": "chunked"
          },
          {
            "name": "Content-Length",
            "absent": true
          }
        ],
        "bodyMarkers": [
          "sb-fixture:headers-chunked:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin",
        "streaming"
      ],
      "sitebulbHintIds": [],
      "contentRef": "http-headers/compression-and-transfer",
      "robotsStanzas": []
    },
    {
      "id": "headers-delay-30s",
      "title": "Delayed response — 30 seconds",
      "summary": "Holds the whole response for exactly 30 seconds, long enough to trip common crawler timeouts.",
      "route": "/tests/http-headers/timing/delay-30s",
      "method": "GET",
      "group": "http-headers",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:headers-delay-30s:served"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "http-headers/timing",
      "robotsStanzas": []
    },
    {
      "id": "headers-fast-slow-body",
      "title": "Fast headers, slow body",
      "summary": "Sends the 200 status and headers immediately, then trickles the body so the marker arrives last.",
      "route": "/tests/http-headers/timing/fast-headers-slow-body",
      "method": "GET",
      "group": "http-headers",
      "profile": "streaming",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:headers-fast-slow-body:tail"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin",
        "streaming"
      ],
      "sitebulbHintIds": [],
      "contentRef": "http-headers/timing",
      "robotsStanzas": []
    },
    {
      "id": "limit-50000-urls",
      "title": "Sitemap at the 50,000-URL limit",
      "summary": "A streamed urlset with exactly 50,000 URLs, the sitemaps.org protocol maximum.",
      "route": "/tests/sitemaps/fixtures/limit-50000-urls.xml",
      "method": "GET",
      "group": "sitemaps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/xml; charset=utf-8",
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "sitemaps/limits-and-encoding",
      "robotsStanzas": []
    },
    {
      "id": "limit-50001-urls",
      "title": "Sitemap one over the 50,000-URL limit",
      "summary": "A streamed urlset with exactly 50,001 URLs, one over the sitemaps.org protocol maximum.",
      "route": "/tests/sitemaps/fixtures/limit-50001-urls.xml",
      "method": "GET",
      "group": "sitemaps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/xml; charset=utf-8",
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "sitemaps/limits-and-encoding",
      "robotsStanzas": []
    },
    {
      "id": "malformed-xml",
      "title": "Malformed sitemap XML",
      "summary": "An unclosed urlset whose only loc carries a bare ampersand, so strict XML parsing must fail.",
      "route": "/tests/sitemaps/fixtures/malformed-xml.xml",
      "method": "GET",
      "group": "sitemaps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/xml; charset=utf-8",
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "sitemaps/limits-and-encoding",
      "robotsStanzas": []
    },
    {
      "id": "path-depth-level-1",
      "title": "Path depth trap — entry at level 1",
      "summary": "Entry of a 25-level deep path chain where each level links only to the next.",
      "route": "/tests/spider-traps/path-depth/level-1",
      "method": "GET",
      "group": "spider-traps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:path-depth-level-1:entry"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": [
          {
            "href": "/tests/spider-traps/path-depth/level-2",
            "source": "raw",
            "discoverable": true
          }
        ]
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "spider-traps/path-depth",
      "robotsStanzas": []
    },
    {
      "id": "query-increment-n1",
      "title": "Query increment trap — page 1",
      "summary": "Entry of an incrementing page-parameter series where each page links only to the next.",
      "route": "/tests/spider-traps/query-increment?page=1",
      "method": "GET",
      "group": "spider-traps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:query-increment-n1:entry"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": [
          {
            "href": "/tests/spider-traps/query-increment?page=2",
            "source": "raw",
            "discoverable": true
          }
        ]
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "spider-traps/query-increment",
      "robotsStanzas": []
    },
    {
      "id": "calendar-month-mid",
      "title": "Calendar trap — mid-range month",
      "summary": "A month page in the middle of the fixed 48-month calendar, linking to the previous and next months.",
      "route": "/tests/spider-traps/calendar/2026/06",
      "method": "GET",
      "group": "spider-traps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:calendar-month-mid:entry"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": [
          {
            "href": "/tests/spider-traps/calendar/2026/05",
            "source": "raw",
            "discoverable": true
          },
          {
            "href": "/tests/spider-traps/calendar/2026/07",
            "source": "raw",
            "discoverable": true
          }
        ]
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "spider-traps/calendar",
      "robotsStanzas": []
    },
    {
      "id": "session-id-stable-seed",
      "title": "Session-id trap — stable seed",
      "summary": "A session-style sid parameter that is really a deterministic hash of each target path.",
      "route": "/tests/spider-traps/session-id",
      "method": "GET",
      "group": "spider-traps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:session-id-stable-seed:entry"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": [
          {
            "href": "/tests/spider-traps/session-id/a?sid=6f78393b",
            "source": "raw",
            "discoverable": true
          },
          {
            "href": "/tests/spider-traps/session-id/b?sid=70783ace",
            "source": "raw",
            "discoverable": true
          },
          {
            "href": "/tests/spider-traps/session-id/c?sid=71783c61",
            "source": "raw",
            "discoverable": true
          }
        ]
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "spider-traps/session-id",
      "robotsStanzas": []
    },
    {
      "id": "faceted-two-dimensions",
      "title": "Faceted navigation trap — two dimensions",
      "summary": "A facet hub of 5 colours by 5 sizes producing 25 near-duplicate combination pages.",
      "route": "/tests/spider-traps/faceted",
      "method": "GET",
      "group": "spider-traps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:faceted-two-dimensions:entry"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [
        "NearDuplicate"
      ],
      "contentRef": "spider-traps/faceted",
      "robotsStanzas": []
    },
    {
      "id": "faceted-high-combination-boundary",
      "title": "Faceted navigation trap — 500-combination boundary",
      "summary": "A four-dimension facet hub capped at exactly 500 of 625 possible combinations.",
      "route": "/tests/spider-traps/faceted-deep",
      "method": "GET",
      "group": "spider-traps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:faceted-high-combination-boundary:entry"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [
        "NearDuplicate"
      ],
      "contentRef": "spider-traps/faceted",
      "robotsStanzas": []
    },
    {
      "id": "timestamp-hash-unique",
      "title": "Unique-token URL trap — deterministic hash chain",
      "summary": "A chain of unique-looking token URLs where each token is a deterministic hash of the parent path.",
      "route": "/tests/spider-traps/timestamp-hash-unique",
      "method": "GET",
      "group": "spider-traps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:timestamp-hash-unique:entry"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": [
          {
            "href": "/tests/spider-traps/timestamp-hash-unique/582f8af6",
            "source": "raw",
            "discoverable": true
          }
        ]
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "spider-traps/timestamp-hash",
      "robotsStanzas": []
    },
    {
      "id": "large-body-10mb",
      "title": "Oversized response — 10 MB streamed body",
      "summary": "A streamed HTML body of exactly 10,485,760 bytes with start and end markers.",
      "route": "/tests/spider-traps/large-body-10mb",
      "method": "GET",
      "group": "spider-traps",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:large-body-10mb:start",
          "sb-fixture:large-body-10mb:end"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "spider-traps/large-body",
      "robotsStanzas": []
    },
    {
      "id": "auth-basic-401",
      "title": "HTTP Basic authentication challenge",
      "summary": "Challenges every request without the documented fixture credentials with a 401 Basic challenge.",
      "route": "/tests/auth/basic-401",
      "method": "GET",
      "group": "auth-access-control",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "safe-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 401,
        "expectedHeaders": [
          {
            "name": "WWW-Authenticate",
            "value": "Basic realm=\"crawler-test\""
          }
        ],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:auth-basic-401:challenged"
        ],
        "absentBodyMarkers": [
          "sb-fixture:auth-basic-401:granted"
        ],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "auth-access-control/basic-auth",
      "robotsStanzas": []
    },
    {
      "id": "auth-basic-success-test-credentials",
      "title": "HTTP Basic authentication success with test credentials",
      "summary": "Grants a 200 to the documented fixture credentials and challenges everything else with a 401.",
      "route": "/tests/auth/basic-success-test-credentials",
      "method": "GET",
      "group": "auth-access-control",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "safe-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 401,
        "expectedHeaders": [
          {
            "name": "WWW-Authenticate",
            "value": "Basic realm=\"crawler-test\""
          }
        ],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:auth-basic-success-test-credentials:challenged"
        ],
        "absentBodyMarkers": [
          "sb-fixture:auth-basic-success-test-credentials:granted"
        ],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "auth-access-control/basic-auth",
      "robotsStanzas": []
    },
    {
      "id": "auth-digest-401",
      "title": "HTTP Digest authentication challenge",
      "summary": "Always returns a 401 with a deterministic Digest challenge; access is never granted.",
      "route": "/tests/auth/digest-401",
      "method": "GET",
      "group": "auth-access-control",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "safe-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 401,
        "expectedHeaders": [
          {
            "name": "WWW-Authenticate",
            "value": "Digest realm=\"crawler-test\", qop=\"auth\", algorithm=MD5, nonce=\"sb-fixture-digest-nonce\", opaque=\"sb-fixture-digest-opaque\""
          }
        ],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:auth-digest-401:challenged"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "auth-access-control/digest-auth",
      "robotsStanzas": []
    },
    {
      "id": "auth-cookie-gated-content",
      "title": "Cookie-gated content",
      "summary": "Serves its content only to requests carrying the fixture session cookie; everything else bounces to the login page.",
      "route": "/tests/auth/cookie-gated-content",
      "method": "GET",
      "group": "auth-access-control",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "safe-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 302,
        "expectedHeaders": [],
        "expectedLocation": "/tests/auth/login-form-visible",
        "expectedFinalStatus": 200,
        "maxFollowCount": 1,
        "bodyMarkers": [],
        "absentBodyMarkers": [
          "sb-fixture:auth-cookie-gated-content:granted"
        ],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "auth-access-control/cookies-and-sessions",
      "robotsStanzas": []
    },
    {
      "id": "auth-expired-session",
      "title": "Expired session cookie",
      "summary": "Sets an already-expired session cookie and applies the cookie gate, so cookie-honouring clients always bounce to login.",
      "route": "/tests/auth/expired-session",
      "method": "GET",
      "group": "auth-access-control",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "safe-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 302,
        "expectedHeaders": [
          {
            "name": "Set-Cookie",
            "value": "sb_fixture_session=granted; Path=/tests/auth/; HttpOnly; Expires=Thu, 01 Jan 1970 00:00:00 GMT"
          }
        ],
        "expectedLocation": "/tests/auth/login-form-visible",
        "expectedFinalStatus": 200,
        "maxFollowCount": 1,
        "bodyMarkers": [],
        "absentBodyMarkers": [
          "sb-fixture:auth-expired-session:granted"
        ],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "auth-access-control/cookies-and-sessions",
      "robotsStanzas": []
    },
    {
      "id": "auth-samesite-strict",
      "title": "SameSite=Strict cookie scoping",
      "summary": "Sets a SameSite=Strict cookie and renders whether the cookie arrived on the request.",
      "route": "/tests/auth/samesite-strict",
      "method": "GET",
      "group": "auth-access-control",
      "profile": "primary",
      "implementationType": "astro-page",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "safe-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [
          {
            "name": "Set-Cookie",
            "value": "sb_fixture_samesite=granted; Path=/tests/auth/; SameSite=Strict; HttpOnly"
          }
        ],
        "bodyMarkers": [
          "sb-fixture:auth-samesite-strict:ungated"
        ],
        "absentBodyMarkers": [
          "sb-fixture:auth-samesite-strict:granted"
        ],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "contentRef": "auth-access-control/cookies-and-sessions",
      "robotsStanzas": []
    },
    {
      "id": "resource-large-binary",
      "title": "Large binary resource",
      "summary": "A generated 8,388,608-byte octet-stream, streamed in fixed chunks with a deterministic byte scheme and a concurrency cap of 4.",
      "route": "/tests/non-html/resource-large-binary.bin",
      "method": "GET",
      "group": "non-html-resources",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [
          {
            "name": "Content-Length",
            "value": "8388608"
          }
        ],
        "expectedContentType": "application/octet-stream",
        "bodyMarkers": [
          "sb-fixture:resource-large-binary:body"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "non-html-resources/delivery-edge-cases",
      "robotsStanzas": []
    },
    {
      "id": "intl-fuji-sitemap",
      "title": "Fuji Kitchen site-local sitemap",
      "summary": "The second declaration channel for the sitemap-head cluster; supplied manually in audit setup and referenced from nowhere.",
      "route": "/intl/fuji/sitemap.xml",
      "method": "GET",
      "group": "international-sites",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "safe",
      "sitemapPolicy": "never",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "application/xml",
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "international-sites/fuji",
      "robotsStanzas": []
    },
    {
      "id": "ai-robots-full-policy-profile",
      "title": "AI robots full-policy origin",
      "summary": "The robots-ai-specific origin whose root robots.txt carries whole-origin AI crawler policies.",
      "route": "/",
      "method": "GET",
      "group": "ai-modern-crawlers",
      "profile": "robots-ai-specific",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "contentRef": "ai-modern-crawlers/per-bot-robots",
      "robotsStanzas": []
    },
    {
      "id": "ai-llms-malformed",
      "title": "llms.txt — malformed",
      "summary": "The llms-malformed origin serving a 200 llms.txt of binary junk with no Markdown structure.",
      "route": "/llms.txt",
      "method": "GET",
      "group": "ai-modern-crawlers",
      "profile": "llms-malformed",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/plain",
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "contentRef": "ai-modern-crawlers/llms-txt",
      "robotsStanzas": []
    },
    {
      "id": "exotic-browser-webdriver",
      "title": "Browser fingerprint surface — navigator.webdriver",
      "summary": "Renders the value of navigator.webdriver into the rendered-marker element so the crawler sees its own automation flag.",
      "route": "/tests/exotic-advanced-tests/browser/webdriver",
      "method": "GET",
      "group": "exotic-advanced-tests",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:exotic-browser-webdriver:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:exotic-browser-webdriver:rendered"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "exotic-advanced-tests/browser-fingerprint-surface",
      "robotsStanzas": []
    },
    {
      "id": "exotic-browser-plugins-length",
      "title": "Browser fingerprint surface — navigator.plugins.length",
      "summary": "Renders navigator.plugins.length into the rendered-marker element so the crawler sees its plugin-count signature.",
      "route": "/tests/exotic-advanced-tests/browser/plugins-length",
      "method": "GET",
      "group": "exotic-advanced-tests",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:exotic-browser-plugins-length:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:exotic-browser-plugins-length:rendered"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "exotic-advanced-tests/browser-fingerprint-surface",
      "robotsStanzas": []
    },
    {
      "id": "exotic-browser-viewport",
      "title": "Browser fingerprint surface — render viewport",
      "summary": "Renders innerWidth x innerHeight into the rendered-marker element so the crawler sees its render viewport dimensions.",
      "route": "/tests/exotic-advanced-tests/browser/viewport",
      "method": "GET",
      "group": "exotic-advanced-tests",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:exotic-browser-viewport:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:exotic-browser-viewport:rendered"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "exotic-advanced-tests/browser-fingerprint-surface",
      "robotsStanzas": []
    },
    {
      "id": "exotic-browser-no-mouse-movement",
      "title": "Browser fingerprint surface — mouse movement absence",
      "summary": "A bounded 3 second timer records whether any mousemove event fired, then renders the result into the rendered-marker element.",
      "route": "/tests/exotic-advanced-tests/browser/no-mouse-movement",
      "method": "GET",
      "group": "exotic-advanced-tests",
      "profile": "primary",
      "implementationType": "browser-fixture",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:exotic-browser-no-mouse-movement:raw"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [
          "sb-fixture:exotic-browser-no-mouse-movement:rendered"
        ],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "exotic-advanced-tests/browser-fingerprint-surface",
      "robotsStanzas": []
    },
    {
      "id": "exotic-tls-ja3-profile",
      "title": "TLS fingerprint echo — JA3",
      "summary": "The fingerprinting origin echoes the JA3 fingerprint captured for the requesting TLS connection as JSON.",
      "route": "/fingerprint/ja3",
      "method": "GET",
      "group": "exotic-advanced-tests",
      "profile": "fingerprinting",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "application/json",
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "tls-fingerprinting",
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "contentRef": "exotic-advanced-tests/tls-fingerprinting",
      "robotsStanzas": []
    },
    {
      "id": "exotic-tls-ja4-profile",
      "title": "TLS fingerprint echo — JA4",
      "summary": "The fingerprinting origin echoes the JA4 fingerprint captured for the requesting TLS connection as JSON.",
      "route": "/fingerprint/ja4",
      "method": "GET",
      "group": "exotic-advanced-tests",
      "profile": "fingerprinting",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "application/json",
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "tls-fingerprinting",
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "contentRef": "exotic-advanced-tests/tls-fingerprinting",
      "robotsStanzas": []
    },
    {
      "id": "exotic-sse-endpoint",
      "title": "Server-sent events stream",
      "summary": "A bounded SSE stream emitting exactly 10 events at 500 ms intervals before closing cleanly.",
      "route": "/streams/sse",
      "method": "GET",
      "group": "exotic-advanced-tests",
      "profile": "streaming",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/event-stream",
        "bodyMarkers": [],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "streaming",
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "contentRef": "exotic-advanced-tests/streaming",
      "robotsStanzas": []
    },
    {
      "id": "exotic-websocket-upgrade",
      "title": "WebSocket upgrade route",
      "summary": "WebSocket clients get a valid 101 upgrade; plain GET receives a deterministic 426 with the upgrade-required marker.",
      "route": "/streams/websocket",
      "method": "GET",
      "group": "exotic-advanced-tests",
      "profile": "streaming",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 426,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:exotic-websocket-upgrade:upgrade-required"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "streaming",
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "contentRef": "exotic-advanced-tests/streaming",
      "robotsStanzas": []
    },
    {
      "id": "exotic-long-polling",
      "title": "Long-polling release",
      "summary": "Holds the response open for at most 20 seconds, then returns 200 with the released marker.",
      "route": "/streams/long-poll",
      "method": "GET",
      "group": "exotic-advanced-tests",
      "profile": "streaming",
      "implementationType": "supporting-profile",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:exotic-long-polling:released"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "streaming",
        "multi-origin"
      ],
      "sitebulbHintIds": [],
      "contentRef": "exotic-advanced-tests/streaming",
      "robotsStanzas": []
    },
    {
      "id": "exotic-parser-stress-malformed",
      "title": "Parser stress — malformed markup",
      "summary": "Five recoverable malformation classes, each wrapped around its own marker, served verbatim.",
      "route": "/tests/exotic-advanced-tests/parser/malformed",
      "method": "GET",
      "group": "exotic-advanced-tests",
      "profile": "primary",
      "implementationType": "astro-page",
      "routeClass": "entry",
      "risk": "moderate",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "bodyMarkers": [
          "sb-fixture:exotic-parser-stress-malformed:unclosed-block",
          "sb-fixture:exotic-parser-stress-malformed:mis-nested",
          "sb-fixture:exotic-parser-stress-malformed:orphan-close",
          "sb-fixture:exotic-parser-stress-malformed:bogus-comment",
          "sb-fixture:exotic-parser-stress-malformed:unterminated-attr"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "exotic-advanced-tests/parser-stress",
      "robotsStanzas": []
    },
    {
      "id": "asset-enormous-payload-page",
      "title": "Enormous network payload page",
      "summary": "References two 2,621,440-byte binary payloads, pushing the total page transfer over the 4 MB threshold.",
      "route": "/tests/asset-weight/enormous-payload",
      "method": "GET",
      "group": "asset-weight",
      "profile": "primary",
      "implementationType": "astro-page",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:asset-enormous-payload-page:body"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [
        "compression-control"
      ],
      "sitebulbHintIds": [
        "AvoidEnormousNetworkPayloads"
      ],
      "contentRef": "asset-weight/enormous-payload",
      "robotsStanzas": []
    },
    {
      "id": "vitals-ttfb-slow-document",
      "title": "TTFB — 2,500ms slow document",
      "summary": "The server sleeps exactly 2,500ms before emitting a normal small HTML page; concurrency-capped at 8 with 429 overflow.",
      "route": "/tests/web-vitals/ttfb-slow-document",
      "method": "GET",
      "group": "web-vitals",
      "profile": "primary",
      "implementationType": "astro-endpoint",
      "routeClass": "entry",
      "risk": "risky",
      "sitemapPolicy": "risky-manifest-only",
      "includeInNavigation": false,
      "directEntryOnly": true,
      "external": false,
      "expectation": {
        "expectedStatus": 200,
        "expectedHeaders": [],
        "expectedContentType": "text/html; charset=utf-8",
        "bodyMarkers": [
          "sb-fixture:vitals-ttfb-slow-document:body"
        ],
        "absentBodyMarkers": [],
        "renderedMarkers": [],
        "absentRenderedMarkers": [],
        "expectedDirectives": [],
        "expectedLinks": []
      },
      "environmentCapabilities": [],
      "sitebulbHintIds": [],
      "contentRef": "web-vitals/time-to-first-byte",
      "robotsStanzas": []
    }
  ]
}