{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://github.com/BichengWang/ai-decision-system/schema/decisioncontrol/evaluation.v1.json",
  "title": "decision-control policy evaluation report, schema 1",
  "$comment": "sha256 covers /report, canonicalized as python-json-v1 (json.dumps sort_keys, separators (',',':'), ensure_ascii=False, UTF-8). Not expressible here: the reader recomputes every metric, gate and disposition from the frozen cases, policy and requirements and requires the report to equal that recomputation exactly.",
  "type": "object",
  "properties": {
    "report": {
      "type": "object",
      "properties": {
        "schema_version": {
          "const": 1
        },
        "kind": {
          "const": "policy_evaluation"
        },
        "source": {
          "const": "supplied_recommendations"
        },
        "cases": {
          "type": "integer",
          "minimum": 1
        },
        "confidence_level": {
          "const": 0.95
        },
        "policy": {
          "$ref": "#/$defs/policy"
        },
        "requirements": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/requirements"
            }
          ]
        },
        "metrics": {
          "type": "object",
          "properties": {
            "auto_allow_rate": {
              "$ref": "#/$defs/rate"
            },
            "unsafe_auto_allow_rate": {
              "$ref": "#/$defs/rate"
            },
            "auto_route_error_rate": {
              "$ref": "#/$defs/rate"
            },
            "review_rate": {
              "$ref": "#/$defs/rate"
            },
            "abstain_rate": {
              "$ref": "#/$defs/rate"
            },
            "deny_rate": {
              "$ref": "#/$defs/rate"
            },
            "required_review_recall": {
              "$ref": "#/$defs/rate"
            },
            "review_precision": {
              "$ref": "#/$defs/rate"
            },
            "incorrect_approval_rate": {
              "$ref": "#/$defs/rate"
            },
            "review_observation_rate": {
              "$ref": "#/$defs/rate"
            }
          },
          "required": [
            "auto_allow_rate",
            "unsafe_auto_allow_rate",
            "auto_route_error_rate",
            "review_rate",
            "abstain_rate",
            "deny_rate",
            "required_review_recall",
            "review_precision",
            "incorrect_approval_rate",
            "review_observation_rate"
          ],
          "additionalProperties": false
        },
        "gates": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/gate"
          }
        },
        "disposition": {
          "enum": [
            "PASS",
            "FAIL",
            "UNGATED"
          ]
        },
        "case_results": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/case_result"
          }
        }
      },
      "required": [
        "schema_version",
        "kind",
        "source",
        "cases",
        "confidence_level",
        "policy",
        "requirements",
        "metrics",
        "gates",
        "disposition",
        "case_results"
      ],
      "additionalProperties": false
    },
    "sha256": {
      "$ref": "#/$defs/sha256"
    }
  },
  "required": [
    "report",
    "sha256"
  ],
  "additionalProperties": false,
  "$defs": {
    "string": {
      "type": "string",
      "pattern": "^[^\\ud800-\\udfff]*$",
      "description": "Any string without an unpaired surrogate (which has no UTF-8 encoding)."
    },
    "text": {
      "type": "string",
      "allOf": [
        {
          "pattern": "^[^\\ud800-\\udfff]*$"
        },
        {
          "pattern": "^(?:\\S|\\S[\\s\\S]*\\S)(?![\\s\\S])"
        }
      ],
      "description": "Nonempty, no leading or trailing whitespace, no unpaired surrogate."
    },
    "sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}(?![\\s\\S])"
    },
    "uuid": {
      "type": "string",
      "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}(?![\\s\\S])"
    },
    "timestamp": {
      "type": "string",
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]+)?(?:Z|[+-]00:00)(?![\\s\\S])",
      "description": "ISO 8601 timestamp at UTC offset zero."
    },
    "names": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/text"
      },
      "uniqueItems": true
    },
    "verdict": {
      "enum": [
        "ALLOW",
        "DENY",
        "REVIEW",
        "ABSTAIN"
      ]
    },
    "evaluation": {
      "type": "object",
      "properties": {
        "verdict": {
          "$ref": "#/$defs/verdict"
        },
        "reasons": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/text"
          },
          "uniqueItems": true,
          "minItems": 1
        }
      },
      "required": [
        "verdict",
        "reasons"
      ],
      "additionalProperties": false
    },
    "probability": {
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "ticket": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/$defs/text"
        },
        "department": {
          "$ref": "#/$defs/text"
        },
        "revision": {
          "type": "integer",
          "minimum": 0
        }
      },
      "required": [
        "id",
        "department",
        "revision"
      ],
      "additionalProperties": false
    },
    "recommendation": {
      "type": "object",
      "properties": {
        "action": {
          "$ref": "#/$defs/text"
        },
        "ticket_id": {
          "$ref": "#/$defs/text"
        },
        "destination": {
          "$ref": "#/$defs/text"
        },
        "probability": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/probability"
            }
          ]
        },
        "model": {
          "$ref": "#/$defs/text"
        },
        "question_version": {
          "$ref": "#/$defs/text"
        },
        "refused": {
          "type": "boolean"
        }
      },
      "required": [
        "action",
        "ticket_id",
        "destination",
        "probability",
        "model",
        "question_version",
        "refused"
      ],
      "additionalProperties": false
    },
    "policy": {
      "type": "object",
      "properties": {
        "version": {
          "$ref": "#/$defs/text"
        },
        "allowed_destinations": {
          "allOf": [
            {
              "$ref": "#/$defs/names"
            },
            {
              "minItems": 1
            }
          ]
        },
        "review_destinations": {
          "$ref": "#/$defs/names"
        },
        "reviewers": {
          "allOf": [
            {
              "$ref": "#/$defs/names"
            },
            {
              "minItems": 1
            }
          ]
        },
        "min_probability": {
          "$ref": "#/$defs/probability"
        }
      },
      "required": [
        "version",
        "allowed_destinations",
        "review_destinations",
        "reviewers",
        "min_probability"
      ],
      "additionalProperties": false
    },
    "rate": {
      "type": "object",
      "properties": {
        "numerator": {
          "type": "integer",
          "minimum": 0
        },
        "denominator": {
          "type": "integer",
          "minimum": 0
        },
        "value": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "number"
            }
          ]
        },
        "lower": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "number"
            }
          ]
        },
        "upper": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "number"
            }
          ]
        }
      },
      "required": [
        "numerator",
        "denominator",
        "value",
        "lower",
        "upper"
      ],
      "additionalProperties": false
    },
    "bound": {
      "type": "object",
      "properties": {
        "statistic": {
          "enum": [
            "value",
            "lower",
            "upper"
          ]
        },
        "min_denominator": {
          "type": "integer",
          "minimum": 1
        },
        "min": {
          "$ref": "#/$defs/probability"
        },
        "max": {
          "$ref": "#/$defs/probability"
        }
      },
      "required": [
        "statistic",
        "min_denominator"
      ],
      "additionalProperties": false,
      "anyOf": [
        {
          "required": [
            "min"
          ]
        },
        {
          "required": [
            "max"
          ]
        }
      ]
    },
    "requirements": {
      "type": "object",
      "properties": {
        "min_cases": {
          "type": "integer",
          "minimum": 1
        },
        "bounds": {
          "type": "object",
          "minProperties": 1,
          "propertyNames": {
            "enum": [
              "auto_allow_rate",
              "unsafe_auto_allow_rate",
              "auto_route_error_rate",
              "review_rate",
              "abstain_rate",
              "deny_rate",
              "required_review_recall",
              "review_precision",
              "incorrect_approval_rate",
              "review_observation_rate"
            ]
          },
          "additionalProperties": {
            "$ref": "#/$defs/bound"
          }
        }
      },
      "required": [
        "min_cases",
        "bounds"
      ],
      "additionalProperties": false
    },
    "gate": {
      "type": "object",
      "properties": {
        "metric": {
          "enum": [
            "cases",
            "auto_allow_rate",
            "unsafe_auto_allow_rate",
            "auto_route_error_rate",
            "review_rate",
            "abstain_rate",
            "deny_rate",
            "required_review_recall",
            "review_precision",
            "incorrect_approval_rate",
            "review_observation_rate"
          ]
        },
        "statistic": {
          "enum": [
            "value",
            "lower",
            "upper"
          ]
        },
        "observed": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "number"
            }
          ]
        },
        "min": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "number"
            }
          ]
        },
        "max": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "number"
            }
          ]
        },
        "denominator": {
          "type": "integer",
          "minimum": 0
        },
        "min_denominator": {
          "type": "integer",
          "minimum": 1
        },
        "passed": {
          "type": "boolean"
        },
        "reason": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "enum": [
                "insufficient_cases",
                "unmeasured",
                "insufficient_denominator",
                "outside_bound"
              ]
            }
          ]
        }
      },
      "required": [
        "metric",
        "statistic",
        "observed",
        "min",
        "max",
        "denominator",
        "min_denominator",
        "passed",
        "reason"
      ],
      "additionalProperties": false
    },
    "case": {
      "type": "object",
      "properties": {
        "id": {
          "$ref": "#/$defs/text"
        },
        "ticket": {
          "$ref": "#/$defs/ticket"
        },
        "recommendation": {
          "$ref": "#/$defs/recommendation"
        },
        "labels": {
          "type": "object",
          "properties": {
            "safe_to_execute": {
              "type": "boolean"
            },
            "requires_review": {
              "type": "boolean"
            },
            "correct_destination": {
              "$ref": "#/$defs/text"
            }
          },
          "required": [
            "safe_to_execute",
            "requires_review",
            "correct_destination"
          ],
          "additionalProperties": false
        },
        "review_outcome": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "enum": [
                "APPROVED",
                "REJECTED"
              ]
            }
          ]
        }
      },
      "required": [
        "id",
        "ticket",
        "recommendation",
        "labels",
        "review_outcome"
      ],
      "additionalProperties": false
    },
    "case_result": {
      "type": "object",
      "properties": {
        "case": {
          "$ref": "#/$defs/case"
        },
        "evaluation": {
          "$ref": "#/$defs/evaluation"
        },
        "auto_allow_unsafe": {
          "type": "boolean"
        },
        "auto_route_incorrect": {
          "type": "boolean"
        },
        "approval_incorrect": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "boolean"
            }
          ]
        }
      },
      "required": [
        "case",
        "evaluation",
        "auto_allow_unsafe",
        "auto_route_incorrect",
        "approval_incorrect"
      ],
      "additionalProperties": false
    }
  }
}
