{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://platoskallipolis.com/schemas/readiness-revalidation-dry-run-matrix.v1.json",
  "title": "Plato's Kallipolis readiness revalidation dry-run matrix",
  "type": "object",
  "additionalProperties": false,
  "required": ["schema", "state", "manifestSnapshotAt", "manifest", "ordering", "counts", "batches", "executionBoundary", "privacy"],
  "properties": {
    "schema": { "const": "kallipolis.readiness-revalidation-dry-run-matrix.v1" },
    "state": { "const": "dry-run-planned-not-executed" },
    "manifestSnapshotAt": { "type": "string", "format": "date-time" },
    "manifest": { "$ref": "#/$defs/manifestReference" },
    "ordering": { "const": ["global-batch-ordinal-ascending", "binding-order-preserved"] },
    "counts": { "$ref": "#/$defs/counts" },
    "batches": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/batch" } },
    "executionBoundary": { "$ref": "#/$defs/executionBoundary" },
    "privacy": { "$ref": "#/$defs/privacy" }
  },
  "$defs": {
    "digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
    "manifestReference": {
      "type": "object",
      "additionalProperties": false,
      "required": ["path", "rawHash", "schema", "state", "exactBindingSetHash", "selectedExactBindings", "expiryGroups", "executionBatches"],
      "properties": {
        "path": { "type": "string", "pattern": "^ops/evidence/[A-Za-z0-9._/-]+\\.json$" },
        "rawHash": { "$ref": "#/$defs/digest" },
        "schema": { "const": "kallipolis.readiness-revalidation-execution-manifest.v1" },
        "state": { "const": "planned-not-executed" },
        "exactBindingSetHash": { "$ref": "#/$defs/digest" },
        "selectedExactBindings": { "type": "integer", "minimum": 1 },
        "expiryGroups": { "type": "integer", "minimum": 1 },
        "executionBatches": { "type": "integer", "minimum": 1 }
      }
    },
    "counts": {
      "type": "object",
      "additionalProperties": false,
      "required": ["selectedBatches", "plannedBindings", "uniqueBindings", "duplicateBindings", "uncoveredBindings", "executedBindings", "networkCallsMade", "productionPromotionEligible", "lifecycleChangesApplied"],
      "properties": {
        "selectedBatches": { "type": "integer", "minimum": 1 },
        "plannedBindings": { "type": "integer", "minimum": 1 },
        "uniqueBindings": { "type": "integer", "minimum": 1 },
        "duplicateBindings": { "const": 0 },
        "uncoveredBindings": { "const": 0 },
        "executedBindings": { "const": 0 },
        "networkCallsMade": { "const": 0 },
        "productionPromotionEligible": { "const": 0 },
        "lifecycleChangesApplied": { "const": 0 }
      }
    },
    "binding": {
      "type": "object",
      "additionalProperties": false,
      "required": ["resourceId", "version", "contentHash", "category"],
      "properties": {
        "resourceId": { "type": "string", "minLength": 1 },
        "version": { "type": "string", "minLength": 1 },
        "contentHash": { "$ref": "#/$defs/digest" },
        "category": { "type": "string", "minLength": 1 }
      }
    },
    "batch": {
      "type": "object",
      "additionalProperties": false,
      "required": ["batchId", "globalBatchOrdinal", "groupId", "groupOrdinal", "groupBatchOrdinal", "revalidationWindowOpensAtInclusive", "expiryAtExclusive", "bindingCount", "bindingSetHash", "bindings"],
      "properties": {
        "batchId": { "type": "string", "pattern": "^revalidate-[0-9]{2}$" },
        "globalBatchOrdinal": { "type": "integer", "minimum": 0 },
        "groupId": { "type": "string", "pattern": "^expiry-[0-9]{2}$" },
        "groupOrdinal": { "type": "integer", "minimum": 0 },
        "groupBatchOrdinal": { "type": "integer", "minimum": 0 },
        "revalidationWindowOpensAtInclusive": { "type": "string", "format": "date-time" },
        "expiryAtExclusive": { "type": "string", "format": "date-time" },
        "bindingCount": { "type": "integer", "minimum": 1, "maximum": 25 },
        "bindingSetHash": { "$ref": "#/$defs/digest" },
        "bindings": { "type": "array", "minItems": 1, "maxItems": 25, "items": { "$ref": "#/$defs/binding" } }
      }
    },
    "executionBoundary": {
      "type": "object",
      "additionalProperties": false,
      "required": ["mode", "manifestRawHashVerified", "completeManifestValidatedForEveryBatch", "sourceResolutionPerformed", "sourceBodiesStored", "automaticRetryAllowed", "approvalRequestCreated", "deploymentApprovalObtained", "productionImplementationApproved", "productionMetricPublicationApproved", "organicUseMetricEnabled", "verifiedReuseMetricEnabled", "walletWrites", "niulaiTransactions"],
      "properties": {
        "mode": { "const": "offline-dry-run-matrix" },
        "manifestRawHashVerified": { "const": true },
        "completeManifestValidatedForEveryBatch": { "const": true },
        "sourceResolutionPerformed": { "const": false },
        "sourceBodiesStored": { "const": false },
        "automaticRetryAllowed": { "const": false },
        "approvalRequestCreated": { "const": false },
        "deploymentApprovalObtained": { "const": false },
        "productionImplementationApproved": { "const": false },
        "productionMetricPublicationApproved": { "const": false },
        "organicUseMetricEnabled": { "const": false },
        "verifiedReuseMetricEnabled": { "const": false },
        "walletWrites": { "const": 0 },
        "niulaiTransactions": { "const": 0 }
      }
    },
    "privacy": {
      "type": "object",
      "additionalProperties": false,
      "required": ["artifactPublished", "ownerOrReviewerIdentityStored", "userOrAgentActivityStored", "requestOrResponseBodiesStored", "credentialsStored", "walletDataStored"],
      "properties": {
        "artifactPublished": { "const": false },
        "ownerOrReviewerIdentityStored": { "const": false },
        "userOrAgentActivityStored": { "const": false },
        "requestOrResponseBodiesStored": { "const": false },
        "credentialsStored": { "const": false },
        "walletDataStored": { "const": false }
      }
    }
  }
}
