{
  "about": "Test vectors for Agent Terms v1 (section 13.3). A conforming validator gives each case the result in expect; for fail, the MUST rules that fire are exactly those in rules. Warnings (SHOULD rules) are not part of the result.",
  "spec": "https://snuepi.com/spec/agent-terms/v1",
  "schema": "https://snuepi.com/spec/agent-terms/v1/schema.json",
  "licence": "Apache-2.0",
  "today": "2026-10-29",
  "keys": {
    "https://terms-publisher.example": {
      "keys": [
        {
          "kty": "OKP",
          "crv": "Ed25519",
          "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo",
          "kid": "rfc8037-a1",
          "alg": "EdDSA",
          "use": "sig"
        }
      ]
    }
  },
  "test_key": {
    "note": "The Ed25519 test key of RFC 8037, appendix A.1. It is public: never trust it for anything but these vectors.",
    "private_jwk": {
      "kty": "OKP",
      "crv": "Ed25519",
      "kid": "rfc8037-a1",
      "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo",
      "d": "nWGxne_9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A"
    }
  },
  "cases": [
    {
      "id": "example-trades",
      "file": "../examples/trades.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "example-cleaning",
      "file": "../examples/cleaning.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "example-moving",
      "file": "../examples/moving.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "example-salon",
      "file": "../examples/salon.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "example-restaurant",
      "file": "../examples/restaurant.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "example-law-firm",
      "file": "../examples/law-firm.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "example-accountant",
      "file": "../examples/accountant.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "example-dental-clinic",
      "file": "../examples/dental-clinic.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "example-shop",
      "file": "../examples/shop.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "signed-valid",
      "file": "signed-valid.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "signed-tampered",
      "file": "signed-tampered.json",
      "expect": "fail",
      "rules": [
        "signature.valid"
      ]
    },
    {
      "id": "minimal",
      "file": "minimal.json",
      "expect": "pass",
      "rules": []
    },
    {
      "id": "missing-contact",
      "file": "missing-contact.json",
      "expect": "fail",
      "rules": [
        "schema"
      ]
    },
    {
      "id": "contact-value-unknown",
      "file": "contact-value-unknown.json",
      "expect": "fail",
      "rules": [
        "schema"
      ]
    },
    {
      "id": "tier-unknown",
      "file": "tier-unknown.json",
      "expect": "fail",
      "rules": [
        "schema"
      ]
    },
    {
      "id": "disclosure-waived",
      "file": "disclosure-waived.json",
      "expect": "fail",
      "rules": [
        "identification.disclosure"
      ]
    },
    {
      "id": "phone-hours-missing",
      "file": "phone-hours-missing.json",
      "expect": "fail",
      "rules": [
        "contact.phone_hours"
      ]
    },
    {
      "id": "quiet-hours-equal",
      "file": "quiet-hours-equal.json",
      "expect": "fail",
      "rules": [
        "contact.quiet_hours"
      ]
    },
    {
      "id": "channels-only-without-channel",
      "file": "channels-only-without-channel.json",
      "expect": "fail",
      "rules": [
        "contact.channel_required"
      ]
    },
    {
      "id": "channel-not-a-url",
      "file": "channel-not-a-url.json",
      "expect": "fail",
      "rules": [
        "contact.channel_urls"
      ]
    },
    {
      "id": "deposit-percent-and-amount",
      "file": "deposit-percent-and-amount.json",
      "expect": "fail",
      "rules": [
        "booking.deposit"
      ]
    },
    {
      "id": "opening-window-empty",
      "file": "opening-window-empty.json",
      "expect": "fail",
      "rules": [
        "booking.opening_hours"
      ]
    },
    {
      "id": "special-hours-reversed",
      "file": "special-hours-reversed.json",
      "expect": "fail",
      "rules": [
        "booking.special_hours"
      ]
    },
    {
      "id": "request-types-disagree",
      "file": "request-types-disagree.json",
      "expect": "fail",
      "rules": [
        "request_types.offered"
      ]
    },
    {
      "id": "guardrail-twice",
      "file": "guardrail-twice.json",
      "expect": "fail",
      "rules": [
        "guardrails.unique"
      ]
    },
    {
      "id": "minimum-tier-not-listed",
      "file": "minimum-tier-not-listed.json",
      "expect": "fail",
      "rules": [
        "operator.minimum_tier"
      ]
    },
    {
      "id": "updated-in-the-future",
      "file": "updated-in-the-future.json",
      "expect": "fail",
      "rules": [
        "updated_at.future"
      ]
    },
    {
      "id": "format-unknown",
      "file": "format-unknown.json",
      "expect": "fail",
      "rules": [
        "format.version"
      ]
    },
    {
      "id": "registry-descriptor",
      "file": "registry-descriptor.json",
      "expect": "fail",
      "rules": [
        "document.kind"
      ]
    },
    {
      "id": "pointer",
      "file": "pointer.json",
      "expect": "fail",
      "rules": [
        "document.kind"
      ]
    }
  ]
}
