[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FJSJHMJ57X87G0GSCHFQ2V":3,"skill-same:01M6FJSJHMJ57X87G0GSCHFQ2V":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":22,"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},"01M6FJSJHMJ57X87G0GSCHFQ2V","data-anomaly-detector",null,"Detect anomalies and outliers in construction data: unusual costs, schedule variances, productivity spikes. Statistical and ML-based detection methods.","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\u002Fdata-anomaly-detector\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[23,24,25,26,27,28,29,30,31],"data","anomaly detector","data anomaly detector","ml","productivity","detection","schedule","methods","detect","2026-11-10 10:12:30",false,"---\r\nslug: \"data-anomaly-detector\"\r\ndisplay_name: \"Data Anomaly Detector\"\r\ndescription: \"Detect anomalies and outliers in construction data: unusual costs, schedule variances, productivity spikes. Statistical and ML-based detection methods.\"\r\n---\r\n\r\n# Data Anomaly Detector for Construction\r\n\r\n## Overview\r\n\r\nDetect unusual patterns, outliers, and anomalies in construction data. Identify cost overruns, schedule delays, productivity issues, and data quality problems before they impact projects.\r\n\r\n## Business Case\r\n\r\nConstruction data often contains anomalies that indicate:\r\n- Cost estimate errors or fraud\r\n- Schedule logic issues\r\n- Productivity problems\r\n- Data entry mistakes\r\n- Equipment or material issues\r\n\r\nEarly detection prevents costly corrections and project delays.\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, Tuple\r\nfrom enum import Enum\r\nimport pandas as pd\r\nimport numpy as np\r\nfrom datetime import datetime\r\nfrom scipy import stats\r\n\r\nclass AnomalyType(Enum):\r\n    OUTLIER = \"outlier\"\r\n    PATTERN_BREAK = \"pattern_break\"\r\n    MISSING_SEQUENCE = \"missing_sequence\"\r\n    DUPLICATE = \"duplicate\"\r\n    IMPOSSIBLE_VALUE = \"impossible_value\"\r\n    TREND_DEVIATION = \"trend_deviation\"\r\n\r\nclass AnomalySeverity(Enum):\r\n    CRITICAL = \"critical\"\r\n    HIGH = \"high\"\r\n    MEDIUM = \"medium\"\r\n    LOW = \"low\"\r\n\r\n@dataclass\r\nclass Anomaly:\r\n    id: str\r\n    anomaly_type: AnomalyType\r\n    severity: AnomalySeverity\r\n    field: str\r\n    value: Any\r\n    expected_range: Optional[Tuple[float, float]] = None\r\n    description: str = \"\"\r\n    row_index: Optional[int] = None\r\n    detection_method: str = \"\"\r\n    confidence: float = 0.0\r\n    suggested_action: str = \"\"\r\n\r\n@dataclass\r\nclass AnomalyReport:\r\n    source: str\r\n    detected_at: datetime\r\n    total_records: int\r\n    anomalies: List[Anomaly]\r\n    summary: Dict[str, int]\r\n\r\nclass ConstructionAnomalyDetector:\r\n    \"\"\"Detect anomalies in construction data.\"\"\"\r\n\r\n    # Construction-specific thresholds\r\n    COST_THRESHOLDS = {\r\n        'concrete_per_cy': (200, 800),\r\n        'steel_per_ton': (1500, 4000),\r\n        'labor_per_hour': (25, 150),\r\n        'overhead_percentage': (5, 25),\r\n        'contingency_percentage': (3, 20),\r\n    }\r\n\r\n    SCHEDULE_THRESHOLDS = {\r\n        'max_activity_duration': 365,  # days\r\n        'max_lag': 30,  # days\r\n        'min_productivity': 0.1,\r\n        'max_productivity': 10.0,\r\n    }\r\n\r\n    def __init__(self):\r\n        self.anomalies: List[Anomaly] = []\r\n        self.detection_history: List[AnomalyReport] = []\r\n\r\n    def detect_cost_anomalies(self, df: pd.DataFrame, cost_column: str,\r\n                              group_by: str = None) -> List[Anomaly]:\r\n        \"\"\"Detect anomalies in cost data.\"\"\"\r\n        anomalies = []\r\n\r\n        # Statistical outlier detection (IQR method)\r\n        Q1 = df[cost_column].quantile(0.25)\r\n        Q3 = df[cost_column].quantile(0.75)\r\n        IQR = Q3 - Q1\r\n        lower_bound = Q1 - 1.5 * IQR\r\n        upper_bound = Q3 + 1.5 * IQR\r\n\r\n        outliers = df[(df[cost_column] \u003C lower_bound) | (df[cost_column] > upper_bound)]\r\n\r\n        for idx, row in outliers.iterrows():\r\n            value = row[cost_column]\r\n            severity = AnomalySeverity.HIGH if abs(value - df[cost_column].median()) > 3 * IQR else AnomalySeverity.MEDIUM\r\n\r\n            anomalies.append(Anomaly(\r\n                id=f\"COST-{idx}\",\r\n                anomaly_type=AnomalyType.OUTLIER,\r\n                severity=severity,\r\n                field=cost_column,\r\n                value=value,\r\n                expected_range=(lower_bound, upper_bound),\r\n                description=f\"Cost value {value:,.2f} outside expected range\",\r\n                row_index=idx,\r\n                detection_method=\"IQR\",\r\n                confidence=0.95,\r\n                suggested_action=\"Review cost estimate for errors\"\r\n            ))\r\n\r\n        # Negative cost check\r\n        negatives = df[df[cost_column] \u003C 0]\r\n        for idx, row in negatives.iterrows():\r\n            anomalies.append(Anomaly(\r\n                id=f\"COST-NEG-{idx}\",\r\n                anomaly_type=AnomalyType.IMPOSSIBLE_VALUE,\r\n                severity=AnomalySeverity.CRITICAL,\r\n                field=cost_column,\r\n                value=row[cost_column],\r\n                expected_range=(0, None),\r\n                description=\"Negative cost value detected\",\r\n                row_index=idx,\r\n                detection_method=\"Business Rule\",\r\n                confidence=1.0,\r\n                suggested_action=\"Correct data entry error or investigate credit\"\r\n            ))\r\n\r\n        # Group-based anomalies (if grouped)\r\n        if group_by and group_by in df.columns:\r\n            group_stats = df.groupby(group_by)[cost_column].agg(['mean', 'std'])\r\n\r\n            for group_name, stats in group_stats.iterrows():\r\n                group_data = df[df[group_by] == group_name]\r\n                z_scores = np.abs((group_data[cost_column] - stats['mean']) \u002F stats['std'])\r\n\r\n                for idx, z in z_scores.items():\r\n                    if z > 3:\r\n                        anomalies.append(Anomaly(\r\n                            id=f\"COST-GROUP-{idx}\",\r\n                            anomaly_type=AnomalyType.OUTLIER,\r\n                            severity=AnomalySeverity.MEDIUM,\r\n                            field=cost_column,\r\n                            value=df.loc[idx, cost_column],\r\n                            description=f\"Unusual cost for group {group_name} (z-score: {z:.2f})\",\r\n                            row_index=idx,\r\n                            detection_method=\"Z-Score by Group\",\r\n                            confidence=min(z \u002F 5, 1.0)\r\n                        ))\r\n\r\n        return anomalies\r\n\r\n    def detect_schedule_anomalies(self, df: pd.DataFrame) -> List[Anomaly]:\r\n        \"\"\"Detect anomalies in schedule data.\"\"\"\r\n        anomalies = []\r\n\r\n        # Check for required columns\r\n        required = ['start_date', 'end_date']\r\n        if not all(col in df.columns for col in required):\r\n            return anomalies\r\n\r\n        # Convert dates\r\n        df['start_date'] = pd.to_datetime(df['start_date'])\r\n        df['end_date'] = pd.to_datetime(df['end_date'])\r\n\r\n        # Calculate duration\r\n        df['duration'] = (df['end_date'] - df['start_date']).dt.days\r\n\r\n        # Negative duration (end before start)\r\n        negative_duration = df[df['duration'] \u003C 0]\r\n        for idx, row in negative_duration.iterrows():\r\n            anomalies.append(Anomaly(\r\n                id=f\"SCHED-NEG-{idx}\",\r\n                anomaly_type=AnomalyType.IMPOSSIBLE_VALUE,\r\n                severity=AnomalySeverity.CRITICAL,\r\n                field=\"duration\",\r\n                value=row['duration'],\r\n                description=\"End date before start date\",\r\n                row_index=idx,\r\n                detection_method=\"Business Rule\",\r\n                confidence=1.0,\r\n                suggested_action=\"Correct dates\"\r\n            ))\r\n\r\n        # Extremely long durations\r\n        long_tasks = df[df['duration'] > self.SCHEDULE_THRESHOLDS['max_activity_duration']]\r\n        for idx, row in long_tasks.iterrows():\r\n            anomalies.append(Anomaly(\r\n                id=f\"SCHED-LONG-{idx}\",\r\n                anomaly_type=AnomalyType.OUTLIER,\r\n                severity=AnomalySeverity.MEDIUM,\r\n                field=\"duration\",\r\n                value=row['duration'],\r\n                expected_range=(0, self.SCHEDULE_THRESHOLDS['max_activity_duration']),\r\n                description=f\"Task duration {row['duration']} days exceeds threshold\",\r\n                row_index=idx,\r\n                detection_method=\"Threshold\",\r\n                confidence=0.9,\r\n                suggested_action=\"Review if task should be broken down\"\r\n            ))\r\n\r\n        # Zero duration non-milestones\r\n        if 'is_milestone' in df.columns:\r\n            zero_duration = df[(df['duration'] == 0) & (~df['is_milestone'])]\r\n            for idx, row in zero_duration.iterrows():\r\n                anomalies.append(Anomaly(\r\n                    id=f\"SCHED-ZERO-{idx}\",\r\n                    anomaly_type=AnomalyType.IMPOSSIBLE_VALUE,\r\n                    severity=AnomalySeverity.HIGH,\r\n                    field=\"duration\",\r\n                    value=0,\r\n                    description=\"Zero duration task that is not a milestone\",\r\n                    row_index=idx,\r\n                    detection_method=\"Business Rule\",\r\n                    confidence=1.0,\r\n                    suggested_action=\"Add duration or mark as milestone\"\r\n                ))\r\n\r\n        return anomalies\r\n\r\n    def detect_productivity_anomalies(self, df: pd.DataFrame,\r\n                                      quantity_col: str,\r\n                                      hours_col: str) -> List[Anomaly]:\r\n        \"\"\"Detect productivity anomalies.\"\"\"\r\n        anomalies = []\r\n\r\n        # Calculate productivity\r\n        df['productivity'] = df[quantity_col] \u002F df[hours_col].replace(0, np.nan)\r\n\r\n        # Use Modified Z-Score (more robust for skewed data)\r\n        median = df['productivity'].median()\r\n        mad = np.abs(df['productivity'] - median).median()\r\n        modified_z = 0.6745 * (df['productivity'] - median) \u002F mad\r\n\r\n        outliers = df[np.abs(modified_z) > 3.5]\r\n\r\n        for idx, row in outliers.iterrows():\r\n            prod = row['productivity']\r\n            z = modified_z.loc[idx]\r\n\r\n            severity = AnomalySeverity.HIGH if abs(z) > 5 else AnomalySeverity.MEDIUM\r\n            direction = \"high\" if z > 0 else \"low\"\r\n\r\n            anomalies.append(Anomaly(\r\n                id=f\"PROD-{idx}\",\r\n                anomaly_type=AnomalyType.OUTLIER,\r\n                severity=severity,\r\n                field=\"productivity\",\r\n                value=prod,\r\n                description=f\"Unusually {direction} productivity: {prod:.2f} units\u002Fhour\",\r\n                row_index=idx,\r\n                detection_method=\"Modified Z-Score\",\r\n                confidence=min(abs(z) \u002F 7, 1.0),\r\n                suggested_action=f\"Investigate {direction} productivity cause\"\r\n            ))\r\n\r\n        return anomalies\r\n\r\n    def detect_time_series_anomalies(self, df: pd.DataFrame,\r\n                                      date_col: str,\r\n                                      value_col: str,\r\n                                      window: int = 7) -> List[Anomaly]:\r\n        \"\"\"Detect anomalies in time series data (e.g., daily costs, progress).\"\"\"\r\n        anomalies = []\r\n\r\n        df = df.sort_values(date_col).copy()\r\n        df['rolling_mean'] = df[value_col].rolling(window=window, center=True).mean()\r\n        df['rolling_std'] = df[value_col].rolling(window=window, center=True).std()\r\n\r\n        # Points outside 2 standard deviations from rolling mean\r\n        df['z_score'] = (df[value_col] - df['rolling_mean']) \u002F df['rolling_std']\r\n\r\n        outliers = df[np.abs(df['z_score']) > 2].dropna()\r\n\r\n        for idx, row in outliers.iterrows():\r\n            anomalies.append(Anomaly(\r\n                id=f\"TS-{idx}\",\r\n                anomaly_type=AnomalyType.TREND_DEVIATION,\r\n                severity=AnomalySeverity.MEDIUM if abs(row['z_score']) \u003C 3 else AnomalySeverity.HIGH,\r\n                field=value_col,\r\n                value=row[value_col],\r\n                expected_range=(\r\n                    row['rolling_mean'] - 2 * row['rolling_std'],\r\n                    row['rolling_mean'] + 2 * row['rolling_std']\r\n                ),\r\n                description=f\"Value deviates from {window}-day trend\",\r\n                row_index=idx,\r\n                detection_method=\"Rolling Z-Score\",\r\n                confidence=min(abs(row['z_score']) \u002F 4, 1.0)\r\n            ))\r\n\r\n        return anomalies\r\n\r\n    def detect_duplicate_anomalies(self, df: pd.DataFrame,\r\n                                   key_columns: List[str]) -> List[Anomaly]:\r\n        \"\"\"Detect duplicate records.\"\"\"\r\n        anomalies = []\r\n\r\n        duplicates = df[df.duplicated(subset=key_columns, keep=False)]\r\n\r\n        if len(duplicates) > 0:\r\n            dup_groups = duplicates.groupby(key_columns).size()\r\n            for keys, count in dup_groups.items():\r\n                anomalies.append(Anomaly(\r\n                    id=f\"DUP-{hash(str(keys)) % 10000}\",\r\n                    anomaly_type=AnomalyType.DUPLICATE,\r\n                    severity=AnomalySeverity.HIGH,\r\n                    field=str(key_columns),\r\n                    value=keys,\r\n                    description=f\"Found {count} duplicate records for {keys}\",\r\n                    detection_method=\"Exact Match\",\r\n                    confidence=1.0,\r\n                    suggested_action=\"Review and remove duplicates\"\r\n                ))\r\n\r\n        return anomalies\r\n\r\n    def detect_sequence_gaps(self, df: pd.DataFrame, sequence_col: str) -> List[Anomaly]:\r\n        \"\"\"Detect gaps in sequential data (invoice numbers, PO numbers, etc.).\"\"\"\r\n        anomalies = []\r\n\r\n        # Extract numeric part if mixed format\r\n        df['seq_num'] = pd.to_numeric(\r\n            df[sequence_col].astype(str).str.extract(r'(\\d+)')[0],\r\n            errors='coerce'\r\n        )\r\n\r\n        sorted_seq = df['seq_num'].dropna().sort_values()\r\n        expected = range(int(sorted_seq.min()), int(sorted_seq.max()) + 1)\r\n        actual = set(sorted_seq.astype(int))\r\n        missing = set(expected) - actual\r\n\r\n        if missing:\r\n            # Group consecutive missing numbers\r\n            missing_ranges = []\r\n            sorted_missing = sorted(missing)\r\n            start = sorted_missing[0]\r\n            end = start\r\n\r\n            for num in sorted_missing[1:]:\r\n                if num == end + 1:\r\n                    end = num\r\n                else:\r\n                    missing_ranges.append((start, end))\r\n                    start = num\r\n                    end = num\r\n            missing_ranges.append((start, end))\r\n\r\n            for start, end in missing_ranges:\r\n                range_str = str(start) if start == end else f\"{start}-{end}\"\r\n                anomalies.append(Anomaly(\r\n                    id=f\"SEQ-{start}\",\r\n                    anomaly_type=AnomalyType.MISSING_SEQUENCE,\r\n                    severity=AnomalySeverity.MEDIUM,\r\n                    field=sequence_col,\r\n                    value=range_str,\r\n                    description=f\"Missing sequence number(s): {range_str}\",\r\n                    detection_method=\"Sequence Analysis\",\r\n                    confidence=1.0,\r\n                    suggested_action=\"Investigate missing numbers\"\r\n                ))\r\n\r\n        return anomalies\r\n\r\n    def run_full_detection(self, df: pd.DataFrame, config: Dict) -> AnomalyReport:\r\n        \"\"\"Run all applicable anomaly detection methods.\"\"\"\r\n        all_anomalies = []\r\n\r\n        # Cost anomalies\r\n        if 'cost_columns' in config:\r\n            for col in config['cost_columns']:\r\n                if col in df.columns:\r\n                    all_anomalies.extend(\r\n                        self.detect_cost_anomalies(df, col, config.get('group_by'))\r\n                    )\r\n\r\n        # Schedule anomalies\r\n        if 'start_date' in df.columns and 'end_date' in df.columns:\r\n            all_anomalies.extend(self.detect_schedule_anomalies(df))\r\n\r\n        # Productivity\r\n        if 'quantity_col' in config and 'hours_col' in config:\r\n            all_anomalies.extend(\r\n                self.detect_productivity_anomalies(\r\n                    df, config['quantity_col'], config['hours_col']\r\n                )\r\n            )\r\n\r\n        # Duplicates\r\n        if 'key_columns' in config:\r\n            all_anomalies.extend(\r\n                self.detect_duplicate_anomalies(df, config['key_columns'])\r\n            )\r\n\r\n        # Sequence gaps\r\n        if 'sequence_column' in config:\r\n            all_anomalies.extend(\r\n                self.detect_sequence_gaps(df, config['sequence_column'])\r\n            )\r\n\r\n        # Create summary\r\n        summary = {}\r\n        for a in all_anomalies:\r\n            key = f\"{a.anomaly_type.value}_{a.severity.value}\"\r\n            summary[key] = summary.get(key, 0) + 1\r\n\r\n        report = AnomalyReport(\r\n            source=config.get('source_name', 'Unknown'),\r\n            detected_at=datetime.now(),\r\n            total_records=len(df),\r\n            anomalies=all_anomalies,\r\n            summary=summary\r\n        )\r\n\r\n        self.detection_history.append(report)\r\n        return report\r\n\r\n    def generate_report(self, report: AnomalyReport) -> str:\r\n        \"\"\"Generate markdown anomaly report.\"\"\"\r\n        lines = [f\"# Anomaly Detection Report\", \"\"]\r\n        lines.append(f\"**Source:** {report.source}\")\r\n        lines.append(f\"**Detected At:** {report.detected_at.strftime('%Y-%m-%d %H:%M')}\")\r\n        lines.append(f\"**Total Records:** {report.total_records:,}\")\r\n        lines.append(f\"**Anomalies Found:** {len(report.anomalies)}\")\r\n        lines.append(\"\")\r\n\r\n        # Summary by severity\r\n        lines.append(\"## Summary by Severity\")\r\n        for severity in AnomalySeverity:\r\n            count = sum(1 for a in report.anomalies if a.severity == severity)\r\n            if count > 0:\r\n                lines.append(f\"- **{severity.value.upper()}:** {count}\")\r\n        lines.append(\"\")\r\n\r\n        # Critical anomalies first\r\n        critical = [a for a in report.anomalies if a.severity == AnomalySeverity.CRITICAL]\r\n        if critical:\r\n            lines.append(\"## Critical Anomalies\")\r\n            for a in critical:\r\n                lines.append(f\"\\n### {a.id}\")\r\n                lines.append(f\"- **Type:** {a.anomaly_type.value}\")\r\n                lines.append(f\"- **Field:** {a.field}\")\r\n                lines.append(f\"- **Value:** {a.value}\")\r\n                lines.append(f\"- **Description:** {a.description}\")\r\n                lines.append(f\"- **Action:** {a.suggested_action}\")\r\n\r\n        # All anomalies table\r\n        lines.append(\"\\n## All Anomalies\")\r\n        lines.append(\"| ID | Type | Severity | Field | Description |\")\r\n        lines.append(\"|-----|------|----------|-------|-------------|\")\r\n        for a in report.anomalies[:50]:\r\n            lines.append(f\"| {a.id} | {a.anomaly_type.value} | {a.severity.value} | {a.field} | {a.description[:50]} |\")\r\n\r\n        if len(report.anomalies) > 50:\r\n            lines.append(f\"\\n*... and {len(report.anomalies) - 50} more anomalies*\")\r\n\r\n        return \"\\n\".join(lines)\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\nimport pandas as pd\r\n\r\n# Load data\r\ndf = pd.read_excel(\"project_costs.xlsx\")\r\n\r\n# Initialize detector\r\ndetector = ConstructionAnomalyDetector()\r\n\r\n# Run detection\r\nconfig = {\r\n    'source_name': 'Project Costs Q1 2026',\r\n    'cost_columns': ['total_cost', 'labor_cost', 'material_cost'],\r\n    'group_by': 'cost_code',\r\n    'key_columns': ['project_id', 'cost_code', 'date'],\r\n    'sequence_column': 'invoice_number'\r\n}\r\n\r\nreport = detector.run_full_detection(df, config)\r\n\r\n# Generate report\r\nprint(detector.generate_report(report))\r\n\r\n# Get critical anomalies for immediate action\r\ncritical = [a for a in report.anomalies if a.severity == AnomalySeverity.CRITICAL]\r\nprint(f\"\\n{len(critical)} critical anomalies require immediate attention\")\r\n```\r\n\r\n## Dependencies\r\n\r\n```bash\r\npip install pandas numpy scipy\r\n```\r\n\r\n## Resources\r\n\r\n- **Statistical Methods**: IQR, Z-Score, Modified Z-Score\r\n- **Construction Benchmarks**: RSMeans, ENR indices\r\n","# Data Anomaly Detector for Construction\r\n\r\n## Overview\r\n\r\nDetect unusual patterns, outliers, and anomalies in construction data. Identify cost overruns, schedule delays, productivity issues, and data quality problems before they impact projects.\r\n\r\n## Business Case\r\n\r\nConstruction data often contains anomalies that indicate:\r\n- Cost estimate errors or fraud\r\n- Schedule logic issues\r\n- Productivity problems\r\n- Data entry mistakes\r\n- Equipment or material issues\r\n\r\nEarly detection prevents costly corrections and project delays.\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, Tuple\r\nfrom enum import Enum\r\nimport pandas as pd\r\nimport numpy as np\r\nfrom datetime import datetime\r\nfrom scipy import stats\r\n\r\nclass AnomalyType(Enum):\r\n    OUTLIER = \"outlier\"\r\n    PATTERN_BREAK = \"pattern_break\"\r\n    MISSING_SEQUENCE = \"missing_sequence\"\r\n    DUPLICATE = \"duplicate\"\r\n    IMPOSSIBLE_VALUE = \"impossible_value\"\r\n    TREND_DEVIATION = \"trend_deviation\"\r\n\r\nclass AnomalySeverity(Enum):\r\n    CRITICAL = \"critical\"\r\n    HIGH = \"high\"\r\n    MEDIUM = \"medium\"\r\n    LOW = \"low\"\r\n\r\n@dataclass\r\nclass Anomaly:\r\n    id: str\r\n    anomaly_type: AnomalyType\r\n    severity: AnomalySeverity\r\n    field: str\r\n    value: Any\r\n    expected_range: Optional[Tuple[float, float]] = None\r\n    description: str = \"\"\r\n    row_index: Optional[int] = None\r\n    detection_method: str = \"\"\r\n    confidence: float = 0.0\r\n    suggested_action: str = \"\"\r\n\r\n@dataclass\r\nclass AnomalyReport:\r\n    source: str\r\n    detected_at: datetime\r\n    total_records: int\r\n    anomalies: List[Anomaly]\r\n    summary: Dict[str, int]\r\n\r\nclass ConstructionAnomalyDetector:\r\n    \"\"\"Detect anomalies in construction data.\"\"\"\r\n\r\n    # Construction-specific thresholds\r\n    COST_THRESHOLDS = {\r\n        'concrete_per_cy': (200, 800),\r\n        'steel_per_ton': (1500, 4000),\r\n        'labor_per_hour': (25, 150),\r\n        'overhead_percentage': (5, 25),\r\n        'contingency_percentage': (3, 20),\r\n    }\r\n\r\n    SCHEDULE_THRESHOLDS = {\r\n        'max_activity_duration': 365,  # days\r\n        'max_lag': 30,  # days\r\n        'min_productivity': 0.1,\r\n        'max_productivity': 10.0,\r\n    }\r\n\r\n    def __init__(self):\r\n        self.anomalies: List[Anomaly] = []\r\n        self.detection_history: List[AnomalyReport] = []\r\n\r\n    def detect_cost_anomalies(self, df: pd.DataFrame, cost_column: str,\r\n                              group_by: str = None) -> List[Anomaly]:\r\n        \"\"\"Detect anomalies in cost data.\"\"\"\r\n        anomalies = []\r\n\r\n        # Statistical outlier detection (IQR method)\r\n        Q1 = df[cost_column].quantile(0.25)\r\n        Q3 = df[cost_column].quantile(0.75)\r\n        IQR = Q3 - Q1\r\n        lower_bound = Q1 - 1.5 * IQR\r\n        upper_bound = Q3 + 1.5 * IQR\r\n\r\n        outliers = df[(df[cost_column] \u003C lower_bound) | (df[cost_column] > upper_bound)]\r\n\r\n        for idx, row in outliers.iterrows():\r\n            value = row[cost_column]\r\n            severity = AnomalySeverity.HIGH if abs(value - df[cost_column].median()) > 3 * IQR else AnomalySeverity.MEDIUM\r\n\r\n            anomalies.append(Anomaly(\r\n                id=f\"COST-{idx}\",\r\n                anomaly_type=AnomalyType.OUTLIER,\r\n                severity=severity,\r\n                field=cost_column,\r\n                value=value,\r\n                expected_range=(lower_bound, upper_bound),\r\n                description=f\"Cost value {value:,.2f} outside expected range\",\r\n                row_index=idx,\r\n                detection_method=\"IQR\",\r\n                confidence=0.95,\r\n                suggested_action=\"Review cost estimate for errors\"\r\n            ))\r\n\r\n        # Negative cost check\r\n        negatives = df[df[cost_column] \u003C 0]\r\n        for idx, row in negatives.iterrows():\r\n            anomalies.append(Anomaly(\r\n                id=f\"COST-NEG-{idx}\",\r\n                anomaly_type=AnomalyType.IMPOSSIBLE_VALUE,\r\n                severity=AnomalySeverity.CRITICAL,\r\n                field=cost_column,\r\n                value=row[cost_column],\r\n                expected_range=(0, None),\r\n                description=\"Negative cost value detected\",\r\n                row_index=idx,\r\n                detection_method=\"Business Rule\",\r\n                confidence=1.0,\r\n                suggested_action=\"Correct data entry error or investigate credit\"\r\n            ))\r\n\r\n        # Group-based anomalies (if grouped)\r\n        if group_by and group_by in df.columns:\r\n            group_stats = df.groupby(group_by)[cost_column].agg(['mean', 'std'])\r\n\r\n            for group_name, stats in group_stats.iterrows():\r\n                group_data = df[df[group_by] == group_name]\r\n                z_scores = np.abs((group_data[cost_column] - stats['mean']) \u002F stats['std'])\r\n\r\n                for idx, z in z_scores.items():\r\n                    if z > 3:\r\n                        anomalies.append(Anomaly(\r\n                            id=f\"COST-GROUP-{idx}\",\r\n                            anomaly_type=AnomalyType.OUTLIER,\r\n                            severity=AnomalySeverity.MEDIUM,\r\n                            field=cost_column,\r\n                            value=df.loc[idx, cost_column],\r\n                            description=f\"Unusual cost for group {group_name} (z-score: {z:.2f})\",\r\n                            row_index=idx,\r\n                            detection_method=\"Z-Score by Group\",\r\n                            confidence=min(z \u002F 5, 1.0)\r\n                        ))\r\n\r\n        return anomalies\r\n\r\n    def detect_schedule_anomalies(self, df: pd.DataFrame) -> List[Anomaly]:\r\n        \"\"\"Detect anomalies in schedule data.\"\"\"\r\n        anomalies = []\r\n\r\n        # Check for required columns\r\n        required = ['start_date', 'end_date']\r\n        if not all(col in df.columns for col in required):\r\n            return anomalies\r\n\r\n        # Convert dates\r\n        df['start_date'] = pd.to_datetime(df['start_date'])\r\n        df['end_date'] = pd.to_datetime(df['end_date'])\r\n\r\n        # Calculate duration\r\n        df['duration'] = (df['end_date'] - df['start_date']).dt.days\r\n\r\n        # Negative duration (end before start)\r\n        negative_duration = df[df['duration'] \u003C 0]\r\n        for idx, row in negative_duration.iterrows():\r\n            anomalies.append(Anomaly(\r\n                id=f\"SCHED-NEG-{idx}\",\r\n                anomaly_type=AnomalyType.IMPOSSIBLE_VALUE,\r\n                severity=AnomalySeverity.CRITICAL,\r\n                field=\"duration\",\r\n                value=row['duration'],\r\n                description=\"End date before start date\",\r\n                row_index=idx,\r\n                detection_method=\"Business Rule\",\r\n                confidence=1.0,\r\n                suggested_action=\"Correct dates\"\r\n            ))\r\n\r\n        # Extremely long durations\r\n        long_tasks = df[df['duration'] > self.SCHEDULE_THRESHOLDS['max_activity_duration']]\r\n        for idx, row in long_tasks.iterrows():\r\n            anomalies.append(Anomaly(\r\n                id=f\"SCHED-LONG-{idx}\",\r\n                anomaly_type=AnomalyType.OUTLIER,\r\n                severity=AnomalySeverity.MEDIUM,\r\n                field=\"duration\",\r\n                value=row['duration'],\r\n                expected_range=(0, self.SCHEDULE_THRESHOLDS['max_activity_duration']),\r\n                description=f\"Task duration {row['duration']} days exceeds threshold\",\r\n                row_index=idx,\r\n                detection_method=\"Threshold\",\r\n                confidence=0.9,\r\n                suggested_action=\"Review if task should be broken down\"\r\n            ))\r\n\r\n        # Zero duration non-milestones\r\n        if 'is_milestone' in df.columns:\r\n            zero_duration = df[(df['duration'] == 0) & (~df['is_milestone'])]\r\n            for idx, row in zero_duration.iterrows():\r\n                anomalies.append(Anomaly(\r\n                    id=f\"SCHED-ZERO-{idx}\",\r\n                    anomaly_type=AnomalyType.IMPOSSIBLE_VALUE,\r\n                    severity=AnomalySeverity.HIGH,\r\n                    field=\"duration\",\r\n                    value=0,\r\n                    description=\"Zero duration task that is not a milestone\",\r\n                    row_index=idx,\r\n                    detection_method=\"Business Rule\",\r\n                    confidence=1.0,\r\n                    suggested_action=\"Add duration or mark as milestone\"\r\n                ))\r\n\r\n        return anomalies\r\n\r\n    def detect_productivity_anomalies(self, df: pd.DataFrame,\r\n                                      quantity_col: str,\r\n                                      hours_col: str) -> List[Anomaly]:\r\n        \"\"\"Detect productivity anomalies.\"\"\"\r\n        anomalies = []\r\n\r\n        # Calculate productivity\r\n        df['productivity'] = df[quantity_col] \u002F df[hours_col].replace(0, np.nan)\r\n\r\n        # Use Modified Z-Score (more robust for skewed data)\r\n        median = df['productivity'].median()\r\n        mad = np.abs(df['productivity'] - median).median()\r\n        modified_z = 0.6745 * (df['productivity'] - median) \u002F mad\r\n\r\n        outliers = df[np.abs(modified_z) > 3.5]\r\n\r\n        for idx, row in outliers.iterrows():\r\n            prod = row['productivity']\r\n            z = modified_z.loc[idx]\r\n\r\n            severity = AnomalySeverity.HIGH if abs(z) > 5 else AnomalySeverity.MEDIUM\r\n            direction = \"high\" if z > 0 else \"low\"\r\n\r\n            anomalies.append(Anomaly(\r\n                id=f\"PROD-{idx}\",\r\n                anomaly_type=AnomalyType.OUTLIER,\r\n                severity=severity,\r\n                field=\"productivity\",\r\n                value=prod,\r\n                description=f\"Unusually {direction} productivity: {prod:.2f} units\u002Fhour\",\r\n                row_index=idx,\r\n                detection_method=\"Modified Z-Score\",\r\n                confidence=min(abs(z) \u002F 7, 1.0),\r\n                suggested_action=f\"Investigate {direction} productivity cause\"\r\n            ))\r\n\r\n        return anomalies\r\n\r\n    def detect_time_series_anomalies(self, df: pd.DataFrame,\r\n                                      date_col: str,\r\n                                      value_col: str,\r\n                                      window: int = 7) -> List[Anomaly]:\r\n        \"\"\"Detect anomalies in time series data (e.g., daily costs, progress).\"\"\"\r\n        anomalies = []\r\n\r\n        df = df.sort_values(date_col).copy()\r\n        df['rolling_mean'] = df[value_col].rolling(window=window, center=True).mean()\r\n        df['rolling_std'] = df[value_col].rolling(window=window, center=True).std()\r\n\r\n        # Points outside 2 standard deviations from rolling mean\r\n        df['z_score'] = (df[value_col] - df['rolling_mean']) \u002F df['rolling_std']\r\n\r\n        outliers = df[np.abs(df['z_score']) > 2].dropna()\r\n\r\n        for idx, row in outliers.iterrows():\r\n            anomalies.append(Anomaly(\r\n                id=f\"TS-{idx}\",\r\n                anomaly_type=AnomalyType.TREND_DEVIATION,\r\n                severity=AnomalySeverity.MEDIUM if abs(row['z_score']) \u003C 3 else AnomalySeverity.HIGH,\r\n                field=value_col,\r\n                value=row[value_col],\r\n                expected_range=(\r\n                    row['rolling_mean'] - 2 * row['rolling_std'],\r\n                    row['rolling_mean'] + 2 * row['rolling_std']\r\n                ),\r\n                description=f\"Value deviates from {window}-day trend\",\r\n                row_index=idx,\r\n                detection_method=\"Rolling Z-Score\",\r\n                confidence=min(abs(row['z_score']) \u002F 4, 1.0)\r\n            ))\r\n\r\n        return anomalies\r\n\r\n    def detect_duplicate_anomalies(self, df: pd.DataFrame,\r\n                                   key_columns: List[str]) -> List[Anomaly]:\r\n        \"\"\"Detect duplicate records.\"\"\"\r\n        anomalies = []\r\n\r\n        duplicates = df[df.duplicated(subset=key_columns, keep=False)]\r\n\r\n        if len(duplicates) > 0:\r\n            dup_groups = duplicates.groupby(key_columns).size()\r\n            for keys, count in dup_groups.items():\r\n                anomalies.append(Anomaly(\r\n                    id=f\"DUP-{hash(str(keys)) % 10000}\",\r\n                    anomaly_type=AnomalyType.DUPLICATE,\r\n                    severity=AnomalySeverity.HIGH,\r\n                    field=str(key_columns),\r\n                    value=keys,\r\n                    description=f\"Found {count} duplicate records for {keys}\",\r\n                    detection_method=\"Exact Match\",\r\n                    confidence=1.0,\r\n                    suggested_action=\"Review and remove duplicates\"\r\n                ))\r\n\r\n        return anomalies\r\n\r\n    def detect_sequence_gaps(self, df: pd.DataFrame, sequence_col: str) -> List[Anomaly]:\r\n        \"\"\"Detect gaps in sequential data (invoice numbers, PO numbers, etc.).\"\"\"\r\n        anomalies = []\r\n\r\n        # Extract numeric part if mixed format\r\n        df['seq_num'] = pd.to_numeric(\r\n            df[sequence_col].astype(str).str.extract(r'(\\d+)')[0],\r\n            errors='coerce'\r\n        )\r\n\r\n        sorted_seq = df['seq_num'].dropna().sort_values()\r\n        expected = range(int(sorted_seq.min()), int(sorted_seq.max()) + 1)\r\n        actual = set(sorted_seq.astype(int))\r\n        missing = set(expected) - actual\r\n\r\n        if missing:\r\n            # Group consecutive missing numbers\r\n            missing_ranges = []\r\n            sorted_missing = sorted(missing)\r\n            start = sorted_missing[0]\r\n            end = start\r\n\r\n            for num in sorted_missing[1:]:\r\n                if num == end + 1:\r\n                    end = num\r\n                else:\r\n                    missing_ranges.append((start, end))\r\n                    start = num\r\n                    end = num\r\n            missing_ranges.append((start, end))\r\n\r\n            for start, end in missing_ranges:\r\n                range_str = str(start) if start == end else f\"{start}-{end}\"\r\n                anomalies.append(Anomaly(\r\n                    id=f\"SEQ-{start}\",\r\n                    anomaly_type=AnomalyType.MISSING_SEQUENCE,\r\n                    severity=AnomalySeverity.MEDIUM,\r\n                    field=sequence_col,\r\n                    value=range_str,\r\n                    description=f\"Missing sequence number(s): {range_str}\",\r\n                    detection_method=\"Sequence Analysis\",\r\n                    confidence=1.0,\r\n                    suggested_action=\"Investigate missing numbers\"\r\n                ))\r\n\r\n        return anomalies\r\n\r\n    def run_full_detection(self, df: pd.DataFrame, config: Dict) -> AnomalyReport:\r\n        \"\"\"Run all applicable anomaly detection methods.\"\"\"\r\n        all_anomalies = []\r\n\r\n        # Cost anomalies\r\n        if 'cost_columns' in config:\r\n            for col in config['cost_columns']:\r\n                if col in df.columns:\r\n                    all_anomalies.extend(\r\n                        self.detect_cost_anomalies(df, col, config.get('group_by'))\r\n                    )\r\n\r\n        # Schedule anomalies\r\n        if 'start_date' in df.columns and 'end_date' in df.columns:\r\n            all_anomalies.extend(self.detect_schedule_anomalies(df))\r\n\r\n        # Productivity\r\n        if 'quantity_col' in config and 'hours_col' in config:\r\n            all_anomalies.extend(\r\n                self.detect_productivity_anomalies(\r\n                    df, config['quantity_col'], config['hours_col']\r\n                )\r\n            )\r\n\r\n        # Duplicates\r\n        if 'key_columns' in config:\r\n            all_anomalies.extend(\r\n                self.detect_duplicate_anomalies(df, config['key_columns'])\r\n            )\r\n\r\n        # Sequence gaps\r\n        if 'sequence_column' in config:\r\n            all_anomalies.extend(\r\n                self.detect_sequence_gaps(df, config['sequence_column'])\r\n            )\r\n\r\n        # Create summary\r\n        summary = {}\r\n        for a in all_anomalies:\r\n            key = f\"{a.anomaly_type.value}_{a.severity.value}\"\r\n            summary[key] = summary.get(key, 0) + 1\r\n\r\n        report = AnomalyReport(\r\n            source=config.get('source_name', 'Unknown'),\r\n            detected_at=datetime.now(),\r\n            total_records=len(df),\r\n            anomalies=all_anomalies,\r\n            summary=summary\r\n        )\r\n\r\n        self.detection_history.append(report)\r\n        return report\r\n\r\n    def generate_report(self, report: AnomalyReport) -> str:\r\n        \"\"\"Generate markdown anomaly report.\"\"\"\r\n        lines = [f\"# Anomaly Detection Report\", \"\"]\r\n        lines.append(f\"**Source:** {report.source}\")\r\n        lines.append(f\"**Detected At:** {report.detected_at.strftime('%Y-%m-%d %H:%M')}\")\r\n        lines.append(f\"**Total Records:** {report.total_records:,}\")\r\n        lines.append(f\"**Anomalies Found:** {len(report.anomalies)}\")\r\n        lines.append(\"\")\r\n\r\n        # Summary by severity\r\n        lines.append(\"## Summary by Severity\")\r\n        for severity in AnomalySeverity:\r\n            count = sum(1 for a in report.anomalies if a.severity == severity)\r\n            if count > 0:\r\n                lines.append(f\"- **{severity.value.upper()}:** {count}\")\r\n        lines.append(\"\")\r\n\r\n        # Critical anomalies first\r\n        critical = [a for a in report.anomalies if a.severity == AnomalySeverity.CRITICAL]\r\n        if critical:\r\n            lines.append(\"## Critical Anomalies\")\r\n            for a in critical:\r\n                lines.append(f\"\\n### {a.id}\")\r\n                lines.append(f\"- **Type:** {a.anomaly_type.value}\")\r\n                lines.append(f\"- **Field:** {a.field}\")\r\n                lines.append(f\"- **Value:** {a.value}\")\r\n                lines.append(f\"- **Description:** {a.description}\")\r\n                lines.append(f\"- **Action:** {a.suggested_action}\")\r\n\r\n        # All anomalies table\r\n        lines.append(\"\\n## All Anomalies\")\r\n        lines.append(\"| ID | Type | Severity | Field | Description |\")\r\n        lines.append(\"|-----|------|----------|-------|-------------|\")\r\n        for a in report.anomalies[:50]:\r\n            lines.append(f\"| {a.id} | {a.anomaly_type.value} | {a.severity.value} | {a.field} | {a.description[:50]} |\")\r\n\r\n        if len(report.anomalies) > 50:\r\n            lines.append(f\"\\n*... and {len(report.anomalies) - 50} more anomalies*\")\r\n\r\n        return \"\\n\".join(lines)\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\nimport pandas as pd\r\n\r\n# Load data\r\ndf = pd.read_excel(\"project_costs.xlsx\")\r\n\r\n# Initialize detector\r\ndetector = ConstructionAnomalyDetector()\r\n\r\n# Run detection\r\nconfig = {\r\n    'source_name': 'Project Costs Q1 2026',\r\n    'cost_columns': ['total_cost', 'labor_cost', 'material_cost'],\r\n    'group_by': 'cost_code',\r\n    'key_columns': ['project_id', 'cost_code', 'date'],\r\n    'sequence_column': 'invoice_number'\r\n}\r\n\r\nreport = detector.run_full_detection(df, config)\r\n\r\n# Generate report\r\nprint(detector.generate_report(report))\r\n\r\n# Get critical anomalies for immediate action\r\ncritical = [a for a in report.anomalies if a.severity == AnomalySeverity.CRITICAL]\r\nprint(f\"\\n{len(critical)} critical anomalies require immediate attention\")\r\n```\r\n\r\n## Dependencies\r\n\r\n```bash\r\npip install pandas numpy scipy\r\n```\r\n\r\n## Resources\r\n\r\n- **Statistical Methods**: IQR, Z-Score, Modified Z-Score\r\n- **Construction Benchmarks**: RSMeans, ENR indices\r\n",{"slug":5,"description":7,"display_name":37},"Data Anomaly Detector","main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fdatadrivenconstruction\u002Fdata-anomaly-detector",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 data-anomaly-detector",{"tool":51,"command":52},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill data-anomaly-detector",{"tool":54,"command":55},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill data-anomaly-detector","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002Fdata-anomaly-detector\u002FSKILL.md",true,[59],{"path":60,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":63,"sourceHtmlUrl":64},"_meta.json","REFERENCE","参考文档",310,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002Fdata-anomaly-detector\u002F_meta.json",[66,94,123,144,150,170],{"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":75,"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":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000036","内容创作者",[76,77,78,79,80,81,82,83,84,85,86,87,88,89,27,90,91,92,93],"crowd prompting","prompting","api","with","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","marketplace","https","content","ai agents",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":105,"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",[100],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[106,78,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,83,122],"dilemm ai","arena","analyze","browser","openclaw agent","create","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":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",[129],{"categoryNo":130,"categoryName":131,"taxonomyType":103,"taxonomyTypeDesc":104},"01JBSEEDCAT000000000000021","资料检索与研究",[133,134,135,136,137,138,139,79,140,120,122,141,78,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":32},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[148],{"categoryNo":130,"categoryName":131,"taxonomyType":103,"taxonomyTypeDesc":104},[136,135,134,133,143,138,139,79,137,120,122,140,141,78,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":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",[],[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":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",[176,177],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},{"categoryNo":178,"categoryName":179,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000037","律师与法务",[181,182,183,184,79,185,186,38,187,141,188,189,190,191,192,91,193,194,195],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance","github"]