{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://mlsysbook.ai/periodic-table/table.schema.json", "title": "Periodic Table of ML Systems", "description": "Single source of truth for the Periodic Table of ML Systems. Consumed by the standalone HTML emitter and the StaffML React app. Cross-reference invariants (bond resolution, formula resolution, no cell collisions) are enforced by the validator script in addition to this schema.", "type": "object", "required": ["version", "title", "blocks", "rows", "elements", "compounds"], "additionalProperties": false, "properties": { "version": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$" }, "title": { "type": "string" }, "subtitle": { "type": "string" }, "blocks": { "type": "array", "minItems": 1, "items": { "type": "object", "required": ["key", "name", "sub", "color", "cols"], "additionalProperties": false, "properties": { "key": { "type": "string", "enum": ["R", "C", "X", "K", "M"] }, "name": { "type": "string" }, "sub": { "type": "string" }, "color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "cols": { "type": "array", "minItems": 1, "items": { "type": "integer", "minimum": 1, "maximum": 18 } } } } }, "rows": { "type": "array", "minItems": 1, "items": { "type": "object", "required": ["index", "key", "name"], "additionalProperties": false, "properties": { "index": { "type": "integer", "minimum": 1, "maximum": 8 }, "key": { "type": "string", "pattern": "^[a-z_]+$" }, "name": { "type": "string" }, "tagline": { "type": "string" } } } }, "elements": { "type": "array", "minItems": 1, "items": { "type": "object", "required": ["id", "sym", "name", "block", "row", "col", "desc", "bonds", "why"], "additionalProperties": false, "properties": { "id": { "type": "integer", "minimum": 1 }, "sym": { "type": "string", "pattern": "^[A-Z][a-z]$" }, "name": { "type": "string", "minLength": 1 }, "block": { "type": "string", "enum": ["R", "C", "X", "K", "M"] }, "row": { "type": "integer", "minimum": 1, "maximum": 8 }, "col": { "type": "integer", "minimum": 1, "maximum": 18 }, "year": { "type": ["string", "null"] }, "desc": { "type": "string", "minLength": 1 }, "bonds": { "type": "array", "items": { "type": "string", "pattern": "^[A-Z][a-z]$" } }, "why": { "type": "string", "minLength": 1 } } } }, "compounds": { "type": "array", "items": { "type": "object", "required": ["section", "items"], "additionalProperties": false, "properties": { "section": { "type": "string" }, "hint": { "type": "string" }, "items": { "type": "array", "items": { "type": "object", "required": ["name", "formula"], "additionalProperties": false, "properties": { "name": { "type": "string" }, "formula": { "type": "string", "minLength": 1 } } } } } } }, "known_collisions": { "type": "array", "description": "Documented intentional symbol collisions. Lookup behavior is last-wins; consumers may disambiguate by id or by (row, col).", "items": { "type": "object", "required": ["sym", "ids", "note"], "additionalProperties": false, "properties": { "sym": { "type": "string", "pattern": "^[A-Z][a-z]$" }, "ids": { "type": "array", "minItems": 2, "items": { "type": "integer", "minimum": 1 } }, "note": { "type": "string" } } } } } }