{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://backup-tool.invalid/contracts/repository/v1/manifest.schema.json", "title": "Backup Tool Manifest v1", "type": "object", "additionalProperties": false, "required": [ "format_version", "backup_id", "repository_id", "source_id", "job_id", "execution_id", "requested_mode", "effective_mode", "created_at", "source_consistency", "exclusion_policy", "entries", "aggregates", "encryption_key_id", "manifest_digest", "manifest_signature" ], "properties": { "format_version": {"const": 1}, "backup_id": {"$ref": "#/$defs/uuidv7"}, "repository_id": {"$ref": "#/$defs/uuidv7"}, "source_id": {"$ref": "#/$defs/uuidv7"}, "job_id": {"$ref": "#/$defs/uuidv7"}, "execution_id": {"$ref": "#/$defs/uuidv7"}, "requested_mode": {"enum": ["full", "incremental"]}, "effective_mode": {"enum": ["full", "incremental"]}, "created_at": {"type": "string", "format": "date-time", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]+)?Z$"}, "source_consistency": { "type": "object", "additionalProperties": false, "required": ["adapter", "captured_at", "evidence"], "properties": { "adapter": {"enum": ["local", "postgresql", "mysql"]}, "captured_at": {"type": "string", "format": "date-time", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]+)?Z$"}, "evidence": {"type": "object"} } }, "exclusion_policy": { "type": "object", "additionalProperties": false, "required": ["matcher", "version", "patterns"], "properties": { "matcher": {"const": "gitignore"}, "version": {"type": "integer", "minimum": 1}, "patterns": {"type": "array", "items": {"type": "string"}} } }, "entries": { "type": "array", "items": {"$ref": "#/$defs/entry"} }, "aggregates": { "type": "object", "additionalProperties": false, "required": ["entry_count", "logical_bytes", "stored_bytes"], "properties": { "entry_count": {"type": "integer", "minimum": 0}, "logical_bytes": {"type": "integer", "minimum": 0}, "stored_bytes": {"type": "integer", "minimum": 0} } }, "encryption_key_id": {"type": ["string", "null"]}, "manifest_digest": {"type": "string", "pattern": "^[0-9a-f]{64}$"}, "manifest_signature": { "type": "object", "additionalProperties": false, "required": ["algorithm", "key_id", "value"], "properties": { "algorithm": {"const": "ed25519"}, "key_id": {"type": "string", "minLength": 1}, "value": {"type": "string", "pattern": "^[0-9a-f]{128}$"} } } }, "$defs": { "uuidv7": { "type": "string", "format": "uuid", "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" }, "entry": { "type": "object", "additionalProperties": false, "required": ["path", "type", "size", "blob_digest", "mode", "mtime_ns", "link_target", "metadata_support"], "properties": { "path": {"type": "string", "minLength": 1, "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$"}, "type": {"enum": ["file", "directory", "symlink"]}, "size": {"type": "integer", "minimum": 0}, "blob_digest": {"type": ["string", "null"], "pattern": "^[0-9a-f]{64}$"}, "mode": {"type": ["integer", "null"], "minimum": 0}, "mtime_ns": {"type": ["integer", "null"], "minimum": 0}, "link_target": {"type": ["string", "null"]}, "metadata_support": {"type": "array", "items": {"type": "string"}, "uniqueItems": true} }, "allOf": [ { "if": {"properties": {"type": {"const": "file"}}}, "then": { "properties": { "blob_digest": {"type": "string", "pattern": "^[0-9a-f]{64}$"}, "link_target": {"type": "null"} } } }, { "if": {"properties": {"type": {"const": "directory"}}}, "then": { "properties": { "blob_digest": {"type": "null"}, "link_target": {"type": "null"}, "size": {"const": 0} } } }, { "if": {"properties": {"type": {"const": "symlink"}}}, "then": { "properties": { "blob_digest": {"type": "null"}, "link_target": { "type": "string", "minLength": 1, "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*\\\\).+$" }, "size": {"const": 0} } } } ] } } }