{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://docforge.local/schema/generation-diff-page-v1.json", "title": "DocForge bounded latest-generation diff page", "$defs": { "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, "generation": { "type": "object", "required": [ "revision", "source_hash", "node_count", "node_hash", "edge_count", "edge_hash", "index_schema_version" ], "properties": { "revision": { "type": "string", "minLength": 1 }, "source_hash": { "$ref": "#/$defs/sha256" }, "node_count": { "type": "integer", "minimum": 0 }, "node_hash": { "$ref": "#/$defs/sha256" }, "edge_count": { "type": "integer", "minimum": 0 }, "edge_hash": { "$ref": "#/$defs/sha256" }, "index_schema_version": { "type": "integer", "minimum": 1 } }, "additionalProperties": false }, "summary": { "type": "object", "required": [ "nodes_added", "nodes_removed", "nodes_changed", "edges_added", "edges_removed", "total_changes" ], "properties": { "nodes_added": { "type": "integer", "minimum": 0 }, "nodes_removed": { "type": "integer", "minimum": 0 }, "nodes_changed": { "type": "integer", "minimum": 0 }, "edges_added": { "type": "integer", "minimum": 0 }, "edges_removed": { "type": "integer", "minimum": 0 }, "total_changes": { "type": "integer", "minimum": 0 } }, "additionalProperties": false }, "node_item": { "type": "object", "required": [ "entity", "change", "node_id", "before_content_hash", "after_content_hash", "before_source_path", "after_source_path", "before_node_hash", "after_node_hash", "changed_fields", "item_hash" ], "properties": { "entity": { "const": "node" }, "change": { "enum": ["added", "removed", "changed"] }, "node_id": { "type": "string", "minLength": 1 }, "before_content_hash": { "oneOf": [{ "$ref": "#/$defs/sha256" }, { "type": "null" }] }, "after_content_hash": { "oneOf": [{ "$ref": "#/$defs/sha256" }, { "type": "null" }] }, "before_source_path": { "type": ["string", "null"] }, "after_source_path": { "type": ["string", "null"] }, "before_node_hash": { "oneOf": [{ "$ref": "#/$defs/sha256" }, { "type": "null" }] }, "after_node_hash": { "oneOf": [{ "$ref": "#/$defs/sha256" }, { "type": "null" }] }, "changed_fields": { "type": "array", "uniqueItems": true, "items": { "enum": [ "title", "family", "authority", "status", "tags", "summary", "content", "source_path", "source_anchor", "content_hash" ] } }, "item_hash": { "$ref": "#/$defs/sha256" } }, "allOf": [ { "if": { "properties": { "change": { "const": "added" } }, "required": ["change"] }, "then": { "properties": { "before_content_hash": { "type": "null" }, "before_source_path": { "type": "null" }, "before_node_hash": { "type": "null" }, "after_content_hash": { "$ref": "#/$defs/sha256" }, "after_source_path": { "type": "string", "minLength": 1 }, "after_node_hash": { "$ref": "#/$defs/sha256" }, "changed_fields": { "maxItems": 0 } } } }, { "if": { "properties": { "change": { "const": "removed" } }, "required": ["change"] }, "then": { "properties": { "before_content_hash": { "$ref": "#/$defs/sha256" }, "before_source_path": { "type": "string", "minLength": 1 }, "before_node_hash": { "$ref": "#/$defs/sha256" }, "after_content_hash": { "type": "null" }, "after_source_path": { "type": "null" }, "after_node_hash": { "type": "null" }, "changed_fields": { "maxItems": 0 } } } }, { "if": { "properties": { "change": { "const": "changed" } }, "required": ["change"] }, "then": { "properties": { "before_content_hash": { "$ref": "#/$defs/sha256" }, "before_source_path": { "type": "string", "minLength": 1 }, "before_node_hash": { "$ref": "#/$defs/sha256" }, "after_content_hash": { "$ref": "#/$defs/sha256" }, "after_source_path": { "type": "string", "minLength": 1 }, "after_node_hash": { "$ref": "#/$defs/sha256" }, "changed_fields": { "minItems": 1 } } } } ], "additionalProperties": false }, "edge_item": { "type": "object", "required": [ "entity", "change", "source_id", "relation", "target_id", "item_hash" ], "properties": { "entity": { "const": "edge" }, "change": { "enum": ["added", "removed"] }, "source_id": { "type": "string", "minLength": 1 }, "relation": { "type": "string", "minLength": 1 }, "target_id": { "type": "string", "minLength": 1 }, "item_hash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false }, "receipt_header": { "type": "object", "required": [ "schema_version", "diff_semantics_version", "project_id", "project_root_fingerprint", "adapter", "kind", "reason", "from_generation", "to_generation", "summary", "full_item_count", "retained_item_count", "details_truncated", "truncation_reason", "full_collection_hash", "retained_collection_hash", "index_signature", "stored_receipt_hash" ], "properties": { "schema_version": { "const": 1 }, "diff_semantics_version": { "const": 1 }, "project_id": { "type": "string", "minLength": 1 }, "project_root_fingerprint": { "type": "string", "pattern": "^[0-9a-f]{16}$" }, "adapter": { "type": "string", "minLength": 1 }, "kind": { "enum": ["baseline", "transition"] }, "reason": { "enum": [ null, "no_predecessor", "predecessor_unsafe", "predecessor_unsupported_schema", "predecessor_foreign", "predecessor_policy_incompatible", "predecessor_corrupt", "predecessor_unattested", "predecessor_changed", "no_meaningful_transition" ] }, "from_generation": { "oneOf": [{ "$ref": "#/$defs/generation" }, { "type": "null" }] }, "to_generation": { "$ref": "#/$defs/generation" }, "summary": { "$ref": "#/$defs/summary" }, "full_item_count": { "type": "integer", "minimum": 0 }, "retained_item_count": { "type": "integer", "minimum": 0, "maximum": 1000 }, "details_truncated": { "type": "boolean" }, "truncation_reason": { "enum": [null, "receipt_item_limit", "receipt_byte_limit"] }, "full_collection_hash": { "$ref": "#/$defs/sha256" }, "retained_collection_hash": { "$ref": "#/$defs/sha256" }, "index_signature": { "type": "object", "required": ["device", "inode", "size", "mtime_ns", "ctime_ns"], "properties": { "device": { "type": "integer", "minimum": 0 }, "inode": { "type": "integer", "minimum": 0 }, "size": { "type": "integer", "minimum": 0 }, "mtime_ns": { "type": "integer", "minimum": 0 }, "ctime_ns": { "type": "integer", "minimum": 0 } }, "additionalProperties": false }, "stored_receipt_hash": { "$ref": "#/$defs/sha256" } }, "allOf": [ { "if": { "properties": { "kind": { "const": "baseline" } }, "required": ["kind"] }, "then": { "properties": { "from_generation": { "type": "null" }, "reason": { "not": { "type": "null" } }, "summary": { "properties": { "nodes_added": { "const": 0 }, "nodes_removed": { "const": 0 }, "nodes_changed": { "const": 0 }, "edges_added": { "const": 0 }, "edges_removed": { "const": 0 }, "total_changes": { "const": 0 } } }, "full_item_count": { "const": 0 }, "retained_item_count": { "const": 0 }, "details_truncated": { "const": false }, "truncation_reason": { "const": null }, "full_collection_hash": { "const": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945" }, "retained_collection_hash": { "const": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945" } } }, "else": { "properties": { "from_generation": { "$ref": "#/$defs/generation" }, "reason": { "type": "null" } } } }, { "if": { "properties": { "truncation_reason": { "const": null } }, "required": ["truncation_reason"] }, "then": { "properties": { "details_truncated": { "const": false }, "full_item_count": { "maximum": 1000 } } } }, { "if": { "properties": { "truncation_reason": { "const": "receipt_item_limit" } }, "required": ["truncation_reason"] }, "then": { "properties": { "details_truncated": { "const": true }, "full_item_count": { "minimum": 1001 }, "retained_item_count": { "const": 1000 } } } }, { "if": { "properties": { "truncation_reason": { "const": "receipt_byte_limit" } }, "required": ["truncation_reason"] }, "then": { "properties": { "details_truncated": { "const": true } } } } ], "additionalProperties": false }, "page_body": { "type": "object", "required": [ "page_schema_version", "receipt_header", "items", "omissions", "page_hash" ], "properties": { "page_schema_version": { "const": 1 }, "receipt_header": { "$ref": "#/$defs/receipt_header" }, "items": { "type": "array", "maxItems": 1000, "items": { "oneOf": [ { "$ref": "#/$defs/node_item" }, { "$ref": "#/$defs/edge_item" } ] } }, "omissions": { "type": "array", "maxItems": 1, "items": { "type": "object", "required": ["code", "item_hash"], "properties": { "code": { "const": "response_limit" }, "item_hash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false } }, "page_hash": { "$ref": "#/$defs/sha256" } }, "additionalProperties": false }, "pagination": { "type": "object", "required": [ "schema_version", "kind", "returned_count", "limit", "total_count", "has_more", "next_cursor" ], "properties": { "schema_version": { "const": 1 }, "kind": { "const": "generation-diff.items" }, "returned_count": { "type": "integer", "minimum": 0 }, "limit": { "type": "integer", "minimum": 1, "maximum": 1000 }, "total_count": { "type": "integer", "minimum": 0, "maximum": 1000 }, "has_more": { "type": "boolean" }, "next_cursor": { "type": ["string", "null"], "minLength": 1, "maxLength": 8192 } }, "allOf": [ { "if": { "properties": { "has_more": { "const": true } }, "required": ["has_more"] }, "then": { "properties": { "next_cursor": { "type": "string", "minLength": 1 } } }, "else": { "properties": { "next_cursor": { "type": "null" } } } } ], "additionalProperties": false } }, "type": "object", "required": ["generation_diff", "pagination"], "properties": { "generation_diff": { "$ref": "#/$defs/page_body" }, "pagination": { "$ref": "#/$defs/pagination" } }, "additionalProperties": false }