[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FJRGSZFN5T8TGSCMEV8TNT":3,"skill-same:01M6FJRGSZFN5T8TGSCMEV8TNT":59},{"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":26,"linkOnly":27,"markdownContent":28,"markdownBody":29,"frontMatter":30,"refName":32,"commitSha":33,"skillDirectory":34,"forksCount":35,"repositoryHtmlUrl":36,"repositoryHomepageUrl":6,"ownerHtmlUrl":37,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":38,"install":39,"resources":52},"01M6FJRGSZFN5T8TGSCMEV8TNT","cwicr-subcontractor",null,"Analyze and compare subcontractor bids against CWICR benchmarks. Evaluate pricing, identify outliers, and support negotiation.","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\u002Fcwicr-subcontractor\u002FSKILL.md",[],[18,19,20,21,22,23,24,25],"cwicr subcontractor","support","pricing","negotiation","analyze","benchmarks","compare","bids","2026-11-10 10:12:30",false,"---\r\nslug: \"cwicr-subcontractor\"\r\ndisplay_name: \"CWICR Subcontractor\"\r\ndescription: \"Analyze and compare subcontractor bids against CWICR benchmarks. Evaluate pricing, identify outliers, and support negotiation.\"\r\n---\r\n\r\n# CWICR Subcontractor Analyzer\r\n\r\n## Business Case\r\n\r\n### Problem Statement\r\nEvaluating subcontractor bids requires:\r\n- Fair price benchmarks\r\n- Bid comparison\r\n- Outlier identification\r\n- Negotiation support\r\n\r\n### Solution\r\nCompare subcontractor bids against CWICR cost data to identify fair pricing, outliers, and negotiation opportunities.\r\n\r\n### Business Value\r\n- **Fair evaluation** - Objective benchmarks\r\n- **Cost savings** - Identify overpriced bids\r\n- **Risk detection** - Flag unrealistic low bids\r\n- **Negotiation support** - Data-driven discussions\r\n\r\n## Technical Implementation\r\n\r\n```python\r\nimport pandas as pd\r\nimport numpy as np\r\nfrom typing import Dict, Any, List, Optional\r\nfrom dataclasses import dataclass\r\nfrom enum import Enum\r\nfrom statistics import mean, stdev\r\n\r\n\r\nclass BidStatus(Enum):\r\n    \"\"\"Bid evaluation status.\"\"\"\r\n    COMPETITIVE = \"competitive\"\r\n    HIGH = \"high\"\r\n    LOW = \"low\"\r\n    OUTLIER_HIGH = \"outlier_high\"\r\n    OUTLIER_LOW = \"outlier_low\"\r\n\r\n\r\n@dataclass\r\nclass SubcontractorBid:\r\n    \"\"\"Subcontractor bid.\"\"\"\r\n    subcontractor_name: str\r\n    trade: str\r\n    bid_amount: float\r\n    scope_items: List[Dict[str, Any]]\r\n    includes_material: bool\r\n    includes_labor: bool\r\n    includes_equipment: bool\r\n    duration_days: int\r\n    notes: str = \"\"\r\n\r\n\r\n@dataclass\r\nclass BidEvaluation:\r\n    \"\"\"Bid evaluation result.\"\"\"\r\n    subcontractor_name: str\r\n    bid_amount: float\r\n    benchmark_cost: float\r\n    variance: float\r\n    variance_percent: float\r\n    status: BidStatus\r\n    line_item_analysis: List[Dict[str, Any]]\r\n    recommendation: str\r\n\r\n\r\nclass CWICRSubcontractor:\r\n    \"\"\"Analyze subcontractor bids using CWICR data.\"\"\"\r\n\r\n    OUTLIER_THRESHOLD = 0.30  # 30% from benchmark\r\n    HIGH_THRESHOLD = 0.15    # 15% above benchmark\r\n    LOW_THRESHOLD = -0.10    # 10% below benchmark\r\n\r\n    def __init__(self,\r\n                 cwicr_data: pd.DataFrame,\r\n                 overhead_rate: float = 0.12,\r\n                 profit_rate: float = 0.10):\r\n        self.cost_data = cwicr_data\r\n        self.overhead_rate = overhead_rate\r\n        self.profit_rate = profit_rate\r\n        self._index_data()\r\n\r\n    def _index_data(self):\r\n        \"\"\"Index cost data.\"\"\"\r\n        if 'work_item_code' in self.cost_data.columns:\r\n            self._code_index = self.cost_data.set_index('work_item_code')\r\n        else:\r\n            self._code_index = None\r\n\r\n    def calculate_benchmark(self,\r\n                            scope_items: List[Dict[str, Any]],\r\n                            include_overhead: bool = True,\r\n                            include_profit: bool = True) -> Dict[str, Any]:\r\n        \"\"\"Calculate benchmark cost for scope.\"\"\"\r\n\r\n        labor = 0\r\n        material = 0\r\n        equipment = 0\r\n\r\n        line_items = []\r\n\r\n        for item in scope_items:\r\n            code = item.get('work_item_code', item.get('code'))\r\n            qty = item.get('quantity', 0)\r\n\r\n            if self._code_index is not None and code in self._code_index.index:\r\n                wi = self._code_index.loc[code]\r\n                item_labor = float(wi.get('labor_cost', 0) or 0) * qty\r\n                item_material = float(wi.get('material_cost', 0) or 0) * qty\r\n                item_equipment = float(wi.get('equipment_cost', 0) or 0) * qty\r\n\r\n                labor += item_labor\r\n                material += item_material\r\n                equipment += item_equipment\r\n\r\n                line_items.append({\r\n                    'code': code,\r\n                    'quantity': qty,\r\n                    'labor': round(item_labor, 2),\r\n                    'material': round(item_material, 2),\r\n                    'equipment': round(item_equipment, 2),\r\n                    'total': round(item_labor + item_material + item_equipment, 2)\r\n                })\r\n\r\n        direct_cost = labor + material + equipment\r\n\r\n        overhead = direct_cost * self.overhead_rate if include_overhead else 0\r\n        profit = (direct_cost + overhead) * self.profit_rate if include_profit else 0\r\n\r\n        return {\r\n            'labor': round(labor, 2),\r\n            'material': round(material, 2),\r\n            'equipment': round(equipment, 2),\r\n            'direct_cost': round(direct_cost, 2),\r\n            'overhead': round(overhead, 2),\r\n            'profit': round(profit, 2),\r\n            'total': round(direct_cost + overhead + profit, 2),\r\n            'line_items': line_items\r\n        }\r\n\r\n    def evaluate_bid(self, bid: SubcontractorBid) -> BidEvaluation:\r\n        \"\"\"Evaluate single subcontractor bid.\"\"\"\r\n\r\n        benchmark = self.calculate_benchmark(bid.scope_items)\r\n        benchmark_cost = benchmark['total']\r\n\r\n        variance = bid.bid_amount - benchmark_cost\r\n        variance_pct = (variance \u002F benchmark_cost * 100) if benchmark_cost > 0 else 0\r\n\r\n        # Determine status\r\n        if variance_pct > self.OUTLIER_THRESHOLD * 100:\r\n            status = BidStatus.OUTLIER_HIGH\r\n            recommendation = \"Bid significantly above benchmark. Request detailed breakdown or reject.\"\r\n        elif variance_pct \u003C -self.OUTLIER_THRESHOLD * 100:\r\n            status = BidStatus.OUTLIER_LOW\r\n            recommendation = \"Bid significantly below benchmark. Verify scope understanding and capacity.\"\r\n        elif variance_pct > self.HIGH_THRESHOLD * 100:\r\n            status = BidStatus.HIGH\r\n            recommendation = \"Bid above benchmark. Consider negotiation or alternative bidders.\"\r\n        elif variance_pct \u003C self.LOW_THRESHOLD * 100:\r\n            status = BidStatus.LOW\r\n            recommendation = \"Bid below benchmark. Verify completeness and quality approach.\"\r\n        else:\r\n            status = BidStatus.COMPETITIVE\r\n            recommendation = \"Bid within acceptable range. Proceed with standard evaluation.\"\r\n\r\n        # Line item analysis\r\n        line_analysis = []\r\n        for i, item in enumerate(bid.scope_items):\r\n            if i \u003C len(benchmark['line_items']):\r\n                bench_item = benchmark['line_items'][i]\r\n                # Assume proportional pricing\r\n                expected = bench_item['total'] \u002F benchmark['direct_cost'] * bid.bid_amount if benchmark['direct_cost'] > 0 else 0\r\n                line_analysis.append({\r\n                    'code': item.get('work_item_code', item.get('code')),\r\n                    'benchmark': bench_item['total'],\r\n                    'expected_in_bid': round(expected, 2)\r\n                })\r\n\r\n        return BidEvaluation(\r\n            subcontractor_name=bid.subcontractor_name,\r\n            bid_amount=bid.bid_amount,\r\n            benchmark_cost=benchmark_cost,\r\n            variance=round(variance, 2),\r\n            variance_percent=round(variance_pct, 1),\r\n            status=status,\r\n            line_item_analysis=line_analysis,\r\n            recommendation=recommendation\r\n        )\r\n\r\n    def compare_bids(self,\r\n                      bids: List[SubcontractorBid]) -> Dict[str, Any]:\r\n        \"\"\"Compare multiple bids.\"\"\"\r\n\r\n        if not bids:\r\n            return {}\r\n\r\n        evaluations = [self.evaluate_bid(bid) for bid in bids]\r\n\r\n        # Statistics\r\n        amounts = [e.bid_amount for e in evaluations]\r\n        avg_bid = mean(amounts)\r\n        std_bid = stdev(amounts) if len(amounts) > 1 else 0\r\n\r\n        # Rank by variance from benchmark\r\n        ranked = sorted(evaluations, key=lambda x: abs(x.variance_percent))\r\n\r\n        # Find best value\r\n        competitive = [e for e in evaluations if e.status == BidStatus.COMPETITIVE]\r\n        if competitive:\r\n            best_value = min(competitive, key=lambda x: x.bid_amount)\r\n        else:\r\n            best_value = ranked[0]\r\n\r\n        # Identify outliers\r\n        outliers = [e for e in evaluations if e.status in [BidStatus.OUTLIER_HIGH, BidStatus.OUTLIER_LOW]]\r\n\r\n        return {\r\n            'bid_count': len(bids),\r\n            'average_bid': round(avg_bid, 2),\r\n            'std_deviation': round(std_bid, 2),\r\n            'spread': round(max(amounts) - min(amounts), 2),\r\n            'spread_percent': round((max(amounts) - min(amounts)) \u002F avg_bid * 100, 1) if avg_bid > 0 else 0,\r\n            'benchmark': evaluations[0].benchmark_cost,\r\n            'best_value': {\r\n                'name': best_value.subcontractor_name,\r\n                'amount': best_value.bid_amount,\r\n                'variance_from_benchmark': best_value.variance_percent\r\n            },\r\n            'lowest_bid': {\r\n                'name': min(evaluations, key=lambda x: x.bid_amount).subcontractor_name,\r\n                'amount': min(amounts)\r\n            },\r\n            'outliers': [\r\n                {'name': e.subcontractor_name, 'status': e.status.value, 'variance': e.variance_percent}\r\n                for e in outliers\r\n            ],\r\n            'evaluations': evaluations\r\n        }\r\n\r\n    def generate_negotiation_points(self,\r\n                                     evaluation: BidEvaluation) -> List[Dict[str, Any]]:\r\n        \"\"\"Generate negotiation points based on evaluation.\"\"\"\r\n\r\n        points = []\r\n\r\n        if evaluation.status in [BidStatus.HIGH, BidStatus.OUTLIER_HIGH]:\r\n            points.append({\r\n                'topic': 'Overall Price',\r\n                'benchmark': evaluation.benchmark_cost,\r\n                'bid': evaluation.bid_amount,\r\n                'target': round(evaluation.benchmark_cost * 1.05, 2),  # 5% above benchmark\r\n                'potential_savings': round(evaluation.bid_amount - evaluation.benchmark_cost * 1.05, 2)\r\n            })\r\n\r\n            # Suggest line item discussions\r\n            for item in evaluation.line_item_analysis:\r\n                points.append({\r\n                    'topic': f\"Line Item: {item['code']}\",\r\n                    'benchmark': item['benchmark'],\r\n                    'suggestion': 'Request detailed breakdown'\r\n                })\r\n\r\n        return points\r\n\r\n    def export_bid_comparison(self,\r\n                               comparison: Dict[str, Any],\r\n                               output_path: str) -> str:\r\n        \"\"\"Export bid comparison to Excel.\"\"\"\r\n\r\n        with pd.ExcelWriter(output_path, engine='openpyxl') as writer:\r\n            # Summary\r\n            summary_df = pd.DataFrame([{\r\n                'Number of Bids': comparison['bid_count'],\r\n                'Average Bid': comparison['average_bid'],\r\n                'Spread': comparison['spread'],\r\n                'Spread %': comparison['spread_percent'],\r\n                'Benchmark': comparison['benchmark'],\r\n                'Best Value Bidder': comparison['best_value']['name'],\r\n                'Lowest Bidder': comparison['lowest_bid']['name']\r\n            }])\r\n            summary_df.to_excel(writer, sheet_name='Summary', index=False)\r\n\r\n            # All evaluations\r\n            eval_df = pd.DataFrame([\r\n                {\r\n                    'Subcontractor': e.subcontractor_name,\r\n                    'Bid Amount': e.bid_amount,\r\n                    'Benchmark': e.benchmark_cost,\r\n                    'Variance': e.variance,\r\n                    'Variance %': e.variance_percent,\r\n                    'Status': e.status.value,\r\n                    'Recommendation': e.recommendation\r\n                }\r\n                for e in comparison['evaluations']\r\n            ])\r\n            eval_df.to_excel(writer, sheet_name='Evaluations', index=False)\r\n\r\n        return output_path\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\n# Load CWICR data\r\ncwicr = pd.read_parquet(\"ddc_cwicr_en.parquet\")\r\n\r\n# Initialize analyzer\r\nanalyzer = CWICRSubcontractor(cwicr)\r\n\r\n# Define scope\r\nscope = [\r\n    {'work_item_code': 'ELEC-001', 'quantity': 100},\r\n    {'work_item_code': 'ELEC-002', 'quantity': 50}\r\n]\r\n\r\n# Create bid\r\nbid = SubcontractorBid(\r\n    subcontractor_name=\"ABC Electric\",\r\n    trade=\"Electrical\",\r\n    bid_amount=75000,\r\n    scope_items=scope,\r\n    includes_material=True,\r\n    includes_labor=True,\r\n    includes_equipment=True,\r\n    duration_days=30\r\n)\r\n\r\n# Evaluate\r\nevaluation = analyzer.evaluate_bid(bid)\r\nprint(f\"Status: {evaluation.status.value}\")\r\nprint(f\"Variance: {evaluation.variance_percent}%\")\r\nprint(f\"Recommendation: {evaluation.recommendation}\")\r\n```\r\n\r\n## Common Use Cases\r\n\r\n### 1. Compare Multiple Bids\r\n```python\r\nbids = [\r\n    SubcontractorBid(\"ABC Electric\", \"Electrical\", 75000, scope, True, True, True, 30),\r\n    SubcontractorBid(\"XYZ Power\", \"Electrical\", 68000, scope, True, True, True, 35),\r\n    SubcontractorBid(\"Quick Elec\", \"Electrical\", 82000, scope, True, True, True, 25)\r\n]\r\n\r\ncomparison = analyzer.compare_bids(bids)\r\nprint(f\"Best Value: {comparison['best_value']['name']}\")\r\n```\r\n\r\n### 2. Negotiation Support\r\n```python\r\npoints = analyzer.generate_negotiation_points(evaluation)\r\nfor point in points:\r\n    print(f\"{point['topic']}: Target ${point.get('target', 'N\u002FA')}\")\r\n```\r\n\r\n### 3. Export Report\r\n```python\r\nanalyzer.export_bid_comparison(comparison, \"bid_comparison.xlsx\")\r\n```\r\n\r\n## Resources\r\n- **GitHub**: [OpenConstructionEstimate-DDC-CWICR](https:\u002F\u002Fgithub.com\u002Fdatadrivenconstruction\u002FOpenConstructionEstimate-DDC-CWICR)\r\n- **DDC Book**: Chapter 3.2 - Subcontractor Management\r\n","# CWICR Subcontractor Analyzer\r\n\r\n## Business Case\r\n\r\n### Problem Statement\r\nEvaluating subcontractor bids requires:\r\n- Fair price benchmarks\r\n- Bid comparison\r\n- Outlier identification\r\n- Negotiation support\r\n\r\n### Solution\r\nCompare subcontractor bids against CWICR cost data to identify fair pricing, outliers, and negotiation opportunities.\r\n\r\n### Business Value\r\n- **Fair evaluation** - Objective benchmarks\r\n- **Cost savings** - Identify overpriced bids\r\n- **Risk detection** - Flag unrealistic low bids\r\n- **Negotiation support** - Data-driven discussions\r\n\r\n## Technical Implementation\r\n\r\n```python\r\nimport pandas as pd\r\nimport numpy as np\r\nfrom typing import Dict, Any, List, Optional\r\nfrom dataclasses import dataclass\r\nfrom enum import Enum\r\nfrom statistics import mean, stdev\r\n\r\n\r\nclass BidStatus(Enum):\r\n    \"\"\"Bid evaluation status.\"\"\"\r\n    COMPETITIVE = \"competitive\"\r\n    HIGH = \"high\"\r\n    LOW = \"low\"\r\n    OUTLIER_HIGH = \"outlier_high\"\r\n    OUTLIER_LOW = \"outlier_low\"\r\n\r\n\r\n@dataclass\r\nclass SubcontractorBid:\r\n    \"\"\"Subcontractor bid.\"\"\"\r\n    subcontractor_name: str\r\n    trade: str\r\n    bid_amount: float\r\n    scope_items: List[Dict[str, Any]]\r\n    includes_material: bool\r\n    includes_labor: bool\r\n    includes_equipment: bool\r\n    duration_days: int\r\n    notes: str = \"\"\r\n\r\n\r\n@dataclass\r\nclass BidEvaluation:\r\n    \"\"\"Bid evaluation result.\"\"\"\r\n    subcontractor_name: str\r\n    bid_amount: float\r\n    benchmark_cost: float\r\n    variance: float\r\n    variance_percent: float\r\n    status: BidStatus\r\n    line_item_analysis: List[Dict[str, Any]]\r\n    recommendation: str\r\n\r\n\r\nclass CWICRSubcontractor:\r\n    \"\"\"Analyze subcontractor bids using CWICR data.\"\"\"\r\n\r\n    OUTLIER_THRESHOLD = 0.30  # 30% from benchmark\r\n    HIGH_THRESHOLD = 0.15    # 15% above benchmark\r\n    LOW_THRESHOLD = -0.10    # 10% below benchmark\r\n\r\n    def __init__(self,\r\n                 cwicr_data: pd.DataFrame,\r\n                 overhead_rate: float = 0.12,\r\n                 profit_rate: float = 0.10):\r\n        self.cost_data = cwicr_data\r\n        self.overhead_rate = overhead_rate\r\n        self.profit_rate = profit_rate\r\n        self._index_data()\r\n\r\n    def _index_data(self):\r\n        \"\"\"Index cost data.\"\"\"\r\n        if 'work_item_code' in self.cost_data.columns:\r\n            self._code_index = self.cost_data.set_index('work_item_code')\r\n        else:\r\n            self._code_index = None\r\n\r\n    def calculate_benchmark(self,\r\n                            scope_items: List[Dict[str, Any]],\r\n                            include_overhead: bool = True,\r\n                            include_profit: bool = True) -> Dict[str, Any]:\r\n        \"\"\"Calculate benchmark cost for scope.\"\"\"\r\n\r\n        labor = 0\r\n        material = 0\r\n        equipment = 0\r\n\r\n        line_items = []\r\n\r\n        for item in scope_items:\r\n            code = item.get('work_item_code', item.get('code'))\r\n            qty = item.get('quantity', 0)\r\n\r\n            if self._code_index is not None and code in self._code_index.index:\r\n                wi = self._code_index.loc[code]\r\n                item_labor = float(wi.get('labor_cost', 0) or 0) * qty\r\n                item_material = float(wi.get('material_cost', 0) or 0) * qty\r\n                item_equipment = float(wi.get('equipment_cost', 0) or 0) * qty\r\n\r\n                labor += item_labor\r\n                material += item_material\r\n                equipment += item_equipment\r\n\r\n                line_items.append({\r\n                    'code': code,\r\n                    'quantity': qty,\r\n                    'labor': round(item_labor, 2),\r\n                    'material': round(item_material, 2),\r\n                    'equipment': round(item_equipment, 2),\r\n                    'total': round(item_labor + item_material + item_equipment, 2)\r\n                })\r\n\r\n        direct_cost = labor + material + equipment\r\n\r\n        overhead = direct_cost * self.overhead_rate if include_overhead else 0\r\n        profit = (direct_cost + overhead) * self.profit_rate if include_profit else 0\r\n\r\n        return {\r\n            'labor': round(labor, 2),\r\n            'material': round(material, 2),\r\n            'equipment': round(equipment, 2),\r\n            'direct_cost': round(direct_cost, 2),\r\n            'overhead': round(overhead, 2),\r\n            'profit': round(profit, 2),\r\n            'total': round(direct_cost + overhead + profit, 2),\r\n            'line_items': line_items\r\n        }\r\n\r\n    def evaluate_bid(self, bid: SubcontractorBid) -> BidEvaluation:\r\n        \"\"\"Evaluate single subcontractor bid.\"\"\"\r\n\r\n        benchmark = self.calculate_benchmark(bid.scope_items)\r\n        benchmark_cost = benchmark['total']\r\n\r\n        variance = bid.bid_amount - benchmark_cost\r\n        variance_pct = (variance \u002F benchmark_cost * 100) if benchmark_cost > 0 else 0\r\n\r\n        # Determine status\r\n        if variance_pct > self.OUTLIER_THRESHOLD * 100:\r\n            status = BidStatus.OUTLIER_HIGH\r\n            recommendation = \"Bid significantly above benchmark. Request detailed breakdown or reject.\"\r\n        elif variance_pct \u003C -self.OUTLIER_THRESHOLD * 100:\r\n            status = BidStatus.OUTLIER_LOW\r\n            recommendation = \"Bid significantly below benchmark. Verify scope understanding and capacity.\"\r\n        elif variance_pct > self.HIGH_THRESHOLD * 100:\r\n            status = BidStatus.HIGH\r\n            recommendation = \"Bid above benchmark. Consider negotiation or alternative bidders.\"\r\n        elif variance_pct \u003C self.LOW_THRESHOLD * 100:\r\n            status = BidStatus.LOW\r\n            recommendation = \"Bid below benchmark. Verify completeness and quality approach.\"\r\n        else:\r\n            status = BidStatus.COMPETITIVE\r\n            recommendation = \"Bid within acceptable range. Proceed with standard evaluation.\"\r\n\r\n        # Line item analysis\r\n        line_analysis = []\r\n        for i, item in enumerate(bid.scope_items):\r\n            if i \u003C len(benchmark['line_items']):\r\n                bench_item = benchmark['line_items'][i]\r\n                # Assume proportional pricing\r\n                expected = bench_item['total'] \u002F benchmark['direct_cost'] * bid.bid_amount if benchmark['direct_cost'] > 0 else 0\r\n                line_analysis.append({\r\n                    'code': item.get('work_item_code', item.get('code')),\r\n                    'benchmark': bench_item['total'],\r\n                    'expected_in_bid': round(expected, 2)\r\n                })\r\n\r\n        return BidEvaluation(\r\n            subcontractor_name=bid.subcontractor_name,\r\n            bid_amount=bid.bid_amount,\r\n            benchmark_cost=benchmark_cost,\r\n            variance=round(variance, 2),\r\n            variance_percent=round(variance_pct, 1),\r\n            status=status,\r\n            line_item_analysis=line_analysis,\r\n            recommendation=recommendation\r\n        )\r\n\r\n    def compare_bids(self,\r\n                      bids: List[SubcontractorBid]) -> Dict[str, Any]:\r\n        \"\"\"Compare multiple bids.\"\"\"\r\n\r\n        if not bids:\r\n            return {}\r\n\r\n        evaluations = [self.evaluate_bid(bid) for bid in bids]\r\n\r\n        # Statistics\r\n        amounts = [e.bid_amount for e in evaluations]\r\n        avg_bid = mean(amounts)\r\n        std_bid = stdev(amounts) if len(amounts) > 1 else 0\r\n\r\n        # Rank by variance from benchmark\r\n        ranked = sorted(evaluations, key=lambda x: abs(x.variance_percent))\r\n\r\n        # Find best value\r\n        competitive = [e for e in evaluations if e.status == BidStatus.COMPETITIVE]\r\n        if competitive:\r\n            best_value = min(competitive, key=lambda x: x.bid_amount)\r\n        else:\r\n            best_value = ranked[0]\r\n\r\n        # Identify outliers\r\n        outliers = [e for e in evaluations if e.status in [BidStatus.OUTLIER_HIGH, BidStatus.OUTLIER_LOW]]\r\n\r\n        return {\r\n            'bid_count': len(bids),\r\n            'average_bid': round(avg_bid, 2),\r\n            'std_deviation': round(std_bid, 2),\r\n            'spread': round(max(amounts) - min(amounts), 2),\r\n            'spread_percent': round((max(amounts) - min(amounts)) \u002F avg_bid * 100, 1) if avg_bid > 0 else 0,\r\n            'benchmark': evaluations[0].benchmark_cost,\r\n            'best_value': {\r\n                'name': best_value.subcontractor_name,\r\n                'amount': best_value.bid_amount,\r\n                'variance_from_benchmark': best_value.variance_percent\r\n            },\r\n            'lowest_bid': {\r\n                'name': min(evaluations, key=lambda x: x.bid_amount).subcontractor_name,\r\n                'amount': min(amounts)\r\n            },\r\n            'outliers': [\r\n                {'name': e.subcontractor_name, 'status': e.status.value, 'variance': e.variance_percent}\r\n                for e in outliers\r\n            ],\r\n            'evaluations': evaluations\r\n        }\r\n\r\n    def generate_negotiation_points(self,\r\n                                     evaluation: BidEvaluation) -> List[Dict[str, Any]]:\r\n        \"\"\"Generate negotiation points based on evaluation.\"\"\"\r\n\r\n        points = []\r\n\r\n        if evaluation.status in [BidStatus.HIGH, BidStatus.OUTLIER_HIGH]:\r\n            points.append({\r\n                'topic': 'Overall Price',\r\n                'benchmark': evaluation.benchmark_cost,\r\n                'bid': evaluation.bid_amount,\r\n                'target': round(evaluation.benchmark_cost * 1.05, 2),  # 5% above benchmark\r\n                'potential_savings': round(evaluation.bid_amount - evaluation.benchmark_cost * 1.05, 2)\r\n            })\r\n\r\n            # Suggest line item discussions\r\n            for item in evaluation.line_item_analysis:\r\n                points.append({\r\n                    'topic': f\"Line Item: {item['code']}\",\r\n                    'benchmark': item['benchmark'],\r\n                    'suggestion': 'Request detailed breakdown'\r\n                })\r\n\r\n        return points\r\n\r\n    def export_bid_comparison(self,\r\n                               comparison: Dict[str, Any],\r\n                               output_path: str) -> str:\r\n        \"\"\"Export bid comparison to Excel.\"\"\"\r\n\r\n        with pd.ExcelWriter(output_path, engine='openpyxl') as writer:\r\n            # Summary\r\n            summary_df = pd.DataFrame([{\r\n                'Number of Bids': comparison['bid_count'],\r\n                'Average Bid': comparison['average_bid'],\r\n                'Spread': comparison['spread'],\r\n                'Spread %': comparison['spread_percent'],\r\n                'Benchmark': comparison['benchmark'],\r\n                'Best Value Bidder': comparison['best_value']['name'],\r\n                'Lowest Bidder': comparison['lowest_bid']['name']\r\n            }])\r\n            summary_df.to_excel(writer, sheet_name='Summary', index=False)\r\n\r\n            # All evaluations\r\n            eval_df = pd.DataFrame([\r\n                {\r\n                    'Subcontractor': e.subcontractor_name,\r\n                    'Bid Amount': e.bid_amount,\r\n                    'Benchmark': e.benchmark_cost,\r\n                    'Variance': e.variance,\r\n                    'Variance %': e.variance_percent,\r\n                    'Status': e.status.value,\r\n                    'Recommendation': e.recommendation\r\n                }\r\n                for e in comparison['evaluations']\r\n            ])\r\n            eval_df.to_excel(writer, sheet_name='Evaluations', index=False)\r\n\r\n        return output_path\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\n# Load CWICR data\r\ncwicr = pd.read_parquet(\"ddc_cwicr_en.parquet\")\r\n\r\n# Initialize analyzer\r\nanalyzer = CWICRSubcontractor(cwicr)\r\n\r\n# Define scope\r\nscope = [\r\n    {'work_item_code': 'ELEC-001', 'quantity': 100},\r\n    {'work_item_code': 'ELEC-002', 'quantity': 50}\r\n]\r\n\r\n# Create bid\r\nbid = SubcontractorBid(\r\n    subcontractor_name=\"ABC Electric\",\r\n    trade=\"Electrical\",\r\n    bid_amount=75000,\r\n    scope_items=scope,\r\n    includes_material=True,\r\n    includes_labor=True,\r\n    includes_equipment=True,\r\n    duration_days=30\r\n)\r\n\r\n# Evaluate\r\nevaluation = analyzer.evaluate_bid(bid)\r\nprint(f\"Status: {evaluation.status.value}\")\r\nprint(f\"Variance: {evaluation.variance_percent}%\")\r\nprint(f\"Recommendation: {evaluation.recommendation}\")\r\n```\r\n\r\n## Common Use Cases\r\n\r\n### 1. Compare Multiple Bids\r\n```python\r\nbids = [\r\n    SubcontractorBid(\"ABC Electric\", \"Electrical\", 75000, scope, True, True, True, 30),\r\n    SubcontractorBid(\"XYZ Power\", \"Electrical\", 68000, scope, True, True, True, 35),\r\n    SubcontractorBid(\"Quick Elec\", \"Electrical\", 82000, scope, True, True, True, 25)\r\n]\r\n\r\ncomparison = analyzer.compare_bids(bids)\r\nprint(f\"Best Value: {comparison['best_value']['name']}\")\r\n```\r\n\r\n### 2. Negotiation Support\r\n```python\r\npoints = analyzer.generate_negotiation_points(evaluation)\r\nfor point in points:\r\n    print(f\"{point['topic']}: Target ${point.get('target', 'N\u002FA')}\")\r\n```\r\n\r\n### 3. Export Report\r\n```python\r\nanalyzer.export_bid_comparison(comparison, \"bid_comparison.xlsx\")\r\n```\r\n\r\n## Resources\r\n- **GitHub**: [OpenConstructionEstimate-DDC-CWICR](https:\u002F\u002Fgithub.com\u002Fdatadrivenconstruction\u002FOpenConstructionEstimate-DDC-CWICR)\r\n- **DDC Book**: Chapter 3.2 - Subcontractor Management\r\n",{"slug":5,"description":7,"display_name":31},"CWICR Subcontractor","main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fdatadrivenconstruction\u002Fcwicr-subcontractor",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":40,"prompt":50,"zipAvailable":51},[41,44,47],{"tool":42,"command":43},"npx","npx skills add kbarbel640-del\u002Fskills --skill cwicr-subcontractor",{"tool":45,"command":46},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill cwicr-subcontractor",{"tool":48,"command":49},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill cwicr-subcontractor","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002Fcwicr-subcontractor\u002FSKILL.md",true,[53],{"path":54,"resourceType":55,"resourceTypeDesc":56,"sizeBytes":57,"sourceHtmlUrl":58},"_meta.json","REFERENCE","参考文档",306,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fdatadrivenconstruction\u002Fcwicr-subcontractor\u002F_meta.json",[60,91,119,140,146,166],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":71,"publishedAt":26},"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",[66],{"categoryNo":67,"categoryName":68,"taxonomyType":69,"taxonomyTypeDesc":70},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],"crowd prompting","prompting","api","with","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","https","content","ai agents",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":102,"publishedAt":26},"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",[97],{"categoryNo":98,"categoryName":99,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[103,74,104,22,105,106,107,108,109,110,111,112,113,114,115,116,117,79,118],"dilemm ai","arena","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":128,"publishedAt":26},"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",[125],{"categoryNo":126,"categoryName":127,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000021","资料检索与研究",[129,130,131,132,133,134,135,75,136,116,118,137,74,138,139],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http","via",{"skillNo":141,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":145,"publishedAt":26},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[144],{"categoryNo":126,"categoryName":127,"taxonomyType":100,"taxonomyTypeDesc":101},[132,131,130,129,139,134,135,75,133,116,118,136,137,74,138],{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":26},"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",[],[153,154,155,156,157,158,159,160,161,162,163,164,165],"git","summary","git summary","commits","repository","win32","status","linux","contributors","true","quick","get","branches",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":176,"publishedAt":26},"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",[172,173],{"categoryNo":98,"categoryName":99,"taxonomyType":100,"taxonomyTypeDesc":101},{"categoryNo":174,"categoryName":175,"taxonomyType":69,"taxonomyTypeDesc":70},"01JBSEEDCAT000000000000037","律师与法务",[177,178,179,180,75,181,182,32,183,137,184,185,186,187,188,88,189,190,191],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","projects","compliance","actions","state","governance","github"]