{
  "spec": "https://ulang.dev/spec/v1/",
  "engine": {
    "name": "ulang-lite",
    "version": "0.1.0",
    "repository": "https://github.com/ThinkTechHoldings/ulang-git",
    "commit": "61af4281ed6fd09d5f9f2100d3960630d757ae49"
  },
  "vectors": [
    {
      "id": "expense",
      "title": "Expense approval",
      "source": "// Expense approvals: who may approve, and up to how much.\nCONTRACT ExpenseApproval {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Expense {\n      amount: float\n      approver_is_submitter: bool\n      approver_limit: float\n      receipt_attached: bool\n      category: string\n    }\n    CONSTANTS {\n      receipt_threshold: float == 75.0 [SOURCE:FIN-POLICY-4.2]\n      hard_cap: float == 10000.0 [SOURCE:FIN-POLICY-4.1]\n    }\n  }\n  TRIGGER {\n    approve_expense()\n  }\n  GUARANTEE {\n    ENSURE approve_expense() WHEN Expense.receipt_attached == true OR Expense.amount < receipt_threshold [SOURCE:receipt_required]\n  }\n  PROHIBITION {\n    FORBID approve_expense WHEN Expense.approver_is_submitter == true [SOURCE:no_self_approval]\n    FORBID approve_expense WHEN Expense.amount > hard_cap [SOURCE:over_hard_cap]\n    FORBID approve_expense WHEN Expense.amount > Expense.approver_limit [SOURCE:over_approver_limit]\n    FORBID approve_expense WHEN Expense.category == \"gift_card\" [SOURCE:no_gift_cards]\n  }\n  OBSERVABILITY {\n    LOG \"expense approval decided\" ON decision\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "ExpenseApproval",
            "digest": "5a6326d24470e02c54a4f175994a1b0c2c4a6efa08baec2c025b0af1fc78e7fd",
            "canonical": "CONTRACT ExpenseApproval {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Expense {\n      amount: float\n      approver_is_submitter: bool\n      approver_limit: float\n      receipt_attached: bool\n      category: string\n    }\n    CONSTANTS {\n      receipt_threshold: float == 75.0 [SOURCE:FIN-POLICY-4.2]\n      hard_cap: float == 10000.0 [SOURCE:FIN-POLICY-4.1]\n    }\n  }\n  TRIGGER {\n    approve_expense()\n  }\n  GUARANTEE {\n    ENSURE approve_expense() WHEN Expense.receipt_attached == true OR Expense.amount < receipt_threshold [SOURCE:receipt_required]\n  }\n  PROHIBITION {\n    FORBID approve_expense WHEN Expense.approver_is_submitter == true [SOURCE:no_self_approval]\n    FORBID approve_expense WHEN Expense.amount > hard_cap [SOURCE:over_hard_cap]\n    FORBID approve_expense WHEN Expense.amount > Expense.approver_limit [SOURCE:over_approver_limit]\n    FORBID approve_expense WHEN Expense.category == \"gift_card\" [SOURCE:no_gift_cards]\n  }\n  OBSERVABILITY {\n    LOG \"expense approval decided\" ON decision\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "approve_expense",
          "facts": {
            "amount": 120,
            "approver_is_submitter": false,
            "approver_limit": 500,
            "receipt_attached": true,
            "category": "travel"
          },
          "verdict": "PERMIT",
          "clause_id": "ExpenseApproval.approve_expense.permit"
        },
        {
          "action": "approve_expense",
          "facts": {
            "amount": 120,
            "approver_is_submitter": true,
            "approver_limit": 500,
            "receipt_attached": true,
            "category": "travel"
          },
          "verdict": "DENY",
          "clause_id": "ExpenseApproval.no_self_approval"
        },
        {
          "action": "approve_expense",
          "facts": {
            "amount": 800,
            "approver_is_submitter": false,
            "approver_limit": 500,
            "receipt_attached": true,
            "category": "travel"
          },
          "verdict": "DENY",
          "clause_id": "ExpenseApproval.over_approver_limit"
        },
        {
          "action": "approve_expense",
          "facts": {
            "amount": 120,
            "approver_is_submitter": false,
            "approver_limit": 500,
            "receipt_attached": false,
            "category": "travel"
          },
          "verdict": "DENY",
          "clause_id": "ExpenseApproval.receipt_required"
        },
        {
          "action": "approve_expense",
          "facts": {
            "amount": 40,
            "approver_is_submitter": false,
            "approver_limit": 500,
            "receipt_attached": false,
            "category": "travel"
          },
          "verdict": "PERMIT",
          "clause_id": "ExpenseApproval.approve_expense.permit"
        },
        {
          "action": "approve_expense",
          "facts": {
            "amount": 120,
            "approver_is_submitter": true,
            "approver_limit": 500,
            "receipt_attached": false,
            "category": "travel"
          },
          "verdict": "DENY",
          "clause_id": "ExpenseApproval.no_self_approval"
        }
      ]
    },
    {
      "id": "comment-absorbed",
      "title": "A comment after an operand becomes part of it",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count <= zero // must be non-empty\n      [SOURCE:claim_nonempty]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "unknown-name",
        "line": 19,
        "column": 40
      }
    },
    {
      "id": "not-inside-name",
      "title": "`NOT` inside a name is refused before parsing",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      CANNOT_MERGE: bool\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.CANNOT_MERGE == false [SOURCE:mergeable]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "not-operator",
        "line": 5,
        "column": 10
      }
    },
    {
      "id": "constants",
      "title": "Constants: hard, typed, sourced; floats may be negative or use an exponent",
      "source": "CONTRACT Thermostat {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Reading {\n      celsius: float\n      sensor_ok: bool\n    }\n    CONSTANTS {\n      floor_c: float == -40.0 [SOURCE:SPEC-7]\n      ceiling_c: float == 1.2e2 [SOURCE:SPEC-7]\n    }\n  }\n  TRIGGER {\n    accept_reading()\n  }\n  GUARANTEE {\n    ENSURE accept_reading() WHEN Reading.sensor_ok == true [SOURCE:sensor_healthy]\n  }\n  PROHIBITION {\n    FORBID accept_reading WHEN Reading.celsius < floor_c OR Reading.celsius > ceiling_c [SOURCE:out_of_range]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Thermostat",
            "digest": "46b2bd81659c2d927d909f163fe452baf44c8a0057eaf2ce646c24a80b8ba53a",
            "canonical": "CONTRACT Thermostat {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Reading {\n      celsius: float\n      sensor_ok: bool\n    }\n    CONSTANTS {\n      floor_c: float == -40.0 [SOURCE:SPEC-7]\n      ceiling_c: float == 120.0 [SOURCE:SPEC-7]\n    }\n  }\n  TRIGGER {\n    accept_reading()\n  }\n  GUARANTEE {\n    ENSURE accept_reading() WHEN Reading.sensor_ok == true [SOURCE:sensor_healthy]\n  }\n  PROHIBITION {\n    FORBID accept_reading WHEN Reading.celsius < floor_c OR Reading.celsius > ceiling_c [SOURCE:out_of_range]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "accept_reading",
          "facts": {
            "celsius": 21.5,
            "sensor_ok": true
          },
          "verdict": "PERMIT",
          "clause_id": "Thermostat.accept_reading.permit"
        },
        {
          "action": "accept_reading",
          "facts": {
            "celsius": -41,
            "sensor_ok": true
          },
          "verdict": "DENY",
          "clause_id": "Thermostat.out_of_range"
        },
        {
          "action": "accept_reading",
          "facts": {
            "celsius": 21.5,
            "sensor_ok": false
          },
          "verdict": "DENY",
          "clause_id": "Thermostat.sensor_healthy"
        }
      ]
    },
    {
      "id": "depth-16",
      "title": "16 comparisons in a flat AND chain: depth 16, accepted",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count != 0 AND Request.count != 1 AND Request.count != 2 AND Request.count != 3 AND Request.count != 4 AND Request.count != 5 AND Request.count != 6 AND Request.count != 7 AND Request.count != 8 AND Request.count != 9 AND Request.count != 10 AND Request.count != 11 AND Request.count != 12 AND Request.count != 13 AND Request.count != 14 AND Request.count != 15 [SOURCE:long_chain]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Claim",
            "digest": "cd6fcc39d39a158e1a07629a7421a2fd2d6ff8db20478bb73bb6d72a0baa2be8",
            "canonical": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count != 0 AND Request.count != 1 AND Request.count != 2 AND Request.count != 3 AND Request.count != 4 AND Request.count != 5 AND Request.count != 6 AND Request.count != 7 AND Request.count != 8 AND Request.count != 9 AND Request.count != 10 AND Request.count != 11 AND Request.count != 12 AND Request.count != 13 AND Request.count != 14 AND Request.count != 15 [SOURCE:long_chain]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "depth-17",
      "title": "17 comparisons: depth 17, refused",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count != 0 AND Request.count != 1 AND Request.count != 2 AND Request.count != 3 AND Request.count != 4 AND Request.count != 5 AND Request.count != 6 AND Request.count != 7 AND Request.count != 8 AND Request.count != 9 AND Request.count != 10 AND Request.count != 11 AND Request.count != 12 AND Request.count != 13 AND Request.count != 14 AND Request.count != 15 AND Request.count != 16 [SOURCE:long_chain]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "limit",
        "code": "condition-depth",
        "line": 22,
        "column": 23
      }
    },
    {
      "id": "diag-section-order",
      "title": "Sections out of order",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  TRIGGER {\n    grant()\n  }\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "syntax",
        "code": "syntax",
        "line": 6,
        "column": 3
      }
    },
    {
      "id": "diag-soft-constant",
      "title": "A soft constant (`=`) is refused",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int = 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "constant-invalid",
        "line": 12,
        "column": 7
      }
    },
    {
      "id": "diag-string-order",
      "title": "Strings cannot be ordered",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.region > \"eu\" [SOURCE:region]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "kind-mismatch",
        "line": 22,
        "column": 23
      }
    },
    {
      "id": "diag-ungoverned",
      "title": "Every triggered action needs a clause",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n    revoke()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "ungoverned-action",
        "line": 15,
        "column": 3
      }
    },
    {
      "id": "diag-assignment",
      "title": "A single `=` is an assignment, not a comparison",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready = true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "condition-form",
        "line": 19,
        "column": 25
      }
    },
    {
      "id": "canonical-before",
      "title": "Any layout, comments and spellings…",
      "source": "# layout, comments and spelling do not matter to the digest\nCONTRACT   Thermostat{ENFORCEMENT_MODE:ENFORCED\n  CONTEXT { ENTITIES Reading { celsius: float\n      sensor_ok: bool  retries: int }\n    CONSTANTS { ceiling_c: float == 1.2e2 [SOURCE:  SPEC-7 ]\n      max_retries: int == 003 [SOURCE:SPEC-9] } }\n  TRIGGER { accept_reading( ) }\n  GUARANTEE { ENSURE accept_reading() WHEN (Reading.sensor_ok == TRUE) [SOURCE:sensor_healthy] }\n  PROHIBITION {\n    // over range, or retried too often while unhealthy\n    FORBID accept_reading() WHEN Reading.celsius > ceiling_c OR (Reading.retries >= max_retries AND (Reading.sensor_ok == FALSE)) [SOURCE:reject_reading]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Thermostat",
            "digest": "dfd61b1c80460b5a1e1142a5f5f39bb178d6cc015b846730d52049434c2d0f36",
            "canonical": "CONTRACT Thermostat {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Reading {\n      celsius: float\n      sensor_ok: bool\n      retries: int\n    }\n    CONSTANTS {\n      ceiling_c: float == 120.0 [SOURCE:SPEC-7]\n      max_retries: int == 3 [SOURCE:SPEC-9]\n    }\n  }\n  TRIGGER {\n    accept_reading()\n  }\n  GUARANTEE {\n    ENSURE accept_reading() WHEN Reading.sensor_ok == true [SOURCE:sensor_healthy]\n  }\n  PROHIBITION {\n    FORBID accept_reading WHEN Reading.celsius > ceiling_c OR Reading.retries >= max_retries AND Reading.sensor_ok == false [SOURCE:reject_reading]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "keyword-prefix-name",
      "title": "`CONTRACTX {` is the contract `X`",
      "source": "CONTRACTX {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "X",
            "digest": "faa8a3ad45a3289f43a2da6b10a41daf39b4e66c0d84e2a3bd62b46a9100892d",
            "canonical": "CONTRACT X {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "keyword-prefix-spaced",
      "title": "The same contract, spaced",
      "source": "CONTRACT X {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "X",
            "digest": "faa8a3ad45a3289f43a2da6b10a41daf39b4e66c0d84e2a3bd62b46a9100892d",
            "canonical": "CONTRACT X {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "android",
      "title": "`ANDROID` reads as `AND ROID`",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count == 1 ANDROID == 2 [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "literal-comparison",
        "line": 22,
        "column": 45
      }
    },
    {
      "id": "integer-type",
      "title": "`integer` reads as `int` then `eger`",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: integer\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "syntax",
        "code": "syntax",
        "line": 6,
        "column": 5
      }
    },
    {
      "id": "hash-comment",
      "title": "`#` starts a comment",
      "source": "# a comment\nCONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Claim",
            "digest": "7f34e8634265f53f0c4870553ea618ab5bf02811d79ae9ac8feed7a73996b647",
            "canonical": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "minimal",
      "title": "The template contract",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Claim",
            "digest": "7f34e8634265f53f0c4870553ea618ab5bf02811d79ae9ac8feed7a73996b647",
            "canonical": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "grant",
          "facts": {
            "count": 3,
            "region": "eu",
            "ready": true,
            "ratio": 0.5
          },
          "verdict": "PERMIT",
          "clause_id": "Claim.grant.permit"
        },
        {
          "action": "grant",
          "facts": {
            "count": 30,
            "region": "eu",
            "ready": true,
            "ratio": 0.5
          },
          "verdict": "DENY",
          "clause_id": "Claim.over_cap"
        }
      ]
    },
    {
      "id": "forbid-parens",
      "title": "`FORBID grant()` is the same clause as `FORBID grant`",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant() WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Claim",
            "digest": "7f34e8634265f53f0c4870553ea618ab5bf02811d79ae9ac8feed7a73996b647",
            "canonical": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "no-escapes",
      "title": "Strings have no escapes: `\\\"` ends the string",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.region == \"a\\\"b\" [SOURCE:region]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "syntax",
        "code": "syntax",
        "line": 22,
        "column": 45
      }
    },
    {
      "id": "float-exponent-int",
      "title": "An exponent makes a float: `1e3` cannot be an int constant",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 1e3 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "constant-invalid",
        "line": 12,
        "column": 7
      }
    },
    {
      "id": "plus-exponent",
      "title": "`1e+3` is refused: `+` is arithmetic",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: float == 1e+3 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "arithmetic",
        "line": 12,
        "column": 23
      }
    },
    {
      "id": "negative-int-constant",
      "title": "Integer constants are 0 … 2^53-1",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == -5 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "constant-invalid",
        "line": 12,
        "column": 7
      }
    },
    {
      "id": "negative-int-literal",
      "title": "Negative integer literals are fine in conditions",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count < -5 [SOURCE:negative]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Claim",
            "digest": "365efb1d6abc67630059c452a5bed50876c583f2ec59bf96e80995338b987515",
            "canonical": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count < -5 [SOURCE:negative]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "integer-range",
      "title": "2^53 is outside the exact domain",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > 9007199254740992 [SOURCE:huge]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "limit",
        "code": "integer-range",
        "line": 22,
        "column": 39
      }
    },
    {
      "id": "subtraction",
      "title": "`- 1` is arithmetic",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap - 1 [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "arithmetic",
        "line": 22,
        "column": 43
      }
    },
    {
      "id": "subtraction-tight",
      "title": "`cap -1` parses as subtraction, then is refused",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap -1 [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "call-or-arithmetic",
        "line": 22,
        "column": 43
      }
    },
    {
      "id": "not",
      "title": "`NOT` is refused",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN NOT Request.ready == true [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "not-operator",
        "line": 22,
        "column": 23
      }
    },
    {
      "id": "call",
      "title": "Calls are refused",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN len(Request.region) > 2 [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "call-or-arithmetic",
        "line": 22,
        "column": 23
      }
    },
    {
      "id": "bare-operand",
      "title": "A bare operand is not a condition",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "condition-form",
        "line": 19,
        "column": 25
      }
    },
    {
      "id": "trigger-guard",
      "title": "Triggers take no guard",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant() WHEN Request.ready == true\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "trigger-form",
        "line": 16,
        "column": 5
      }
    },
    {
      "id": "trigger-bare",
      "title": "Triggers need parentheses",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "trigger-form",
        "line": 16,
        "column": 5
      }
    },
    {
      "id": "trigger-params",
      "title": "Triggers take no parameters",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant(Request.count)\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "trigger-params",
        "line": 16,
        "column": 5
      }
    },
    {
      "id": "ensure-no-parens",
      "title": "`ENSURE` keeps its parentheses",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "ensure-form",
        "line": 19,
        "column": 5
      }
    },
    {
      "id": "empty-guarantee",
      "title": "An empty GUARANTEE block",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    \n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "empty-guarantee",
        "line": 18,
        "column": 3
      }
    },
    {
      "id": "no-guarantee",
      "title": "GUARANTEE may be absent",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Claim",
            "digest": "d425f6e5308e2a5e50c888a4947f97493a3553661bcdc8c0349acd81adf7e4c4",
            "canonical": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "advisory",
      "title": "Modes other than `enforced` are refused by default",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: advisory\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "enforcement-mode",
        "line": 2,
        "column": 3
      }
    },
    {
      "id": "two-entities",
      "title": "Exactly one ENTITIES block",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    ENTITIES Other {\n      x: int\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "entity",
        "line": 3,
        "column": 3
      }
    },
    {
      "id": "duplicate-field",
      "title": "Field names are unique",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      count: int\n      ready: bool\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "fields",
        "line": 4,
        "column": 5
      }
    },
    {
      "id": "collides",
      "title": "A constant may not share a field’s name",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      cap: int == 25 [SOURCE:POLICY]\n      count: int == 1 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "constant-collides",
        "line": 10,
        "column": 5
      }
    },
    {
      "id": "duplicate-id",
      "title": "Clause ids are unique across ENSURE and FORBID",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:must_be_ready]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "clause-id",
        "line": 22,
        "column": 5
      }
    },
    {
      "id": "spaced-tag",
      "title": "`[ SOURCE:` with a space is not a valid clause id",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [ SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "clause-id",
        "line": 22,
        "column": 5
      }
    },
    {
      "id": "foreign",
      "title": "Only the contract’s own entity resolves",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Other.count > cap [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "foreign-reference",
        "line": 22,
        "column": 23
      }
    },
    {
      "id": "unknown-field",
      "title": "Unknown field",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.nope > cap [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "unknown-field",
        "line": 22,
        "column": 23
      }
    },
    {
      "id": "group-value",
      "title": "A parenthesised value parses, then is refused",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > (25) [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "foreign-reference",
        "line": 22,
        "column": 39
      }
    },
    {
      "id": "constant-literal",
      "title": "`constant op literal` is refused",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN cap == 25 [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "literal-comparison",
        "line": 22,
        "column": 23
      }
    },
    {
      "id": "literal-constant",
      "title": "`literal op constant` is accepted (only the other order is refused)",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN 25 == cap [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Claim",
            "digest": "c60dc3c50e70cff315e863bc081f12968551efb42c10d0491ce1a48f37f4a0ba",
            "canonical": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN 25 == cap [SOURCE:x]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "bool-ordering",
      "title": "Booleans compare only with `==` / `!=`",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.ready < true [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "kind-mismatch",
        "line": 22,
        "column": 23
      }
    },
    {
      "id": "string-path-path",
      "title": "String comparisons must be `field op literal`",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      home: string\n      ready: bool\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.region != Request.home [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "nonnumeric-comparison",
        "line": 22,
        "column": 23
      }
    },
    {
      "id": "float-equality",
      "title": "Numeric `==` tolerates last-bit noise",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.ratio == 0.3 [SOURCE:ratio_point_three]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Claim",
            "digest": "329e566997017a2143d420aaecc56eac7dc490de8cd43e19cabc589f3fae34d5",
            "canonical": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.ratio == 0.3 [SOURCE:ratio_point_three]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "grant",
          "facts": {
            "count": 1,
            "region": "eu",
            "ready": true,
            "ratio": 0.30000000000000004
          },
          "verdict": "DENY",
          "clause_id": "Claim.ratio_point_three"
        },
        {
          "action": "grant",
          "facts": {
            "count": 1,
            "region": "eu",
            "ready": true,
            "ratio": 0.3000001
          },
          "verdict": "PERMIT",
          "clause_id": "Claim.grant.permit"
        }
      ]
    },
    {
      "id": "nesting",
      "title": "Nesting deeper than 20 is refused before parsing",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN (((((((((((((((((((((Request.count > cap))))))))))))))))))))) [SOURCE:x]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "limit",
        "code": "nesting-or-tokens",
        "line": 22,
        "column": 41
      }
    },
    {
      "id": "two-contracts",
      "title": "Two contracts in one source",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n\nCONTRACT Other {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Claim",
            "digest": "7f34e8634265f53f0c4870553ea618ab5bf02811d79ae9ac8feed7a73996b647",
            "canonical": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n"
          },
          {
            "name": "Other",
            "digest": "bd91ffba528870bed0355edecd243de6a13350e73ae069ec0c03c3f21b2ee107",
            "canonical": "CONTRACT Other {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "duplicate-contract",
      "title": "Contract names are unique within a source",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n\nCONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "duplicate-contract",
        "line": 26,
        "column": 1
      }
    },
    {
      "id": "empty",
      "title": "An empty source",
      "source": "",
      "expect": {
        "ok": false,
        "kind": "limit",
        "code": "source-size",
        "line": 1,
        "column": 1
      }
    },
    {
      "id": "type-comment",
      "title": "A comment after a type becomes part of it",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int // paths requested\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "type-unsupported",
        "line": 5,
        "column": 14
      }
    },
    {
      "id": "bom",
      "title": "A byte-order mark is not white space",
      "source": "﻿CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "syntax",
        "code": "syntax",
        "line": 1,
        "column": 1
      }
    },
    {
      "id": "no-mode",
      "title": "A contract without a mode is refused",
      "source": "CONTRACT Claim {\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "enforcement-mode",
        "line": 1,
        "column": 1
      }
    },
    {
      "id": "errata-e1",
      "title": "Errata E1: a constant tagged `[ SOURCE:P]` is accepted, but its canonical text does not re-parse",
      "source": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [ SOURCE:POLICY]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Claim",
            "digest": "1ba3c884488e6b7df67a6335f5ba226e18b175b8194f636ac93f8dd3e570a09e",
            "canonical": "CONTRACT Claim {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Request {\n      count: int\n      region: string\n      ready: bool\n      ratio: float\n    }\n    CONSTANTS {\n      zero: int == 0 [SOURCE:POLICY]\n      cap: int == 25 [SOURCE:[ SOURCE:POLICY]]\n    }\n  }\n  TRIGGER {\n    grant()\n  }\n  GUARANTEE {\n    ENSURE grant() WHEN Request.ready == true [SOURCE:must_be_ready]\n  }\n  PROHIBITION {\n    FORBID grant WHEN Request.count > cap [SOURCE:over_cap]\n  }\n}\n"
          }
        ]
      }
    },
    {
      "id": "tut-1",
      "title": "Step 1: the facts",
      "source": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "trigger-required",
        "line": 1,
        "column": 1
      }
    },
    {
      "id": "tut-2",
      "title": "Step 2: the action",
      "source": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "semantic",
        "code": "ungoverned-action",
        "line": 13,
        "column": 3
      }
    },
    {
      "id": "tut-3",
      "title": "Step 3: a first rule",
      "source": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "ProductionDeploy",
            "digest": "4b1ab28648aa677d0e199d0c53d3573bd48ecd26746e7123b63d29b9d14335b2",
            "canonical": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "PERMIT",
          "clause_id": "ProductionDeploy.deploy.permit"
        },
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": true,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "DENY",
          "clause_id": "ProductionDeploy.no_self_approval"
        }
      ]
    },
    {
      "id": "tut-4",
      "title": "Step 4: guarantees",
      "source": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n  GUARANTEE {\n    ENSURE deploy() WHEN DeployRequest.tests_passed == true [SOURCE:tests_green]\n    ENSURE deploy() WHEN DeployRequest.approvals >= 2 [SOURCE:two_approvals]\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "ProductionDeploy",
            "digest": "64a8766dab399915424f1024b1b38b353f7c27bc0dbfe03702bff58654149e49",
            "canonical": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n  GUARANTEE {\n    ENSURE deploy() WHEN DeployRequest.tests_passed == true [SOURCE:tests_green]\n    ENSURE deploy() WHEN DeployRequest.approvals >= 2 [SOURCE:two_approvals]\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "PERMIT",
          "clause_id": "ProductionDeploy.deploy.permit"
        },
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": false,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "DENY",
          "clause_id": "ProductionDeploy.tests_green"
        },
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 1,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "DENY",
          "clause_id": "ProductionDeploy.two_approvals"
        }
      ]
    },
    {
      "id": "tut-5",
      "title": "Step 5: named, sourced constants",
      "source": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n    CONSTANTS {\n      min_approvals: int == 2 [SOURCE:ENG-HANDBOOK-7.1]\n      max_error_rate_pct: float == 1.5 [SOURCE:SRE-SLO-3]\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n  GUARANTEE {\n    ENSURE deploy() WHEN DeployRequest.tests_passed == true [SOURCE:tests_green]\n    ENSURE deploy() WHEN DeployRequest.approvals >= min_approvals [SOURCE:two_approvals]\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n    FORBID deploy WHEN DeployRequest.error_rate_pct > max_error_rate_pct [SOURCE:error_budget]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "ProductionDeploy",
            "digest": "ed486438406d7f6025ff25851429dce5708b2d83bb7ef4d2b5ec7fb83f6cc8d8",
            "canonical": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n    CONSTANTS {\n      min_approvals: int == 2 [SOURCE:ENG-HANDBOOK-7.1]\n      max_error_rate_pct: float == 1.5 [SOURCE:SRE-SLO-3]\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n  GUARANTEE {\n    ENSURE deploy() WHEN DeployRequest.tests_passed == true [SOURCE:tests_green]\n    ENSURE deploy() WHEN DeployRequest.approvals >= min_approvals [SOURCE:two_approvals]\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n    FORBID deploy WHEN DeployRequest.error_rate_pct > max_error_rate_pct [SOURCE:error_budget]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "PERMIT",
          "clause_id": "ProductionDeploy.deploy.permit"
        },
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 2.5,
            "change_freeze": false
          },
          "verdict": "DENY",
          "clause_id": "ProductionDeploy.error_budget"
        },
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 1.5,
            "change_freeze": false
          },
          "verdict": "PERMIT",
          "clause_id": "ProductionDeploy.deploy.permit"
        }
      ]
    },
    {
      "id": "tut-6",
      "title": "Step 6: combining conditions",
      "source": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n    CONSTANTS {\n      min_approvals: int == 2 [SOURCE:ENG-HANDBOOK-7.1]\n      max_error_rate_pct: float == 1.5 [SOURCE:SRE-SLO-3]\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n  GUARANTEE {\n    ENSURE deploy() WHEN DeployRequest.tests_passed == true [SOURCE:tests_green]\n    ENSURE deploy() WHEN DeployRequest.approvals >= min_approvals [SOURCE:two_approvals]\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.change_freeze == true AND DeployRequest.environment == \"production\" [SOURCE:change_freeze]\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n    FORBID deploy WHEN DeployRequest.error_rate_pct > max_error_rate_pct [SOURCE:error_budget]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "ProductionDeploy",
            "digest": "c6011a1c7c5a6458f4baeeb28608decb7f3f5fe6f4e6a4e27343b768ba526f3c",
            "canonical": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n    CONSTANTS {\n      min_approvals: int == 2 [SOURCE:ENG-HANDBOOK-7.1]\n      max_error_rate_pct: float == 1.5 [SOURCE:SRE-SLO-3]\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n  GUARANTEE {\n    ENSURE deploy() WHEN DeployRequest.tests_passed == true [SOURCE:tests_green]\n    ENSURE deploy() WHEN DeployRequest.approvals >= min_approvals [SOURCE:two_approvals]\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.change_freeze == true AND DeployRequest.environment == \"production\" [SOURCE:change_freeze]\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n    FORBID deploy WHEN DeployRequest.error_rate_pct > max_error_rate_pct [SOURCE:error_budget]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "PERMIT",
          "clause_id": "ProductionDeploy.deploy.permit"
        },
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": true
          },
          "verdict": "DENY",
          "clause_id": "ProductionDeploy.change_freeze"
        },
        {
          "action": "deploy",
          "facts": {
            "environment": "staging",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": true
          },
          "verdict": "PERMIT",
          "clause_id": "ProductionDeploy.deploy.permit"
        }
      ]
    },
    {
      "id": "tut-7",
      "title": "Step 7: a second action",
      "source": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n    CONSTANTS {\n      min_approvals: int == 2 [SOURCE:ENG-HANDBOOK-7.1]\n      max_error_rate_pct: float == 1.5 [SOURCE:SRE-SLO-3]\n    }\n  }\n  TRIGGER {\n    deploy()\n    rollback()\n  }\n  GUARANTEE {\n    ENSURE deploy() WHEN DeployRequest.tests_passed == true [SOURCE:tests_green]\n    ENSURE deploy() WHEN DeployRequest.approvals >= min_approvals [SOURCE:two_approvals]\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.change_freeze == true AND DeployRequest.environment == \"production\" [SOURCE:change_freeze]\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n    FORBID deploy WHEN DeployRequest.error_rate_pct > max_error_rate_pct [SOURCE:error_budget]\n    FORBID rollback WHEN DeployRequest.environment != \"production\" AND DeployRequest.environment != \"staging\" [SOURCE:known_environments]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "ProductionDeploy",
            "digest": "972a43946ba6393d9189b1f896d9411feabc11ae5d3e30747fe79dc7c2b374de",
            "canonical": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n    CONSTANTS {\n      min_approvals: int == 2 [SOURCE:ENG-HANDBOOK-7.1]\n      max_error_rate_pct: float == 1.5 [SOURCE:SRE-SLO-3]\n    }\n  }\n  TRIGGER {\n    deploy()\n    rollback()\n  }\n  GUARANTEE {\n    ENSURE deploy() WHEN DeployRequest.tests_passed == true [SOURCE:tests_green]\n    ENSURE deploy() WHEN DeployRequest.approvals >= min_approvals [SOURCE:two_approvals]\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.change_freeze == true AND DeployRequest.environment == \"production\" [SOURCE:change_freeze]\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n    FORBID deploy WHEN DeployRequest.error_rate_pct > max_error_rate_pct [SOURCE:error_budget]\n    FORBID rollback WHEN DeployRequest.environment != \"production\" AND DeployRequest.environment != \"staging\" [SOURCE:known_environments]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "rollback",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "PERMIT",
          "clause_id": "ProductionDeploy.rollback.permit"
        },
        {
          "action": "rollback",
          "facts": {
            "environment": "dev",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "DENY",
          "clause_id": "ProductionDeploy.known_environments"
        },
        {
          "action": "rollback",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": true
          },
          "verdict": "PERMIT",
          "clause_id": "ProductionDeploy.rollback.permit"
        }
      ]
    },
    {
      "id": "tut-final",
      "title": "policy/deploy.ul",
      "source": "// Production deploys: who may ship, and when.\nCONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n    CONSTANTS {\n      min_approvals: int == 2 [SOURCE:ENG-HANDBOOK-7.1]\n      max_error_rate_pct: float == 1.5 [SOURCE:SRE-SLO-3]\n    }\n  }\n  TRIGGER {\n    deploy()\n    rollback()\n  }\n  GUARANTEE {\n    ENSURE deploy() WHEN DeployRequest.tests_passed == true [SOURCE:tests_green]\n    ENSURE deploy() WHEN DeployRequest.approvals >= min_approvals [SOURCE:two_approvals]\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.change_freeze == true AND DeployRequest.environment == \"production\" [SOURCE:change_freeze]\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n    FORBID deploy WHEN DeployRequest.error_rate_pct > max_error_rate_pct [SOURCE:error_budget]\n    FORBID rollback WHEN DeployRequest.environment != \"production\" AND DeployRequest.environment != \"staging\" [SOURCE:known_environments]\n  }\n  OBSERVABILITY {\n    LOG \"deploy decision\" ON decision\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "ProductionDeploy",
            "digest": "686358ddc154b77b5b7b3a24870b8dd6f79b23d376ed039d6824a923284e4059",
            "canonical": "CONTRACT ProductionDeploy {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES DeployRequest {\n      environment: string\n      tests_passed: bool\n      approvals: int\n      author_approved_own_change: bool\n      error_rate_pct: float\n      change_freeze: bool\n    }\n    CONSTANTS {\n      min_approvals: int == 2 [SOURCE:ENG-HANDBOOK-7.1]\n      max_error_rate_pct: float == 1.5 [SOURCE:SRE-SLO-3]\n    }\n  }\n  TRIGGER {\n    deploy()\n    rollback()\n  }\n  GUARANTEE {\n    ENSURE deploy() WHEN DeployRequest.tests_passed == true [SOURCE:tests_green]\n    ENSURE deploy() WHEN DeployRequest.approvals >= min_approvals [SOURCE:two_approvals]\n  }\n  PROHIBITION {\n    FORBID deploy WHEN DeployRequest.change_freeze == true AND DeployRequest.environment == \"production\" [SOURCE:change_freeze]\n    FORBID deploy WHEN DeployRequest.author_approved_own_change == true [SOURCE:no_self_approval]\n    FORBID deploy WHEN DeployRequest.error_rate_pct > max_error_rate_pct [SOURCE:error_budget]\n    FORBID rollback WHEN DeployRequest.environment != \"production\" AND DeployRequest.environment != \"staging\" [SOURCE:known_environments]\n  }\n  OBSERVABILITY {\n    LOG \"deploy decision\" ON decision\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "PERMIT",
          "clause_id": "ProductionDeploy.deploy.permit"
        },
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": true,
            "approvals": 2,
            "author_approved_own_change": true,
            "error_rate_pct": 0.4,
            "change_freeze": true
          },
          "verdict": "DENY",
          "clause_id": "ProductionDeploy.change_freeze"
        },
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": false,
            "approvals": 2,
            "author_approved_own_change": true,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "DENY",
          "clause_id": "ProductionDeploy.no_self_approval"
        },
        {
          "action": "deploy",
          "facts": {
            "environment": "production",
            "tests_passed": false,
            "approvals": 1,
            "author_approved_own_change": false,
            "error_rate_pct": 0.4,
            "change_freeze": false
          },
          "verdict": "DENY",
          "clause_id": "ProductionDeploy.tests_green"
        }
      ]
    },
    {
      "id": "pat-not-bad",
      "title": "`NOT` is refused before parsing",
      "source": "CONTRACT Publish {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Article {\n      reviewed: bool\n      word_count: int\n      status: string\n    }\n  }\n  TRIGGER {\n    publish()\n  }\n  PROHIBITION {\n    FORBID publish WHEN NOT Article.reviewed == true [SOURCE:needs_review]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "not-operator",
        "line": 14,
        "column": 25
      }
    },
    {
      "id": "pat-not",
      "title": "Say it with the opposite comparison",
      "source": "CONTRACT Publish {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Article {\n      reviewed: bool\n      word_count: int\n      status: string\n    }\n  }\n  TRIGGER {\n    publish()\n  }\n  PROHIBITION {\n    FORBID publish WHEN Article.reviewed == false [SOURCE:needs_review]\n    FORBID publish WHEN Article.word_count < 300 [SOURCE:too_short]\n    FORBID publish WHEN Article.status != \"ready\" AND Article.status != \"scheduled\" [SOURCE:wrong_status]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Publish",
            "digest": "e21f874658d8a743229e186939fa8b3baf72548147242642ca341549fc6c8987",
            "canonical": "CONTRACT Publish {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Article {\n      reviewed: bool\n      word_count: int\n      status: string\n    }\n  }\n  TRIGGER {\n    publish()\n  }\n  PROHIBITION {\n    FORBID publish WHEN Article.reviewed == false [SOURCE:needs_review]\n    FORBID publish WHEN Article.word_count < 300 [SOURCE:too_short]\n    FORBID publish WHEN Article.status != \"ready\" AND Article.status != \"scheduled\" [SOURCE:wrong_status]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "publish",
          "facts": {
            "reviewed": true,
            "word_count": 800,
            "status": "ready"
          },
          "verdict": "PERMIT",
          "clause_id": "Publish.publish.permit"
        },
        {
          "action": "publish",
          "facts": {
            "reviewed": false,
            "word_count": 800,
            "status": "ready"
          },
          "verdict": "DENY",
          "clause_id": "Publish.needs_review"
        },
        {
          "action": "publish",
          "facts": {
            "reviewed": true,
            "word_count": 800,
            "status": "draft"
          },
          "verdict": "DENY",
          "clause_id": "Publish.wrong_status"
        }
      ]
    },
    {
      "id": "pat-allowlist",
      "title": "Allow-list of strings",
      "source": "CONTRACT Shipping {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Shipment {\n      country: string\n      weight_kg: float\n      hazardous: bool\n    }\n    CONSTANTS {\n      max_weight_kg: float == 30.0 [SOURCE:CARRIER-TERMS-2]\n    }\n  }\n  TRIGGER {\n    ship()\n  }\n  PROHIBITION {\n    FORBID ship WHEN Shipment.country != \"US\" AND Shipment.country != \"CA\" AND Shipment.country != \"MX\" [SOURCE:ship_regions]\n    FORBID ship WHEN Shipment.hazardous == true OR Shipment.weight_kg > max_weight_kg [SOURCE:carrier_limits]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Shipping",
            "digest": "849104d027b84a94dfdbc5ee0739dd33fa5c7f66143d5761e05f8ee9e07132f4",
            "canonical": "CONTRACT Shipping {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Shipment {\n      country: string\n      weight_kg: float\n      hazardous: bool\n    }\n    CONSTANTS {\n      max_weight_kg: float == 30.0 [SOURCE:CARRIER-TERMS-2]\n    }\n  }\n  TRIGGER {\n    ship()\n  }\n  PROHIBITION {\n    FORBID ship WHEN Shipment.country != \"US\" AND Shipment.country != \"CA\" AND Shipment.country != \"MX\" [SOURCE:ship_regions]\n    FORBID ship WHEN Shipment.hazardous == true OR Shipment.weight_kg > max_weight_kg [SOURCE:carrier_limits]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "ship",
          "facts": {
            "country": "US",
            "weight_kg": 2,
            "hazardous": false
          },
          "verdict": "PERMIT",
          "clause_id": "Shipping.ship.permit"
        },
        {
          "action": "ship",
          "facts": {
            "country": "FR",
            "weight_kg": 2,
            "hazardous": false
          },
          "verdict": "DENY",
          "clause_id": "Shipping.ship_regions"
        },
        {
          "action": "ship",
          "facts": {
            "country": "us",
            "weight_kg": 2,
            "hazardous": false
          },
          "verdict": "DENY",
          "clause_id": "Shipping.ship_regions"
        },
        {
          "action": "ship",
          "facts": {
            "country": "CA",
            "weight_kg": 31,
            "hazardous": false
          },
          "verdict": "DENY",
          "clause_id": "Shipping.carrier_limits"
        }
      ]
    },
    {
      "id": "pat-range",
      "title": "A range: inside with ENSURE, outside with FORBID",
      "source": "CONTRACT Setpoint {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Change {\n      celsius: float\n      operator_certified: bool\n    }\n    CONSTANTS {\n      min_c: float == 5.0 [SOURCE:SAFETY-1]\n      max_c: float == 28.0 [SOURCE:SAFETY-1]\n    }\n  }\n  TRIGGER {\n    set_temperature()\n  }\n  GUARANTEE {\n    ENSURE set_temperature() WHEN Change.celsius >= min_c AND Change.celsius <= max_c [SOURCE:in_range]\n  }\n  PROHIBITION {\n    FORBID set_temperature WHEN Change.celsius > 24.0 AND Change.operator_certified == false [SOURCE:certified_above_24]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Setpoint",
            "digest": "a55e62765e7467b7cd7309c8219c9af2f7dd80d6ee9a7e6b53a9958ab2c75cc4",
            "canonical": "CONTRACT Setpoint {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Change {\n      celsius: float\n      operator_certified: bool\n    }\n    CONSTANTS {\n      min_c: float == 5.0 [SOURCE:SAFETY-1]\n      max_c: float == 28.0 [SOURCE:SAFETY-1]\n    }\n  }\n  TRIGGER {\n    set_temperature()\n  }\n  GUARANTEE {\n    ENSURE set_temperature() WHEN Change.celsius >= min_c AND Change.celsius <= max_c [SOURCE:in_range]\n  }\n  PROHIBITION {\n    FORBID set_temperature WHEN Change.celsius > 24.0 AND Change.operator_certified == false [SOURCE:certified_above_24]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "set_temperature",
          "facts": {
            "celsius": 21,
            "operator_certified": false
          },
          "verdict": "PERMIT",
          "clause_id": "Setpoint.set_temperature.permit"
        },
        {
          "action": "set_temperature",
          "facts": {
            "celsius": 3,
            "operator_certified": false
          },
          "verdict": "DENY",
          "clause_id": "Setpoint.in_range"
        },
        {
          "action": "set_temperature",
          "facts": {
            "celsius": 26,
            "operator_certified": false
          },
          "verdict": "DENY",
          "clause_id": "Setpoint.certified_above_24"
        },
        {
          "action": "set_temperature",
          "facts": {
            "celsius": 26,
            "operator_certified": true
          },
          "verdict": "PERMIT",
          "clause_id": "Setpoint.set_temperature.permit"
        }
      ]
    },
    {
      "id": "pat-two-fields",
      "title": "Compare two facts",
      "source": "CONTRACT Purchasing {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Purchase {\n      amount_cents: int\n      remaining_budget_cents: int\n      vendor_approved: bool\n    }\n  }\n  TRIGGER {\n    purchase()\n  }\n  GUARANTEE {\n    ENSURE purchase() WHEN Purchase.vendor_approved == true [SOURCE:approved_vendor]\n  }\n  PROHIBITION {\n    FORBID purchase WHEN Purchase.amount_cents > Purchase.remaining_budget_cents [SOURCE:over_budget]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Purchasing",
            "digest": "80232a79bb4efcf53f35bbfb38f7695e895ebc466f44c79190a4c0c6576a6bd2",
            "canonical": "CONTRACT Purchasing {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Purchase {\n      amount_cents: int\n      remaining_budget_cents: int\n      vendor_approved: bool\n    }\n  }\n  TRIGGER {\n    purchase()\n  }\n  GUARANTEE {\n    ENSURE purchase() WHEN Purchase.vendor_approved == true [SOURCE:approved_vendor]\n  }\n  PROHIBITION {\n    FORBID purchase WHEN Purchase.amount_cents > Purchase.remaining_budget_cents [SOURCE:over_budget]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "purchase",
          "facts": {
            "amount_cents": 5000,
            "remaining_budget_cents": 20000,
            "vendor_approved": true
          },
          "verdict": "PERMIT",
          "clause_id": "Purchasing.purchase.permit"
        },
        {
          "action": "purchase",
          "facts": {
            "amount_cents": 25000,
            "remaining_budget_cents": 20000,
            "vendor_approved": true
          },
          "verdict": "DENY",
          "clause_id": "Purchasing.over_budget"
        }
      ]
    },
    {
      "id": "pat-derived-bad",
      "title": "Arithmetic is refused",
      "source": "CONTRACT Quota {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Usage {\n      used: int\n      requested: int\n      limit: int\n    }\n  }\n  TRIGGER {\n    reserve()\n  }\n  PROHIBITION {\n    FORBID reserve WHEN Usage.used + Usage.requested > Usage.limit [SOURCE:quota]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "arithmetic",
        "line": 14,
        "column": 36
      }
    },
    {
      "id": "pat-derived",
      "title": "Compute it in the application, decide it in the contract",
      "source": "CONTRACT Quota {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Usage {\n      used: int\n      requested: int\n      projected: int\n      limit: int\n    }\n  }\n  TRIGGER {\n    reserve()\n  }\n  PROHIBITION {\n    FORBID reserve WHEN Usage.projected > Usage.limit [SOURCE:quota]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Quota",
            "digest": "04b0f1188e1e0b8f95d4e1039faa609a6e8df7b9afb4751d95d7f8071f4d3427",
            "canonical": "CONTRACT Quota {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Usage {\n      used: int\n      requested: int\n      projected: int\n      limit: int\n    }\n  }\n  TRIGGER {\n    reserve()\n  }\n  PROHIBITION {\n    FORBID reserve WHEN Usage.projected > Usage.limit [SOURCE:quota]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "reserve",
          "facts": {
            "used": 70,
            "requested": 20,
            "projected": 90,
            "limit": 100
          },
          "verdict": "PERMIT",
          "clause_id": "Quota.reserve.permit"
        },
        {
          "action": "reserve",
          "facts": {
            "used": 70,
            "requested": 40,
            "projected": 110,
            "limit": 100
          },
          "verdict": "DENY",
          "clause_id": "Quota.quota"
        }
      ]
    },
    {
      "id": "pat-relation-bad",
      "title": "Two string facts cannot be compared",
      "source": "CONTRACT Approvals {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Approval {\n      approver_id: string\n      requester_id: string\n      approver_is_requester: bool\n    }\n  }\n  TRIGGER {\n    approve()\n  }\n  PROHIBITION {\n    FORBID approve WHEN Approval.approver_id == Approval.requester_id [SOURCE:four_eyes]\n  }\n}\n",
      "expect": {
        "ok": false,
        "kind": "unsupported",
        "code": "nonnumeric-comparison",
        "line": 14,
        "column": 25
      }
    },
    {
      "id": "pat-relation",
      "title": "Pass the relation as a boolean fact",
      "source": "CONTRACT Approvals {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Approval {\n      approver_id: string\n      requester_id: string\n      approver_is_requester: bool\n    }\n  }\n  TRIGGER {\n    approve()\n  }\n  PROHIBITION {\n    FORBID approve WHEN Approval.approver_is_requester == true [SOURCE:four_eyes]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Approvals",
            "digest": "f6a9fe155f7924641bbe29b6427d5bd4681ae4656de70524db30ca0343940905",
            "canonical": "CONTRACT Approvals {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Approval {\n      approver_id: string\n      requester_id: string\n      approver_is_requester: bool\n    }\n  }\n  TRIGGER {\n    approve()\n  }\n  PROHIBITION {\n    FORBID approve WHEN Approval.approver_is_requester == true [SOURCE:four_eyes]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "approve",
          "facts": {
            "approver_id": "u-17",
            "requester_id": "u-42",
            "approver_is_requester": false
          },
          "verdict": "PERMIT",
          "clause_id": "Approvals.approve.permit"
        },
        {
          "action": "approve",
          "facts": {
            "approver_id": "u-42",
            "requester_id": "u-42",
            "approver_is_requester": true
          },
          "verdict": "DENY",
          "clause_id": "Approvals.four_eyes"
        }
      ]
    },
    {
      "id": "pat-time",
      "title": "Time windows: the application supplies the clock",
      "source": "CONTRACT ChangeWindow {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Window {\n      weekday: int\n      hour_utc: int\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n  PROHIBITION {\n    FORBID deploy WHEN Window.weekday >= 5 OR Window.hour_utc < 9 OR Window.hour_utc >= 17 [SOURCE:business_hours]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "ChangeWindow",
            "digest": "d218eaff9511e87499bbb84b769fb22e58eeca02d08cbe750b785fe7194aa438",
            "canonical": "CONTRACT ChangeWindow {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Window {\n      weekday: int\n      hour_utc: int\n    }\n  }\n  TRIGGER {\n    deploy()\n  }\n  PROHIBITION {\n    FORBID deploy WHEN Window.weekday >= 5 OR Window.hour_utc < 9 OR Window.hour_utc >= 17 [SOURCE:business_hours]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "deploy",
          "facts": {
            "weekday": 1,
            "hour_utc": 14
          },
          "verdict": "PERMIT",
          "clause_id": "ChangeWindow.deploy.permit"
        },
        {
          "action": "deploy",
          "facts": {
            "weekday": 5,
            "hour_utc": 14
          },
          "verdict": "DENY",
          "clause_id": "ChangeWindow.business_hours"
        },
        {
          "action": "deploy",
          "facts": {
            "weekday": 1,
            "hour_utc": 18
          },
          "verdict": "DENY",
          "clause_id": "ChangeWindow.business_hours"
        }
      ]
    },
    {
      "id": "pat-order-a",
      "title": "Most useful rule first",
      "source": "CONTRACT Payouts {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Account {\n      frozen: bool\n      amount_cents: int\n      balance_cents: int\n    }\n  }\n  TRIGGER {\n    withdraw()\n  }\n  PROHIBITION {\n    FORBID withdraw WHEN Account.frozen == true [SOURCE:account_frozen]\n    FORBID withdraw WHEN Account.amount_cents > Account.balance_cents [SOURCE:insufficient_funds]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Payouts",
            "digest": "7425e5b3fb960f154ecacc95d45edcd68073f269bb9180f80b14cbf5a2fbdf18",
            "canonical": "CONTRACT Payouts {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Account {\n      frozen: bool\n      amount_cents: int\n      balance_cents: int\n    }\n  }\n  TRIGGER {\n    withdraw()\n  }\n  PROHIBITION {\n    FORBID withdraw WHEN Account.frozen == true [SOURCE:account_frozen]\n    FORBID withdraw WHEN Account.amount_cents > Account.balance_cents [SOURCE:insufficient_funds]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "withdraw",
          "facts": {
            "frozen": true,
            "amount_cents": 9000,
            "balance_cents": 5000
          },
          "verdict": "DENY",
          "clause_id": "Payouts.account_frozen"
        }
      ]
    },
    {
      "id": "pat-order-b",
      "title": "The same rules, reversed",
      "source": "CONTRACT Payouts {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Account {\n      frozen: bool\n      amount_cents: int\n      balance_cents: int\n    }\n  }\n  TRIGGER {\n    withdraw()\n  }\n  PROHIBITION {\n    FORBID withdraw WHEN Account.amount_cents > Account.balance_cents [SOURCE:insufficient_funds]\n    FORBID withdraw WHEN Account.frozen == true [SOURCE:account_frozen]\n  }\n}\n",
      "expect": {
        "ok": true,
        "contracts": [
          {
            "name": "Payouts",
            "digest": "9ae8ce9470978d9eac4216cec9c931cbe47d616e382cff79b9f84326d254e1b0",
            "canonical": "CONTRACT Payouts {\n  ENFORCEMENT_MODE: enforced\n  CONTEXT {\n    ENTITIES Account {\n      frozen: bool\n      amount_cents: int\n      balance_cents: int\n    }\n  }\n  TRIGGER {\n    withdraw()\n  }\n  PROHIBITION {\n    FORBID withdraw WHEN Account.amount_cents > Account.balance_cents [SOURCE:insufficient_funds]\n    FORBID withdraw WHEN Account.frozen == true [SOURCE:account_frozen]\n  }\n}\n"
          }
        ]
      },
      "decisions": [
        {
          "action": "withdraw",
          "facts": {
            "frozen": true,
            "amount_cents": 9000,
            "balance_cents": 5000
          },
          "verdict": "DENY",
          "clause_id": "Payouts.insufficient_funds"
        }
      ]
    }
  ]
}
