[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FJHH4KJGDDPQ13662BEE3S":3,"skill-same:01M6FJHH4KJGDDPQ13662BEE3S":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":6,"ownerHtmlUrl":43,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":44,"install":45,"resources":58},"01M6FJHH4KJGDDPQ13662BEE3S","bim-consistency-checker",null,"Check BIM model consistency: naming conventions, parameter completeness, spatial relationships, and data integrity across model elements.","kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002Fbim-consistency-checker\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31],"consistency","bim consistency checker","data","integrity","model","check","Spatial","relationships","conventions","across","elements","data integrity","completeness","naming","2026-11-10 10:12:30",false,"---\r\nslug: \"bim-consistency-checker\"\r\ndisplay_name: \"BIM Consistency Checker\"\r\ndescription: \"Check BIM model consistency: naming conventions, parameter completeness, spatial relationships, and data integrity across model elements.\"\r\n---\r\n\r\n# BIM Consistency Checker for Construction\r\n\r\n## Overview\r\n\r\nValidate BIM model consistency including naming conventions, parameter completeness, spatial relationships, classification compliance, and cross-reference integrity.\r\n\r\n## Business Case\r\n\r\nBIM consistency checking ensures:\r\n- **Data Quality**: Complete and accurate model data\r\n- **Interoperability**: Models work across platforms\r\n- **Coordination**: Consistent information for all trades\r\n- **Deliverable Compliance**: Meet BIM execution plan requirements\r\n\r\n## Technical Implementation\r\n\r\n```python\r\nfrom dataclasses import dataclass, field\r\nfrom typing import List, Dict, Any, Optional, Set\r\nfrom enum import Enum\r\nimport re\r\n\r\nclass CheckSeverity(Enum):\r\n    ERROR = \"error\"\r\n    WARNING = \"warning\"\r\n    INFO = \"info\"\r\n\r\nclass CheckCategory(Enum):\r\n    NAMING = \"naming\"\r\n    PARAMETERS = \"parameters\"\r\n    SPATIAL = \"spatial\"\r\n    CLASSIFICATION = \"classification\"\r\n    GEOMETRY = \"geometry\"\r\n    RELATIONSHIPS = \"relationships\"\r\n\r\n@dataclass\r\nclass ConsistencyIssue:\r\n    element_id: str\r\n    element_name: str\r\n    category: CheckCategory\r\n    severity: CheckSeverity\r\n    rule: str\r\n    message: str\r\n    suggestion: str = \"\"\r\n\r\n@dataclass\r\nclass ConsistencyReport:\r\n    model_name: str\r\n    total_elements: int\r\n    elements_checked: int\r\n    issues: List[ConsistencyIssue]\r\n    issues_by_category: Dict[str, int]\r\n    issues_by_severity: Dict[str, int]\r\n    pass_rate: float\r\n\r\n@dataclass\r\nclass NamingConvention:\r\n    element_type: str\r\n    pattern: str\r\n    description: str\r\n    examples: List[str]\r\n\r\nclass BIMConsistencyChecker:\r\n    \"\"\"Check BIM model consistency and data quality.\"\"\"\r\n\r\n    # Default naming conventions\r\n    DEFAULT_NAMING_RULES = [\r\n        NamingConvention(\r\n            element_type='Level',\r\n            pattern=r'^(L|Level)\\s*\\d{1,2}$|^(B|Basement)\\s*\\d?$|^(R|Roof)$',\r\n            description='Levels should follow L01, Level 1, B1, Roof pattern',\r\n            examples=['L01', 'Level 1', 'B1', 'Roof']\r\n        ),\r\n        NamingConvention(\r\n            element_type='Grid',\r\n            pattern=r'^[A-Z]$|^\\d{1,2}$|^[A-Z]\\.\\d$',\r\n            description='Grids should be single letters (A-Z) or numbers',\r\n            examples=['A', '1', 'A.1']\r\n        ),\r\n        NamingConvention(\r\n            element_type='Room',\r\n            pattern=r'^\\d{3,4}[A-Z]?\\s*-?\\s*.+',\r\n            description='Rooms should have number and name (101 - Office)',\r\n            examples=['101 - Office', '201A Conference']\r\n        ),\r\n        NamingConvention(\r\n            element_type='Wall',\r\n            pattern=r'^(INT|EXT|CW|CMU|GYP)[-_].+',\r\n            description='Walls should have type prefix',\r\n            examples=['INT-GYP-1HR', 'EXT-CMU-8IN']\r\n        ),\r\n        NamingConvention(\r\n            element_type='Door',\r\n            pattern=r'^[A-Z]?\\d{2,3}[A-Z]?$',\r\n            description='Doors should follow type numbering',\r\n            examples=['101', 'A101', '101A']\r\n        ),\r\n    ]\r\n\r\n    # Required parameters by element type\r\n    REQUIRED_PARAMETERS = {\r\n        'Wall': ['Fire Rating', 'Function', 'Structural'],\r\n        'Door': ['Fire Rating', 'Width', 'Height', 'Frame Material'],\r\n        'Room': ['Name', 'Number', 'Area', 'Department'],\r\n        'Window': ['Width', 'Height', 'Glass Type'],\r\n        'Floor': ['Structural', 'Fire Rating'],\r\n        'Ceiling': ['Height', 'Type'],\r\n        'Column': ['Structural Material', 'Shape'],\r\n        'Beam': ['Structural Material', 'Size'],\r\n    }\r\n\r\n    def __init__(self):\r\n        self.naming_rules: List[NamingConvention] = list(self.DEFAULT_NAMING_RULES)\r\n        self.required_params: Dict[str, List[str]] = dict(self.REQUIRED_PARAMETERS)\r\n        self.issues: List[ConsistencyIssue] = []\r\n\r\n    def add_naming_rule(self, rule: NamingConvention):\r\n        \"\"\"Add custom naming convention rule.\"\"\"\r\n        self.naming_rules.append(rule)\r\n\r\n    def set_required_parameters(self, element_type: str, parameters: List[str]):\r\n        \"\"\"Set required parameters for an element type.\"\"\"\r\n        self.required_params[element_type] = parameters\r\n\r\n    def check_model(self, elements: List[Dict]) -> ConsistencyReport:\r\n        \"\"\"Run all consistency checks on model elements.\"\"\"\r\n        self.issues = []\r\n\r\n        for element in elements:\r\n            self._check_naming(element)\r\n            self._check_parameters(element)\r\n            self._check_spatial(element)\r\n            self._check_classification(element)\r\n            self._check_geometry(element)\r\n\r\n        # Cross-element checks\r\n        self._check_relationships(elements)\r\n        self._check_duplicates(elements)\r\n\r\n        # Calculate statistics\r\n        issues_by_category = {}\r\n        issues_by_severity = {}\r\n\r\n        for issue in self.issues:\r\n            cat = issue.category.value\r\n            sev = issue.severity.value\r\n            issues_by_category[cat] = issues_by_category.get(cat, 0) + 1\r\n            issues_by_severity[sev] = issues_by_severity.get(sev, 0) + 1\r\n\r\n        elements_with_issues = len(set(i.element_id for i in self.issues))\r\n        pass_rate = (len(elements) - elements_with_issues) \u002F len(elements) * 100 if elements else 100\r\n\r\n        return ConsistencyReport(\r\n            model_name='Model',\r\n            total_elements=len(elements),\r\n            elements_checked=len(elements),\r\n            issues=self.issues,\r\n            issues_by_category=issues_by_category,\r\n            issues_by_severity=issues_by_severity,\r\n            pass_rate=pass_rate\r\n        )\r\n\r\n    def _check_naming(self, element: Dict):\r\n        \"\"\"Check element naming conventions.\"\"\"\r\n        element_type = element.get('type', '')\r\n        name = element.get('name', '')\r\n        element_id = element.get('id', '')\r\n\r\n        if not name:\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name='(no name)',\r\n                category=CheckCategory.NAMING,\r\n                severity=CheckSeverity.ERROR,\r\n                rule='Name Required',\r\n                message='Element has no name',\r\n                suggestion='Assign a descriptive name following conventions'\r\n            ))\r\n            return\r\n\r\n        # Check against naming rules\r\n        for rule in self.naming_rules:\r\n            if rule.element_type.lower() in element_type.lower():\r\n                if not re.match(rule.pattern, name, re.IGNORECASE):\r\n                    self.issues.append(ConsistencyIssue(\r\n                        element_id=element_id,\r\n                        element_name=name,\r\n                        category=CheckCategory.NAMING,\r\n                        severity=CheckSeverity.WARNING,\r\n                        rule=f'{rule.element_type} Naming',\r\n                        message=f'Name \"{name}\" does not follow convention',\r\n                        suggestion=f'{rule.description}. Examples: {\", \".join(rule.examples)}'\r\n                    ))\r\n\r\n        # Check for special characters\r\n        if re.search(r'[\u003C>:\"\u002F\\\\|?*]', name):\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name=name,\r\n                category=CheckCategory.NAMING,\r\n                severity=CheckSeverity.ERROR,\r\n                rule='Invalid Characters',\r\n                message='Name contains invalid characters',\r\n                suggestion='Remove special characters: \u003C > : \" \u002F \\\\ | ? *'\r\n            ))\r\n\r\n    def _check_parameters(self, element: Dict):\r\n        \"\"\"Check parameter completeness.\"\"\"\r\n        element_type = element.get('type', '')\r\n        element_id = element.get('id', '')\r\n        name = element.get('name', '')\r\n        params = element.get('parameters', {})\r\n\r\n        # Check required parameters\r\n        required = self.required_params.get(element_type, [])\r\n        for param in required:\r\n            if param not in params or params[param] in [None, '', 'None']:\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=element_id,\r\n                    element_name=name,\r\n                    category=CheckCategory.PARAMETERS,\r\n                    severity=CheckSeverity.WARNING,\r\n                    rule='Required Parameter',\r\n                    message=f'Missing required parameter: {param}',\r\n                    suggestion=f'Set value for {param}'\r\n                ))\r\n\r\n        # Check for default\u002Fplaceholder values\r\n        placeholder_values = ['TBD', 'XXX', 'TODO', 'CHANGE', '\u003Cdefault>']\r\n        for param, value in params.items():\r\n            if str(value).upper() in placeholder_values:\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=element_id,\r\n                    element_name=name,\r\n                    category=CheckCategory.PARAMETERS,\r\n                    severity=CheckSeverity.WARNING,\r\n                    rule='Placeholder Value',\r\n                    message=f'Parameter \"{param}\" has placeholder value: {value}',\r\n                    suggestion='Replace with actual value'\r\n                ))\r\n\r\n    def _check_spatial(self, element: Dict):\r\n        \"\"\"Check spatial consistency.\"\"\"\r\n        element_id = element.get('id', '')\r\n        name = element.get('name', '')\r\n        element_type = element.get('type', '')\r\n\r\n        # Check level assignment\r\n        level = element.get('level')\r\n        requires_level = element_type in ['Wall', 'Door', 'Window', 'Room', 'Floor', 'Ceiling']\r\n\r\n        if requires_level and not level:\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name=name,\r\n                category=CheckCategory.SPATIAL,\r\n                severity=CheckSeverity.ERROR,\r\n                rule='Level Assignment',\r\n                message='Element not assigned to a level',\r\n                suggestion='Assign element to appropriate level'\r\n            ))\r\n\r\n        # Check room bounding\r\n        if element_type == 'Wall':\r\n            room_bounding = element.get('room_bounding', True)\r\n            if not room_bounding:\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=element_id,\r\n                    element_name=name,\r\n                    category=CheckCategory.SPATIAL,\r\n                    severity=CheckSeverity.INFO,\r\n                    rule='Room Bounding',\r\n                    message='Wall is not room bounding',\r\n                    suggestion='Verify this is intentional'\r\n                ))\r\n\r\n    def _check_classification(self, element: Dict):\r\n        \"\"\"Check classification codes.\"\"\"\r\n        element_id = element.get('id', '')\r\n        name = element.get('name', '')\r\n        params = element.get('parameters', {})\r\n\r\n        # Check for classification\r\n        classification = params.get('Classification') or params.get('OmniClass') or params.get('UniFormat')\r\n\r\n        if not classification:\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name=name,\r\n                category=CheckCategory.CLASSIFICATION,\r\n                severity=CheckSeverity.INFO,\r\n                rule='Classification Required',\r\n                message='Element has no classification code',\r\n                suggestion='Assign OmniClass, UniFormat, or other classification'\r\n            ))\r\n        else:\r\n            # Validate format\r\n            if not re.match(r'^\\d{2}[-\\s]?\\d{2}[-\\s]?\\d{2}', str(classification)):\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=element_id,\r\n                    element_name=name,\r\n                    category=CheckCategory.CLASSIFICATION,\r\n                    severity=CheckSeverity.WARNING,\r\n                    rule='Classification Format',\r\n                    message=f'Invalid classification format: {classification}',\r\n                    suggestion='Use standard format (XX XX XX)'\r\n                ))\r\n\r\n    def _check_geometry(self, element: Dict):\r\n        \"\"\"Check geometry validity.\"\"\"\r\n        element_id = element.get('id', '')\r\n        name = element.get('name', '')\r\n        geometry = element.get('geometry', {})\r\n\r\n        # Check for zero area\u002Fvolume\r\n        area = geometry.get('area', 0)\r\n        volume = geometry.get('volume', 0)\r\n\r\n        if area == 0 and volume == 0 and element.get('type') not in ['Grid', 'Level', 'ReferencePlane']:\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name=name,\r\n                category=CheckCategory.GEOMETRY,\r\n                severity=CheckSeverity.ERROR,\r\n                rule='Zero Geometry',\r\n                message='Element has zero area and volume',\r\n                suggestion='Check element geometry is valid'\r\n            ))\r\n\r\n        # Check for extremely small elements\r\n        if 0 \u003C area \u003C 0.01:  # Less than 0.01 m² or ft²\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name=name,\r\n                category=CheckCategory.GEOMETRY,\r\n                severity=CheckSeverity.WARNING,\r\n                rule='Tiny Element',\r\n                message=f'Element has very small area: {area}',\r\n                suggestion='Verify element is intentional and not a modeling error'\r\n            ))\r\n\r\n    def _check_relationships(self, elements: List[Dict]):\r\n        \"\"\"Check cross-element relationships.\"\"\"\r\n        # Build lookup\r\n        elements_by_id = {e['id']: e for e in elements}\r\n        elements_by_type = {}\r\n        for e in elements:\r\n            t = e.get('type', '')\r\n            if t not in elements_by_type:\r\n                elements_by_type[t] = []\r\n            elements_by_type[t].append(e)\r\n\r\n        # Check door-wall relationships\r\n        for door in elements_by_type.get('Door', []):\r\n            host_wall = door.get('host_id')\r\n            if host_wall and host_wall not in elements_by_id:\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=door['id'],\r\n                    element_name=door.get('name', ''),\r\n                    category=CheckCategory.RELATIONSHIPS,\r\n                    severity=CheckSeverity.ERROR,\r\n                    rule='Invalid Host',\r\n                    message=f'Door references non-existent wall: {host_wall}',\r\n                    suggestion='Rehost door to valid wall'\r\n                ))\r\n\r\n        # Check room enclosure\r\n        for room in elements_by_type.get('Room', []):\r\n            if not room.get('is_bounded', True):\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=room['id'],\r\n                    element_name=room.get('name', ''),\r\n                    category=CheckCategory.RELATIONSHIPS,\r\n                    severity=CheckSeverity.ERROR,\r\n                    rule='Unbounded Room',\r\n                    message='Room is not properly bounded',\r\n                    suggestion='Check room boundary walls'\r\n                ))\r\n\r\n    def _check_duplicates(self, elements: List[Dict]):\r\n        \"\"\"Check for duplicate elements.\"\"\"\r\n        seen: Dict[str, List[Dict]] = {}\r\n\r\n        for element in elements:\r\n            # Create signature for duplicate detection\r\n            sig_parts = [\r\n                element.get('type', ''),\r\n                str(element.get('geometry', {}).get('location', '')),\r\n                element.get('name', '')\r\n            ]\r\n            signature = '|'.join(sig_parts)\r\n\r\n            if signature in seen:\r\n                for dup in seen[signature]:\r\n                    self.issues.append(ConsistencyIssue(\r\n                        element_id=element['id'],\r\n                        element_name=element.get('name', ''),\r\n                        category=CheckCategory.RELATIONSHIPS,\r\n                        severity=CheckSeverity.WARNING,\r\n                        rule='Duplicate Element',\r\n                        message=f'Possible duplicate of element {dup[\"id\"]}',\r\n                        suggestion='Review and remove duplicate if confirmed'\r\n                    ))\r\n\r\n            if signature not in seen:\r\n                seen[signature] = []\r\n            seen[signature].append(element)\r\n\r\n    def generate_report(self, report: ConsistencyReport) -> str:\r\n        \"\"\"Generate consistency check report.\"\"\"\r\n        lines = [\"# BIM Consistency Check Report\", \"\"]\r\n        lines.append(f\"**Model:** {report.model_name}\")\r\n        lines.append(f\"**Elements Checked:** {report.elements_checked}\")\r\n        lines.append(f\"**Pass Rate:** {report.pass_rate:.1f}%\")\r\n        lines.append(\"\")\r\n\r\n        # Summary\r\n        lines.append(\"## Summary\")\r\n        lines.append(f\"- **Total Issues:** {len(report.issues)}\")\r\n        lines.append(f\"- Errors: {report.issues_by_severity.get('error', 0)}\")\r\n        lines.append(f\"- Warnings: {report.issues_by_severity.get('warning', 0)}\")\r\n        lines.append(f\"- Info: {report.issues_by_severity.get('info', 0)}\")\r\n        lines.append(\"\")\r\n\r\n        # By category\r\n        lines.append(\"## Issues by Category\")\r\n        for cat, count in sorted(report.issues_by_category.items()):\r\n            lines.append(f\"- {cat}: {count}\")\r\n        lines.append(\"\")\r\n\r\n        # Critical issues\r\n        errors = [i for i in report.issues if i.severity == CheckSeverity.ERROR]\r\n        if errors:\r\n            lines.append(\"## Critical Issues (Errors)\")\r\n            for issue in errors[:20]:\r\n                lines.append(f\"\\n### {issue.element_name} ({issue.element_id})\")\r\n                lines.append(f\"- **Rule:** {issue.rule}\")\r\n                lines.append(f\"- **Issue:** {issue.message}\")\r\n                lines.append(f\"- **Fix:** {issue.suggestion}\")\r\n\r\n        return \"\\n\".join(lines)\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\n# Initialize checker\r\nchecker = BIMConsistencyChecker()\r\n\r\n# Sample model elements\r\nelements = [\r\n    {\r\n        'id': 'wall-001',\r\n        'type': 'Wall',\r\n        'name': 'INT-GYP-1HR',\r\n        'level': 'Level 1',\r\n        'parameters': {'Fire Rating': '1 Hour', 'Function': 'Interior'},\r\n        'geometry': {'area': 50.5}\r\n    },\r\n    {\r\n        'id': 'door-001',\r\n        'type': 'Door',\r\n        'name': '101',\r\n        'level': 'Level 1',\r\n        'host_id': 'wall-001',\r\n        'parameters': {'Width': 36, 'Height': 84}\r\n    }\r\n]\r\n\r\n# Run checks\r\nreport = checker.check_model(elements)\r\n\r\nprint(f\"Pass Rate: {report.pass_rate:.1f}%\")\r\nprint(f\"Issues Found: {len(report.issues)}\")\r\n\r\n# Generate report\r\nprint(checker.generate_report(report))\r\n```\r\n\r\n## Dependencies\r\n\r\n```bash\r\npip install (no external dependencies)\r\n```\r\n","# BIM Consistency Checker for Construction\r\n\r\n## Overview\r\n\r\nValidate BIM model consistency including naming conventions, parameter completeness, spatial relationships, classification compliance, and cross-reference integrity.\r\n\r\n## Business Case\r\n\r\nBIM consistency checking ensures:\r\n- **Data Quality**: Complete and accurate model data\r\n- **Interoperability**: Models work across platforms\r\n- **Coordination**: Consistent information for all trades\r\n- **Deliverable Compliance**: Meet BIM execution plan requirements\r\n\r\n## Technical Implementation\r\n\r\n```python\r\nfrom dataclasses import dataclass, field\r\nfrom typing import List, Dict, Any, Optional, Set\r\nfrom enum import Enum\r\nimport re\r\n\r\nclass CheckSeverity(Enum):\r\n    ERROR = \"error\"\r\n    WARNING = \"warning\"\r\n    INFO = \"info\"\r\n\r\nclass CheckCategory(Enum):\r\n    NAMING = \"naming\"\r\n    PARAMETERS = \"parameters\"\r\n    SPATIAL = \"spatial\"\r\n    CLASSIFICATION = \"classification\"\r\n    GEOMETRY = \"geometry\"\r\n    RELATIONSHIPS = \"relationships\"\r\n\r\n@dataclass\r\nclass ConsistencyIssue:\r\n    element_id: str\r\n    element_name: str\r\n    category: CheckCategory\r\n    severity: CheckSeverity\r\n    rule: str\r\n    message: str\r\n    suggestion: str = \"\"\r\n\r\n@dataclass\r\nclass ConsistencyReport:\r\n    model_name: str\r\n    total_elements: int\r\n    elements_checked: int\r\n    issues: List[ConsistencyIssue]\r\n    issues_by_category: Dict[str, int]\r\n    issues_by_severity: Dict[str, int]\r\n    pass_rate: float\r\n\r\n@dataclass\r\nclass NamingConvention:\r\n    element_type: str\r\n    pattern: str\r\n    description: str\r\n    examples: List[str]\r\n\r\nclass BIMConsistencyChecker:\r\n    \"\"\"Check BIM model consistency and data quality.\"\"\"\r\n\r\n    # Default naming conventions\r\n    DEFAULT_NAMING_RULES = [\r\n        NamingConvention(\r\n            element_type='Level',\r\n            pattern=r'^(L|Level)\\s*\\d{1,2}$|^(B|Basement)\\s*\\d?$|^(R|Roof)$',\r\n            description='Levels should follow L01, Level 1, B1, Roof pattern',\r\n            examples=['L01', 'Level 1', 'B1', 'Roof']\r\n        ),\r\n        NamingConvention(\r\n            element_type='Grid',\r\n            pattern=r'^[A-Z]$|^\\d{1,2}$|^[A-Z]\\.\\d$',\r\n            description='Grids should be single letters (A-Z) or numbers',\r\n            examples=['A', '1', 'A.1']\r\n        ),\r\n        NamingConvention(\r\n            element_type='Room',\r\n            pattern=r'^\\d{3,4}[A-Z]?\\s*-?\\s*.+',\r\n            description='Rooms should have number and name (101 - Office)',\r\n            examples=['101 - Office', '201A Conference']\r\n        ),\r\n        NamingConvention(\r\n            element_type='Wall',\r\n            pattern=r'^(INT|EXT|CW|CMU|GYP)[-_].+',\r\n            description='Walls should have type prefix',\r\n            examples=['INT-GYP-1HR', 'EXT-CMU-8IN']\r\n        ),\r\n        NamingConvention(\r\n            element_type='Door',\r\n            pattern=r'^[A-Z]?\\d{2,3}[A-Z]?$',\r\n            description='Doors should follow type numbering',\r\n            examples=['101', 'A101', '101A']\r\n        ),\r\n    ]\r\n\r\n    # Required parameters by element type\r\n    REQUIRED_PARAMETERS = {\r\n        'Wall': ['Fire Rating', 'Function', 'Structural'],\r\n        'Door': ['Fire Rating', 'Width', 'Height', 'Frame Material'],\r\n        'Room': ['Name', 'Number', 'Area', 'Department'],\r\n        'Window': ['Width', 'Height', 'Glass Type'],\r\n        'Floor': ['Structural', 'Fire Rating'],\r\n        'Ceiling': ['Height', 'Type'],\r\n        'Column': ['Structural Material', 'Shape'],\r\n        'Beam': ['Structural Material', 'Size'],\r\n    }\r\n\r\n    def __init__(self):\r\n        self.naming_rules: List[NamingConvention] = list(self.DEFAULT_NAMING_RULES)\r\n        self.required_params: Dict[str, List[str]] = dict(self.REQUIRED_PARAMETERS)\r\n        self.issues: List[ConsistencyIssue] = []\r\n\r\n    def add_naming_rule(self, rule: NamingConvention):\r\n        \"\"\"Add custom naming convention rule.\"\"\"\r\n        self.naming_rules.append(rule)\r\n\r\n    def set_required_parameters(self, element_type: str, parameters: List[str]):\r\n        \"\"\"Set required parameters for an element type.\"\"\"\r\n        self.required_params[element_type] = parameters\r\n\r\n    def check_model(self, elements: List[Dict]) -> ConsistencyReport:\r\n        \"\"\"Run all consistency checks on model elements.\"\"\"\r\n        self.issues = []\r\n\r\n        for element in elements:\r\n            self._check_naming(element)\r\n            self._check_parameters(element)\r\n            self._check_spatial(element)\r\n            self._check_classification(element)\r\n            self._check_geometry(element)\r\n\r\n        # Cross-element checks\r\n        self._check_relationships(elements)\r\n        self._check_duplicates(elements)\r\n\r\n        # Calculate statistics\r\n        issues_by_category = {}\r\n        issues_by_severity = {}\r\n\r\n        for issue in self.issues:\r\n            cat = issue.category.value\r\n            sev = issue.severity.value\r\n            issues_by_category[cat] = issues_by_category.get(cat, 0) + 1\r\n            issues_by_severity[sev] = issues_by_severity.get(sev, 0) + 1\r\n\r\n        elements_with_issues = len(set(i.element_id for i in self.issues))\r\n        pass_rate = (len(elements) - elements_with_issues) \u002F len(elements) * 100 if elements else 100\r\n\r\n        return ConsistencyReport(\r\n            model_name='Model',\r\n            total_elements=len(elements),\r\n            elements_checked=len(elements),\r\n            issues=self.issues,\r\n            issues_by_category=issues_by_category,\r\n            issues_by_severity=issues_by_severity,\r\n            pass_rate=pass_rate\r\n        )\r\n\r\n    def _check_naming(self, element: Dict):\r\n        \"\"\"Check element naming conventions.\"\"\"\r\n        element_type = element.get('type', '')\r\n        name = element.get('name', '')\r\n        element_id = element.get('id', '')\r\n\r\n        if not name:\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name='(no name)',\r\n                category=CheckCategory.NAMING,\r\n                severity=CheckSeverity.ERROR,\r\n                rule='Name Required',\r\n                message='Element has no name',\r\n                suggestion='Assign a descriptive name following conventions'\r\n            ))\r\n            return\r\n\r\n        # Check against naming rules\r\n        for rule in self.naming_rules:\r\n            if rule.element_type.lower() in element_type.lower():\r\n                if not re.match(rule.pattern, name, re.IGNORECASE):\r\n                    self.issues.append(ConsistencyIssue(\r\n                        element_id=element_id,\r\n                        element_name=name,\r\n                        category=CheckCategory.NAMING,\r\n                        severity=CheckSeverity.WARNING,\r\n                        rule=f'{rule.element_type} Naming',\r\n                        message=f'Name \"{name}\" does not follow convention',\r\n                        suggestion=f'{rule.description}. Examples: {\", \".join(rule.examples)}'\r\n                    ))\r\n\r\n        # Check for special characters\r\n        if re.search(r'[\u003C>:\"\u002F\\\\|?*]', name):\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name=name,\r\n                category=CheckCategory.NAMING,\r\n                severity=CheckSeverity.ERROR,\r\n                rule='Invalid Characters',\r\n                message='Name contains invalid characters',\r\n                suggestion='Remove special characters: \u003C > : \" \u002F \\\\ | ? *'\r\n            ))\r\n\r\n    def _check_parameters(self, element: Dict):\r\n        \"\"\"Check parameter completeness.\"\"\"\r\n        element_type = element.get('type', '')\r\n        element_id = element.get('id', '')\r\n        name = element.get('name', '')\r\n        params = element.get('parameters', {})\r\n\r\n        # Check required parameters\r\n        required = self.required_params.get(element_type, [])\r\n        for param in required:\r\n            if param not in params or params[param] in [None, '', 'None']:\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=element_id,\r\n                    element_name=name,\r\n                    category=CheckCategory.PARAMETERS,\r\n                    severity=CheckSeverity.WARNING,\r\n                    rule='Required Parameter',\r\n                    message=f'Missing required parameter: {param}',\r\n                    suggestion=f'Set value for {param}'\r\n                ))\r\n\r\n        # Check for default\u002Fplaceholder values\r\n        placeholder_values = ['TBD', 'XXX', 'TODO', 'CHANGE', '\u003Cdefault>']\r\n        for param, value in params.items():\r\n            if str(value).upper() in placeholder_values:\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=element_id,\r\n                    element_name=name,\r\n                    category=CheckCategory.PARAMETERS,\r\n                    severity=CheckSeverity.WARNING,\r\n                    rule='Placeholder Value',\r\n                    message=f'Parameter \"{param}\" has placeholder value: {value}',\r\n                    suggestion='Replace with actual value'\r\n                ))\r\n\r\n    def _check_spatial(self, element: Dict):\r\n        \"\"\"Check spatial consistency.\"\"\"\r\n        element_id = element.get('id', '')\r\n        name = element.get('name', '')\r\n        element_type = element.get('type', '')\r\n\r\n        # Check level assignment\r\n        level = element.get('level')\r\n        requires_level = element_type in ['Wall', 'Door', 'Window', 'Room', 'Floor', 'Ceiling']\r\n\r\n        if requires_level and not level:\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name=name,\r\n                category=CheckCategory.SPATIAL,\r\n                severity=CheckSeverity.ERROR,\r\n                rule='Level Assignment',\r\n                message='Element not assigned to a level',\r\n                suggestion='Assign element to appropriate level'\r\n            ))\r\n\r\n        # Check room bounding\r\n        if element_type == 'Wall':\r\n            room_bounding = element.get('room_bounding', True)\r\n            if not room_bounding:\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=element_id,\r\n                    element_name=name,\r\n                    category=CheckCategory.SPATIAL,\r\n                    severity=CheckSeverity.INFO,\r\n                    rule='Room Bounding',\r\n                    message='Wall is not room bounding',\r\n                    suggestion='Verify this is intentional'\r\n                ))\r\n\r\n    def _check_classification(self, element: Dict):\r\n        \"\"\"Check classification codes.\"\"\"\r\n        element_id = element.get('id', '')\r\n        name = element.get('name', '')\r\n        params = element.get('parameters', {})\r\n\r\n        # Check for classification\r\n        classification = params.get('Classification') or params.get('OmniClass') or params.get('UniFormat')\r\n\r\n        if not classification:\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name=name,\r\n                category=CheckCategory.CLASSIFICATION,\r\n                severity=CheckSeverity.INFO,\r\n                rule='Classification Required',\r\n                message='Element has no classification code',\r\n                suggestion='Assign OmniClass, UniFormat, or other classification'\r\n            ))\r\n        else:\r\n            # Validate format\r\n            if not re.match(r'^\\d{2}[-\\s]?\\d{2}[-\\s]?\\d{2}', str(classification)):\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=element_id,\r\n                    element_name=name,\r\n                    category=CheckCategory.CLASSIFICATION,\r\n                    severity=CheckSeverity.WARNING,\r\n                    rule='Classification Format',\r\n                    message=f'Invalid classification format: {classification}',\r\n                    suggestion='Use standard format (XX XX XX)'\r\n                ))\r\n\r\n    def _check_geometry(self, element: Dict):\r\n        \"\"\"Check geometry validity.\"\"\"\r\n        element_id = element.get('id', '')\r\n        name = element.get('name', '')\r\n        geometry = element.get('geometry', {})\r\n\r\n        # Check for zero area\u002Fvolume\r\n        area = geometry.get('area', 0)\r\n        volume = geometry.get('volume', 0)\r\n\r\n        if area == 0 and volume == 0 and element.get('type') not in ['Grid', 'Level', 'ReferencePlane']:\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name=name,\r\n                category=CheckCategory.GEOMETRY,\r\n                severity=CheckSeverity.ERROR,\r\n                rule='Zero Geometry',\r\n                message='Element has zero area and volume',\r\n                suggestion='Check element geometry is valid'\r\n            ))\r\n\r\n        # Check for extremely small elements\r\n        if 0 \u003C area \u003C 0.01:  # Less than 0.01 m² or ft²\r\n            self.issues.append(ConsistencyIssue(\r\n                element_id=element_id,\r\n                element_name=name,\r\n                category=CheckCategory.GEOMETRY,\r\n                severity=CheckSeverity.WARNING,\r\n                rule='Tiny Element',\r\n                message=f'Element has very small area: {area}',\r\n                suggestion='Verify element is intentional and not a modeling error'\r\n            ))\r\n\r\n    def _check_relationships(self, elements: List[Dict]):\r\n        \"\"\"Check cross-element relationships.\"\"\"\r\n        # Build lookup\r\n        elements_by_id = {e['id']: e for e in elements}\r\n        elements_by_type = {}\r\n        for e in elements:\r\n            t = e.get('type', '')\r\n            if t not in elements_by_type:\r\n                elements_by_type[t] = []\r\n            elements_by_type[t].append(e)\r\n\r\n        # Check door-wall relationships\r\n        for door in elements_by_type.get('Door', []):\r\n            host_wall = door.get('host_id')\r\n            if host_wall and host_wall not in elements_by_id:\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=door['id'],\r\n                    element_name=door.get('name', ''),\r\n                    category=CheckCategory.RELATIONSHIPS,\r\n                    severity=CheckSeverity.ERROR,\r\n                    rule='Invalid Host',\r\n                    message=f'Door references non-existent wall: {host_wall}',\r\n                    suggestion='Rehost door to valid wall'\r\n                ))\r\n\r\n        # Check room enclosure\r\n        for room in elements_by_type.get('Room', []):\r\n            if not room.get('is_bounded', True):\r\n                self.issues.append(ConsistencyIssue(\r\n                    element_id=room['id'],\r\n                    element_name=room.get('name', ''),\r\n                    category=CheckCategory.RELATIONSHIPS,\r\n                    severity=CheckSeverity.ERROR,\r\n                    rule='Unbounded Room',\r\n                    message='Room is not properly bounded',\r\n                    suggestion='Check room boundary walls'\r\n                ))\r\n\r\n    def _check_duplicates(self, elements: List[Dict]):\r\n        \"\"\"Check for duplicate elements.\"\"\"\r\n        seen: Dict[str, List[Dict]] = {}\r\n\r\n        for element in elements:\r\n            # Create signature for duplicate detection\r\n            sig_parts = [\r\n                element.get('type', ''),\r\n                str(element.get('geometry', {}).get('location', '')),\r\n                element.get('name', '')\r\n            ]\r\n            signature = '|'.join(sig_parts)\r\n\r\n            if signature in seen:\r\n                for dup in seen[signature]:\r\n                    self.issues.append(ConsistencyIssue(\r\n                        element_id=element['id'],\r\n                        element_name=element.get('name', ''),\r\n                        category=CheckCategory.RELATIONSHIPS,\r\n                        severity=CheckSeverity.WARNING,\r\n                        rule='Duplicate Element',\r\n                        message=f'Possible duplicate of element {dup[\"id\"]}',\r\n                        suggestion='Review and remove duplicate if confirmed'\r\n                    ))\r\n\r\n            if signature not in seen:\r\n                seen[signature] = []\r\n            seen[signature].append(element)\r\n\r\n    def generate_report(self, report: ConsistencyReport) -> str:\r\n        \"\"\"Generate consistency check report.\"\"\"\r\n        lines = [\"# BIM Consistency Check Report\", \"\"]\r\n        lines.append(f\"**Model:** {report.model_name}\")\r\n        lines.append(f\"**Elements Checked:** {report.elements_checked}\")\r\n        lines.append(f\"**Pass Rate:** {report.pass_rate:.1f}%\")\r\n        lines.append(\"\")\r\n\r\n        # Summary\r\n        lines.append(\"## Summary\")\r\n        lines.append(f\"- **Total Issues:** {len(report.issues)}\")\r\n        lines.append(f\"- Errors: {report.issues_by_severity.get('error', 0)}\")\r\n        lines.append(f\"- Warnings: {report.issues_by_severity.get('warning', 0)}\")\r\n        lines.append(f\"- Info: {report.issues_by_severity.get('info', 0)}\")\r\n        lines.append(\"\")\r\n\r\n        # By category\r\n        lines.append(\"## Issues by Category\")\r\n        for cat, count in sorted(report.issues_by_category.items()):\r\n            lines.append(f\"- {cat}: {count}\")\r\n        lines.append(\"\")\r\n\r\n        # Critical issues\r\n        errors = [i for i in report.issues if i.severity == CheckSeverity.ERROR]\r\n        if errors:\r\n            lines.append(\"## Critical Issues (Errors)\")\r\n            for issue in errors[:20]:\r\n                lines.append(f\"\\n### {issue.element_name} ({issue.element_id})\")\r\n                lines.append(f\"- **Rule:** {issue.rule}\")\r\n                lines.append(f\"- **Issue:** {issue.message}\")\r\n                lines.append(f\"- **Fix:** {issue.suggestion}\")\r\n\r\n        return \"\\n\".join(lines)\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\n# Initialize checker\r\nchecker = BIMConsistencyChecker()\r\n\r\n# Sample model elements\r\nelements = [\r\n    {\r\n        'id': 'wall-001',\r\n        'type': 'Wall',\r\n        'name': 'INT-GYP-1HR',\r\n        'level': 'Level 1',\r\n        'parameters': {'Fire Rating': '1 Hour', 'Function': 'Interior'},\r\n        'geometry': {'area': 50.5}\r\n    },\r\n    {\r\n        'id': 'door-001',\r\n        'type': 'Door',\r\n        'name': '101',\r\n        'level': 'Level 1',\r\n        'host_id': 'wall-001',\r\n        'parameters': {'Width': 36, 'Height': 84}\r\n    }\r\n]\r\n\r\n# Run checks\r\nreport = checker.check_model(elements)\r\n\r\nprint(f\"Pass Rate: {report.pass_rate:.1f}%\")\r\nprint(f\"Issues Found: {len(report.issues)}\")\r\n\r\n# Generate report\r\nprint(checker.generate_report(report))\r\n```\r\n\r\n## Dependencies\r\n\r\n```bash\r\npip install (no external dependencies)\r\n```\r\n",{"slug":5,"description":7,"display_name":37},"BIM Consistency Checker","main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fdatadrivenconstruction\u002Fbim-consistency-checker",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":8,"skillName":5,"commands":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add kbarbel640-del\u002Fskills --skill bim-consistency-checker",{"tool":51,"command":52},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill bim-consistency-checker",{"tool":54,"command":55},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill bim-consistency-checker","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002Fbim-consistency-checker\u002FSKILL.md",true,[59],{"path":60,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":63,"sourceHtmlUrl":64},"_meta.json","REFERENCE","参考文档",314,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002Fbim-consistency-checker\u002F_meta.json",[66,97,126,147,153,173],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":77,"publishedAt":32},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[72],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96],"crowd prompting","prompting","api","with","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","https","content","ai agents",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":108,"publishedAt":32},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[103],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[109,80,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,85,125],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":135,"publishedAt":32},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[132],{"categoryNo":133,"categoryName":134,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000021","资料检索与研究",[136,137,138,139,140,141,142,81,143,123,125,144,80,145,146],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http","via",{"skillNo":148,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":152,"publishedAt":32},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[151],{"categoryNo":133,"categoryName":134,"taxonomyType":106,"taxonomyTypeDesc":107},[139,138,137,136,146,141,142,81,140,123,125,143,144,80,145],{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":32},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[160,161,162,163,164,165,166,167,168,169,170,171,172],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":183,"publishedAt":32},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[179,180],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},{"categoryNo":181,"categoryName":182,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000037","律师与法务",[184,185,186,187,81,188,189,38,190,144,23,191,192,193,194,94,195,196,197],"agent constitution","constitution","contracts","tree","query","base","log","Rules","projects","compliance","actions","state","governance","github"]