{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://fingertrackid.dev/schemas/event-assessment.v1.1.schema.json",
  "title": "EventAssessmentV1_1",
  "description": "Assessment público, event-specific e já persistido, resposta a um event-assessment-request.v1.1. Igual ao event-assessment.v1 campo a campo, com a tag do cliente no lugar de journey: a classe interna nunca aparece. O FTID recomenda; o cliente decide e executa.",
  "$defs": {
    "uuidv7": {
      "type": "string",
      "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
    },
    "nullable_uuidv7": {
      "anyOf": [
        {
          "$ref": "#/$defs/uuidv7"
        },
        {
          "type": "null"
        }
      ]
    },
    "instant": {
      "type": "string",
      "format": "date-time",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$"
    },
    "nullable_instant": {
      "anyOf": [
        {
          "$ref": "#/$defs/instant"
        },
        {
          "type": "null"
        }
      ]
    },
    "public_version": {
      "type": "string",
      "minLength": 1,
      "pattern": "^(?=.*\\S).+$"
    },
    "nullable_public_version": {
      "anyOf": [
        {
          "$ref": "#/$defs/public_version"
        },
        {
          "type": "null"
        }
      ]
    },
    "limitation_code": {
      "type": "string",
      "enum": [
        "NO_FIRST_PARTY_COOKIE",
        "INSTALLATION_COOKIE_REJECTED",
        "NO_EDGE_SIGNALS",
        "STALE_DEVICE_PROFILE",
        "PROVIDER_UNAVAILABLE",
        "PROVIDER_BUDGET_EXCEEDED",
        "COLLECTOR_NOT_LOADED",
        "UNSUPPORTED_RUNTIME",
        "REQUIRED_EVIDENCE_MISSING",
        "DETECTOR_TIMEOUT",
        "DETECTOR_ERROR",
        "NETWORK_TYPE_AMBIGUOUS",
        "CLIENT_CLOCK_SKEW",
        "POLICY_UNAVAILABLE"
      ]
    },
    "applicability_reason_code": {
      "type": "string",
      "enum": [
        "CHANNEL_MISMATCH",
        "BROWSER_ENGINE_MISMATCH",
        "PLATFORM_MISMATCH",
        "JOURNEY_MISMATCH"
      ]
    },
    "signal": {
      "type": "object",
      "properties": {
        "signal_code": {
          "type": "string",
          "enum": [
            "ANTI_FINGERPRINTING",
            "BOT_AUTOMATION",
            "BROWSER_SPOOFING",
            "EMULATED_ENVIRONMENT",
            "PRIVATE_BROWSING",
            "BROWSER_PRIVACY_BRAVE",
            "BROWSER_PRIVACY_SAFARI",
            "BROWSER_PRIVACY_SAMSUNG_INTERNET",
            "NETWORK_PROXY",
            "NETWORK_VPN",
            "NETWORK_HOSTING",
            "NETWORK_TOR",
            "DEVICE_MULTI_USER"
          ]
        },
        "channel": {
          "const": "WEB"
        },
        "signal_state": {
          "type": "string",
          "enum": ["DETECTED", "NOT_DETECTED", "NOT_EVALUATED"]
        },
        "applicability": {
          "type": "string",
          "enum": ["APPLICABLE", "NOT_APPLICABLE"]
        },
        "source": {
          "type": "string",
          "enum": ["EDGE", "SDK", "SERVER_CONTEXT", "PROVIDER", "DERIVED"]
        },
        "detector_version": {
          "$ref": "#/$defs/public_version"
        },
        "detector_confidence": {
          "anyOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "observed_at": {
          "$ref": "#/$defs/nullable_instant"
        },
        "evaluated_at": {
          "$ref": "#/$defs/instant"
        },
        "freshness_ms": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "not_evaluated_reason_code": {
          "anyOf": [
            {
              "$ref": "#/$defs/limitation_code"
            },
            {
              "type": "null"
            }
          ]
        },
        "applicability_reason_code": {
          "anyOf": [
            {
              "$ref": "#/$defs/applicability_reason_code"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "signal_code",
        "channel",
        "signal_state",
        "applicability",
        "source",
        "detector_version",
        "detector_confidence",
        "observed_at",
        "evaluated_at",
        "freshness_ms",
        "not_evaluated_reason_code",
        "applicability_reason_code"
      ],
      "additionalProperties": false,
      "allOf": [
        {
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "signal_state": {
                  "enum": ["DETECTED", "NOT_DETECTED"]
                },
                "applicability": {
                  "const": "APPLICABLE"
                },
                "detector_confidence": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                },
                "observed_at": {
                  "$ref": "#/$defs/instant"
                },
                "freshness_ms": {
                  "type": "integer",
                  "minimum": 0
                },
                "not_evaluated_reason_code": {
                  "type": "null"
                },
                "applicability_reason_code": {
                  "type": "null"
                }
              },
              "required": [
                "signal_state",
                "applicability",
                "detector_confidence",
                "observed_at",
                "freshness_ms",
                "not_evaluated_reason_code",
                "applicability_reason_code"
              ]
            },
            {
              "type": "object",
              "properties": {
                "signal_state": {
                  "const": "NOT_EVALUATED"
                },
                "applicability": {
                  "const": "APPLICABLE"
                },
                "detector_confidence": {
                  "type": "null"
                },
                "observed_at": {
                  "type": "null"
                },
                "freshness_ms": {
                  "type": "null"
                },
                "not_evaluated_reason_code": {
                  "$ref": "#/$defs/limitation_code"
                },
                "applicability_reason_code": {
                  "type": "null"
                }
              },
              "required": [
                "signal_state",
                "applicability",
                "detector_confidence",
                "observed_at",
                "freshness_ms",
                "not_evaluated_reason_code",
                "applicability_reason_code"
              ]
            },
            {
              "type": "object",
              "properties": {
                "signal_state": {
                  "const": "NOT_EVALUATED"
                },
                "applicability": {
                  "const": "NOT_APPLICABLE"
                },
                "detector_confidence": {
                  "type": "null"
                },
                "observed_at": {
                  "type": "null"
                },
                "freshness_ms": {
                  "type": "null"
                },
                "not_evaluated_reason_code": {
                  "type": "null"
                },
                "applicability_reason_code": {
                  "$ref": "#/$defs/applicability_reason_code"
                }
              },
              "required": [
                "signal_state",
                "applicability",
                "detector_confidence",
                "observed_at",
                "freshness_ms",
                "not_evaluated_reason_code",
                "applicability_reason_code"
              ]
            }
          ]
        }
      ]
    },
    "tag": {
      "description": "Tag livre do ponto de chamada, escolhida pela integração (D174). Slug ASCII minúsculo, 1..64, começando por letra ou dígito; sem normalização silenciosa (maiúscula, espaço e hífen são recusados). Nunca seleciona policy, detector, provider, nota, prazo, quota ou fila, e não pode conter PII, segredo, documento, telefone, e-mail nem nome de pessoa. No máximo dez dígitos no total, em qualquer posição: a recusa de onze ou mais dígitos (juntos ou separados, como em `cpf_123_456_789_01`) é estrutural e não comprova ausência de PII.",
      "type": "string",
      "allOf": [
        {
          "type": "string",
          "pattern": "^[a-z0-9][a-z0-9_]{0,63}$"
        },
        {
          "not": {
            "type": "string",
            "pattern": "^(?:[^0-9]*[0-9]){11}"
          }
        }
      ]
    }
  },
  "type": "object",
  "properties": {
    "schema_version": {
      "const": "event-assessment.v1.1"
    },
    "assessment_id": {
      "$ref": "#/$defs/uuidv7"
    },
    "assessment_version": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "supersedes_assessment_id": {
      "$ref": "#/$defs/nullable_uuidv7"
    },
    "business_event_id": {
      "$ref": "#/$defs/uuidv7"
    },
    "external_event_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
    },
    "tag": {
      "$ref": "#/$defs/tag"
    },
    "assessment_status": {
      "type": "string",
      "enum": ["COMPLETED", "INCONCLUSIVE", "UNSCORABLE", "FAILED"]
    },
    "retryable": {
      "const": false
    },
    "trust_score": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 100
        },
        {
          "type": "null"
        }
      ]
    },
    "device_intelligence_snapshot_id": {
      "$ref": "#/$defs/nullable_uuidv7"
    },
    "device_intelligence_snapshot_version": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "device_id": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^dev_[A-Za-z0-9_-]{20,}$"
        },
        {
          "type": "null"
        }
      ]
    },
    "device_match_confidence": {
      "anyOf": [
        {
          "type": "number",
          "minimum": 0,
          "maximum": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "evidence_coverage": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100
    },
    "data_freshness": {
      "type": "object",
      "properties": {
        "evidence_cutoff_at": {
          "$ref": "#/$defs/instant"
        },
        "oldest_required_observed_at": {
          "$ref": "#/$defs/nullable_instant"
        },
        "maximum_required_age_ms": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991
        },
        "all_required_fresh": {
          "type": "boolean"
        }
      },
      "required": [
        "evidence_cutoff_at",
        "oldest_required_observed_at",
        "maximum_required_age_ms",
        "all_required_fresh"
      ],
      "additionalProperties": false,
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "oldest_required_observed_at": {
              "$ref": "#/$defs/instant"
            },
            "all_required_fresh": {
              "type": "boolean"
            }
          },
          "required": ["oldest_required_observed_at", "all_required_fresh"]
        },
        {
          "type": "object",
          "properties": {
            "oldest_required_observed_at": {
              "type": "null"
            },
            "all_required_fresh": {
              "const": false
            }
          },
          "required": ["oldest_required_observed_at", "all_required_fresh"]
        }
      ]
    },
    "signals": {
      "type": "array",
      "minItems": 13,
      "maxItems": 13,
      "items": {
        "$ref": "#/$defs/signal"
      },
      "allOf": [
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "ANTI_FINGERPRINTING"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "BOT_AUTOMATION"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "BROWSER_SPOOFING"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "EMULATED_ENVIRONMENT"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "PRIVATE_BROWSING"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "BROWSER_PRIVACY_BRAVE"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "BROWSER_PRIVACY_SAFARI"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "BROWSER_PRIVACY_SAMSUNG_INTERNET"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "NETWORK_PROXY"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "NETWORK_VPN"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "NETWORK_HOSTING"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "NETWORK_TOR"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        },
        {
          "contains": {
            "type": "object",
            "properties": {
              "signal_code": {
                "const": "DEVICE_MULTI_USER"
              }
            },
            "required": ["signal_code"]
          },
          "minContains": 1,
          "maxContains": 1
        }
      ]
    },
    "limitation_codes": {
      "type": "array",
      "uniqueItems": true,
      "items": {
        "$ref": "#/$defs/limitation_code"
      }
    },
    "reason_codes": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[A-Z][A-Z0-9_]{2,63}$"
      }
    },
    "recommended_action": {
      "type": "string",
      "enum": ["ALLOW", "MONITOR", "STEP_UP", "REVIEW", "BLOCK_RECOMMENDED"]
    },
    "recommendation_basis": {
      "type": "string",
      "enum": ["EVALUATION", "INSUFFICIENT_EVIDENCE", "OUT_OF_POLICY_SCOPE", "TECHNICAL_FAILURE"]
    },
    "policy_version": {
      "$ref": "#/$defs/nullable_public_version"
    },
    "fallback_policy_version": {
      "$ref": "#/$defs/public_version"
    },
    "ruleset_version": {
      "$ref": "#/$defs/public_version"
    },
    "signal_catalog_version": {
      "$ref": "#/$defs/public_version"
    },
    "feature_schema_version": {
      "$ref": "#/$defs/public_version"
    },
    "resolver_version": {
      "$ref": "#/$defs/public_version"
    },
    "sdk_version": {
      "$ref": "#/$defs/nullable_public_version"
    },
    "provider_versions": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/public_version"
      }
    },
    "evidence_cutoff_at": {
      "$ref": "#/$defs/instant"
    },
    "evaluated_at": {
      "$ref": "#/$defs/instant"
    },
    "expires_at": {
      "$ref": "#/$defs/instant"
    },
    "correlation_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    }
  },
  "required": [
    "schema_version",
    "assessment_id",
    "assessment_version",
    "supersedes_assessment_id",
    "business_event_id",
    "external_event_id",
    "tag",
    "assessment_status",
    "retryable",
    "trust_score",
    "device_intelligence_snapshot_id",
    "device_intelligence_snapshot_version",
    "device_id",
    "device_match_confidence",
    "evidence_coverage",
    "data_freshness",
    "signals",
    "limitation_codes",
    "reason_codes",
    "recommended_action",
    "recommendation_basis",
    "policy_version",
    "fallback_policy_version",
    "ruleset_version",
    "signal_catalog_version",
    "feature_schema_version",
    "resolver_version",
    "sdk_version",
    "provider_versions",
    "evidence_cutoff_at",
    "evaluated_at",
    "expires_at",
    "correlation_id"
  ],
  "additionalProperties": false,
  "allOf": [
    {
      "if": {
        "properties": {
          "device_match_confidence": {
            "type": "number"
          }
        },
        "required": ["device_match_confidence"]
      },
      "then": {
        "properties": {
          "device_id": {
            "type": "string"
          }
        },
        "required": ["device_id"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "source": {
                  "const": "SDK"
                },
                "signal_state": {
                  "enum": ["DETECTED", "NOT_DETECTED"]
                }
              },
              "required": ["source", "signal_state"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "device_intelligence_snapshot_id": {
            "$ref": "#/$defs/uuidv7"
          },
          "device_intelligence_snapshot_version": {
            "type": "integer",
            "minimum": 1
          },
          "sdk_version": {
            "$ref": "#/$defs/public_version"
          }
        },
        "required": [
          "device_intelligence_snapshot_id",
          "device_intelligence_snapshot_version",
          "sdk_version"
        ]
      }
    },
    {
      "if": {
        "properties": {
          "assessment_status": {
            "enum": ["INCONCLUSIVE", "UNSCORABLE", "FAILED"]
          }
        },
        "required": ["assessment_status"]
      },
      "then": {
        "properties": {
          "recommended_action": {
            "enum": ["MONITOR", "STEP_UP"]
          }
        },
        "required": ["recommended_action"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "NO_FIRST_PARTY_COOKIE"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "NO_FIRST_PARTY_COOKIE"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "INSTALLATION_COOKIE_REJECTED"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "INSTALLATION_COOKIE_REJECTED"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "NO_EDGE_SIGNALS"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "NO_EDGE_SIGNALS"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "STALE_DEVICE_PROFILE"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "STALE_DEVICE_PROFILE"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "PROVIDER_UNAVAILABLE"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "PROVIDER_UNAVAILABLE"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "PROVIDER_BUDGET_EXCEEDED"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "PROVIDER_BUDGET_EXCEEDED"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "COLLECTOR_NOT_LOADED"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "COLLECTOR_NOT_LOADED"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "UNSUPPORTED_RUNTIME"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "UNSUPPORTED_RUNTIME"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "REQUIRED_EVIDENCE_MISSING"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "REQUIRED_EVIDENCE_MISSING"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "DETECTOR_TIMEOUT"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "DETECTOR_TIMEOUT"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "DETECTOR_ERROR"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "DETECTOR_ERROR"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "NETWORK_TYPE_AMBIGUOUS"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "NETWORK_TYPE_AMBIGUOUS"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "CLIENT_CLOCK_SKEW"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "CLIENT_CLOCK_SKEW"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "if": {
        "properties": {
          "signals": {
            "type": "array",
            "contains": {
              "type": "object",
              "properties": {
                "not_evaluated_reason_code": {
                  "const": "POLICY_UNAVAILABLE"
                }
              },
              "required": ["not_evaluated_reason_code"]
            }
          }
        },
        "required": ["signals"]
      },
      "then": {
        "properties": {
          "limitation_codes": {
            "type": "array",
            "contains": {
              "const": "POLICY_UNAVAILABLE"
            }
          }
        },
        "required": ["limitation_codes"]
      }
    },
    {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "assessment_status": {
              "const": "COMPLETED"
            },
            "trust_score": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "recommendation_basis": {
              "const": "EVALUATION"
            },
            "policy_version": {
              "$ref": "#/$defs/public_version"
            },
            "device_intelligence_snapshot_id": {
              "$ref": "#/$defs/uuidv7"
            },
            "device_intelligence_snapshot_version": {
              "type": "integer",
              "minimum": 1
            },
            "sdk_version": {
              "$ref": "#/$defs/public_version"
            },
            "data_freshness": {
              "type": "object",
              "properties": {
                "all_required_fresh": {
                  "const": true
                }
              },
              "required": ["all_required_fresh"]
            },
            "reason_codes": {
              "type": "array",
              "minItems": 1
            }
          },
          "required": [
            "assessment_status",
            "trust_score",
            "recommendation_basis",
            "policy_version",
            "device_intelligence_snapshot_id",
            "device_intelligence_snapshot_version",
            "sdk_version",
            "data_freshness",
            "reason_codes"
          ]
        },
        {
          "type": "object",
          "properties": {
            "assessment_status": {
              "const": "INCONCLUSIVE"
            },
            "trust_score": {
              "type": "null"
            },
            "recommendation_basis": {
              "const": "INSUFFICIENT_EVIDENCE"
            },
            "recommended_action": {
              "enum": ["MONITOR", "STEP_UP", "REVIEW", "BLOCK_RECOMMENDED"]
            },
            "policy_version": {
              "$ref": "#/$defs/public_version"
            }
          },
          "required": [
            "assessment_status",
            "trust_score",
            "recommendation_basis",
            "recommended_action",
            "policy_version"
          ]
        },
        {
          "type": "object",
          "properties": {
            "assessment_status": {
              "const": "UNSCORABLE"
            },
            "trust_score": {
              "type": "null"
            },
            "recommendation_basis": {
              "const": "OUT_OF_POLICY_SCOPE"
            },
            "recommended_action": {
              "enum": ["MONITOR", "STEP_UP", "REVIEW", "BLOCK_RECOMMENDED"]
            },
            "policy_version": {
              "$ref": "#/$defs/public_version"
            },
            "reason_codes": {
              "type": "array",
              "minItems": 1
            }
          },
          "required": [
            "assessment_status",
            "trust_score",
            "recommendation_basis",
            "recommended_action",
            "policy_version",
            "reason_codes"
          ]
        },
        {
          "type": "object",
          "properties": {
            "assessment_status": {
              "const": "FAILED"
            },
            "trust_score": {
              "type": "null"
            },
            "recommendation_basis": {
              "const": "TECHNICAL_FAILURE"
            },
            "recommended_action": {
              "enum": ["MONITOR", "STEP_UP", "REVIEW", "BLOCK_RECOMMENDED"]
            }
          },
          "required": [
            "assessment_status",
            "trust_score",
            "recommendation_basis",
            "recommended_action"
          ]
        }
      ]
    },
    {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "device_intelligence_snapshot_id": {
              "$ref": "#/$defs/uuidv7"
            },
            "device_intelligence_snapshot_version": {
              "type": "integer",
              "minimum": 1
            },
            "sdk_version": {
              "$ref": "#/$defs/public_version"
            }
          },
          "required": [
            "device_intelligence_snapshot_id",
            "device_intelligence_snapshot_version",
            "sdk_version"
          ]
        },
        {
          "type": "object",
          "properties": {
            "device_intelligence_snapshot_id": {
              "type": "null"
            },
            "device_intelligence_snapshot_version": {
              "type": "null"
            },
            "device_match_confidence": {
              "type": "null"
            },
            "sdk_version": {
              "type": "null"
            }
          },
          "required": [
            "device_intelligence_snapshot_id",
            "device_intelligence_snapshot_version",
            "device_match_confidence",
            "sdk_version"
          ]
        }
      ]
    },
    {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "assessment_version": {
              "const": 1
            },
            "supersedes_assessment_id": {
              "type": "null"
            }
          },
          "required": ["assessment_version", "supersedes_assessment_id"]
        },
        {
          "type": "object",
          "properties": {
            "assessment_version": {
              "type": "integer",
              "minimum": 2
            },
            "supersedes_assessment_id": {
              "$ref": "#/$defs/uuidv7"
            }
          },
          "required": ["assessment_version", "supersedes_assessment_id"]
        }
      ]
    },
    {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "reason_codes": {
              "type": "array",
              "minItems": 1
            }
          },
          "required": ["reason_codes"]
        },
        {
          "type": "object",
          "properties": {
            "limitation_codes": {
              "type": "array",
              "minItems": 1
            }
          },
          "required": ["limitation_codes"]
        }
      ]
    },
    {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "assessment_status": {
              "const": "FAILED"
            },
            "policy_version": {
              "type": "null"
            },
            "limitation_codes": {
              "type": "array",
              "contains": {
                "const": "POLICY_UNAVAILABLE"
              },
              "minContains": 1,
              "maxContains": 1
            }
          },
          "required": ["assessment_status", "policy_version", "limitation_codes"]
        },
        {
          "type": "object",
          "properties": {
            "policy_version": {
              "$ref": "#/$defs/public_version"
            },
            "limitation_codes": {
              "type": "array",
              "not": {
                "contains": {
                  "const": "POLICY_UNAVAILABLE"
                }
              }
            }
          },
          "required": ["policy_version", "limitation_codes"]
        }
      ]
    }
  ],
  "x-ftid-runtime-invariants": [
    "freshness_ms equals signal.evaluated_at minus signal.observed_at",
    "data_freshness.oldest_required_observed_at is not after data_freshness.evidence_cutoff_at",
    "when all_required_fresh is true, oldest required evidence age does not exceed maximum_required_age_ms",
    "assessment evidence_cutoff_at equals data_freshness.evidence_cutoff_at",
    "assessment evidence_cutoff_at is not after evaluated_at and evaluated_at is before expires_at",
    "no signal observed_at is after assessment evidence_cutoff_at",
    "no signal evaluated_at is after assessment evaluated_at",
    "supersedes_assessment_id differs from assessment_id",
    "tag is the customer tag of the request, never the internal class, and the internal class is LOGIN for every v1.1 assessment",
    "a non-completed v1.1 assessment uses MONITOR or the legacy LOGIN fallback STEP_UP frozen in the policy that evaluated it"
  ]
}
