{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://decantr.ai/schemas/project-audit-report.v1.json",
  "title": "Decantr Project Audit Report",
  "type": "object",
  "required": ["$schema", "projectRoot", "valid", "essence", "reviewPack", "packManifest", "runtimeAudit", "findings", "summary"],
  "properties": {
    "$schema": {
      "const": "https://decantr.ai/schemas/project-audit-report.v1.json"
    },
    "projectRoot": {
      "$ref": "https://decantr.ai/schemas/verification-report.common.v1.json#/$defs/nonEmptyString"
    },
    "valid": {
      "type": "boolean"
    },
    "essence": {
      "anyOf": [
        {
          "$ref": "https://decantr.ai/schemas/essence.v2.json"
        },
        {
          "$ref": "https://decantr.ai/schemas/essence.v3.json"
        },
        {
          "type": "null"
        }
      ]
    },
    "reviewPack": {
      "anyOf": [
        {
          "$ref": "https://decantr.ai/schemas/review-pack.v1.json"
        },
        {
          "type": "null"
        }
      ]
    },
    "packManifest": {
      "anyOf": [
        {
          "$ref": "https://decantr.ai/schemas/pack-manifest.v1.json"
        },
        {
          "type": "null"
        }
      ]
    },
    "runtimeAudit": {
      "type": "object",
      "required": [
        "distPresent",
        "indexPresent",
        "checked",
        "passed",
        "rootDocumentOk",
        "titleOk",
        "langOk",
        "viewportOk",
        "charsetOk",
        "cspSignalOk",
        "inlineScriptCount",
        "inlineEventHandlerCount",
        "externalScriptsWithoutIntegrityCount",
        "externalScriptsWithIntegrityMissingCrossoriginCount",
        "externalStylesheetsWithoutIntegrityCount",
        "externalStylesheetsWithIntegrityMissingCrossoriginCount",
        "externalScriptsWithInsecureTransportCount",
        "externalStylesheetsWithInsecureTransportCount",
        "externalMediaSourcesWithInsecureTransportCount",
        "externalBlankLinksWithoutRelCount",
        "externalIframesWithoutSandboxCount",
        "externalIframesWithInsecureTransportCount",
        "jsEvalSignalCount",
        "jsHtmlInjectionSignalCount",
        "jsInsecureTransportSignalCount",
        "jsSecretSignalCount",
        "assetCount",
        "assetsPassed",
        "routeHintsChecked",
        "routeHintsMatched",
        "routeHintsCoverageOk",
        "routeDocumentsChecked",
        "routeDocumentsPassed",
        "routeDocumentsHardenedCount",
        "routeDocumentsCoverageOk",
        "routeDocumentsHardeningOk",
        "fullRouteCoverageOk",
        "totalAssetBytes",
        "jsAssetBytes",
        "cssAssetBytes",
        "largestAssetPath",
        "largestAssetBytes",
        "failures"
      ],
      "properties": {
        "distPresent": {
          "type": "boolean"
        },
        "indexPresent": {
          "type": "boolean"
        },
        "checked": {
          "type": "boolean"
        },
        "passed": {
          "type": ["boolean", "null"]
        },
        "rootDocumentOk": {
          "type": "boolean"
        },
        "titleOk": {
          "type": "boolean"
        },
        "langOk": {
          "type": "boolean"
        },
        "viewportOk": {
          "type": "boolean"
        },
        "charsetOk": {
          "type": "boolean"
        },
        "cspSignalOk": {
          "type": "boolean"
        },
        "inlineScriptCount": {
          "type": "integer",
          "minimum": 0
        },
        "inlineEventHandlerCount": {
          "type": "integer",
          "minimum": 0
        },
        "externalScriptsWithoutIntegrityCount": {
          "type": "integer",
          "minimum": 0
        },
        "externalScriptsWithIntegrityMissingCrossoriginCount": {
          "type": "integer",
          "minimum": 0
        },
        "externalStylesheetsWithoutIntegrityCount": {
          "type": "integer",
          "minimum": 0
        },
        "externalStylesheetsWithIntegrityMissingCrossoriginCount": {
          "type": "integer",
          "minimum": 0
        },
        "externalScriptsWithInsecureTransportCount": {
          "type": "integer",
          "minimum": 0
        },
        "externalStylesheetsWithInsecureTransportCount": {
          "type": "integer",
          "minimum": 0
        },
        "externalMediaSourcesWithInsecureTransportCount": {
          "type": "integer",
          "minimum": 0
        },
        "externalBlankLinksWithoutRelCount": {
          "type": "integer",
          "minimum": 0
        },
        "externalIframesWithoutSandboxCount": {
          "type": "integer",
          "minimum": 0
        },
        "externalIframesWithInsecureTransportCount": {
          "type": "integer",
          "minimum": 0
        },
        "jsEvalSignalCount": {
          "type": "integer",
          "minimum": 0
        },
        "jsHtmlInjectionSignalCount": {
          "type": "integer",
          "minimum": 0
        },
        "jsInsecureTransportSignalCount": {
          "type": "integer",
          "minimum": 0
        },
        "jsSecretSignalCount": {
          "type": "integer",
          "minimum": 0
        },
        "assetCount": {
          "type": "integer",
          "minimum": 0
        },
        "assetsPassed": {
          "type": "integer",
          "minimum": 0
        },
        "routeHintsChecked": {
          "type": "array",
          "items": {
            "$ref": "https://decantr.ai/schemas/verification-report.common.v1.json#/$defs/nonEmptyString"
          }
        },
        "routeHintsMatched": {
          "type": "integer",
          "minimum": 0
        },
        "routeHintsCoverageOk": {
          "type": "boolean"
        },
        "routeDocumentsChecked": {
          "type": "integer",
          "minimum": 0
        },
        "routeDocumentsPassed": {
          "type": "integer",
          "minimum": 0
        },
        "routeDocumentsHardenedCount": {
          "type": "integer",
          "minimum": 0
        },
        "routeDocumentsCoverageOk": {
          "type": "boolean"
        },
        "routeDocumentsHardeningOk": {
          "type": "boolean"
        },
        "fullRouteCoverageOk": {
          "type": "boolean"
        },
        "totalAssetBytes": {
          "type": "integer",
          "minimum": 0
        },
        "jsAssetBytes": {
          "type": "integer",
          "minimum": 0
        },
        "cssAssetBytes": {
          "type": "integer",
          "minimum": 0
        },
        "largestAssetPath": {
          "type": ["string", "null"]
        },
        "largestAssetBytes": {
          "type": "integer",
          "minimum": 0
        },
        "failures": {
          "type": "array",
          "items": {
            "$ref": "https://decantr.ai/schemas/verification-report.common.v1.json#/$defs/nonEmptyString"
          }
        }
      },
      "additionalProperties": false
    },
    "findings": {
      "type": "array",
      "items": {
        "$ref": "https://decantr.ai/schemas/verification-report.common.v1.json#/$defs/verificationFinding"
      }
    },
    "summary": {
      "type": "object",
      "required": ["errorCount", "warnCount", "infoCount", "essenceVersion", "reviewPackPresent", "packManifestPresent", "runtimeAuditChecked", "runtimePassed", "pageCount"],
      "properties": {
        "errorCount": {
          "type": "integer",
          "minimum": 0
        },
        "warnCount": {
          "type": "integer",
          "minimum": 0
        },
        "infoCount": {
          "type": "integer",
          "minimum": 0
        },
        "essenceVersion": {
          "type": ["string", "null"]
        },
        "reviewPackPresent": {
          "type": "boolean"
        },
        "packManifestPresent": {
          "type": "boolean"
        },
        "runtimeAuditChecked": {
          "type": "boolean"
        },
        "runtimePassed": {
          "type": ["boolean", "null"]
        },
        "pageCount": {
          "type": "integer",
          "minimum": 0
        }
      },
      "additionalProperties": false
    }
  },
  "additionalProperties": false
}
