datadrivenconstruction/uberization-readiness
Assess company readiness for construction industry uberization. Analyze data transparency, process automation, and competitive positioning against open data platforms.
npx skills add https://github.com/datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction --skill uberization-readiness
The construction industry faces disruption from open data platforms that bring transparency to pricing, quality, and performance. Companies that fail to adapt risk being "uberized" out of the market.
> "Traditional business model often thrives on opacity... Automation and open data bring radical transparency." — Artem Boiko
> "Working with construction companies on process automation is like trying to build a copy of Uber for taxi drivers at an airport in 2005." — Artem Boiko
┌─────────────────────────────────────────────────────────────────┐
│ TRADITIONAL vs UBERIZED CONSTRUCTION │
├─────────────────────────────────────────────────────────────────┤
│ │
│ TRADITIONAL MODEL UBERIZED MODEL │
│ ───────────────── ────────────── │
│ │
│ • Opaque pricing • Transparent rates │
│ • Relationship-based • Performance-based │
│ • Manual processes • Automated workflows │
│ • Information asymmetry • Open data access │
│ • Proprietary data • Shared databases │
│ • Slow decision making • Real-time analytics │
│ │
│ "Knowledge is power" "Data is shared" │
│ │
└─────────────────────────────────────────────────────────────────┘
from dataclasses import dataclass
from enum import Enum
from typing import List, Dict
class ReadinessLevel(Enum):
VULNERABLE = 1 # High disruption risk
REACTIVE = 2 # Responding to change
ADAPTIVE = 3 # Actively transforming
LEADING = 4 # Driving change
@dataclass
class AssessmentDimension:
name: str
current_state: str
target_state: str
score: int # 1-10
actions: List[str]
def assess_uberization_readiness(company_data: dict) -> dict:
"""Assess company readiness for industry disruption"""
dimensions = []
# 1. Data Transparency
dimensions.append(AssessmentDimension(
name="Data Transparency",
current_state=company_data.get("pricing_model", "opaque"),
target_state="Transparent pricing with clear breakdowns",
score=rate_transparency(company_data),
actions=[
"Publish rate cards for standard work items",
"Use CWICR codes for consistent pricing",
"Provide detailed estimate breakdowns"
]
))
# 2. Process Automation
dimensions.append(AssessmentDimension(
name="Process Automation",
current_state=company_data.get("automation_level", "manual"),
target_state="Automated workflows with minimal manual intervention",
score=rate_automation(company_data),
actions=[
"Implement ETL pipelines for data processing",
"Automate daily reporting",
"Deploy AI for document processing"
]
))
# 3. Data Accessibility
dimensions.append(AssessmentDimension(
name="Data Accessibility",
current_state=company_data.get("data_access", "siloed"),
target_state="Real-time data access for all stakeholders",
score=rate_accessibility(company_data),
actions=[
"Deploy dashboards for clients",
"Provide API access to project data",
"Eliminate data silos"
]
))
# 4. Performance Metrics
dimensions.append(AssessmentDimension(
name="Performance Tracking",
current_state=company_data.get("kpi_tracking", "none"),
target_state="Real-time KPIs with historical benchmarks",
score=rate_performance(company_data),
actions=[
"Track cost variance per project",
"Measure schedule performance index",
"Monitor quality metrics"
]
))
# 5. Open Standards Adoption
dimensions.append(AssessmentDimension(
name="Open Standards",
current_state=company_data.get("standards", "proprietary"),
target_state="Full adoption of open data standards",
score=rate_standards(company_data),
actions=[
"Adopt IFC for BIM data exchange",
"Use CWICR for work item classification",
"Implement open APIs"
]
))
# Calculate overall readiness
total_score = sum(d.score for d in dimensions)
max_score = len(dimensions) * 10
readiness_pct = (total_score / max_score) * 100
if readiness_pct < 30:
level = ReadinessLevel.VULNERABLE
elif readiness_pct < 50:
level = ReadinessLevel.REACTIVE
elif readiness_pct < 75:
level = ReadinessLevel.ADAPTIVE
else:
level = ReadinessLevel.LEADING
return {
"dimensions": dimensions,
"total_score": total_score,
"max_score": max_score,
"readiness_percentage": readiness_pct,
"readiness_level": level.name,
"risk_assessment": generate_risk_assessment(level, dimensions)
}
assessment_questions = [
# Data Transparency
{
"category": "Data Transparency",
"question": "How are your project estimates presented to clients?",
"options": {
"Lump sum only": 1,
"Cost categories without detail": 3,
"Line item detail": 6,
"Full transparency with unit rates": 10
}
},
{
"category": "Data Transparency",
"question": "Can clients access project data in real-time?",
"options": {
"No access": 1,
"Monthly reports": 3,
"Weekly reports": 5,
"Real-time dashboard": 10
}
},
# Process Automation
{
"category": "Process Automation",
"question": "How are daily reports generated?",
"options": {
"Manual writing": 1,
"Template filling": 3,
"Semi-automated": 6,
"Fully automated": 10
}
},
{
"category": "Process Automation",
"question": "How is estimate data created?",
"options": {
"Manual in Excel": 1,
"Estimating software": 4,
"BIM-linked QTO": 7,
"AI-assisted automation": 10
}
},
# Data Accessibility
{
"category": "Data Accessibility",
"question": "How is project data stored?",
"options": {
"Local files": 1,
"Shared drives": 3,
"Cloud platform": 6,
"Integrated database with API": 10
}
},
# Open Standards
{
"category": "Open Standards",
"question": "What work classification system do you use?",
"options": {
"Internal codes only": 1,
"CSI MasterFormat": 5,
"Open standard (CWICR, Uniclass)": 8,
"Multiple standards with mapping": 10
}
}
]
def analyze_competitive_threats(market_data: dict) -> dict:
"""Analyze threats from open data platforms"""
threats = []
# Threat 1: Price transparency platforms
if market_data.get("price_platforms_active"):
threats.append({
"threat": "Price Comparison Platforms",
"description": "Platforms like OpenEstimate allow clients to compare contractor rates",
"impact": "HIGH",
"response": "Compete on value and transparency, not information asymmetry"
})
# Threat 2: Performance rating systems
threats.append({
"threat": "Performance Ratings",
"description": "Public contractor ratings based on cost, schedule, quality",
"impact": "MEDIUM",
"response": "Proactively track and publish your own performance metrics"
})
# Threat 3: AI estimation tools
threats.append({
"threat": "AI Estimation",
"description": "Clients can generate estimates without contractors",
"impact": "HIGH",
"response": "Add value beyond estimation: execution expertise, risk management"
})
# Threat 4: Direct material sourcing
threats.append({
"threat": "Material Marketplaces",
"description": "Open material pricing eliminates markup opacity",
"impact": "MEDIUM",
"response": "Provide transparent cost-plus pricing"
})
return {
"threats": threats,
"overall_risk": calculate_overall_risk(threats),
"time_to_impact": "3-5 years",
"recommended_actions": generate_action_plan(threats)
}
Year 1: Foundation
├── Adopt open work classification (CWICR)
├── Implement data centralization
├── Deploy basic automation (daily reports)
└── Start tracking KPIs
Year 2: Automation
├── Deploy AI document processing
├── Automate estimation workflows
├── Build client dashboards
└── Integrate systems (BIM → ERP → PM)
Year 3: Transparency
├── Publish performance metrics
├── Provide real-time project access
├── Open API for integrations
└── Transparent pricing models
Year 4+: Leadership
├── Contribute to open data initiatives
├── Build platform capabilities
├── Lead industry transformation
└── Monetize data insights
def generate_readiness_report(assessment: dict) -> str:
"""Generate executive summary report"""
report = f"""
# Uberization Readiness Report
## Overall Assessment
- **Readiness Level:** {assessment['readiness_level']}
- **Score:** {assessment['total_score']}/{assessment['max_score']} ({assessment['readiness_percentage']:.0f}%)
## Risk Assessment
{assessment['risk_assessment']}
## Dimension Scores
| Dimension | Score | Status |
|-----------|-------|--------|
"""
for dim in assessment['dimensions']:
status = "🟢" if dim.score >= 7 else "🟡" if dim.score >= 4 else "🔴"
report += f"| {dim.name} | {dim.score}/10 | {status} |\n"
report += """
## Recommended Actions
### Immediate (0-6 months)
"""
for dim in assessment['dimensions']:
if dim.score < 5:
report += f"\n**{dim.name}:**\n"
for action in dim.actions[:2]:
report += f"- {action}\n"
return report
Take datadrivenconstruction/uberization-readiness from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.