name: bid-summary
description: Summarize construction bid details with historical win/loss comparison and risk analysis
user-invocable: true
metadata:
{ "openclaw": { "emoji": "📑", "category": "construction", "requires": { "bins": ["python3"], "pip": [] } } }
When to use
Use this skill when the user needs to analyze or summarize a construction bid. Common scenarios:
- Bid/no-bid decisions: evaluate whether to pursue an opportunity based on fit, capacity, and win probability
- Pre-submission review: summarize the bid package before sending to verify completeness and competitiveness
- Historical comparison: compare a new bid against past wins and losses to calibrate pricing
- Competitive analysis: assess positioning against known competitors
- Post-award analysis: review won or lost bids to refine future estimating
Steps
Gather bid details from the user: project info, estimate breakdown, deadline, known competitors, and any historical bid data.
Build a JSON config object with this structure:
{
"output_path": "/absolute/path/to/bid_summary.md",
"bid": {
"project_name": "Municipal Water Treatment Plant Expansion",
"bid_number": "BID-2026-0089",
"owner": "City of Dearborn",
"architect_engineer": "Smith & Associates",
"bid_date": "2026-03-15",
"project_type": "municipal",
"delivery_method": "design-bid-build",
"estimated_duration_months": 18,
"location": "Dearborn, MI",
"description": "Expansion of existing water treatment facility from 10MGD to 15MGD capacity"
},
"estimate": {
"total_bid": 4250000.00,
"categories": [
{ "name": "General Conditions", "amount": 340000.00, "percent": 8.0 },
{ "name": "Sitework", "amount": 425000.00, "percent": 10.0 },
{ "name": "Concrete", "amount": 680000.00, "percent": 16.0 },
{ "name": "Structural Steel", "amount": 510000.00, "percent": 12.0 },
{ "name": "Mechanical/Plumbing", "amount": 935000.00, "percent": 22.0 },
{ "name": "Electrical", "amount": 595000.00, "percent": 14.0 },
{ "name": "Finishes", "amount": 340000.00, "percent": 8.0 },
{ "name": "Contingency", "amount": 212500.00, "percent": 5.0 },
{ "name": "Profit/Overhead", "amount": 212500.00, "percent": 5.0 }
],
"unit_cost_sqft": 125.00,
"bond_required": true,
"bond_cost": 42500.00,
"insurance_requirements": "2M general liability, 1M per occurrence"
},
"competitors": [
{ "name": "Barton Malow", "estimated_bid": 4100000.00, "notes": "Strong municipal track record" },
{ "name": "Walbridge", "estimated_bid": 4400000.00, "notes": "Less water/wastewater experience" }
],
"historical": [
{ "project_type": "municipal", "bid_amount": 3200000.00, "result": "won", "margin": 0.08, "year": 2025 },
{ "project_type": "municipal", "bid_amount": 5100000.00, "result": "lost", "margin": 0.12, "year": 2025 },
{ "project_type": "municipal", "bid_amount": 2800000.00, "result": "won", "margin": 0.06, "year": 2024 },
{ "project_type": "commercial", "bid_amount": 1500000.00, "result": "won", "margin": 0.10, "year": 2025 },
{ "project_type": "industrial", "bid_amount": 6000000.00, "result": "lost", "margin": 0.15, "year": 2024 }
],
"risk_factors": [
{ "factor": "Unfamiliar owner — no prior relationship", "severity": "medium" },
{ "factor": "Hazardous materials abatement scope unclear", "severity": "high" },
{ "factor": "Tight schedule with liquidated damages clause", "severity": "high" }
]
}
- Write the JSON config to a temporary file:
cat > /tmp/bid_summary_config.json << 'JSONEOF'
{ ... your config ... }
JSONEOF
- Run the generator script:
python3 {baseDir}/bid_summary.py /tmp/bid_summary_config.json
Report the output path printed by the script to the user.
Clean up the temporary JSON file.
JSON Config Reference
| Field |
Type |
Required |
Description |
output_path |
string |
no |
Absolute path for output markdown (defaults to /tmp/) |
bid |
object |
yes |
Bid and project identification |
estimate |
object |
yes |
Cost estimate breakdown |
competitors |
array |
no |
Known competitor information |
historical |
array |
no |
Historical bid results for comparison |
risk_factors |
array |
no |
Identified risk factors |
Bid Object
| Field |
Type |
Required |
Description |
project_name |
string |
yes |
Project name |
bid_number |
string |
no |
Internal bid tracking number |
owner |
string |
yes |
Project owner |
architect_engineer |
string |
no |
A/E firm |
bid_date |
string |
yes |
Bid due date (YYYY-MM-DD) |
project_type |
string |
yes |
One of: residential, commercial, industrial, municipal, infrastructure, renovation |
delivery_method |
string |
no |
One of: design-bid-build, design-build, cm-at-risk, cm-agency |
estimated_duration_months |
number |
no |
Expected project duration |
location |
string |
no |
Project location |
description |
string |
no |
Brief project description |
Estimate Object
| Field |
Type |
Required |
Description |
total_bid |
number |
yes |
Total bid amount |
categories |
array |
yes |
Cost breakdown by category |
unit_cost_sqft |
number |
no |
Cost per square foot |
bond_required |
boolean |
no |
Whether a bid bond is required |
bond_cost |
number |
no |
Bond premium cost |
insurance_requirements |
string |
no |
Insurance requirements |
Estimate Category Object
| Field |
Type |
Required |
Description |
name |
string |
yes |
Category name |
amount |
number |
yes |
Category amount |
percent |
number |
no |
Percentage of total bid |
Competitor Object
| Field |
Type |
Required |
Description |
name |
string |
yes |
Competitor name |
estimated_bid |
number |
no |
Estimated competitor bid amount |
notes |
string |
no |
Intel notes |
Historical Bid Object
| Field |
Type |
Required |
Description |
project_type |
string |
yes |
Project type category |
bid_amount |
number |
yes |
Bid amount |
result |
string |
yes |
One of: won, lost, pending, no-bid |
margin |
number |
no |
Profit margin as decimal |
year |
number |
no |
Year of bid |
Risk Factor Object
| Field |
Type |
Required |
Description |
factor |
string |
yes |
Risk description |
severity |
string |
yes |
One of: low, medium, high, critical |
Examples
Simple Bid Summary
{
"bid": {
"project_name": "TCG Warehouse Addition",
"owner": "TCG",
"bid_date": "2026-02-28",
"project_type": "commercial"
},
"estimate": {
"total_bid": 850000.00,
"categories": [
{ "name": "General Conditions", "amount": 85000.00 },
{ "name": "Concrete/Foundation", "amount": 170000.00 },
{ "name": "Structural Steel", "amount": 255000.00 },
{ "name": "Mechanical/Electrical", "amount": 212500.00 },
{ "name": "Profit/OH", "amount": 127500.00 }
]
}
}
Bid with Full Historical Comparison
{
"output_path": "/home/holden/outputs/bid_water_plant.md",
"bid": {
"project_name": "Water Treatment Expansion",
"owner": "City of Dearborn",
"bid_date": "2026-03-15",
"project_type": "municipal",
"delivery_method": "design-bid-build"
},
"estimate": {
"total_bid": 4250000.00,
"categories": [
{ "name": "General Conditions", "amount": 340000.00, "percent": 8.0 },
{ "name": "Concrete", "amount": 680000.00, "percent": 16.0 },
{ "name": "Mechanical", "amount": 935000.00, "percent": 22.0 }
]
},
"historical": [
{ "project_type": "municipal", "bid_amount": 3200000.00, "result": "won", "margin": 0.08 },
{ "project_type": "municipal", "bid_amount": 5100000.00, "result": "lost", "margin": 0.12 }
],
"competitors": [
{ "name": "Barton Malow", "estimated_bid": 4100000.00 }
],
"risk_factors": [
{ "factor": "Hazmat scope unclear", "severity": "high" }
]
}
Constraints
- Output format is markdown only
- Dates must be in YYYY-MM-DD format
- Historical data is optional but strongly recommended for meaningful analysis
- Competitor bid estimates are inherently speculative — the report labels them as estimates
- The script requires only Python 3 standard library (no additional pip packages)
- Currency is formatted as USD ($); no multi-currency support
- The output directory must already exist if specifying an output_path
- Percentage breakdowns should be pre-calculated and consistent with total