{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://edpol.pro/downloads/edpol-editorial-audit-receipt.schema.json",
  "title": "EdPol editorial audit receipt",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "audit_id",
    "generated_at",
    "project",
    "source_revision",
    "lifecycle",
    "authority",
    "scope",
    "lenses",
    "findings",
    "review_feedback",
    "evidence_layers",
    "verdict",
    "decision_owner",
    "next_action"
  ],
  "properties": {
    "schema_version": {"const": "edpol-editorial-audit-receipt-v1"},
    "audit_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
    "generated_at": {"type": "string", "format": "date-time"},
    "project": {"type": "string", "minLength": 1},
    "source_revision": {"type": "string", "minLength": 1},
    "lifecycle": {"enum": ["draft", "operator-only", "public-candidate", "deployed-public"]},
    "authority": {"type": "object"},
    "scope": {
      "type": "object",
      "additionalProperties": false,
      "required": ["candidate_scan_schema", "corpus", "files_considered", "files_scanned", "files_skipped", "skipped_files_reviewed_by"],
      "properties": {
        "candidate_scan_schema": {"const": "edpol-editorial-candidate-scan-v3"},
        "corpus": {"type": ["object", "null"]},
        "files_considered": {"type": "integer", "minimum": 0},
        "files_scanned": {"type": "integer", "minimum": 0},
        "files_skipped": {"type": "integer", "minimum": 0},
        "skipped_files_reviewed_by": {"type": ["string", "null"]}
      }
    },
    "lenses": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": ["id", "status", "reason", "evidence"],
        "properties": {
          "id": {"enum": ["copy-localization", "evidence-provenance", "policy-risk", "rendered-experience", "ai-origin"]},
          "status": {"enum": ["checked", "skipped", "blocked", "needs-human"]},
          "reason": {"type": ["string", "null"]},
          "evidence": {"type": "array", "items": {"type": "string", "minLength": 1}}
        }
      }
    },
    "findings": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": ["id", "file", "line", "finding_class", "severity", "rule_id", "decision"],
        "properties": {
          "id": {"type": "string", "pattern": "^EDPOL-[A-F0-9]{12}$"},
          "file": {"type": "string"},
          "line": {"type": "integer", "minimum": 1},
          "finding_class": {"type": "string"},
          "severity": {"type": "string"},
          "rule_id": {"type": "string"},
          "decision": {
            "type": "object",
            "additionalProperties": false,
            "required": ["status", "reason", "reviewer"],
            "properties": {
              "status": {"enum": ["accepted", "false-positive", "fixed", "exception-approved", "blocked", "needs-human"]},
              "reason": {"type": ["string", "null"]},
              "reviewer": {"type": ["string", "null"]}
            }
          }
        }
      }
    },
    "review_feedback": {
      "type": "object",
      "additionalProperties": false,
      "required": ["accepted", "false_positive", "fixed", "exception_approved", "blocked", "needs_human"],
      "properties": {
        "accepted": {"type": "integer", "minimum": 0},
        "false_positive": {"type": "integer", "minimum": 0},
        "fixed": {"type": "integer", "minimum": 0},
        "exception_approved": {"type": "integer", "minimum": 0},
        "blocked": {"type": "integer", "minimum": 0},
        "needs_human": {"type": "integer", "minimum": 0}
      }
    },
    "evidence_layers": {
      "type": "object",
      "additionalProperties": false,
      "required": ["source", "local", "runtime", "public"],
      "properties": {
        "source": {"$ref": "#/$defs/evidenceLayer"},
        "local": {"$ref": "#/$defs/evidenceLayer"},
        "runtime": {"$ref": "#/$defs/evidenceLayer"},
        "public": {"$ref": "#/$defs/evidenceLayer"}
      }
    },
    "verdict": {"enum": ["pass", "needs-rewrite", "blocked"]},
    "decision_owner": {"type": "string", "minLength": 1},
    "next_action": {"type": "string", "minLength": 1}
  },
  "$defs": {
    "evidenceLayer": {
      "type": "object",
      "additionalProperties": false,
      "required": ["status", "items"],
      "properties": {
        "status": {"enum": ["provided", "not-provided"]},
        "items": {"type": "array", "items": {"type": "string", "minLength": 1}}
      }
    }
  }
}
