{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://platoskallipolis.com/schemas/revalidation-lineage-ledger.v1.json",
  "title": "Plato's Kallipolis revalidation lineage ledger",
  "type": "object",
  "additionalProperties": false,
  "required": ["schema", "state", "snapshotAt", "input", "counts", "states", "continuity", "executionBoundary", "privacy"],
  "properties": {
    "schema": { "const": "kallipolis.revalidation-lineage-ledger.v1" },
    "state": { "const": "verified-local-audit-evidence" },
    "snapshotAt": { "type": "string", "format": "date-time" },
    "input": { "$ref": "#/$defs/artifactReference" },
    "counts": {
      "type": "object",
      "additionalProperties": false,
      "required": ["readinessStates", "artifactsVerified", "exactBindingsByState", "totalExecutedBindings", "totalNetworkCalls", "productionPromotionEligible", "lifecycleChangesApplied"],
      "properties": {
        "readinessStates": { "const": 3 },
        "artifactsVerified": { "const": 12 },
        "exactBindingsByState": { "const": [244, 335, 336] },
        "totalExecutedBindings": { "const": 0 },
        "totalNetworkCalls": { "const": 0 },
        "productionPromotionEligible": { "const": 0 },
        "lifecycleChangesApplied": { "const": 0 }
      }
    },
    "states": {
      "type": "array",
      "minItems": 3,
      "maxItems": 3,
      "items": { "$ref": "#/$defs/readinessState" }
    },
    "continuity": {
      "type": "object",
      "additionalProperties": false,
      "required": ["stateOrder", "transitionsAdditiveOnly", "addedBindings", "removedBindings", "crossStateSubstitutionAccepted"],
      "properties": {
        "stateOrder": { "const": ["recovery-aware-244", "first-100-merged-335", "complete-state-336"] },
        "transitionsAdditiveOnly": { "const": true },
        "addedBindings": { "const": [91, 1] },
        "removedBindings": { "const": [0, 0] },
        "crossStateSubstitutionAccepted": { "const": false }
      }
    },
    "executionBoundary": { "$ref": "#/$defs/executionBoundary" },
    "privacy": { "$ref": "#/$defs/privacy" }
  },
  "$defs": {
    "digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
    "artifactReference": {
      "type": "object",
      "additionalProperties": false,
      "required": ["path", "rawHash"],
      "properties": {
        "path": { "type": "string", "minLength": 1 },
        "rawHash": { "$ref": "#/$defs/digest" }
      }
    },
    "artifact": {
      "type": "object",
      "additionalProperties": false,
      "required": ["role", "path", "rawHash", "canonicalHash", "schema", "state", "snapshotAt"],
      "properties": {
        "role": { "enum": ["readiness", "schedule", "revalidation-queue", "execution-manifest"] },
        "path": { "type": "string", "pattern": "^ops/evidence/[A-Za-z0-9._/-]+\\.json$" },
        "rawHash": { "$ref": "#/$defs/digest" },
        "canonicalHash": { "$ref": "#/$defs/digest" },
        "schema": { "type": "string", "minLength": 1 },
        "state": { "type": "string", "minLength": 1 },
        "snapshotAt": { "type": "string", "format": "date-time" }
      }
    },
    "readinessState": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "counts", "exactBindingSetHash", "queueBindingSetHash", "artifacts", "lineage", "transitionFromPrevious"],
      "properties": {
        "id": { "enum": ["recovery-aware-244", "first-100-merged-335", "complete-state-336"] },
        "counts": {
          "type": "object",
          "additionalProperties": false,
          "required": ["exactBindings", "expiryGroups", "executionBatches"],
          "properties": {
            "exactBindings": { "enum": [244, 335, 336] },
            "expiryGroups": { "enum": [11, 16] },
            "executionBatches": { "enum": [15, 20] }
          }
        },
        "exactBindingSetHash": { "$ref": "#/$defs/digest" },
        "queueBindingSetHash": { "$ref": "#/$defs/digest" },
        "artifacts": { "type": "array", "minItems": 4, "maxItems": 4, "items": { "$ref": "#/$defs/artifact" } },
        "lineage": {
          "type": "object",
          "additionalProperties": false,
          "required": ["rawAndCanonicalSourceHashesVerified", "allExactBindingSetsEqual", "chronologyVerified"],
          "properties": {
            "rawAndCanonicalSourceHashesVerified": { "const": true },
            "allExactBindingSetsEqual": { "const": true },
            "chronologyVerified": { "const": true }
          }
        },
        "transitionFromPrevious": {
          "type": "object",
          "additionalProperties": false,
          "required": ["addedBindings", "removedBindings", "additiveOnly", "addedBindingSetHash"],
          "properties": {
            "addedBindings": { "type": "integer", "minimum": 1 },
            "removedBindings": { "const": 0 },
            "additiveOnly": { "type": ["boolean", "null"] },
            "addedBindingSetHash": { "anyOf": [{ "$ref": "#/$defs/digest" }, { "type": "null" }] }
          }
        }
      }
    },
    "executionBoundary": {
      "type": "object",
      "additionalProperties": false,
      "required": ["sourceResolutionPerformed", "networkCodePathPresent", "approvalRequestCreated", "deploymentApprovalObtained", "productionMetricPublicationApproved", "walletWrites", "niulaiTransactions"],
      "properties": {
        "sourceResolutionPerformed": { "const": false },
        "networkCodePathPresent": { "const": false },
        "approvalRequestCreated": { "const": false },
        "deploymentApprovalObtained": { "const": false },
        "productionMetricPublicationApproved": { "const": false },
        "walletWrites": { "const": 0 },
        "niulaiTransactions": { "const": 0 }
      }
    },
    "privacy": {
      "type": "object",
      "additionalProperties": false,
      "required": ["sourceBodiesStored", "ownerOrReviewerIdentityStored", "userOrAgentActivityStored", "requestOrResponseBodiesStored", "credentialsStored", "walletDataStored"],
      "properties": {
        "sourceBodiesStored": { "const": false },
        "ownerOrReviewerIdentityStored": { "const": false },
        "userOrAgentActivityStored": { "const": false },
        "requestOrResponseBodiesStored": { "const": false },
        "credentialsStored": { "const": false },
        "walletDataStored": { "const": false }
      }
    }
  }
}
