{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://wp-content.ru/schemas/320px-site-audit/finding-v1.json",
  "title": "320px Site Audit Finding",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "check_id",
    "check_version",
    "rule_pack_version",
    "status",
    "severity",
    "confidence",
    "category",
    "subcategory",
    "affected_objects",
    "title_key",
    "summary_key",
    "why_it_matters_key",
    "evidence",
    "evidence_summary_key",
    "next_step_key",
    "owner_key",
    "effort_band",
    "prerequisites",
    "coverage",
    "limitation_key",
    "method",
    "source_refs",
    "first_seen",
    "last_seen",
    "comparison_state",
    "acknowledgement"
  ],
  "properties": {
    "check_id": { "$ref": "#/$defs/identifier" },
    "check_version": { "$ref": "#/$defs/semver" },
    "rule_pack_version": { "$ref": "#/$defs/semver" },
    "status": { "enum": ["pass", "warning", "fail", "info", "not_tested", "error"] },
    "severity": { "enum": ["critical", "high", "medium", "low", "info", "none"] },
    "confidence": { "enum": ["confirmed", "high", "medium", "low"] },
    "category": { "$ref": "#/$defs/identifier" },
    "subcategory": { "$ref": "#/$defs/identifier" },
    "affected_objects": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": ["type", "reference"],
        "properties": {
          "type": { "$ref": "#/$defs/identifier" },
          "reference": { "type": "string", "maxLength": 500 }
        }
      }
    },
    "title_key": { "$ref": "#/$defs/identifier" },
    "summary_key": { "$ref": "#/$defs/identifier" },
    "why_it_matters_key": { "$ref": "#/$defs/identifier" },
    "evidence": { "type": "object" },
    "evidence_summary_key": { "$ref": "#/$defs/identifier" },
    "next_step_key": { "$ref": "#/$defs/identifier" },
    "owner_key": { "$ref": "#/$defs/identifier" },
    "effort_band": { "enum": ["unknown", "small", "medium", "large"] },
    "prerequisites": {
      "type": "array",
      "uniqueItems": true,
      "items": { "$ref": "#/$defs/identifier" }
    },
    "coverage": {
      "type": "object",
      "additionalProperties": false,
      "required": ["unit", "observed", "total", "state"],
      "properties": {
        "unit": { "$ref": "#/$defs/identifier" },
        "observed": { "type": "integer", "minimum": 0 },
        "total": { "type": "integer", "minimum": 0 },
        "state": { "enum": ["complete", "partial", "none", "error"] }
      }
    },
    "limitation_key": { "$ref": "#/$defs/identifier" },
    "method": { "$ref": "#/$defs/identifier" },
    "source_refs": {
      "type": "array",
      "uniqueItems": true,
      "items": { "$ref": "#/$defs/identifier" }
    },
    "first_seen": { "type": "string", "format": "date-time" },
    "last_seen": { "type": "string", "format": "date-time" },
    "comparison_state": { "enum": ["new", "unchanged", "resolved", "regressed"] },
    "acknowledgement": {
      "oneOf": [
        { "type": "null" },
        {
          "type": "object",
          "additionalProperties": false,
          "required": ["reason", "actor_id", "created_at"],
          "properties": {
            "reason": { "type": "string", "maxLength": 1000 },
            "actor_id": { "type": "integer", "minimum": 1 },
            "created_at": { "type": "string", "format": "date-time" }
          }
        }
      ]
    }
  },
  "$defs": {
    "identifier": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$"
    },
    "semver": {
      "type": "string",
      "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
    }
  }
}
