{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://example.invalid/techviz/vizspec-1.0.schema.json", "title": "TechViz Grounded Visualization Specification", "type": "object", "required": [ "version", "id", "title", "question", "type", "direction", "summary", "alt", "long_description", "source_context", "nodes", "edges" ], "additionalProperties": false, "properties": { "version": { "const": "1.0" }, "id": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_.-]*$" }, "title": { "type": "string", "minLength": 1 }, "question": { "type": "string", "minLength": 1 }, "type": { "enum": [ "context", "architecture", "container", "component", "deployment", "data-flow", "sequence", "flow", "state", "network", "erd", "dependency", "concept" ] }, "direction": { "enum": [ "LR", "RL", "TB", "BT" ] }, "audience": { "type": "array", "items": { "type": "string" } }, "summary": { "type": "string", "minLength": 1 }, "alt": { "type": "string", "minLength": 1 }, "long_description": { "type": "string", "minLength": 1 }, "source_context": { "type": "object", "required": [ "document", "document_sha256", "anchor" ], "additionalProperties": true, "properties": { "document": { "type": "string" }, "document_sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "anchor": { "type": "object", "required": [ "kind", "value", "line" ], "additionalProperties": true, "properties": { "kind": { "enum": [ "marker", "heading", "line" ] }, "value": {}, "line": { "type": "integer", "minimum": 1 } } } } }, "groups": { "type": "array", "items": { "type": "object", "required": [ "id", "label", "evidence", "assumption" ], "additionalProperties": false, "properties": { "id": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_.-]*$" }, "label": { "type": "string", "minLength": 1 }, "kind": { "type": "string" }, "parent": { "type": "string" }, "description": { "type": "string" }, "evidence": { "$ref": "#/$defs/evidenceArray" }, "assumption": { "type": "boolean" } }, "allOf": [ { "if": { "properties": { "assumption": { "const": true } }, "required": [ "assumption" ] }, "then": { "properties": { "evidence": { "maxItems": 0 } } } } ] } }, "nodes": { "type": "array", "minItems": 1, "items": { "type": "object", "required": [ "id", "label", "kind", "evidence", "assumption" ], "additionalProperties": false, "properties": { "id": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_.-]*$" }, "label": { "type": "string", "minLength": 1 }, "kind": { "type": "string" }, "group": { "type": "string" }, "description": { "type": "string" }, "evidence": { "$ref": "#/$defs/evidenceArray" }, "assumption": { "type": "boolean" }, "icon": { "type": "string" }, "link": { "type": "string" } }, "allOf": [ { "if": { "properties": { "assumption": { "const": true } }, "required": [ "assumption" ] }, "then": { "properties": { "evidence": { "maxItems": 0 } } } } ] } }, "edges": { "type": "array", "items": { "type": "object", "required": [ "id", "from", "to", "label", "kind", "evidence", "assumption" ], "additionalProperties": false, "properties": { "id": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_.-]*$" }, "from": { "type": "string" }, "to": { "type": "string" }, "label": { "type": "string" }, "kind": { "type": "string" }, "order": { "type": "integer", "minimum": 1 }, "evidence": { "$ref": "#/$defs/evidenceArray" }, "assumption": { "type": "boolean" } }, "allOf": [ { "if": { "properties": { "assumption": { "const": true } }, "required": [ "assumption" ] }, "then": { "properties": { "evidence": { "maxItems": 0 } } } } ] } }, "legend": { "type": "array", "items": { "type": "object", "required": [ "symbol", "meaning" ], "additionalProperties": false, "properties": { "symbol": { "type": "string" }, "meaning": { "type": "string" } } } }, "metadata": { "type": "object" } }, "$defs": { "evidenceArray": { "type": "array", "items": { "type": "object", "required": [ "start_line", "end_line" ], "additionalProperties": false, "properties": { "start_line": { "type": "integer", "minimum": 1 }, "end_line": { "type": "integer", "minimum": 1 }, "quote": { "type": "string" } } } } } }