Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

,\n SchemaType.GUID: r'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

,\n SchemaType.CURRENCY: r'^-?\\d+(\\.\\d{2})?

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

,\n SchemaType.DATE: r'^\\d{4}-\\d{2}-\\d{2}

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

,\n SchemaType.DATETIME: r'^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}',\n }\n\n def validate(self, data: Any, schema: Schema) -> SchemaValidationResult:\n result = SchemaValidationResult(\n is_valid=True,\n schema_name=schema.name,\n schema_version=schema.version\n )\n\n self._validate_object(data, schema.fields, \"\", result)\n return result\n\n def _validate_object(self, data: Any, fields: Dict[str, SchemaField], path: str, result: SchemaValidationResult):\n if not isinstance(data, dict):\n result.add_error(path or \"root\", \"Expected object\", \"object\", type(data).__name__)\n return\n\n # Check required fields\n for field_name, field_schema in fields.items():\n field_path = f\"{path}.{field_name}\" if path else field_name\n\n if field_name not in data:\n if field_schema.required:\n result.add_error(field_path, \"Required field missing\", \"present\", \"missing\")\n continue\n\n value = data[field_name]\n\n # Check nullable\n if value is None:\n if not field_schema.nullable:\n result.add_error(field_path, \"Field cannot be null\", \"non-null\", \"null\")\n continue\n\n # Validate type\n self._validate_field(value, field_schema, field_path, result)\n\n # Check for extra fields (warning only)\n for key in data.keys():\n if key not in fields:\n # Could add warning here if needed\n pass\n\n def _validate_field(self, value: Any, schema: SchemaField, path: str, result: SchemaValidationResult):\n # Type validation\n if not self._check_type(value, schema.type):\n result.add_error(path, f\"Invalid type\", schema.type.value, type(value).__name__)\n return\n\n # String validations\n if schema.type == SchemaType.STRING:\n if schema.min_length and len(value) \u003c schema.min_length:\n result.add_error(path, f\"String too short\", f\"min {schema.min_length}\", len(value))\n if schema.max_length and len(value) > schema.max_length:\n result.add_error(path, f\"String too long\", f\"max {schema.max_length}\", len(value))\n if schema.pattern and not re.match(schema.pattern, value):\n result.add_error(path, \"Pattern mismatch\", schema.pattern, value)\n\n # Numeric validations\n if schema.type in (SchemaType.NUMBER, SchemaType.INTEGER):\n if schema.min_value is not None and value \u003c schema.min_value:\n result.add_error(path, \"Value below minimum\", f\">= {schema.min_value}\", value)\n if schema.max_value is not None and value > schema.max_value:\n result.add_error(path, \"Value above maximum\", f\"\u003c= {schema.max_value}\", value)\n\n # Enum validation\n if schema.enum_values and value not in schema.enum_values:\n result.add_error(path, \"Invalid enum value\", str(schema.enum_values), value)\n\n # Array validation\n if schema.type == SchemaType.ARRAY and schema.items_schema:\n for i, item in enumerate(value):\n item_path = f\"{path}[{i}]\"\n if schema.items_schema.fields:\n self._validate_object(item, schema.items_schema.fields, item_path, result)\n\n # Nested object validation\n if schema.type == SchemaType.OBJECT and schema.properties:\n self._validate_object(value, schema.properties, path, result)\n\n # Custom type validation\n if schema.type in self.PATTERNS:\n pattern = self.PATTERNS[schema.type]\n if not re.match(pattern, str(value)):\n result.add_error(path, f\"Invalid {schema.type.value} format\", pattern, value)\n\n def _check_type(self, value: Any, expected: SchemaType) -> bool:\n type_checks = {\n SchemaType.STRING: lambda v: isinstance(v, str),\n SchemaType.NUMBER: lambda v: isinstance(v, (int, float)),\n SchemaType.INTEGER: lambda v: isinstance(v, int) and not isinstance(v, bool),\n SchemaType.BOOLEAN: lambda v: isinstance(v, bool),\n SchemaType.ARRAY: lambda v: isinstance(v, list),\n SchemaType.OBJECT: lambda v: isinstance(v, dict),\n SchemaType.DATE: lambda v: isinstance(v, str),\n SchemaType.DATETIME: lambda v: isinstance(v, str),\n SchemaType.CSI_CODE: lambda v: isinstance(v, str),\n SchemaType.CURRENCY: lambda v: isinstance(v, (int, float, str)),\n SchemaType.GUID: lambda v: isinstance(v, str),\n }\n return type_checks.get(expected, lambda v: True)(value)\n```\n\n## Construction Data Schemas\n\n### Cost Estimate Schema\n\n```python\n# Define schema for cost estimate data\nCOST_ESTIMATE_SCHEMA = Schema(\n name=\"CostEstimate\",\n version=\"1.0\",\n description=\"Schema for construction cost estimates\",\n fields={\n \"project_id\": SchemaField(\n name=\"project_id\",\n type=SchemaType.STRING,\n required=True,\n description=\"Unique project identifier\"\n ),\n \"project_name\": SchemaField(\n name=\"project_name\",\n type=SchemaType.STRING,\n required=True,\n max_length=200\n ),\n \"estimate_type\": SchemaField(\n name=\"estimate_type\",\n type=SchemaType.STRING,\n required=True,\n enum_values=[\"conceptual\", \"schematic\", \"design_development\", \"construction_documents\", \"bid\"]\n ),\n \"estimate_date\": SchemaField(\n name=\"estimate_date\",\n type=SchemaType.DATE,\n required=True\n ),\n \"currency\": SchemaField(\n name=\"currency\",\n type=SchemaType.STRING,\n required=False,\n enum_values=[\"USD\", \"EUR\", \"GBP\", \"CAD\"],\n nullable=True\n ),\n \"gross_area\": SchemaField(\n name=\"gross_area\",\n type=SchemaType.NUMBER,\n required=True,\n min_value=0,\n description=\"Gross floor area in SF or SM\"\n ),\n \"line_items\": SchemaField(\n name=\"line_items\",\n type=SchemaType.ARRAY,\n required=True,\n items_schema=Schema(\n name=\"LineItem\",\n version=\"1.0\",\n fields={\n \"id\": SchemaField(name=\"id\", type=SchemaType.STRING, required=True),\n \"csi_code\": SchemaField(name=\"csi_code\", type=SchemaType.CSI_CODE, required=False, nullable=True),\n \"description\": SchemaField(name=\"description\", type=SchemaType.STRING, required=True, max_length=500),\n \"quantity\": SchemaField(name=\"quantity\", type=SchemaType.NUMBER, required=True, min_value=0),\n \"unit\": SchemaField(name=\"unit\", type=SchemaType.STRING, required=True),\n \"unit_cost\": SchemaField(name=\"unit_cost\", type=SchemaType.NUMBER, required=True, min_value=0),\n \"amount\": SchemaField(name=\"amount\", type=SchemaType.NUMBER, required=True, min_value=0),\n }\n )\n ),\n \"subtotal\": SchemaField(\n name=\"subtotal\",\n type=SchemaType.NUMBER,\n required=True,\n min_value=0\n ),\n \"contingency_percent\": SchemaField(\n name=\"contingency_percent\",\n type=SchemaType.NUMBER,\n required=False,\n min_value=0,\n max_value=50\n ),\n \"total\": SchemaField(\n name=\"total\",\n type=SchemaType.NUMBER,\n required=True,\n min_value=0\n )\n }\n)\n```\n\n### Schedule Data Schema\n\n```python\nSCHEDULE_SCHEMA = Schema(\n name=\"ProjectSchedule\",\n version=\"1.0\",\n description=\"Schema for project schedule data\",\n fields={\n \"project_id\": SchemaField(name=\"project_id\", type=SchemaType.STRING, required=True),\n \"schedule_name\": SchemaField(name=\"schedule_name\", type=SchemaType.STRING, required=True),\n \"data_date\": SchemaField(name=\"data_date\", type=SchemaType.DATE, required=True),\n \"start_date\": SchemaField(name=\"start_date\", type=SchemaType.DATE, required=True),\n \"finish_date\": SchemaField(name=\"finish_date\", type=SchemaType.DATE, required=True),\n \"calendar\": SchemaField(\n name=\"calendar\",\n type=SchemaType.STRING,\n required=False,\n enum_values=[\"5-day\", \"6-day\", \"7-day\"],\n nullable=True\n ),\n \"tasks\": SchemaField(\n name=\"tasks\",\n type=SchemaType.ARRAY,\n required=True,\n items_schema=Schema(\n name=\"Task\",\n version=\"1.0\",\n fields={\n \"id\": SchemaField(name=\"id\", type=SchemaType.STRING, required=True),\n \"wbs\": SchemaField(name=\"wbs\", type=SchemaType.STRING, required=False, nullable=True),\n \"name\": SchemaField(name=\"name\", type=SchemaType.STRING, required=True, max_length=300),\n \"start_date\": SchemaField(name=\"start_date\", type=SchemaType.DATE, required=True),\n \"finish_date\": SchemaField(name=\"finish_date\", type=SchemaType.DATE, required=True),\n \"duration\": SchemaField(name=\"duration\", type=SchemaType.INTEGER, required=True, min_value=0),\n \"percent_complete\": SchemaField(name=\"percent_complete\", type=SchemaType.NUMBER, required=False, min_value=0, max_value=100),\n \"predecessors\": SchemaField(name=\"predecessors\", type=SchemaType.ARRAY, required=False, nullable=True),\n \"resources\": SchemaField(name=\"resources\", type=SchemaType.ARRAY, required=False, nullable=True),\n }\n )\n )\n }\n)\n```\n\n### BIM Element Schema\n\n```python\nBIM_ELEMENT_SCHEMA = Schema(\n name=\"BIMElement\",\n version=\"1.0\",\n description=\"Schema for BIM element data\",\n fields={\n \"guid\": SchemaField(name=\"guid\", type=SchemaType.GUID, required=True),\n \"ifc_class\": SchemaField(\n name=\"ifc_class\",\n type=SchemaType.STRING,\n required=True,\n pattern=r'^Ifc[A-Z][a-zA-Z]+

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

\n ),\n \"name\": SchemaField(name=\"name\", type=SchemaType.STRING, required=False, nullable=True),\n \"description\": SchemaField(name=\"description\", type=SchemaType.STRING, required=False, nullable=True),\n \"level\": SchemaField(name=\"level\", type=SchemaType.STRING, required=False, nullable=True),\n \"classification\": SchemaField(\n name=\"classification\",\n type=SchemaType.OBJECT,\n required=False,\n nullable=True,\n properties={\n \"system\": SchemaField(name=\"system\", type=SchemaType.STRING, required=True),\n \"code\": SchemaField(name=\"code\", type=SchemaType.STRING, required=True),\n \"name\": SchemaField(name=\"name\", type=SchemaType.STRING, required=False, nullable=True),\n }\n ),\n \"quantities\": SchemaField(\n name=\"quantities\",\n type=SchemaType.OBJECT,\n required=False,\n nullable=True,\n properties={\n \"area\": SchemaField(name=\"area\", type=SchemaType.NUMBER, required=False, min_value=0, nullable=True),\n \"volume\": SchemaField(name=\"volume\", type=SchemaType.NUMBER, required=False, min_value=0, nullable=True),\n \"length\": SchemaField(name=\"length\", type=SchemaType.NUMBER, required=False, min_value=0, nullable=True),\n \"count\": SchemaField(name=\"count\", type=SchemaType.INTEGER, required=False, min_value=0, nullable=True),\n }\n ),\n \"properties\": SchemaField(name=\"properties\", type=SchemaType.OBJECT, required=False, nullable=True)\n }\n)\n```\n\n### RFI Schema\n\n```python\nRFI_SCHEMA = Schema(\n name=\"RFI\",\n version=\"1.0\",\n description=\"Schema for Request for Information\",\n fields={\n \"rfi_number\": SchemaField(name=\"rfi_number\", type=SchemaType.STRING, required=True, pattern=r'^RFI-\\d+

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

),\n \"project_id\": SchemaField(name=\"project_id\", type=SchemaType.STRING, required=True),\n \"subject\": SchemaField(name=\"subject\", type=SchemaType.STRING, required=True, max_length=500),\n \"status\": SchemaField(\n name=\"status\",\n type=SchemaType.STRING,\n required=True,\n enum_values=[\"draft\", \"submitted\", \"in_review\", \"answered\", \"closed\"]\n ),\n \"priority\": SchemaField(\n name=\"priority\",\n type=SchemaType.STRING,\n required=False,\n enum_values=[\"low\", \"medium\", \"high\", \"critical\"],\n nullable=True\n ),\n \"date_submitted\": SchemaField(name=\"date_submitted\", type=SchemaType.DATE, required=True),\n \"date_required\": SchemaField(name=\"date_required\", type=SchemaType.DATE, required=True),\n \"from_company\": SchemaField(name=\"from_company\", type=SchemaType.STRING, required=True),\n \"to_company\": SchemaField(name=\"to_company\", type=SchemaType.STRING, required=True),\n \"spec_section\": SchemaField(name=\"spec_section\", type=SchemaType.CSI_CODE, required=False, nullable=True),\n \"drawing_reference\": SchemaField(name=\"drawing_reference\", type=SchemaType.STRING, required=False, nullable=True),\n \"question\": SchemaField(name=\"question\", type=SchemaType.STRING, required=True),\n \"response\": SchemaField(name=\"response\", type=SchemaType.STRING, required=False, nullable=True),\n \"date_responded\": SchemaField(name=\"date_responded\", type=SchemaType.DATE, required=False, nullable=True),\n \"attachments\": SchemaField(name=\"attachments\", type=SchemaType.ARRAY, required=False, nullable=True)\n }\n)\n```\n\n## Schema Registry\n\n```python\nclass ConstructionSchemaRegistry:\n \"\"\"Registry of construction data schemas.\"\"\"\n\n def __init__(self):\n self.schemas: Dict[str, Schema] = {}\n self._register_defaults()\n\n def _register_defaults(self):\n self.register(COST_ESTIMATE_SCHEMA)\n self.register(SCHEDULE_SCHEMA)\n self.register(BIM_ELEMENT_SCHEMA)\n self.register(RFI_SCHEMA)\n\n def register(self, schema: Schema):\n key = f\"{schema.name}:{schema.version}\"\n self.schemas[key] = schema\n # Also register without version for latest\n self.schemas[schema.name] = schema\n\n def get(self, name: str, version: str = None) -> Optional[Schema]:\n if version:\n return self.schemas.get(f\"{name}:{version}\")\n return self.schemas.get(name)\n\n def validate(self, data: Any, schema_name: str, version: str = None) -> SchemaValidationResult:\n schema = self.get(schema_name, version)\n if not schema:\n result = SchemaValidationResult(is_valid=False)\n result.add_error(\"schema\", f\"Schema '{schema_name}' not found\", \"valid schema\", \"not found\")\n return result\n\n validator = SchemaValidator()\n return validator.validate(data, schema)\n\n def list_schemas(self) -> List[str]:\n return [k for k in self.schemas.keys() if ':' in k]\n```\n\n## Usage Examples\n\n```python\n# Initialize registry\nregistry = ConstructionSchemaRegistry()\n\n# Validate cost estimate\nestimate_data = {\n \"project_id\": \"PROJ-001\",\n \"project_name\": \"Downtown Office Tower\",\n \"estimate_type\": \"schematic\",\n \"estimate_date\": \"2026-01-15\",\n \"gross_area\": 50000,\n \"line_items\": [\n {\n \"id\": \"1\",\n \"csi_code\": \"03 30 00\",\n \"description\": \"Cast-in-place concrete\",\n \"quantity\": 5000,\n \"unit\": \"CY\",\n \"unit_cost\": 150.00,\n \"amount\": 750000.00\n }\n ],\n \"subtotal\": 750000.00,\n \"contingency_percent\": 10,\n \"total\": 825000.00\n}\n\nresult = registry.validate(estimate_data, \"CostEstimate\")\nprint(result.to_report())\n\n# Validate RFI\nrfi_data = {\n \"rfi_number\": \"RFI-042\",\n \"project_id\": \"PROJ-001\",\n \"subject\": \"Concrete mix design clarification\",\n \"status\": \"submitted\",\n \"priority\": \"high\",\n \"date_submitted\": \"2026-01-20\",\n \"date_required\": \"2026-01-27\",\n \"from_company\": \"ABC Concrete\",\n \"to_company\": \"XYZ Architects\",\n \"spec_section\": \"03 30 00\",\n \"question\": \"Please clarify the required PSI for the foundation pour.\"\n}\n\nresult = registry.validate(rfi_data, \"RFI\")\nif result.is_valid:\n print(\"RFI data is valid\")\nelse:\n print(result.to_report())\n```\n\n## JSON Schema Export\n\n```python\ndef export_to_json_schema(schema: Schema) -> dict:\n \"\"\"Export DDC schema to JSON Schema format.\"\"\"\n\n def field_to_json_schema(field: SchemaField) -> dict:\n type_map = {\n SchemaType.STRING: \"string\",\n SchemaType.NUMBER: \"number\",\n SchemaType.INTEGER: \"integer\",\n SchemaType.BOOLEAN: \"boolean\",\n SchemaType.ARRAY: \"array\",\n SchemaType.OBJECT: \"object\",\n SchemaType.DATE: \"string\",\n SchemaType.DATETIME: \"string\",\n SchemaType.CSI_CODE: \"string\",\n SchemaType.CURRENCY: \"number\",\n SchemaType.GUID: \"string\",\n }\n\n js = {\"type\": type_map.get(field.type, \"string\")}\n\n if field.description:\n js[\"description\"] = field.description\n if field.min_value is not None:\n js[\"minimum\"] = field.min_value\n if field.max_value is not None:\n js[\"maximum\"] = field.max_value\n if field.min_length is not None:\n js[\"minLength\"] = field.min_length\n if field.max_length is not None:\n js[\"maxLength\"] = field.max_length\n if field.pattern:\n js[\"pattern\"] = field.pattern\n if field.enum_values:\n js[\"enum\"] = field.enum_values\n\n if field.type == SchemaType.DATE:\n js[\"format\"] = \"date\"\n if field.type == SchemaType.DATETIME:\n js[\"format\"] = \"date-time\"\n if field.type == SchemaType.GUID:\n js[\"format\"] = \"uuid\"\n\n return js\n\n properties = {}\n required = []\n\n for name, field in schema.fields.items():\n properties[name] = field_to_json_schema(field)\n if field.required:\n required.append(name)\n\n return {\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": schema.name,\n \"description\": schema.description,\n \"type\": \"object\",\n \"properties\": properties,\n \"required\": required\n }\n\n# Export to JSON Schema\njson_schema = export_to_json_schema(COST_ESTIMATE_SCHEMA)\nprint(json.dumps(json_schema, indent=2))\n```\n\n## Integration with DDC Pipeline\n\n```python\n# Validate API request before processing\ndef validate_api_request(endpoint: str, payload: dict) -> SchemaValidationResult:\n schema_map = {\n '/api/estimates': 'CostEstimate',\n '/api/schedules': 'ProjectSchedule',\n '/api/rfis': 'RFI',\n '/api/bim/elements': 'BIMElement'\n }\n\n schema_name = schema_map.get(endpoint)\n if not schema_name:\n result = SchemaValidationResult(is_valid=True)\n return result\n\n registry = ConstructionSchemaRegistry()\n return registry.validate(payload, schema_name)\n\n# Use in API handler\[email protected]('/api/estimates')\ndef create_estimate(payload: dict):\n validation = validate_api_request('/api/estimates', payload)\n if not validation.is_valid:\n return {'error': 'Validation failed', 'details': [e.__dict__ for e in validation.errors]}, 400\n\n # Process valid data\n return process_estimate(payload)\n```\n\n## Resources\n\n- **JSON Schema**: https://json-schema.org/\n- **CSI MasterFormat**: Standard classification codes\n- **IFC Schema**: https://standards.buildingsmart.org/IFC/\n---","attachment_filenames":["claw.json","instructions.md"],"attachments":[{"filename":"claw.json","content":"{\n \"name\": \"schema-validation\",\n \"version\": \"2.0.0\",\n \"description\": \"JSON/data schema validation for construction data exchange: API payloads, file imports, BIM exports. Ensure data structure compliance before processing.\",\n \"author\": \"datadrivenconstruction\",\n \"license\": \"MIT\",\n \"permissions\": [\n \"filesystem\",\n \"network\"\n ],\n \"entry\": \"instructions.md\",\n \"tags\": [\n \"construction\",\n \"BIM\",\n \"data-processing\",\n \"safety\",\n \"quality\"\n ],\n \"models\": [\n \"claude-*\",\n \"gpt-*\"\n ],\n \"minOpenClawVersion\": \"0.8.0\"\n}","content_type":"application/json; charset=utf-8","language":"json","size":551,"content_sha256":"b188da613a3d9ccdd4e3c72a42901f3b508396a5c9c6e4997374aed0b8caf187"},{"filename":"instructions.md","content":"You are a construction industry assistant specializing in construction project management.\n\nJSON/data schema validation for construction data exchange: API payloads, file imports, BIM exports. Ensure data structure compliance before processing.\n\nWhen the user asks to validate data quality and compliance:\n1. Gather the required input data from the user\n2. Process the data using the methods described in SKILL.md\n3. Present results in a clear, structured format\n4. Offer follow-up analysis or export options\n\n## Input Format\n- The user provides project data, file paths, or parameters as described in SKILL.md\n- Accept data in common formats: CSV, Excel, JSON, or direct input\n\n## Output Format\n- Present results in structured tables when applicable\n- Include summary statistics and key findings\n- Offer export to Excel/CSV/JSON when relevant\n\n## Key Reference\n- See SKILL.md for detailed implementation code, classes, and methods\n- Follow the patterns and APIs defined in the skill documentation\n\n## Constraints\n- Only use data provided by the user or referenced in the skill\n- Validate inputs before processing\n- Report errors clearly with suggested fixes\n- Follow construction industry standards and best practices\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":1219,"content_sha256":"c586f9c364a8ec3056927505b9876af8227971dde3da5b6755149ec7e89acabd"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Schema Validation for Construction Data","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Overview","type":"text"}]},{"type":"paragraph","content":[{"text":"Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Schema Validation Framework","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Core Schema Validator","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from dataclasses import dataclass, field\nfrom typing import Any, Dict, List, Optional, Union\nfrom enum import Enum\nimport json\nimport re\nfrom datetime import datetime\n\nclass SchemaType(Enum):\n STRING = \"string\"\n NUMBER = \"number\"\n INTEGER = \"integer\"\n BOOLEAN = \"boolean\"\n ARRAY = \"array\"\n OBJECT = \"object\"\n DATE = \"date\"\n DATETIME = \"datetime\"\n CSI_CODE = \"csi_code\"\n CURRENCY = \"currency\"\n GUID = \"guid\"\n\n@dataclass\nclass SchemaField:\n name: str\n type: SchemaType\n required: bool = True\n nullable: bool = False\n min_value: Optional[float] = None\n max_value: Optional[float] = None\n min_length: Optional[int] = None\n max_length: Optional[int] = None\n pattern: Optional[str] = None\n enum_values: Optional[List[Any]] = None\n items_schema: Optional['Schema'] = None # For arrays\n properties: Optional[Dict[str, 'SchemaField']] = None # For objects\n description: str = \"\"\n\n@dataclass\nclass Schema:\n name: str\n version: str\n fields: Dict[str, SchemaField]\n description: str = \"\"\n\n@dataclass\nclass SchemaValidationError:\n path: str\n message: str\n expected: str\n actual: Any\n\n@dataclass\nclass SchemaValidationResult:\n is_valid: bool\n errors: List[SchemaValidationError] = field(default_factory=list)\n schema_name: str = \"\"\n schema_version: str = \"\"\n\n def add_error(self, path: str, message: str, expected: str, actual: Any):\n self.errors.append(SchemaValidationError(path, message, expected, actual))\n self.is_valid = False\n\n def to_report(self) -> str:\n lines = [\n f\"Schema Validation: {self.schema_name} v{self.schema_version}\",\n \"=\" * 50,\n f\"Status: {'✓ VALID' if self.is_valid else '✗ INVALID'}\",\n f\"Errors: {len(self.errors)}\",\n \"\"\n ]\n\n for error in self.errors:\n lines.append(f\"❌ {error.path}\")\n lines.append(f\" {error.message}\")\n lines.append(f\" Expected: {error.expected}\")\n lines.append(f\" Actual: {error.actual}\")\n lines.append(\"\")\n\n return \"\\n\".join(lines)\n\n\nclass SchemaValidator:\n \"\"\"Validate data against schemas.\"\"\"\n\n # Custom type patterns\n PATTERNS = {\n SchemaType.CSI_CODE: r'^\\d{2}\\s?\\d{2}\\s?\\d{2}

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

,\n SchemaType.GUID: r'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

,\n SchemaType.CURRENCY: r'^-?\\d+(\\.\\d{2})?

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

,\n SchemaType.DATE: r'^\\d{4}-\\d{2}-\\d{2}

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

,\n SchemaType.DATETIME: r'^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}',\n }\n\n def validate(self, data: Any, schema: Schema) -> SchemaValidationResult:\n result = SchemaValidationResult(\n is_valid=True,\n schema_name=schema.name,\n schema_version=schema.version\n )\n\n self._validate_object(data, schema.fields, \"\", result)\n return result\n\n def _validate_object(self, data: Any, fields: Dict[str, SchemaField], path: str, result: SchemaValidationResult):\n if not isinstance(data, dict):\n result.add_error(path or \"root\", \"Expected object\", \"object\", type(data).__name__)\n return\n\n # Check required fields\n for field_name, field_schema in fields.items():\n field_path = f\"{path}.{field_name}\" if path else field_name\n\n if field_name not in data:\n if field_schema.required:\n result.add_error(field_path, \"Required field missing\", \"present\", \"missing\")\n continue\n\n value = data[field_name]\n\n # Check nullable\n if value is None:\n if not field_schema.nullable:\n result.add_error(field_path, \"Field cannot be null\", \"non-null\", \"null\")\n continue\n\n # Validate type\n self._validate_field(value, field_schema, field_path, result)\n\n # Check for extra fields (warning only)\n for key in data.keys():\n if key not in fields:\n # Could add warning here if needed\n pass\n\n def _validate_field(self, value: Any, schema: SchemaField, path: str, result: SchemaValidationResult):\n # Type validation\n if not self._check_type(value, schema.type):\n result.add_error(path, f\"Invalid type\", schema.type.value, type(value).__name__)\n return\n\n # String validations\n if schema.type == SchemaType.STRING:\n if schema.min_length and len(value) \u003c schema.min_length:\n result.add_error(path, f\"String too short\", f\"min {schema.min_length}\", len(value))\n if schema.max_length and len(value) > schema.max_length:\n result.add_error(path, f\"String too long\", f\"max {schema.max_length}\", len(value))\n if schema.pattern and not re.match(schema.pattern, value):\n result.add_error(path, \"Pattern mismatch\", schema.pattern, value)\n\n # Numeric validations\n if schema.type in (SchemaType.NUMBER, SchemaType.INTEGER):\n if schema.min_value is not None and value \u003c schema.min_value:\n result.add_error(path, \"Value below minimum\", f\">= {schema.min_value}\", value)\n if schema.max_value is not None and value > schema.max_value:\n result.add_error(path, \"Value above maximum\", f\"\u003c= {schema.max_value}\", value)\n\n # Enum validation\n if schema.enum_values and value not in schema.enum_values:\n result.add_error(path, \"Invalid enum value\", str(schema.enum_values), value)\n\n # Array validation\n if schema.type == SchemaType.ARRAY and schema.items_schema:\n for i, item in enumerate(value):\n item_path = f\"{path}[{i}]\"\n if schema.items_schema.fields:\n self._validate_object(item, schema.items_schema.fields, item_path, result)\n\n # Nested object validation\n if schema.type == SchemaType.OBJECT and schema.properties:\n self._validate_object(value, schema.properties, path, result)\n\n # Custom type validation\n if schema.type in self.PATTERNS:\n pattern = self.PATTERNS[schema.type]\n if not re.match(pattern, str(value)):\n result.add_error(path, f\"Invalid {schema.type.value} format\", pattern, value)\n\n def _check_type(self, value: Any, expected: SchemaType) -> bool:\n type_checks = {\n SchemaType.STRING: lambda v: isinstance(v, str),\n SchemaType.NUMBER: lambda v: isinstance(v, (int, float)),\n SchemaType.INTEGER: lambda v: isinstance(v, int) and not isinstance(v, bool),\n SchemaType.BOOLEAN: lambda v: isinstance(v, bool),\n SchemaType.ARRAY: lambda v: isinstance(v, list),\n SchemaType.OBJECT: lambda v: isinstance(v, dict),\n SchemaType.DATE: lambda v: isinstance(v, str),\n SchemaType.DATETIME: lambda v: isinstance(v, str),\n SchemaType.CSI_CODE: lambda v: isinstance(v, str),\n SchemaType.CURRENCY: lambda v: isinstance(v, (int, float, str)),\n SchemaType.GUID: lambda v: isinstance(v, str),\n }\n return type_checks.get(expected, lambda v: True)(value)","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Construction Data Schemas","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Cost Estimate Schema","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"# Define schema for cost estimate data\nCOST_ESTIMATE_SCHEMA = Schema(\n name=\"CostEstimate\",\n version=\"1.0\",\n description=\"Schema for construction cost estimates\",\n fields={\n \"project_id\": SchemaField(\n name=\"project_id\",\n type=SchemaType.STRING,\n required=True,\n description=\"Unique project identifier\"\n ),\n \"project_name\": SchemaField(\n name=\"project_name\",\n type=SchemaType.STRING,\n required=True,\n max_length=200\n ),\n \"estimate_type\": SchemaField(\n name=\"estimate_type\",\n type=SchemaType.STRING,\n required=True,\n enum_values=[\"conceptual\", \"schematic\", \"design_development\", \"construction_documents\", \"bid\"]\n ),\n \"estimate_date\": SchemaField(\n name=\"estimate_date\",\n type=SchemaType.DATE,\n required=True\n ),\n \"currency\": SchemaField(\n name=\"currency\",\n type=SchemaType.STRING,\n required=False,\n enum_values=[\"USD\", \"EUR\", \"GBP\", \"CAD\"],\n nullable=True\n ),\n \"gross_area\": SchemaField(\n name=\"gross_area\",\n type=SchemaType.NUMBER,\n required=True,\n min_value=0,\n description=\"Gross floor area in SF or SM\"\n ),\n \"line_items\": SchemaField(\n name=\"line_items\",\n type=SchemaType.ARRAY,\n required=True,\n items_schema=Schema(\n name=\"LineItem\",\n version=\"1.0\",\n fields={\n \"id\": SchemaField(name=\"id\", type=SchemaType.STRING, required=True),\n \"csi_code\": SchemaField(name=\"csi_code\", type=SchemaType.CSI_CODE, required=False, nullable=True),\n \"description\": SchemaField(name=\"description\", type=SchemaType.STRING, required=True, max_length=500),\n \"quantity\": SchemaField(name=\"quantity\", type=SchemaType.NUMBER, required=True, min_value=0),\n \"unit\": SchemaField(name=\"unit\", type=SchemaType.STRING, required=True),\n \"unit_cost\": SchemaField(name=\"unit_cost\", type=SchemaType.NUMBER, required=True, min_value=0),\n \"amount\": SchemaField(name=\"amount\", type=SchemaType.NUMBER, required=True, min_value=0),\n }\n )\n ),\n \"subtotal\": SchemaField(\n name=\"subtotal\",\n type=SchemaType.NUMBER,\n required=True,\n min_value=0\n ),\n \"contingency_percent\": SchemaField(\n name=\"contingency_percent\",\n type=SchemaType.NUMBER,\n required=False,\n min_value=0,\n max_value=50\n ),\n \"total\": SchemaField(\n name=\"total\",\n type=SchemaType.NUMBER,\n required=True,\n min_value=0\n )\n }\n)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Schedule Data Schema","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"SCHEDULE_SCHEMA = Schema(\n name=\"ProjectSchedule\",\n version=\"1.0\",\n description=\"Schema for project schedule data\",\n fields={\n \"project_id\": SchemaField(name=\"project_id\", type=SchemaType.STRING, required=True),\n \"schedule_name\": SchemaField(name=\"schedule_name\", type=SchemaType.STRING, required=True),\n \"data_date\": SchemaField(name=\"data_date\", type=SchemaType.DATE, required=True),\n \"start_date\": SchemaField(name=\"start_date\", type=SchemaType.DATE, required=True),\n \"finish_date\": SchemaField(name=\"finish_date\", type=SchemaType.DATE, required=True),\n \"calendar\": SchemaField(\n name=\"calendar\",\n type=SchemaType.STRING,\n required=False,\n enum_values=[\"5-day\", \"6-day\", \"7-day\"],\n nullable=True\n ),\n \"tasks\": SchemaField(\n name=\"tasks\",\n type=SchemaType.ARRAY,\n required=True,\n items_schema=Schema(\n name=\"Task\",\n version=\"1.0\",\n fields={\n \"id\": SchemaField(name=\"id\", type=SchemaType.STRING, required=True),\n \"wbs\": SchemaField(name=\"wbs\", type=SchemaType.STRING, required=False, nullable=True),\n \"name\": SchemaField(name=\"name\", type=SchemaType.STRING, required=True, max_length=300),\n \"start_date\": SchemaField(name=\"start_date\", type=SchemaType.DATE, required=True),\n \"finish_date\": SchemaField(name=\"finish_date\", type=SchemaType.DATE, required=True),\n \"duration\": SchemaField(name=\"duration\", type=SchemaType.INTEGER, required=True, min_value=0),\n \"percent_complete\": SchemaField(name=\"percent_complete\", type=SchemaType.NUMBER, required=False, min_value=0, max_value=100),\n \"predecessors\": SchemaField(name=\"predecessors\", type=SchemaType.ARRAY, required=False, nullable=True),\n \"resources\": SchemaField(name=\"resources\", type=SchemaType.ARRAY, required=False, nullable=True),\n }\n )\n )\n }\n)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"BIM Element Schema","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"BIM_ELEMENT_SCHEMA = Schema(\n name=\"BIMElement\",\n version=\"1.0\",\n description=\"Schema for BIM element data\",\n fields={\n \"guid\": SchemaField(name=\"guid\", type=SchemaType.GUID, required=True),\n \"ifc_class\": SchemaField(\n name=\"ifc_class\",\n type=SchemaType.STRING,\n required=True,\n pattern=r'^Ifc[A-Z][a-zA-Z]+

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

\n ),\n \"name\": SchemaField(name=\"name\", type=SchemaType.STRING, required=False, nullable=True),\n \"description\": SchemaField(name=\"description\", type=SchemaType.STRING, required=False, nullable=True),\n \"level\": SchemaField(name=\"level\", type=SchemaType.STRING, required=False, nullable=True),\n \"classification\": SchemaField(\n name=\"classification\",\n type=SchemaType.OBJECT,\n required=False,\n nullable=True,\n properties={\n \"system\": SchemaField(name=\"system\", type=SchemaType.STRING, required=True),\n \"code\": SchemaField(name=\"code\", type=SchemaType.STRING, required=True),\n \"name\": SchemaField(name=\"name\", type=SchemaType.STRING, required=False, nullable=True),\n }\n ),\n \"quantities\": SchemaField(\n name=\"quantities\",\n type=SchemaType.OBJECT,\n required=False,\n nullable=True,\n properties={\n \"area\": SchemaField(name=\"area\", type=SchemaType.NUMBER, required=False, min_value=0, nullable=True),\n \"volume\": SchemaField(name=\"volume\", type=SchemaType.NUMBER, required=False, min_value=0, nullable=True),\n \"length\": SchemaField(name=\"length\", type=SchemaType.NUMBER, required=False, min_value=0, nullable=True),\n \"count\": SchemaField(name=\"count\", type=SchemaType.INTEGER, required=False, min_value=0, nullable=True),\n }\n ),\n \"properties\": SchemaField(name=\"properties\", type=SchemaType.OBJECT, required=False, nullable=True)\n }\n)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"RFI Schema","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"RFI_SCHEMA = Schema(\n name=\"RFI\",\n version=\"1.0\",\n description=\"Schema for Request for Information\",\n fields={\n \"rfi_number\": SchemaField(name=\"rfi_number\", type=SchemaType.STRING, required=True, pattern=r'^RFI-\\d+

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…

),\n \"project_id\": SchemaField(name=\"project_id\", type=SchemaType.STRING, required=True),\n \"subject\": SchemaField(name=\"subject\", type=SchemaType.STRING, required=True, max_length=500),\n \"status\": SchemaField(\n name=\"status\",\n type=SchemaType.STRING,\n required=True,\n enum_values=[\"draft\", \"submitted\", \"in_review\", \"answered\", \"closed\"]\n ),\n \"priority\": SchemaField(\n name=\"priority\",\n type=SchemaType.STRING,\n required=False,\n enum_values=[\"low\", \"medium\", \"high\", \"critical\"],\n nullable=True\n ),\n \"date_submitted\": SchemaField(name=\"date_submitted\", type=SchemaType.DATE, required=True),\n \"date_required\": SchemaField(name=\"date_required\", type=SchemaType.DATE, required=True),\n \"from_company\": SchemaField(name=\"from_company\", type=SchemaType.STRING, required=True),\n \"to_company\": SchemaField(name=\"to_company\", type=SchemaType.STRING, required=True),\n \"spec_section\": SchemaField(name=\"spec_section\", type=SchemaType.CSI_CODE, required=False, nullable=True),\n \"drawing_reference\": SchemaField(name=\"drawing_reference\", type=SchemaType.STRING, required=False, nullable=True),\n \"question\": SchemaField(name=\"question\", type=SchemaType.STRING, required=True),\n \"response\": SchemaField(name=\"response\", type=SchemaType.STRING, required=False, nullable=True),\n \"date_responded\": SchemaField(name=\"date_responded\", type=SchemaType.DATE, required=False, nullable=True),\n \"attachments\": SchemaField(name=\"attachments\", type=SchemaType.ARRAY, required=False, nullable=True)\n }\n)","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Schema Registry","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"class ConstructionSchemaRegistry:\n \"\"\"Registry of construction data schemas.\"\"\"\n\n def __init__(self):\n self.schemas: Dict[str, Schema] = {}\n self._register_defaults()\n\n def _register_defaults(self):\n self.register(COST_ESTIMATE_SCHEMA)\n self.register(SCHEDULE_SCHEMA)\n self.register(BIM_ELEMENT_SCHEMA)\n self.register(RFI_SCHEMA)\n\n def register(self, schema: Schema):\n key = f\"{schema.name}:{schema.version}\"\n self.schemas[key] = schema\n # Also register without version for latest\n self.schemas[schema.name] = schema\n\n def get(self, name: str, version: str = None) -> Optional[Schema]:\n if version:\n return self.schemas.get(f\"{name}:{version}\")\n return self.schemas.get(name)\n\n def validate(self, data: Any, schema_name: str, version: str = None) -> SchemaValidationResult:\n schema = self.get(schema_name, version)\n if not schema:\n result = SchemaValidationResult(is_valid=False)\n result.add_error(\"schema\", f\"Schema '{schema_name}' not found\", \"valid schema\", \"not found\")\n return result\n\n validator = SchemaValidator()\n return validator.validate(data, schema)\n\n def list_schemas(self) -> List[str]:\n return [k for k in self.schemas.keys() if ':' in k]","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Usage Examples","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"# Initialize registry\nregistry = ConstructionSchemaRegistry()\n\n# Validate cost estimate\nestimate_data = {\n \"project_id\": \"PROJ-001\",\n \"project_name\": \"Downtown Office Tower\",\n \"estimate_type\": \"schematic\",\n \"estimate_date\": \"2026-01-15\",\n \"gross_area\": 50000,\n \"line_items\": [\n {\n \"id\": \"1\",\n \"csi_code\": \"03 30 00\",\n \"description\": \"Cast-in-place concrete\",\n \"quantity\": 5000,\n \"unit\": \"CY\",\n \"unit_cost\": 150.00,\n \"amount\": 750000.00\n }\n ],\n \"subtotal\": 750000.00,\n \"contingency_percent\": 10,\n \"total\": 825000.00\n}\n\nresult = registry.validate(estimate_data, \"CostEstimate\")\nprint(result.to_report())\n\n# Validate RFI\nrfi_data = {\n \"rfi_number\": \"RFI-042\",\n \"project_id\": \"PROJ-001\",\n \"subject\": \"Concrete mix design clarification\",\n \"status\": \"submitted\",\n \"priority\": \"high\",\n \"date_submitted\": \"2026-01-20\",\n \"date_required\": \"2026-01-27\",\n \"from_company\": \"ABC Concrete\",\n \"to_company\": \"XYZ Architects\",\n \"spec_section\": \"03 30 00\",\n \"question\": \"Please clarify the required PSI for the foundation pour.\"\n}\n\nresult = registry.validate(rfi_data, \"RFI\")\nif result.is_valid:\n print(\"RFI data is valid\")\nelse:\n print(result.to_report())","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"JSON Schema Export","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"def export_to_json_schema(schema: Schema) -> dict:\n \"\"\"Export DDC schema to JSON Schema format.\"\"\"\n\n def field_to_json_schema(field: SchemaField) -> dict:\n type_map = {\n SchemaType.STRING: \"string\",\n SchemaType.NUMBER: \"number\",\n SchemaType.INTEGER: \"integer\",\n SchemaType.BOOLEAN: \"boolean\",\n SchemaType.ARRAY: \"array\",\n SchemaType.OBJECT: \"object\",\n SchemaType.DATE: \"string\",\n SchemaType.DATETIME: \"string\",\n SchemaType.CSI_CODE: \"string\",\n SchemaType.CURRENCY: \"number\",\n SchemaType.GUID: \"string\",\n }\n\n js = {\"type\": type_map.get(field.type, \"string\")}\n\n if field.description:\n js[\"description\"] = field.description\n if field.min_value is not None:\n js[\"minimum\"] = field.min_value\n if field.max_value is not None:\n js[\"maximum\"] = field.max_value\n if field.min_length is not None:\n js[\"minLength\"] = field.min_length\n if field.max_length is not None:\n js[\"maxLength\"] = field.max_length\n if field.pattern:\n js[\"pattern\"] = field.pattern\n if field.enum_values:\n js[\"enum\"] = field.enum_values\n\n if field.type == SchemaType.DATE:\n js[\"format\"] = \"date\"\n if field.type == SchemaType.DATETIME:\n js[\"format\"] = \"date-time\"\n if field.type == SchemaType.GUID:\n js[\"format\"] = \"uuid\"\n\n return js\n\n properties = {}\n required = []\n\n for name, field in schema.fields.items():\n properties[name] = field_to_json_schema(field)\n if field.required:\n required.append(name)\n\n return {\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": schema.name,\n \"description\": schema.description,\n \"type\": \"object\",\n \"properties\": properties,\n \"required\": required\n }\n\n# Export to JSON Schema\njson_schema = export_to_json_schema(COST_ESTIMATE_SCHEMA)\nprint(json.dumps(json_schema, indent=2))","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Integration with DDC Pipeline","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"# Validate API request before processing\ndef validate_api_request(endpoint: str, payload: dict) -> SchemaValidationResult:\n schema_map = {\n '/api/estimates': 'CostEstimate',\n '/api/schedules': 'ProjectSchedule',\n '/api/rfis': 'RFI',\n '/api/bim/elements': 'BIMElement'\n }\n\n schema_name = schema_map.get(endpoint)\n if not schema_name:\n result = SchemaValidationResult(is_valid=True)\n return result\n\n registry = ConstructionSchemaRegistry()\n return registry.validate(payload, schema_name)\n\n# Use in API handler\[email protected]('/api/estimates')\ndef create_estimate(payload: dict):\n validation = validate_api_request('/api/estimates', payload)\n if not validation.is_valid:\n return {'error': 'Validation failed', 'details': [e.__dict__ for e in validation.errors]}, 400\n\n # Process valid data\n return process_estimate(payload)","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Resources","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"JSON Schema","type":"text","marks":[{"type":"strong"}]},{"text":": https://json-schema.org/","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CSI MasterFormat","type":"text","marks":[{"type":"strong"}]},{"text":": Standard classification codes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"IFC Schema","type":"text","marks":[{"type":"strong"}]},{"text":": https://standards.buildingsmart.org/IFC/","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"schema-validation","author":"@skillopedia","source":{"stars":155,"repo_name":"ddc_skills_for_ai_agents_in_construction","origin_url":"https://github.com/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction/blob/HEAD/4_DDC_Curated/Data-Validation/schema-validation/SKILL.md","repo_owner":"datadrivenconstruction","body_sha256":"e9c3e61abc5a5f0875546af87f1deea1f54568a8fc5a19efe25ef374e7e7d774","cluster_key":"d86b3318c30726750a42150d5a0a5b3ef9b5b2fb4dfd22fc76c3e5237ef97a81","clean_bundle":{"format":"clean-skill-bundle-v1","source":"datadrivenconstruction/ddc_skills_for_ai_agents_in_construction/4_DDC_Curated/Data-Validation/schema-validation/SKILL.md","attachments":[{"id":"74315331-e0ef-54ae-9ca0-4afeaeda7553","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/74315331-e0ef-54ae-9ca0-4afeaeda7553/attachment.json","path":"claw.json","size":551,"sha256":"b188da613a3d9ccdd4e3c72a42901f3b508396a5c9c6e4997374aed0b8caf187","contentType":"application/json; charset=utf-8"},{"id":"a8497a89-fe96-5943-9c6c-886893977eda","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a8497a89-fe96-5943-9c6c-886893977eda/attachment.md","path":"instructions.md","size":1219,"sha256":"c586f9c364a8ec3056927505b9876af8227971dde3da5b6755149ec7e89acabd","contentType":"text/markdown; charset=utf-8"}],"bundle_sha256":"ce16aa1740ff344d8ecb3bdc2fd990bb8ac6947ba08517f5f8a729bdb871cfb7","attachment_count":2,"text_attachments":2,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":2,"skill_md_path":"4_DDC_Curated/Data-Validation/schema-validation/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"data-analytics","category_label":"Data"},"exact_dupes_collapsed_into_this":1},"version":"v1","category":"data-analytics","homepage":"https://datadrivenconstruction.io","metadata":{"openclaw":{"os":["darwin","linux","win32"],"emoji":"✔️","homepage":"https://datadrivenconstruction.io","requires":{"bins":["python3"]}}},"import_tag":"clean-skills-v1","description":"JSON/data schema validation for construction data exchange: API payloads, file imports, BIM exports. Ensure data structure compliance before processing."}},"renderedAt":1782986512273}

Schema Validation for Construction Data Overview Validate data structures against defined schemas for construction data exchange. Ensure API payloads, file imports, and BIM exports conform to expected formats before processing. Schema Validation Framework Core Schema Validator Construction Data Schemas Cost Estimate Schema Schedule Data Schema BIM Element Schema RFI Schema Schema Registry Usage Examples JSON Schema Export Integration with DDC Pipeline Resources - JSON Schema : https://json-schema.org/ - CSI MasterFormat : Standard classification codes - IFC Schema : https://standards.building…