[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FJG18P5KH587P9XRM0T3F2":3,"skill-same:01M6FJG18P5KH587P9XRM0T3F2":64},{"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":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":40,"repositoryHtmlUrl":41,"repositoryHomepageUrl":6,"ownerHtmlUrl":42,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":43,"install":44,"resources":57},"01M6FJG18P5KH587P9XRM0T3F2","4d-simulation",null,"Create 4D construction simulations by linking BIM elements to project schedules. Generate time-based visualizations, sequence analysis, and construction phasing with Gantt integration.","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\u002F4d-simulation\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30],"simulation","4d simulation","create","generate","integration","analysis","visualizations","time","project","elements","phasing","sequence analysis","with","2026-11-10 10:12:30",false,"---\r\nslug: \"4d-simulation\"\r\ndisplay_name: \"4D Simulation\"\r\ndescription: \"Create 4D construction simulations by linking BIM elements to project schedules. Generate time-based visualizations, sequence analysis, and construction phasing with Gantt integration.\"\r\n---\r\n\r\n# 4D Simulation for Construction\r\n\r\n## Overview\r\n\r\nBased on DDC methodology (Chapter 3.3), this skill implements 4D BIM simulations - linking 3D model elements to the 4th dimension: time. Visualize construction sequences, detect scheduling conflicts, and optimize work phasing.\r\n\r\n**Book Reference:** \"4D, 6D-8D и расчет CO2\" \u002F \"4D-8D BIM and CO2 Calculation\"\r\n\r\n> \"4D моделирование позволяет визуализировать последовательность строительства и выявлять конфликты на этапе планирования.\"\r\n> — DDC Book, Chapter 3.3\r\n\r\n## Quick Start\r\n\r\n```python\r\nimport pandas as pd\r\nfrom datetime import datetime, timedelta\r\n\r\n# BIM elements with schedule data\r\nelements = pd.DataFrame({\r\n    'ElementId': ['E001', 'E002', 'E003', 'E004'],\r\n    'Category': ['Foundation', 'Column', 'Beam', 'Slab'],\r\n    'Level': ['Level 0', 'Level 1', 'Level 1', 'Level 1'],\r\n    'Start_Date': ['2024-01-01', '2024-01-15', '2024-02-01', '2024-02-15'],\r\n    'End_Date': ['2024-01-14', '2024-01-31', '2024-02-14', '2024-02-28'],\r\n    'Phase': ['Structure', 'Structure', 'Structure', 'Structure']\r\n})\r\n\r\nelements['Start_Date'] = pd.to_datetime(elements['Start_Date'])\r\nelements['End_Date'] = pd.to_datetime(elements['End_Date'])\r\nelements['Duration_Days'] = (elements['End_Date'] - elements['Start_Date']).dt.days\r\n\r\n# Get elements active on a specific date\r\ntarget_date = pd.to_datetime('2024-01-20')\r\nactive_elements = elements[\r\n    (elements['Start_Date'] \u003C= target_date) &\r\n    (elements['End_Date'] >= target_date)\r\n]\r\nprint(f\"Elements under construction on {target_date.date()}:\")\r\nprint(active_elements[['ElementId', 'Category']])\r\n```\r\n\r\n## 4D Data Model\r\n\r\n### Schedule-Element Linking\r\n\r\n```python\r\nimport pandas as pd\r\nimport numpy as np\r\nfrom datetime import datetime, timedelta\r\nfrom typing import List, Dict, Optional\r\n\r\nclass ScheduleElementLinker:\r\n    \"\"\"Link BIM elements to schedule activities\"\"\"\r\n\r\n    def __init__(self, elements_df: pd.DataFrame, schedule_df: pd.DataFrame):\r\n        self.elements = elements_df.copy()\r\n        self.schedule = schedule_df.copy()\r\n        self.links = pd.DataFrame()\r\n\r\n    def auto_link_by_category(self, mapping: Dict[str, str]):\r\n        \"\"\"Auto-link elements to activities by category mapping\r\n\r\n        Args:\r\n            mapping: Dict mapping element categories to activity names\r\n                     e.g., {'Wall': 'Structural Walls', 'Slab': 'Floor Construction'}\r\n        \"\"\"\r\n        links = []\r\n\r\n        for category, activity_name in mapping.items():\r\n            # Find elements of this category\r\n            category_elements = self.elements[\r\n                self.elements['Category'] == category\r\n            ]['ElementId'].tolist()\r\n\r\n            # Find matching activity\r\n            activity = self.schedule[\r\n                self.schedule['Activity'].str.contains(activity_name, case=False)\r\n            ]\r\n\r\n            if not activity.empty and category_elements:\r\n                for elem_id in category_elements:\r\n                    links.append({\r\n                        'ElementId': elem_id,\r\n                        'ActivityId': activity.iloc[0]['ActivityId'],\r\n                        'Activity': activity.iloc[0]['Activity'],\r\n                        'Start_Date': activity.iloc[0]['Start_Date'],\r\n                        'End_Date': activity.iloc[0]['End_Date']\r\n                    })\r\n\r\n        self.links = pd.DataFrame(links)\r\n        return self.links\r\n\r\n    def auto_link_by_level(self):\r\n        \"\"\"Auto-link elements based on level and construction sequence\"\"\"\r\n        # Get unique levels in order\r\n        levels = sorted(self.elements['Level'].unique())\r\n\r\n        links = []\r\n        for i, level in enumerate(levels):\r\n            level_elements = self.elements[self.elements['Level'] == level]\r\n\r\n            # Find activity for this level\r\n            level_activity = self.schedule[\r\n                self.schedule['Activity'].str.contains(level, case=False)\r\n            ]\r\n\r\n            if not level_activity.empty:\r\n                for _, elem in level_elements.iterrows():\r\n                    links.append({\r\n                        'ElementId': elem['ElementId'],\r\n                        'ActivityId': level_activity.iloc[0]['ActivityId'],\r\n                        'Activity': level_activity.iloc[0]['Activity'],\r\n                        'Start_Date': level_activity.iloc[0]['Start_Date'],\r\n                        'End_Date': level_activity.iloc[0]['End_Date']\r\n                    })\r\n\r\n        self.links = pd.DataFrame(links)\r\n        return self.links\r\n\r\n    def manual_link(self, element_id: str, activity_id: str):\r\n        \"\"\"Manually link element to activity\"\"\"\r\n        element = self.elements[self.elements['ElementId'] == element_id]\r\n        activity = self.schedule[self.schedule['ActivityId'] == activity_id]\r\n\r\n        if element.empty or activity.empty:\r\n            raise ValueError(\"Element or activity not found\")\r\n\r\n        new_link = pd.DataFrame([{\r\n            'ElementId': element_id,\r\n            'ActivityId': activity_id,\r\n            'Activity': activity.iloc[0]['Activity'],\r\n            'Start_Date': activity.iloc[0]['Start_Date'],\r\n            'End_Date': activity.iloc[0]['End_Date']\r\n        }])\r\n\r\n        self.links = pd.concat([self.links, new_link], ignore_index=True)\r\n        return self.links\r\n\r\n    def get_linked_elements(self):\r\n        \"\"\"Get elements with schedule data\"\"\"\r\n        return self.elements.merge(\r\n            self.links[['ElementId', 'ActivityId', 'Start_Date', 'End_Date']],\r\n            on='ElementId',\r\n            how='left'\r\n        )\r\n```\r\n\r\n### 4D Simulation Engine\r\n\r\n```python\r\nclass Simulation4D:\r\n    \"\"\"4D construction simulation engine\"\"\"\r\n\r\n    def __init__(self, linked_elements: pd.DataFrame):\r\n        self.elements = linked_elements.copy()\r\n        self.elements['Start_Date'] = pd.to_datetime(self.elements['Start_Date'])\r\n        self.elements['End_Date'] = pd.to_datetime(self.elements['End_Date'])\r\n\r\n        self.project_start = self.elements['Start_Date'].min()\r\n        self.project_end = self.elements['End_Date'].max()\r\n\r\n    def get_state_at_date(self, target_date: datetime) -> pd.DataFrame:\r\n        \"\"\"Get element states at a specific date\"\"\"\r\n        target = pd.to_datetime(target_date)\r\n\r\n        # Determine state for each element\r\n        conditions = [\r\n            target \u003C self.elements['Start_Date'],  # Not started\r\n            (self.elements['Start_Date'] \u003C= target) & (target \u003C= self.elements['End_Date']),  # In progress\r\n            target > self.elements['End_Date']  # Completed\r\n        ]\r\n        choices = ['not_started', 'in_progress', 'completed']\r\n\r\n        self.elements['State'] = np.select(conditions, choices, default='unknown')\r\n\r\n        return self.elements.copy()\r\n\r\n    def generate_timeline(self, interval_days: int = 7) -> List[Dict]:\r\n        \"\"\"Generate timeline snapshots\"\"\"\r\n        timeline = []\r\n        current_date = self.project_start\r\n\r\n        while current_date \u003C= self.project_end:\r\n            state = self.get_state_at_date(current_date)\r\n\r\n            snapshot = {\r\n                'date': current_date,\r\n                'not_started': len(state[state['State'] == 'not_started']),\r\n                'in_progress': len(state[state['State'] == 'in_progress']),\r\n                'completed': len(state[state['State'] == 'completed']),\r\n                'total': len(state)\r\n            }\r\n            snapshot['progress_pct'] = (snapshot['completed'] \u002F snapshot['total']) * 100\r\n\r\n            timeline.append(snapshot)\r\n            current_date += timedelta(days=interval_days)\r\n\r\n        return timeline\r\n\r\n    def get_elements_in_progress(self, target_date: datetime) -> pd.DataFrame:\r\n        \"\"\"Get elements currently under construction\"\"\"\r\n        state = self.get_state_at_date(target_date)\r\n        return state[state['State'] == 'in_progress']\r\n\r\n    def analyze_construction_sequence(self) -> pd.DataFrame:\r\n        \"\"\"Analyze construction sequence by category and level\"\"\"\r\n        sequence = self.elements.groupby(['Level', 'Category']).agg({\r\n            'Start_Date': 'min',\r\n            'End_Date': 'max',\r\n            'ElementId': 'count'\r\n        }).rename(columns={'ElementId': 'Element_Count'})\r\n\r\n        sequence['Duration_Days'] = (sequence['End_Date'] - sequence['Start_Date']).dt.days\r\n        sequence = sequence.sort_values('Start_Date').reset_index()\r\n\r\n        return sequence\r\n\r\n    def detect_parallel_work(self) -> pd.DataFrame:\r\n        \"\"\"Detect work happening in parallel\"\"\"\r\n        dates = pd.date_range(self.project_start, self.project_end, freq='D')\r\n        parallel_work = []\r\n\r\n        for date in dates:\r\n            state = self.get_state_at_date(date)\r\n            in_progress = state[state['State'] == 'in_progress']\r\n\r\n            if len(in_progress) > 1:\r\n                categories = in_progress['Category'].unique().tolist()\r\n                levels = in_progress['Level'].unique().tolist()\r\n\r\n                parallel_work.append({\r\n                    'date': date,\r\n                    'parallel_count': len(in_progress),\r\n                    'categories': ', '.join(categories),\r\n                    'levels': ', '.join(levels)\r\n                })\r\n\r\n        return pd.DataFrame(parallel_work)\r\n```\r\n\r\n## Gantt Chart Integration\r\n\r\n### Gantt Chart Generator\r\n\r\n```python\r\nimport matplotlib.pyplot as plt\r\nimport matplotlib.dates as mdates\r\nfrom matplotlib.patches import Patch\r\n\r\nclass GanttChartGenerator:\r\n    \"\"\"Generate Gantt charts for 4D simulation\"\"\"\r\n\r\n    def __init__(self, elements: pd.DataFrame):\r\n        self.elements = elements.copy()\r\n        self.colors = {\r\n            'Foundation': '#8B4513',\r\n            'Column': '#4169E1',\r\n            'Beam': '#228B22',\r\n            'Slab': '#DC143C',\r\n            'Wall': '#FF8C00',\r\n            'Roof': '#9932CC',\r\n            'MEP': '#20B2AA',\r\n            'Finishes': '#FFD700'\r\n        }\r\n\r\n    def create_gantt(self, group_by='Category', figsize=(14, 8)):\r\n        \"\"\"Create Gantt chart grouped by specified column\"\"\"\r\n        fig, ax = plt.subplots(figsize=figsize)\r\n\r\n        # Group elements\r\n        groups = self.elements.groupby(group_by)\r\n\r\n        y_pos = 0\r\n        y_labels = []\r\n        legend_elements = []\r\n\r\n        for group_name, group_df in groups:\r\n            color = self.colors.get(group_name, '#808080')\r\n\r\n            for _, row in group_df.iterrows():\r\n                start = row['Start_Date']\r\n                duration = (row['End_Date'] - row['Start_Date']).days\r\n\r\n                ax.barh(y_pos, duration, left=start, height=0.6,\r\n                       color=color, alpha=0.8, edgecolor='black', linewidth=0.5)\r\n\r\n                y_pos += 1\r\n\r\n            y_labels.append(group_name)\r\n            legend_elements.append(Patch(facecolor=color, label=group_name))\r\n\r\n        # Formatting\r\n        ax.set_yticks(range(len(self.elements)))\r\n        ax.set_yticklabels(self.elements['ElementId'])\r\n        ax.set_xlabel('Date')\r\n        ax.set_title('Construction Schedule - Gantt Chart', fontsize=14, fontweight='bold')\r\n\r\n        # Date formatting\r\n        ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))\r\n        ax.xaxis.set_major_locator(mdates.WeekdayLocator(interval=2))\r\n        plt.xticks(rotation=45)\r\n\r\n        # Legend\r\n        ax.legend(handles=legend_elements, loc='upper right')\r\n\r\n        # Grid\r\n        ax.grid(axis='x', alpha=0.3)\r\n\r\n        plt.tight_layout()\r\n        return fig\r\n\r\n    def create_level_gantt(self, figsize=(14, 10)):\r\n        \"\"\"Create Gantt chart grouped by level\"\"\"\r\n        fig, ax = plt.subplots(figsize=figsize)\r\n\r\n        levels = sorted(self.elements['Level'].unique())\r\n\r\n        for i, level in enumerate(levels):\r\n            level_elements = self.elements[self.elements['Level'] == level]\r\n\r\n            for _, row in level_elements.iterrows():\r\n                color = self.colors.get(row['Category'], '#808080')\r\n                start = row['Start_Date']\r\n                duration = (row['End_Date'] - row['Start_Date']).days\r\n\r\n                ax.barh(i, duration, left=start, height=0.4,\r\n                       color=color, alpha=0.8, edgecolor='black', linewidth=0.5)\r\n\r\n        ax.set_yticks(range(len(levels)))\r\n        ax.set_yticklabels(levels)\r\n        ax.set_xlabel('Date')\r\n        ax.set_ylabel('Building Level')\r\n        ax.set_title('Construction Sequence by Level', fontsize=14, fontweight='bold')\r\n\r\n        ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))\r\n        plt.xticks(rotation=45)\r\n\r\n        # Add legend\r\n        legend_patches = [Patch(color=c, label=cat) for cat, c in self.colors.items()\r\n                         if cat in self.elements['Category'].values]\r\n        ax.legend(handles=legend_patches, loc='upper right')\r\n\r\n        plt.tight_layout()\r\n        return fig\r\n\r\n    def create_progress_chart(self, timeline: List[Dict], figsize=(12, 6)):\r\n        \"\"\"Create S-curve progress chart\"\"\"\r\n        df = pd.DataFrame(timeline)\r\n\r\n        fig, ax = plt.subplots(figsize=figsize)\r\n\r\n        ax.plot(df['date'], df['progress_pct'], 'b-', linewidth=2, label='Progress')\r\n        ax.fill_between(df['date'], 0, df['progress_pct'], alpha=0.3)\r\n\r\n        # Add milestones at 25%, 50%, 75%, 100%\r\n        for milestone in [25, 50, 75, 100]:\r\n            ax.axhline(y=milestone, color='gray', linestyle='--', alpha=0.5)\r\n            ax.text(df['date'].iloc[0], milestone + 2, f'{milestone}%',\r\n                   fontsize=9, color='gray')\r\n\r\n        ax.set_xlabel('Date')\r\n        ax.set_ylabel('Progress (%)')\r\n        ax.set_title('Project S-Curve', fontsize=14, fontweight='bold')\r\n        ax.set_ylim(0, 105)\r\n\r\n        ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))\r\n        plt.xticks(rotation=45)\r\n\r\n        plt.tight_layout()\r\n        return fig\r\n```\r\n\r\n## Sequence Analysis\r\n\r\n### Construction Sequence Optimizer\r\n\r\n```python\r\nclass SequenceAnalyzer:\r\n    \"\"\"Analyze and optimize construction sequences\"\"\"\r\n\r\n    def __init__(self, elements: pd.DataFrame):\r\n        self.elements = elements.copy()\r\n        self.dependencies = []\r\n\r\n    def add_dependency(self, predecessor: str, successor: str, lag_days: int = 0):\r\n        \"\"\"Add dependency between elements\"\"\"\r\n        self.dependencies.append({\r\n            'predecessor': predecessor,\r\n            'successor': successor,\r\n            'lag_days': lag_days\r\n        })\r\n\r\n    def check_sequence_violations(self) -> List[Dict]:\r\n        \"\"\"Check for sequence violations\"\"\"\r\n        violations = []\r\n\r\n        for dep in self.dependencies:\r\n            pred = self.elements[self.elements['ElementId'] == dep['predecessor']]\r\n            succ = self.elements[self.elements['ElementId'] == dep['successor']]\r\n\r\n            if pred.empty or succ.empty:\r\n                continue\r\n\r\n            pred_end = pred.iloc[0]['End_Date']\r\n            succ_start = succ.iloc[0]['Start_Date']\r\n\r\n            required_start = pred_end + timedelta(days=dep['lag_days'])\r\n\r\n            if succ_start \u003C required_start:\r\n                violations.append({\r\n                    'predecessor': dep['predecessor'],\r\n                    'successor': dep['successor'],\r\n                    'predecessor_end': pred_end,\r\n                    'successor_start': succ_start,\r\n                    'required_start': required_start,\r\n                    'violation_days': (required_start - succ_start).days\r\n                })\r\n\r\n        return violations\r\n\r\n    def check_spatial_conflicts(self) -> List[Dict]:\r\n        \"\"\"Check for spatial conflicts (same location, same time)\"\"\"\r\n        conflicts = []\r\n\r\n        # Group by location (Level + Zone if available)\r\n        location_col = 'Level'\r\n\r\n        for location, group in self.elements.groupby(location_col):\r\n            if len(group) \u003C 2:\r\n                continue\r\n\r\n            # Check for overlapping work\r\n            for i, row1 in group.iterrows():\r\n                for j, row2 in group.iterrows():\r\n                    if i >= j:\r\n                        continue\r\n\r\n                    # Check date overlap\r\n                    overlap = (row1['Start_Date'] \u003C= row2['End_Date'] and\r\n                              row2['Start_Date'] \u003C= row1['End_Date'])\r\n\r\n                    if overlap:\r\n                        conflicts.append({\r\n                            'location': location,\r\n                            'element1': row1['ElementId'],\r\n                            'element1_category': row1['Category'],\r\n                            'element2': row2['ElementId'],\r\n                            'element2_category': row2['Category'],\r\n                            'overlap_start': max(row1['Start_Date'], row2['Start_Date']),\r\n                            'overlap_end': min(row1['End_Date'], row2['End_Date'])\r\n                        })\r\n\r\n        return conflicts\r\n\r\n    def calculate_critical_path(self) -> List[str]:\r\n        \"\"\"Calculate critical path (simplified)\"\"\"\r\n        # Build dependency graph\r\n        graph = {}\r\n        for elem in self.elements['ElementId']:\r\n            graph[elem] = {\r\n                'predecessors': [],\r\n                'duration': 0\r\n            }\r\n\r\n        for dep in self.dependencies:\r\n            if dep['successor'] in graph:\r\n                graph[dep['successor']]['predecessors'].append(dep['predecessor'])\r\n\r\n        # Calculate durations\r\n        for _, row in self.elements.iterrows():\r\n            if row['ElementId'] in graph:\r\n                graph[row['ElementId']]['duration'] = (row['End_Date'] - row['Start_Date']).days\r\n\r\n        # Find longest path (simplified critical path)\r\n        def longest_path(node, memo={}):\r\n            if node in memo:\r\n                return memo[node]\r\n\r\n            if not graph[node]['predecessors']:\r\n                return graph[node]['duration']\r\n\r\n            max_pred = max(\r\n                longest_path(pred, memo) for pred in graph[node]['predecessors']\r\n            )\r\n            memo[node] = max_pred + graph[node]['duration']\r\n            return memo[node]\r\n\r\n        # Get all path lengths\r\n        path_lengths = {elem: longest_path(elem) for elem in graph.keys()}\r\n\r\n        # Critical path elements\r\n        max_length = max(path_lengths.values())\r\n        critical = [elem for elem, length in path_lengths.items() if length == max_length]\r\n\r\n        return critical\r\n```\r\n\r\n## Export and Integration\r\n\r\n```python\r\ndef export_4d_schedule(elements: pd.DataFrame, output_path: str):\r\n    \"\"\"Export 4D schedule to Excel with multiple views\"\"\"\r\n    with pd.ExcelWriter(output_path, engine='openpyxl') as writer:\r\n        # Full schedule\r\n        elements.to_excel(writer, sheet_name='Schedule', index=False)\r\n\r\n        # By level\r\n        level_summary = elements.groupby('Level').agg({\r\n            'ElementId': 'count',\r\n            'Start_Date': 'min',\r\n            'End_Date': 'max'\r\n        }).rename(columns={'ElementId': 'Element_Count'})\r\n        level_summary['Duration_Days'] = (level_summary['End_Date'] - level_summary['Start_Date']).dt.days\r\n        level_summary.to_excel(writer, sheet_name='By_Level')\r\n\r\n        # By category\r\n        cat_summary = elements.groupby('Category').agg({\r\n            'ElementId': 'count',\r\n            'Start_Date': 'min',\r\n            'End_Date': 'max'\r\n        }).rename(columns={'ElementId': 'Element_Count'})\r\n        cat_summary.to_excel(writer, sheet_name='By_Category')\r\n\r\n    return output_path\r\n```\r\n\r\n## Quick Reference\r\n\r\n| Concept | Description |\r\n|---------|-------------|\r\n| 4D = 3D + Time | BIM model linked to schedule |\r\n| Activity | Scheduled work item |\r\n| Element State | not_started \u002F in_progress \u002F completed |\r\n| Critical Path | Longest sequence determining project duration |\r\n\r\n## Resources\r\n\r\n- **Book**: \"Data-Driven Construction\" by Artem Boiko, Chapter 3.3\r\n- **Website**: https:\u002F\u002Fdatadrivenconstruction.io\r\n\r\n## Next Steps\r\n\r\n- See `gantt-chart` for schedule visualization\r\n- See `co2-estimation` for 6D (sustainability) analysis\r\n- See `clash-detection-analysis` for 4D conflict detection\r\n","# 4D Simulation for Construction\r\n\r\n## Overview\r\n\r\nBased on DDC methodology (Chapter 3.3), this skill implements 4D BIM simulations - linking 3D model elements to the 4th dimension: time. Visualize construction sequences, detect scheduling conflicts, and optimize work phasing.\r\n\r\n**Book Reference:** \"4D, 6D-8D и расчет CO2\" \u002F \"4D-8D BIM and CO2 Calculation\"\r\n\r\n> \"4D моделирование позволяет визуализировать последовательность строительства и выявлять конфликты на этапе планирования.\"\r\n> — DDC Book, Chapter 3.3\r\n\r\n## Quick Start\r\n\r\n```python\r\nimport pandas as pd\r\nfrom datetime import datetime, timedelta\r\n\r\n# BIM elements with schedule data\r\nelements = pd.DataFrame({\r\n    'ElementId': ['E001', 'E002', 'E003', 'E004'],\r\n    'Category': ['Foundation', 'Column', 'Beam', 'Slab'],\r\n    'Level': ['Level 0', 'Level 1', 'Level 1', 'Level 1'],\r\n    'Start_Date': ['2024-01-01', '2024-01-15', '2024-02-01', '2024-02-15'],\r\n    'End_Date': ['2024-01-14', '2024-01-31', '2024-02-14', '2024-02-28'],\r\n    'Phase': ['Structure', 'Structure', 'Structure', 'Structure']\r\n})\r\n\r\nelements['Start_Date'] = pd.to_datetime(elements['Start_Date'])\r\nelements['End_Date'] = pd.to_datetime(elements['End_Date'])\r\nelements['Duration_Days'] = (elements['End_Date'] - elements['Start_Date']).dt.days\r\n\r\n# Get elements active on a specific date\r\ntarget_date = pd.to_datetime('2024-01-20')\r\nactive_elements = elements[\r\n    (elements['Start_Date'] \u003C= target_date) &\r\n    (elements['End_Date'] >= target_date)\r\n]\r\nprint(f\"Elements under construction on {target_date.date()}:\")\r\nprint(active_elements[['ElementId', 'Category']])\r\n```\r\n\r\n## 4D Data Model\r\n\r\n### Schedule-Element Linking\r\n\r\n```python\r\nimport pandas as pd\r\nimport numpy as np\r\nfrom datetime import datetime, timedelta\r\nfrom typing import List, Dict, Optional\r\n\r\nclass ScheduleElementLinker:\r\n    \"\"\"Link BIM elements to schedule activities\"\"\"\r\n\r\n    def __init__(self, elements_df: pd.DataFrame, schedule_df: pd.DataFrame):\r\n        self.elements = elements_df.copy()\r\n        self.schedule = schedule_df.copy()\r\n        self.links = pd.DataFrame()\r\n\r\n    def auto_link_by_category(self, mapping: Dict[str, str]):\r\n        \"\"\"Auto-link elements to activities by category mapping\r\n\r\n        Args:\r\n            mapping: Dict mapping element categories to activity names\r\n                     e.g., {'Wall': 'Structural Walls', 'Slab': 'Floor Construction'}\r\n        \"\"\"\r\n        links = []\r\n\r\n        for category, activity_name in mapping.items():\r\n            # Find elements of this category\r\n            category_elements = self.elements[\r\n                self.elements['Category'] == category\r\n            ]['ElementId'].tolist()\r\n\r\n            # Find matching activity\r\n            activity = self.schedule[\r\n                self.schedule['Activity'].str.contains(activity_name, case=False)\r\n            ]\r\n\r\n            if not activity.empty and category_elements:\r\n                for elem_id in category_elements:\r\n                    links.append({\r\n                        'ElementId': elem_id,\r\n                        'ActivityId': activity.iloc[0]['ActivityId'],\r\n                        'Activity': activity.iloc[0]['Activity'],\r\n                        'Start_Date': activity.iloc[0]['Start_Date'],\r\n                        'End_Date': activity.iloc[0]['End_Date']\r\n                    })\r\n\r\n        self.links = pd.DataFrame(links)\r\n        return self.links\r\n\r\n    def auto_link_by_level(self):\r\n        \"\"\"Auto-link elements based on level and construction sequence\"\"\"\r\n        # Get unique levels in order\r\n        levels = sorted(self.elements['Level'].unique())\r\n\r\n        links = []\r\n        for i, level in enumerate(levels):\r\n            level_elements = self.elements[self.elements['Level'] == level]\r\n\r\n            # Find activity for this level\r\n            level_activity = self.schedule[\r\n                self.schedule['Activity'].str.contains(level, case=False)\r\n            ]\r\n\r\n            if not level_activity.empty:\r\n                for _, elem in level_elements.iterrows():\r\n                    links.append({\r\n                        'ElementId': elem['ElementId'],\r\n                        'ActivityId': level_activity.iloc[0]['ActivityId'],\r\n                        'Activity': level_activity.iloc[0]['Activity'],\r\n                        'Start_Date': level_activity.iloc[0]['Start_Date'],\r\n                        'End_Date': level_activity.iloc[0]['End_Date']\r\n                    })\r\n\r\n        self.links = pd.DataFrame(links)\r\n        return self.links\r\n\r\n    def manual_link(self, element_id: str, activity_id: str):\r\n        \"\"\"Manually link element to activity\"\"\"\r\n        element = self.elements[self.elements['ElementId'] == element_id]\r\n        activity = self.schedule[self.schedule['ActivityId'] == activity_id]\r\n\r\n        if element.empty or activity.empty:\r\n            raise ValueError(\"Element or activity not found\")\r\n\r\n        new_link = pd.DataFrame([{\r\n            'ElementId': element_id,\r\n            'ActivityId': activity_id,\r\n            'Activity': activity.iloc[0]['Activity'],\r\n            'Start_Date': activity.iloc[0]['Start_Date'],\r\n            'End_Date': activity.iloc[0]['End_Date']\r\n        }])\r\n\r\n        self.links = pd.concat([self.links, new_link], ignore_index=True)\r\n        return self.links\r\n\r\n    def get_linked_elements(self):\r\n        \"\"\"Get elements with schedule data\"\"\"\r\n        return self.elements.merge(\r\n            self.links[['ElementId', 'ActivityId', 'Start_Date', 'End_Date']],\r\n            on='ElementId',\r\n            how='left'\r\n        )\r\n```\r\n\r\n### 4D Simulation Engine\r\n\r\n```python\r\nclass Simulation4D:\r\n    \"\"\"4D construction simulation engine\"\"\"\r\n\r\n    def __init__(self, linked_elements: pd.DataFrame):\r\n        self.elements = linked_elements.copy()\r\n        self.elements['Start_Date'] = pd.to_datetime(self.elements['Start_Date'])\r\n        self.elements['End_Date'] = pd.to_datetime(self.elements['End_Date'])\r\n\r\n        self.project_start = self.elements['Start_Date'].min()\r\n        self.project_end = self.elements['End_Date'].max()\r\n\r\n    def get_state_at_date(self, target_date: datetime) -> pd.DataFrame:\r\n        \"\"\"Get element states at a specific date\"\"\"\r\n        target = pd.to_datetime(target_date)\r\n\r\n        # Determine state for each element\r\n        conditions = [\r\n            target \u003C self.elements['Start_Date'],  # Not started\r\n            (self.elements['Start_Date'] \u003C= target) & (target \u003C= self.elements['End_Date']),  # In progress\r\n            target > self.elements['End_Date']  # Completed\r\n        ]\r\n        choices = ['not_started', 'in_progress', 'completed']\r\n\r\n        self.elements['State'] = np.select(conditions, choices, default='unknown')\r\n\r\n        return self.elements.copy()\r\n\r\n    def generate_timeline(self, interval_days: int = 7) -> List[Dict]:\r\n        \"\"\"Generate timeline snapshots\"\"\"\r\n        timeline = []\r\n        current_date = self.project_start\r\n\r\n        while current_date \u003C= self.project_end:\r\n            state = self.get_state_at_date(current_date)\r\n\r\n            snapshot = {\r\n                'date': current_date,\r\n                'not_started': len(state[state['State'] == 'not_started']),\r\n                'in_progress': len(state[state['State'] == 'in_progress']),\r\n                'completed': len(state[state['State'] == 'completed']),\r\n                'total': len(state)\r\n            }\r\n            snapshot['progress_pct'] = (snapshot['completed'] \u002F snapshot['total']) * 100\r\n\r\n            timeline.append(snapshot)\r\n            current_date += timedelta(days=interval_days)\r\n\r\n        return timeline\r\n\r\n    def get_elements_in_progress(self, target_date: datetime) -> pd.DataFrame:\r\n        \"\"\"Get elements currently under construction\"\"\"\r\n        state = self.get_state_at_date(target_date)\r\n        return state[state['State'] == 'in_progress']\r\n\r\n    def analyze_construction_sequence(self) -> pd.DataFrame:\r\n        \"\"\"Analyze construction sequence by category and level\"\"\"\r\n        sequence = self.elements.groupby(['Level', 'Category']).agg({\r\n            'Start_Date': 'min',\r\n            'End_Date': 'max',\r\n            'ElementId': 'count'\r\n        }).rename(columns={'ElementId': 'Element_Count'})\r\n\r\n        sequence['Duration_Days'] = (sequence['End_Date'] - sequence['Start_Date']).dt.days\r\n        sequence = sequence.sort_values('Start_Date').reset_index()\r\n\r\n        return sequence\r\n\r\n    def detect_parallel_work(self) -> pd.DataFrame:\r\n        \"\"\"Detect work happening in parallel\"\"\"\r\n        dates = pd.date_range(self.project_start, self.project_end, freq='D')\r\n        parallel_work = []\r\n\r\n        for date in dates:\r\n            state = self.get_state_at_date(date)\r\n            in_progress = state[state['State'] == 'in_progress']\r\n\r\n            if len(in_progress) > 1:\r\n                categories = in_progress['Category'].unique().tolist()\r\n                levels = in_progress['Level'].unique().tolist()\r\n\r\n                parallel_work.append({\r\n                    'date': date,\r\n                    'parallel_count': len(in_progress),\r\n                    'categories': ', '.join(categories),\r\n                    'levels': ', '.join(levels)\r\n                })\r\n\r\n        return pd.DataFrame(parallel_work)\r\n```\r\n\r\n## Gantt Chart Integration\r\n\r\n### Gantt Chart Generator\r\n\r\n```python\r\nimport matplotlib.pyplot as plt\r\nimport matplotlib.dates as mdates\r\nfrom matplotlib.patches import Patch\r\n\r\nclass GanttChartGenerator:\r\n    \"\"\"Generate Gantt charts for 4D simulation\"\"\"\r\n\r\n    def __init__(self, elements: pd.DataFrame):\r\n        self.elements = elements.copy()\r\n        self.colors = {\r\n            'Foundation': '#8B4513',\r\n            'Column': '#4169E1',\r\n            'Beam': '#228B22',\r\n            'Slab': '#DC143C',\r\n            'Wall': '#FF8C00',\r\n            'Roof': '#9932CC',\r\n            'MEP': '#20B2AA',\r\n            'Finishes': '#FFD700'\r\n        }\r\n\r\n    def create_gantt(self, group_by='Category', figsize=(14, 8)):\r\n        \"\"\"Create Gantt chart grouped by specified column\"\"\"\r\n        fig, ax = plt.subplots(figsize=figsize)\r\n\r\n        # Group elements\r\n        groups = self.elements.groupby(group_by)\r\n\r\n        y_pos = 0\r\n        y_labels = []\r\n        legend_elements = []\r\n\r\n        for group_name, group_df in groups:\r\n            color = self.colors.get(group_name, '#808080')\r\n\r\n            for _, row in group_df.iterrows():\r\n                start = row['Start_Date']\r\n                duration = (row['End_Date'] - row['Start_Date']).days\r\n\r\n                ax.barh(y_pos, duration, left=start, height=0.6,\r\n                       color=color, alpha=0.8, edgecolor='black', linewidth=0.5)\r\n\r\n                y_pos += 1\r\n\r\n            y_labels.append(group_name)\r\n            legend_elements.append(Patch(facecolor=color, label=group_name))\r\n\r\n        # Formatting\r\n        ax.set_yticks(range(len(self.elements)))\r\n        ax.set_yticklabels(self.elements['ElementId'])\r\n        ax.set_xlabel('Date')\r\n        ax.set_title('Construction Schedule - Gantt Chart', fontsize=14, fontweight='bold')\r\n\r\n        # Date formatting\r\n        ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))\r\n        ax.xaxis.set_major_locator(mdates.WeekdayLocator(interval=2))\r\n        plt.xticks(rotation=45)\r\n\r\n        # Legend\r\n        ax.legend(handles=legend_elements, loc='upper right')\r\n\r\n        # Grid\r\n        ax.grid(axis='x', alpha=0.3)\r\n\r\n        plt.tight_layout()\r\n        return fig\r\n\r\n    def create_level_gantt(self, figsize=(14, 10)):\r\n        \"\"\"Create Gantt chart grouped by level\"\"\"\r\n        fig, ax = plt.subplots(figsize=figsize)\r\n\r\n        levels = sorted(self.elements['Level'].unique())\r\n\r\n        for i, level in enumerate(levels):\r\n            level_elements = self.elements[self.elements['Level'] == level]\r\n\r\n            for _, row in level_elements.iterrows():\r\n                color = self.colors.get(row['Category'], '#808080')\r\n                start = row['Start_Date']\r\n                duration = (row['End_Date'] - row['Start_Date']).days\r\n\r\n                ax.barh(i, duration, left=start, height=0.4,\r\n                       color=color, alpha=0.8, edgecolor='black', linewidth=0.5)\r\n\r\n        ax.set_yticks(range(len(levels)))\r\n        ax.set_yticklabels(levels)\r\n        ax.set_xlabel('Date')\r\n        ax.set_ylabel('Building Level')\r\n        ax.set_title('Construction Sequence by Level', fontsize=14, fontweight='bold')\r\n\r\n        ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))\r\n        plt.xticks(rotation=45)\r\n\r\n        # Add legend\r\n        legend_patches = [Patch(color=c, label=cat) for cat, c in self.colors.items()\r\n                         if cat in self.elements['Category'].values]\r\n        ax.legend(handles=legend_patches, loc='upper right')\r\n\r\n        plt.tight_layout()\r\n        return fig\r\n\r\n    def create_progress_chart(self, timeline: List[Dict], figsize=(12, 6)):\r\n        \"\"\"Create S-curve progress chart\"\"\"\r\n        df = pd.DataFrame(timeline)\r\n\r\n        fig, ax = plt.subplots(figsize=figsize)\r\n\r\n        ax.plot(df['date'], df['progress_pct'], 'b-', linewidth=2, label='Progress')\r\n        ax.fill_between(df['date'], 0, df['progress_pct'], alpha=0.3)\r\n\r\n        # Add milestones at 25%, 50%, 75%, 100%\r\n        for milestone in [25, 50, 75, 100]:\r\n            ax.axhline(y=milestone, color='gray', linestyle='--', alpha=0.5)\r\n            ax.text(df['date'].iloc[0], milestone + 2, f'{milestone}%',\r\n                   fontsize=9, color='gray')\r\n\r\n        ax.set_xlabel('Date')\r\n        ax.set_ylabel('Progress (%)')\r\n        ax.set_title('Project S-Curve', fontsize=14, fontweight='bold')\r\n        ax.set_ylim(0, 105)\r\n\r\n        ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))\r\n        plt.xticks(rotation=45)\r\n\r\n        plt.tight_layout()\r\n        return fig\r\n```\r\n\r\n## Sequence Analysis\r\n\r\n### Construction Sequence Optimizer\r\n\r\n```python\r\nclass SequenceAnalyzer:\r\n    \"\"\"Analyze and optimize construction sequences\"\"\"\r\n\r\n    def __init__(self, elements: pd.DataFrame):\r\n        self.elements = elements.copy()\r\n        self.dependencies = []\r\n\r\n    def add_dependency(self, predecessor: str, successor: str, lag_days: int = 0):\r\n        \"\"\"Add dependency between elements\"\"\"\r\n        self.dependencies.append({\r\n            'predecessor': predecessor,\r\n            'successor': successor,\r\n            'lag_days': lag_days\r\n        })\r\n\r\n    def check_sequence_violations(self) -> List[Dict]:\r\n        \"\"\"Check for sequence violations\"\"\"\r\n        violations = []\r\n\r\n        for dep in self.dependencies:\r\n            pred = self.elements[self.elements['ElementId'] == dep['predecessor']]\r\n            succ = self.elements[self.elements['ElementId'] == dep['successor']]\r\n\r\n            if pred.empty or succ.empty:\r\n                continue\r\n\r\n            pred_end = pred.iloc[0]['End_Date']\r\n            succ_start = succ.iloc[0]['Start_Date']\r\n\r\n            required_start = pred_end + timedelta(days=dep['lag_days'])\r\n\r\n            if succ_start \u003C required_start:\r\n                violations.append({\r\n                    'predecessor': dep['predecessor'],\r\n                    'successor': dep['successor'],\r\n                    'predecessor_end': pred_end,\r\n                    'successor_start': succ_start,\r\n                    'required_start': required_start,\r\n                    'violation_days': (required_start - succ_start).days\r\n                })\r\n\r\n        return violations\r\n\r\n    def check_spatial_conflicts(self) -> List[Dict]:\r\n        \"\"\"Check for spatial conflicts (same location, same time)\"\"\"\r\n        conflicts = []\r\n\r\n        # Group by location (Level + Zone if available)\r\n        location_col = 'Level'\r\n\r\n        for location, group in self.elements.groupby(location_col):\r\n            if len(group) \u003C 2:\r\n                continue\r\n\r\n            # Check for overlapping work\r\n            for i, row1 in group.iterrows():\r\n                for j, row2 in group.iterrows():\r\n                    if i >= j:\r\n                        continue\r\n\r\n                    # Check date overlap\r\n                    overlap = (row1['Start_Date'] \u003C= row2['End_Date'] and\r\n                              row2['Start_Date'] \u003C= row1['End_Date'])\r\n\r\n                    if overlap:\r\n                        conflicts.append({\r\n                            'location': location,\r\n                            'element1': row1['ElementId'],\r\n                            'element1_category': row1['Category'],\r\n                            'element2': row2['ElementId'],\r\n                            'element2_category': row2['Category'],\r\n                            'overlap_start': max(row1['Start_Date'], row2['Start_Date']),\r\n                            'overlap_end': min(row1['End_Date'], row2['End_Date'])\r\n                        })\r\n\r\n        return conflicts\r\n\r\n    def calculate_critical_path(self) -> List[str]:\r\n        \"\"\"Calculate critical path (simplified)\"\"\"\r\n        # Build dependency graph\r\n        graph = {}\r\n        for elem in self.elements['ElementId']:\r\n            graph[elem] = {\r\n                'predecessors': [],\r\n                'duration': 0\r\n            }\r\n\r\n        for dep in self.dependencies:\r\n            if dep['successor'] in graph:\r\n                graph[dep['successor']]['predecessors'].append(dep['predecessor'])\r\n\r\n        # Calculate durations\r\n        for _, row in self.elements.iterrows():\r\n            if row['ElementId'] in graph:\r\n                graph[row['ElementId']]['duration'] = (row['End_Date'] - row['Start_Date']).days\r\n\r\n        # Find longest path (simplified critical path)\r\n        def longest_path(node, memo={}):\r\n            if node in memo:\r\n                return memo[node]\r\n\r\n            if not graph[node]['predecessors']:\r\n                return graph[node]['duration']\r\n\r\n            max_pred = max(\r\n                longest_path(pred, memo) for pred in graph[node]['predecessors']\r\n            )\r\n            memo[node] = max_pred + graph[node]['duration']\r\n            return memo[node]\r\n\r\n        # Get all path lengths\r\n        path_lengths = {elem: longest_path(elem) for elem in graph.keys()}\r\n\r\n        # Critical path elements\r\n        max_length = max(path_lengths.values())\r\n        critical = [elem for elem, length in path_lengths.items() if length == max_length]\r\n\r\n        return critical\r\n```\r\n\r\n## Export and Integration\r\n\r\n```python\r\ndef export_4d_schedule(elements: pd.DataFrame, output_path: str):\r\n    \"\"\"Export 4D schedule to Excel with multiple views\"\"\"\r\n    with pd.ExcelWriter(output_path, engine='openpyxl') as writer:\r\n        # Full schedule\r\n        elements.to_excel(writer, sheet_name='Schedule', index=False)\r\n\r\n        # By level\r\n        level_summary = elements.groupby('Level').agg({\r\n            'ElementId': 'count',\r\n            'Start_Date': 'min',\r\n            'End_Date': 'max'\r\n        }).rename(columns={'ElementId': 'Element_Count'})\r\n        level_summary['Duration_Days'] = (level_summary['End_Date'] - level_summary['Start_Date']).dt.days\r\n        level_summary.to_excel(writer, sheet_name='By_Level')\r\n\r\n        # By category\r\n        cat_summary = elements.groupby('Category').agg({\r\n            'ElementId': 'count',\r\n            'Start_Date': 'min',\r\n            'End_Date': 'max'\r\n        }).rename(columns={'ElementId': 'Element_Count'})\r\n        cat_summary.to_excel(writer, sheet_name='By_Category')\r\n\r\n    return output_path\r\n```\r\n\r\n## Quick Reference\r\n\r\n| Concept | Description |\r\n|---------|-------------|\r\n| 4D = 3D + Time | BIM model linked to schedule |\r\n| Activity | Scheduled work item |\r\n| Element State | not_started \u002F in_progress \u002F completed |\r\n| Critical Path | Longest sequence determining project duration |\r\n\r\n## Resources\r\n\r\n- **Book**: \"Data-Driven Construction\" by Artem Boiko, Chapter 3.3\r\n- **Website**: https:\u002F\u002Fdatadrivenconstruction.io\r\n\r\n## Next Steps\r\n\r\n- See `gantt-chart` for schedule visualization\r\n- See `co2-estimation` for 6D (sustainability) analysis\r\n- See `clash-detection-analysis` for 4D conflict detection\r\n",{"slug":5,"description":7,"display_name":36},"4D Simulation","main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fdatadrivenconstruction\u002F4d-simulation",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":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add kbarbel640-del\u002Fskills --skill 4d-simulation",{"tool":50,"command":51},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill 4d-simulation",{"tool":53,"command":54},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill 4d-simulation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002F4d-simulation\u002FSKILL.md",true,[58],{"path":59,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":62,"sourceHtmlUrl":63},"_meta.json","REFERENCE","参考文档",294,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002F4d-simulation\u002F_meta.json",[65,95,123,144,150,170],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":76,"publishedAt":31},"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",[71],{"categoryNo":72,"categoryName":73,"taxonomyType":74,"taxonomyTypeDesc":75},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[77,78,79,30,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94],"crowd prompting","prompting","api","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","https","content","ai agents",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":106,"publishedAt":31},"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",[101],{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[107,79,108,109,110,111,20,112,113,114,115,116,117,118,119,120,121,83,122],"dilemm ai","arena","analyze","browser","openclaw agent","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":132,"publishedAt":31},"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",[129],{"categoryNo":130,"categoryName":131,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000021","资料检索与研究",[133,134,135,136,137,138,139,30,140,120,122,141,79,142,143],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http","via",{"skillNo":145,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":149,"publishedAt":31},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[148],{"categoryNo":130,"categoryName":131,"taxonomyType":104,"taxonomyTypeDesc":105},[136,135,134,133,143,138,139,30,137,120,122,140,141,79,142],{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":31},"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",[],[157,158,159,160,161,162,163,164,165,166,167,168,169],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":180,"publishedAt":31},"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",[176,177],{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},{"categoryNo":178,"categoryName":179,"taxonomyType":74,"taxonomyTypeDesc":75},"01JBSEEDCAT000000000000037","律师与法务",[181,182,183,184,30,185,186,37,187,141,188,189,190,191,192,92,193,194,195],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance","github"]