{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://hogarmas.net/content-credentials/collection-baseline-diff-schema.json",
  "title": "H/M Content Credentials Collection Baseline Diff",
  "description": "A privacy-controlled, checksum-bound comparison of two independently verified H/M Collection Evidence Packages. It compares compact package observations by source SHA-256 multiset and does not re-hash detached source files.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema",
    "ruleset",
    "baseline",
    "current",
    "comparison",
    "summary",
    "changed",
    "added",
    "removed",
    "unresolvedBaseline",
    "unresolvedCurrent",
    "privacy",
    "limitations",
    "integrity"
  ],
  "properties": {
    "schema": {
      "const": "hm.content-credentials-collection-baseline-diff.v1"
    },
    "ruleset": {
      "const": "2026-07-29.1"
    },
    "baseline": {
      "$ref": "#/$defs/packageReference"
    },
    "current": {
      "$ref": "#/$defs/packageReference"
    },
    "comparison": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "matchKey",
        "observationFields",
        "identifierMode",
        "sameObservationRuleset",
        "orderCompared"
      ],
      "properties": {
        "matchKey": {
          "const": "source-sha256-multiset"
        },
        "observationFields": {
          "type": "array",
          "minItems": 10,
          "maxItems": 10,
          "items": {
            "enum": [
              "mimeType",
              "sizeBytes",
              "status",
              "errorCode",
              "manifestPresent",
              "manifestCount",
              "integrity",
              "signerTrust",
              "aiOrigin",
              "validationFailureCount"
            ]
          }
        },
        "identifierMode": {
          "enum": [
            "minimized",
            "internal"
          ]
        },
        "sameObservationRuleset": {
          "type": "boolean"
        },
        "orderCompared": {
          "const": false
        }
      }
    },
    "summary": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "baselineProcessed",
        "currentProcessed",
        "matchableBaseline",
        "matchableCurrent",
        "matchedOccurrences",
        "unchangedOccurrences",
        "changedOccurrences",
        "addedOccurrences",
        "removedOccurrences",
        "unresolvedBaseline",
        "unresolvedCurrent",
        "duplicateHashOccurrencesBaseline",
        "duplicateHashOccurrencesCurrent"
      ],
      "properties": {
        "baselineProcessed": {
          "$ref": "#/$defs/count"
        },
        "currentProcessed": {
          "$ref": "#/$defs/count"
        },
        "matchableBaseline": {
          "$ref": "#/$defs/count"
        },
        "matchableCurrent": {
          "$ref": "#/$defs/count"
        },
        "matchedOccurrences": {
          "$ref": "#/$defs/count"
        },
        "unchangedOccurrences": {
          "$ref": "#/$defs/count"
        },
        "changedOccurrences": {
          "$ref": "#/$defs/count"
        },
        "addedOccurrences": {
          "$ref": "#/$defs/count"
        },
        "removedOccurrences": {
          "$ref": "#/$defs/count"
        },
        "unresolvedBaseline": {
          "$ref": "#/$defs/count"
        },
        "unresolvedCurrent": {
          "$ref": "#/$defs/count"
        },
        "duplicateHashOccurrencesBaseline": {
          "$ref": "#/$defs/count"
        },
        "duplicateHashOccurrencesCurrent": {
          "$ref": "#/$defs/count"
        }
      }
    },
    "changed": {
      "type": "array",
      "maxItems": 2000,
      "items": {
        "$ref": "#/$defs/changedOccurrence"
      }
    },
    "added": {
      "type": "array",
      "maxItems": 2000,
      "items": {
        "$ref": "#/$defs/addedOccurrence"
      }
    },
    "removed": {
      "type": "array",
      "maxItems": 2000,
      "items": {
        "$ref": "#/$defs/removedOccurrence"
      }
    },
    "unresolvedBaseline": {
      "type": "array",
      "maxItems": 2000,
      "items": {
        "$ref": "#/$defs/unresolvedBaseline"
      }
    },
    "unresolvedCurrent": {
      "type": "array",
      "maxItems": 2000,
      "items": {
        "$ref": "#/$defs/unresolvedCurrent"
      }
    },
    "privacy": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "processedLocally",
        "packagesUploaded",
        "browserStorageUsed",
        "sourceFileNamesIncluded",
        "sourceHashesIncluded",
        "sourceFilesIncluded",
        "fullPerFileReportsIncluded"
      ],
      "properties": {
        "processedLocally": {
          "const": true
        },
        "packagesUploaded": {
          "const": false
        },
        "browserStorageUsed": {
          "const": false
        },
        "sourceFileNamesIncluded": {
          "type": "boolean"
        },
        "sourceHashesIncluded": {
          "const": true
        },
        "sourceFilesIncluded": {
          "const": false
        },
        "fullPerFileReportsIncluded": {
          "const": false
        }
      }
    },
    "limitations": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "packageSelfConsistencyVerified",
        "detachedSourceFilesRehashed",
        "officialC2paCollectionDataHash",
        "collectionCompletenessVerified",
        "changeCauseIdentified",
        "actorAttributed",
        "semanticTruthProven",
        "authorshipProven",
        "aiAbsenceProven",
        "legalComplianceCertified",
        "packageExporterAuthenticated",
        "duplicateHashOccurrenceIdentityProven",
        "unhashableEntriesMatched",
        "maliciousRepackPrevented"
      ],
      "properties": {
        "packageSelfConsistencyVerified": {
          "const": true
        },
        "detachedSourceFilesRehashed": {
          "const": false
        },
        "officialC2paCollectionDataHash": {
          "const": false
        },
        "collectionCompletenessVerified": {
          "const": false
        },
        "changeCauseIdentified": {
          "const": false
        },
        "actorAttributed": {
          "const": false
        },
        "semanticTruthProven": {
          "const": false
        },
        "authorshipProven": {
          "const": false
        },
        "aiAbsenceProven": {
          "const": false
        },
        "legalComplianceCertified": {
          "const": false
        },
        "packageExporterAuthenticated": {
          "const": false
        },
        "duplicateHashOccurrenceIdentityProven": {
          "const": false
        },
        "unhashableEntriesMatched": {
          "const": false
        },
        "maliciousRepackPrevented": {
          "const": false
        }
      }
    },
    "integrity": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "algorithm",
        "digest",
        "cryptographicallySigned",
        "exporterIdentityAuthenticated"
      ],
      "properties": {
        "algorithm": {
          "const": "SHA-256"
        },
        "digest": {
          "$ref": "#/$defs/digest"
        },
        "cryptographicallySigned": {
          "const": false
        },
        "exporterIdentityAuthenticated": {
          "const": false
        }
      }
    }
  },
  "$defs": {
    "digest": {
      "type": "string",
      "pattern": "^sha256:[a-f0-9]{64}$"
    },
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 4000
    },
    "packageReference": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "packageId",
        "profile",
        "profileVersion",
        "indexDigest",
        "identifierMode",
        "sourceBatchRuleset",
        "selectedFiles",
        "processedFiles",
        "completedFiles",
        "errorFiles"
      ],
      "properties": {
        "packageId": {
          "type": "string",
          "pattern": "^urn:hm:content-credentials-collection:[a-f0-9]{64}$"
        },
        "profile": {
          "const": "hm.content-credentials-collection-package.v1"
        },
        "profileVersion": {
          "const": "1.0.0"
        },
        "indexDigest": {
          "$ref": "#/$defs/digest"
        },
        "identifierMode": {
          "enum": [
            "minimized",
            "internal"
          ]
        },
        "sourceBatchRuleset": {
          "type": "string",
          "maxLength": 80
        },
        "selectedFiles": {
          "$ref": "#/$defs/count"
        },
        "processedFiles": {
          "$ref": "#/$defs/count"
        },
        "completedFiles": {
          "$ref": "#/$defs/count"
        },
        "errorFiles": {
          "$ref": "#/$defs/count"
        }
      }
    },
    "entryReference": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "assetId",
        "identifier"
      ],
      "properties": {
        "assetId": {
          "type": "string",
          "pattern": "^asset-[0-9]{4}$"
        },
        "identifier": {
          "type": "string",
          "maxLength": 340
        },
        "mimeType": {
          "type": "string",
          "maxLength": 120
        },
        "sizeBytes": {
          "type": "integer",
          "minimum": 0
        },
        "status": {
          "enum": [
            "complete",
            "error"
          ]
        },
        "errorCode": {
          "type": "string",
          "maxLength": 32
        },
        "manifestPresent": {
          "type": "boolean"
        },
        "manifestCount": {
          "type": "integer",
          "minimum": 0
        },
        "integrity": {
          "type": "string",
          "maxLength": 40
        },
        "signerTrust": {
          "type": "string",
          "maxLength": 40
        },
        "aiOrigin": {
          "type": "string",
          "maxLength": 40
        },
        "validationFailureCount": {
          "type": "integer",
          "minimum": 0
        }
      }
    },
    "changedOccurrence": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "sourceId",
        "sourceSha256",
        "occurrence",
        "baseline",
        "current",
        "changedFields"
      ],
      "properties": {
        "sourceId": {
          "type": "string",
          "pattern": "^source-[a-f0-9]{16}-[0-9]{4}$"
        },
        "sourceSha256": {
          "$ref": "#/$defs/digest"
        },
        "occurrence": {
          "type": "integer",
          "minimum": 1,
          "maximum": 2000
        },
        "baseline": {
          "$ref": "#/$defs/entryReference"
        },
        "current": {
          "$ref": "#/$defs/entryReference"
        },
        "changedFields": {
          "type": "array",
          "minItems": 1,
          "maxItems": 10,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "field",
              "before",
              "after"
            ],
            "properties": {
              "field": {
                "type": "string"
              },
              "before": {},
              "after": {}
            }
          }
        }
      }
    },
    "addedOccurrence": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "sourceId",
        "sourceSha256",
        "current"
      ],
      "properties": {
        "sourceId": {
          "type": "string"
        },
        "sourceSha256": {
          "$ref": "#/$defs/digest"
        },
        "current": {
          "$ref": "#/$defs/entryReference"
        }
      }
    },
    "removedOccurrence": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "sourceId",
        "sourceSha256",
        "baseline"
      ],
      "properties": {
        "sourceId": {
          "type": "string"
        },
        "sourceSha256": {
          "$ref": "#/$defs/digest"
        },
        "baseline": {
          "$ref": "#/$defs/entryReference"
        }
      }
    },
    "unresolvedBaseline": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "sourceId",
        "baseline"
      ],
      "properties": {
        "sourceId": {
          "type": "string"
        },
        "baseline": {
          "$ref": "#/$defs/entryReference"
        }
      }
    },
    "unresolvedCurrent": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "sourceId",
        "current"
      ],
      "properties": {
        "sourceId": {
          "type": "string"
        },
        "current": {
          "$ref": "#/$defs/entryReference"
        }
      }
    }
  }
}
