{
  "schema_version": "project-delta.openai-crawler-robots-execution.v2",
  "fixture_version": "2.0.0",
  "released_at": "2026-08-10",
  "execution": {
    "state": "executed_deterministic_local_evaluation",
    "executed": true,
    "evaluator": "project-delta.rfc9309-bounded-evaluator.v1",
    "fixture_count": 10,
    "passed": 10,
    "failed": 0
  },
  "claim_boundary": "These results execute a bounded RFC 9309 policy evaluator against public fixtures. They do not evidence a live request, network identity, crawler compliance, search inclusion, training exclusion, citation, ranking, traffic, or conversion.",
  "primary_sources": [
    "https://developers.openai.com/api/docs/bots",
    "https://openai.com/gptbot.json",
    "https://openai.com/searchbot.json",
    "https://www.rfc-editor.org/rfc/rfc9309"
  ],
  "fixtures": [
    {
      "fixture_id": "gptbot-specific-root-block",
      "expected": {
        "matchingGroup": "GPTBot",
        "matchingRule": "Disallow: /",
        "protocolDecision": "disallow",
        "rfcAccessState": "resolved_disallow"
      },
      "actual": {
        "matching_group": "GPTBot",
        "matching_rule": "Disallow: /",
        "protocol_decision": "disallow",
        "rfc_access_state": "resolved_disallow"
      },
      "passed": true,
      "network_identity_state": "unverified",
      "provider_application_state": "not_tested",
      "downstream_outcome_state": "unknown",
      "claim_boundary": "The rule resolves a declared GPTBot policy; it does not prove who sent a request."
    },
    {
      "fixture_id": "gptbot-public-subtree-allow",
      "expected": {
        "matchingGroup": "GPTBot",
        "matchingRule": "Allow: /public/",
        "protocolDecision": "allow",
        "rfcAccessState": "resolved_allow"
      },
      "actual": {
        "matching_group": "GPTBot",
        "matching_rule": "Allow: /public/",
        "protocol_decision": "allow",
        "rfc_access_state": "resolved_allow"
      },
      "passed": true,
      "network_identity_state": "unverified",
      "provider_application_state": "not_tested",
      "downstream_outcome_state": "unknown",
      "claim_boundary": "Longest-path resolution does not establish that the permitted page will be fetched or used."
    },
    {
      "fixture_id": "wildcard-fallback-block",
      "expected": {
        "matchingGroup": "*",
        "matchingRule": "Disallow: /private/",
        "protocolDecision": "disallow",
        "rfcAccessState": "resolved_disallow"
      },
      "actual": {
        "matching_group": "*",
        "matching_rule": "Disallow: /private/",
        "protocol_decision": "disallow",
        "rfc_access_state": "resolved_disallow"
      },
      "passed": true,
      "network_identity_state": "unverified",
      "provider_application_state": "not_tested",
      "downstream_outcome_state": "unknown",
      "claim_boundary": "A wildcard decision applies only when a specific matching group is absent."
    },
    {
      "fixture_id": "specific-groups-merge",
      "expected": {
        "matchingGroup": "GPTBot + GPTBot",
        "matchingRule": "Allow: /",
        "protocolDecision": "allow",
        "rfcAccessState": "resolved_allow"
      },
      "actual": {
        "matching_group": "GPTBot + GPTBot",
        "matching_rule": "Allow: /",
        "protocol_decision": "allow",
        "rfc_access_state": "resolved_allow"
      },
      "passed": true,
      "network_identity_state": "unverified",
      "provider_application_state": "not_tested",
      "downstream_outcome_state": "unknown",
      "claim_boundary": "Combining matching groups does not prove crawler compliance or change other agent policies."
    },
    {
      "fixture_id": "search-training-agent-separation",
      "expected": {
        "matchingGroup": "OAI-SearchBot",
        "matchingRule": "Allow: /",
        "protocolDecision": "allow",
        "rfcAccessState": "resolved_allow"
      },
      "actual": {
        "matching_group": "OAI-SearchBot",
        "matching_rule": "Allow: /",
        "protocol_decision": "allow",
        "rfc_access_state": "resolved_allow"
      },
      "passed": true,
      "network_identity_state": "unverified",
      "provider_application_state": "not_tested",
      "downstream_outcome_state": "unknown",
      "claim_boundary": "Search-crawl eligibility remains separate from training policy and does not guarantee inclusion."
    },
    {
      "fixture_id": "chatgpt-user-provider-boundary",
      "expected": {
        "matchingGroup": "ChatGPT-User",
        "matchingRule": "Disallow: /",
        "protocolDecision": "disallow",
        "rfcAccessState": "resolved_disallow"
      },
      "actual": {
        "matching_group": "ChatGPT-User",
        "matching_rule": "Disallow: /",
        "protocol_decision": "disallow",
        "rfc_access_state": "resolved_disallow"
      },
      "passed": true,
      "network_identity_state": "unverified",
      "provider_application_state": "documented_robots_may_not_apply",
      "downstream_outcome_state": "unknown",
      "claim_boundary": "The parsed automatic-crawl policy remains separate from documented user-triggered product behavior."
    },
    {
      "fixture_id": "equal-length-allow-wins",
      "expected": {
        "matchingGroup": "GPTBot",
        "matchingRule": "Allow: /folder",
        "protocolDecision": "allow",
        "rfcAccessState": "resolved_allow"
      },
      "actual": {
        "matching_group": "GPTBot",
        "matching_rule": "Allow: /folder",
        "protocol_decision": "allow",
        "rfc_access_state": "resolved_allow"
      },
      "passed": true,
      "network_identity_state": "unverified",
      "provider_application_state": "not_tested",
      "downstream_outcome_state": "unknown",
      "claim_boundary": "RFC 9309 says Allow should win the tie; provider-specific behavior remains a separate observation."
    },
    {
      "fixture_id": "percent-encoded-path-block",
      "expected": {
        "matchingGroup": "GPTBot",
        "matchingRule": "Disallow: /caf%C3%A9/",
        "protocolDecision": "disallow",
        "rfcAccessState": "resolved_disallow"
      },
      "actual": {
        "matching_group": "GPTBot",
        "matching_rule": "Disallow: /caf%C3%A9/",
        "protocol_decision": "disallow",
        "rfc_access_state": "resolved_disallow"
      },
      "passed": true,
      "network_identity_state": "unverified",
      "provider_application_state": "not_tested",
      "downstream_outcome_state": "unknown",
      "claim_boundary": "The fixture does not claim equivalence for every encoded or decoded URI representation."
    },
    {
      "fixture_id": "empty-disallow-allows",
      "expected": {
        "matchingGroup": "GPTBot",
        "matchingRule": "<none>",
        "protocolDecision": "allow",
        "rfcAccessState": "resolved_allow"
      },
      "actual": {
        "matching_group": "GPTBot",
        "matching_rule": "<none>",
        "protocol_decision": "allow",
        "rfc_access_state": "resolved_allow"
      },
      "passed": true,
      "network_identity_state": "unverified",
      "provider_application_state": "not_tested",
      "downstream_outcome_state": "unknown",
      "claim_boundary": "A permissive result does not prove that edge, origin, or authentication policy permits access."
    },
    {
      "fixture_id": "robots-unavailable-404",
      "expected": {
        "matchingGroup": "<none>",
        "matchingRule": "<none>",
        "protocolDecision": "unresolved",
        "rfcAccessState": "access_permitted"
      },
      "actual": {
        "matching_group": "<none>",
        "matching_rule": "<none>",
        "protocol_decision": "unresolved",
        "rfc_access_state": "access_permitted"
      },
      "passed": true,
      "network_identity_state": "unverified",
      "provider_application_state": "unknown",
      "downstream_outcome_state": "unknown",
      "claim_boundary": "RFC 9309 permits access after an unavailable 4xx response but does not require a later fetch."
    }
  ]
}
