{
 "kind": "crawlcheck-observer-fixtures",
 "v": 1,
 "protocol": "https://crawlcheck.io/docs/observer-protocol",
 "generated_at": "2026-10-02T04:56:39.806Z",
 "prefixes": {
  "observation": "crawlcheck-observation-v1\n",
  "enrolment": "crawlcheck-observer-enrol-v1\n"
 },
 "canonical_json": "keys sorted, no whitespace",
 "fixtures": [
  {
   "name": "valid",
   "type": "observation",
   "envelope": {
    "v": 1,
    "kind": "crawlcheck-observation",
    "observer_id": "ind:fixture-a",
    "software": {
     "name": "crawlcheck-open-observer",
     "version": "1.0.0"
    },
    "run": {
     "run_id": "00000000-0000-4000-8000-000000000001"
    },
    "vantage": {
     "provider": "fixture",
     "asn_org": "AS64496 Example",
     "country": "ZZ"
    },
    "clock": {
     "observed_at": "2026-10-02T00:00:00.000Z",
     "server_date": null,
     "skew_ms": null,
     "method": "fixture"
    },
    "profile_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
    "task": {
     "task_id": "t1:fixture",
     "domain": "example.com",
     "url": "https://example.com/"
    },
    "fetches": [
     {
      "identity": "browser",
      "request": {
       "headers": {
        "user-agent": "Mozilla/5.0"
       }
      },
      "started_at": "2026-10-02T00:00:00.000Z",
      "ms": 120,
      "status": 200,
      "url_final": "https://example.com/",
      "headers": {
       "content-type": "text/html"
      },
      "bytes": 1256,
      "sha256": "ea8fac7c65fb589b0d53560f5251f74f9e9b243478dcb6b3ea79b5e36449c8d9",
      "error": null
     }
    ],
    "key": {
     "kty": "OKP",
     "crv": "Ed25519",
     "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
    }
   },
   "sig": "3WC0BUoTDocTUsgorhZrpZ4CxmgBdxb7KUPT76OgjfDBQydCuL229hFZbXeHpQkgy9l6FtEhgRyxdnoAt1AUCg",
   "directory_entry": {
    "observer_id": "ind:fixture-a",
    "class": "independent",
    "signing": {
     "kind": "enrolled_ed25519",
     "key": {
      "kty": "OKP",
      "crv": "Ed25519",
      "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
     }
    }
   },
   "expected": {
    "shape": true,
    "key_matches_directory": true,
    "signature": true,
    "ok": true
   },
   "why": "signed by the enrolled key over the canonical envelope"
  },
  {
   "name": "tampered-after-signing",
   "type": "observation",
   "envelope": {
    "v": 1,
    "kind": "crawlcheck-observation",
    "observer_id": "ind:fixture-a",
    "software": {
     "name": "crawlcheck-open-observer",
     "version": "1.0.0"
    },
    "run": {
     "run_id": "00000000-0000-4000-8000-000000000001"
    },
    "vantage": {
     "provider": "fixture",
     "asn_org": "AS64496 Example",
     "country": "ZZ"
    },
    "clock": {
     "observed_at": "2026-10-02T00:00:00.000Z",
     "server_date": null,
     "skew_ms": null,
     "method": "fixture"
    },
    "profile_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
    "task": {
     "task_id": "t1:fixture",
     "domain": "example.com",
     "url": "https://example.com/"
    },
    "fetches": [
     {
      "identity": "browser",
      "request": {
       "headers": {
        "user-agent": "Mozilla/5.0"
       }
      },
      "started_at": "2026-10-02T00:00:00.000Z",
      "ms": 120,
      "status": 403,
      "url_final": "https://example.com/",
      "headers": {
       "content-type": "text/html"
      },
      "bytes": 1256,
      "sha256": "ea8fac7c65fb589b0d53560f5251f74f9e9b243478dcb6b3ea79b5e36449c8d9",
      "error": null
     }
    ],
    "key": {
     "kty": "OKP",
     "crv": "Ed25519",
     "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
    }
   },
   "sig": "3WC0BUoTDocTUsgorhZrpZ4CxmgBdxb7KUPT76OgjfDBQydCuL229hFZbXeHpQkgy9l6FtEhgRyxdnoAt1AUCg",
   "directory_entry": {
    "observer_id": "ind:fixture-a",
    "class": "independent",
    "signing": {
     "kind": "enrolled_ed25519",
     "key": {
      "kty": "OKP",
      "crv": "Ed25519",
      "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
     }
    }
   },
   "expected": {
    "shape": true,
    "key_matches_directory": true,
    "signature": false,
    "ok": false
   },
   "why": "one fetch status changed from 200 to 403 after signing"
  },
  {
   "name": "key-not-in-directory",
   "type": "observation",
   "envelope": {
    "v": 1,
    "kind": "crawlcheck-observation",
    "observer_id": "ind:fixture-a",
    "software": {
     "name": "crawlcheck-open-observer",
     "version": "1.0.0"
    },
    "run": {
     "run_id": "00000000-0000-4000-8000-000000000001"
    },
    "vantage": {
     "provider": "fixture",
     "asn_org": "AS64496 Example",
     "country": "ZZ"
    },
    "clock": {
     "observed_at": "2026-10-02T00:00:00.000Z",
     "server_date": null,
     "skew_ms": null,
     "method": "fixture"
    },
    "profile_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
    "task": {
     "task_id": "t1:fixture",
     "domain": "example.com",
     "url": "https://example.com/"
    },
    "fetches": [
     {
      "identity": "browser",
      "request": {
       "headers": {
        "user-agent": "Mozilla/5.0"
       }
      },
      "started_at": "2026-10-02T00:00:00.000Z",
      "ms": 120,
      "status": 200,
      "url_final": "https://example.com/",
      "headers": {
       "content-type": "text/html"
      },
      "bytes": 1256,
      "sha256": "ea8fac7c65fb589b0d53560f5251f74f9e9b243478dcb6b3ea79b5e36449c8d9",
      "error": null
     }
    ],
    "key": {
     "kty": "OKP",
     "crv": "Ed25519",
     "x": "_V0owP16zZuyh7OR0k2tuWfL4IVHdOaGUqejx_OnvpU"
    }
   },
   "sig": "IIW5-Xd0kYuQH6ZW9HKQhbdKYuiQKg_meR64uJiP4xquiSZmK1qbvhW4AKugFFc3XSczh7yhg7O5wHMVMFPlAw",
   "directory_entry": {
    "observer_id": "ind:fixture-a",
    "class": "independent",
    "signing": {
     "kind": "enrolled_ed25519",
     "key": {
      "kty": "OKP",
      "crv": "Ed25519",
      "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
     }
    }
   },
   "expected": {
    "shape": true,
    "key_matches_directory": false,
    "signature": true,
    "ok": false
   },
   "why": "self-consistent, but signed and carried by a key the directory does not list for this id"
  },
  {
   "name": "enrolled-key-signed-by-another",
   "type": "observation",
   "envelope": {
    "v": 1,
    "kind": "crawlcheck-observation",
    "observer_id": "ind:fixture-a",
    "software": {
     "name": "crawlcheck-open-observer",
     "version": "1.0.0"
    },
    "run": {
     "run_id": "00000000-0000-4000-8000-000000000001"
    },
    "vantage": {
     "provider": "fixture",
     "asn_org": "AS64496 Example",
     "country": "ZZ"
    },
    "clock": {
     "observed_at": "2026-10-02T00:00:00.000Z",
     "server_date": null,
     "skew_ms": null,
     "method": "fixture"
    },
    "profile_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
    "task": {
     "task_id": "t1:fixture",
     "domain": "example.com",
     "url": "https://example.com/"
    },
    "fetches": [
     {
      "identity": "browser",
      "request": {
       "headers": {
        "user-agent": "Mozilla/5.0"
       }
      },
      "started_at": "2026-10-02T00:00:00.000Z",
      "ms": 120,
      "status": 200,
      "url_final": "https://example.com/",
      "headers": {
       "content-type": "text/html"
      },
      "bytes": 1256,
      "sha256": "ea8fac7c65fb589b0d53560f5251f74f9e9b243478dcb6b3ea79b5e36449c8d9",
      "error": null
     }
    ],
    "key": {
     "kty": "OKP",
     "crv": "Ed25519",
     "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
    }
   },
   "sig": "bqt_6xQA74M7zjR0VLDBMSgARwEnPLbIjTUEWPY8vsyRhrJrSsWWWrMJmyZ48zc_HCOLIfP6SvzzC1fYi9SuAg",
   "directory_entry": {
    "observer_id": "ind:fixture-a",
    "class": "independent",
    "signing": {
     "kind": "enrolled_ed25519",
     "key": {
      "kty": "OKP",
      "crv": "Ed25519",
      "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
     }
    }
   },
   "expected": {
    "shape": true,
    "key_matches_directory": true,
    "signature": false,
    "ok": false
   },
   "why": "carries the enrolled key but the signature was made with a different key"
  },
  {
   "name": "id-not-the-entry",
   "type": "observation",
   "envelope": {
    "v": 1,
    "kind": "crawlcheck-observation",
    "observer_id": "ind:fixture-b",
    "software": {
     "name": "crawlcheck-open-observer",
     "version": "1.0.0"
    },
    "run": {
     "run_id": "00000000-0000-4000-8000-000000000001"
    },
    "vantage": {
     "provider": "fixture",
     "asn_org": "AS64496 Example",
     "country": "ZZ"
    },
    "clock": {
     "observed_at": "2026-10-02T00:00:00.000Z",
     "server_date": null,
     "skew_ms": null,
     "method": "fixture"
    },
    "profile_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
    "task": {
     "task_id": "t1:fixture",
     "domain": "example.com",
     "url": "https://example.com/"
    },
    "fetches": [
     {
      "identity": "browser",
      "request": {
       "headers": {
        "user-agent": "Mozilla/5.0"
       }
      },
      "started_at": "2026-10-02T00:00:00.000Z",
      "ms": 120,
      "status": 200,
      "url_final": "https://example.com/",
      "headers": {
       "content-type": "text/html"
      },
      "bytes": 1256,
      "sha256": "ea8fac7c65fb589b0d53560f5251f74f9e9b243478dcb6b3ea79b5e36449c8d9",
      "error": null
     }
    ],
    "key": {
     "kty": "OKP",
     "crv": "Ed25519",
     "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
    }
   },
   "sig": "xrBX8gP3FGjO4p-dJNKzbgJDYW-BF8Y3j-gtZDOahzuh25Uf5Pve7lu7NErpE8DqeZVDcl60X_pulsrnvc1wBg",
   "directory_entry": {
    "observer_id": "ind:fixture-a",
    "class": "independent",
    "signing": {
     "kind": "enrolled_ed25519",
     "key": {
      "kty": "OKP",
      "crv": "Ed25519",
      "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
     }
    }
   },
   "expected": {
    "shape": true,
    "key_matches_directory": false,
    "signature": true,
    "ok": false
   },
   "why": "the right key under another observer's id"
  },
  {
   "name": "not-an-envelope",
   "type": "observation",
   "envelope": {
    "v": 1,
    "kind": "crawlcheck-observation",
    "observer_id": "ind:fixture-a",
    "software": {
     "name": "crawlcheck-open-observer",
     "version": "1.0.0"
    },
    "run": {
     "run_id": "00000000-0000-4000-8000-000000000001"
    },
    "vantage": {
     "provider": "fixture",
     "asn_org": "AS64496 Example",
     "country": "ZZ"
    },
    "clock": {
     "observed_at": "2026-10-02T00:00:00.000Z",
     "server_date": null,
     "skew_ms": null,
     "method": "fixture"
    },
    "profile_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
    "task": {
     "task_id": "t1:fixture",
     "domain": "example.com",
     "url": "https://example.com/"
    },
    "key": {
     "kty": "OKP",
     "crv": "Ed25519",
     "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
    }
   },
   "sig": "AAAA",
   "directory_entry": {
    "observer_id": "ind:fixture-a",
    "class": "independent",
    "signing": {
     "kind": "enrolled_ed25519",
     "key": {
      "kty": "OKP",
      "crv": "Ed25519",
      "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
     }
    }
   },
   "expected": {
    "shape": false,
    "ok": false
   },
   "why": "no fetches array"
  },
  {
   "name": "enrolment-valid",
   "type": "enrolment",
   "request": {
    "kind": "crawlcheck-observer-enrolment",
    "v": 1,
    "observer_id": "ind:fixture-a",
    "operator": "Fixture operator",
    "network": "Example network",
    "contact": null,
    "software": {
     "name": "crawlcheck-open-observer",
     "version": "1.0.0"
    },
    "key": {
     "kty": "OKP",
     "crv": "Ed25519",
     "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
    },
    "requested_at": "2026-10-02T00:00:00.000Z"
   },
   "sig": "w3nFpPt6-aDhDWDbNW2tA1pF2X2qOegBNlSNW0al5JqFcUf-PVwlNSkW662P94I6owFpAL9haaPEhgL_nYs1AQ",
   "expected": {
    "shape": true,
    "signature": true,
    "ok": true
   },
   "why": "proves possession of the key it enrols"
  },
  {
   "name": "enrolment-forged",
   "type": "enrolment",
   "request": {
    "kind": "crawlcheck-observer-enrolment",
    "v": 1,
    "observer_id": "ind:fixture-a",
    "operator": "Fixture operator",
    "network": "Example network",
    "contact": null,
    "software": {
     "name": "crawlcheck-open-observer",
     "version": "1.0.0"
    },
    "key": {
     "kty": "OKP",
     "crv": "Ed25519",
     "x": "7WCztdFDReLLFDzOceyPs73pEUIVZgcCeqqUVSLPU4g"
    },
    "requested_at": "2026-10-02T00:00:00.000Z"
   },
   "sig": "2o8P0XlE6klXNNchsvAoV3JKigU8_QMu_VNG2xq7-FBGB0b2cU1a5TfcU3zMO4vbghp-UjjsZDprxYGYmKzZAA",
   "expected": {
    "shape": true,
    "signature": false,
    "ok": false
   },
   "why": "claims key A but is signed with key B"
  }
 ]
}