Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Prequalify subcontractors based on safety, financial, and performance criteria.
.claude/skills/datadrivenconstruction-subcontractor-prequalification/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 89% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 138% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 183% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 162% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 17% | 0% |
pythonimport pandas as pd from datetime import date from typing import Dict, Any, List from dataclasses import dataclass, field from enum import Enum class QualificationStatus(Enum): PENDING = "pending" QUALIFIED = "qualified" CONDITIONALLY_QUALIFIED = "conditionally_qualified" NOT_QUALIFIED = "not_qualified" @dataclass class PrequalificationCriteria: name: str weight: float min_score: int max_score: int = 10 @dataclass class SubcontractorApplication: app_id: str company_name: str trade: str contact_email: str years_in_business: int annual_revenue: float bonding_capacity: float emr_rate: float # Experience Modification Rate status: QualificationStatus scores: Dict[str, int] = field(default_factory=dict) documents_received: List[str] = field(default_factory=list) notes: str = "" @property def total_score(self) -> float: return sum(self.scores.values()) class SubcontractorPrequalification: def __init__(self, project_name: str): self.project_name = project_name self.applications: Dict[str, SubcontractorApplication] = {} self.criteria = self._default_criteria() self._counter = 0 def _default_criteria(self) -> List[PrequalificationCriteria]: return [ PrequalificationCriteria("Safety Record", 0.25, 6), PrequalificationCriteria("Financial Stability", 0.20, 5), PrequalificationCriteria("Experience", 0.20, 6), PrequalificationCriteria("References", 0.15, 5), PrequalificationCriteria("Capacity", 0.10, 5), PrequalificationCriteria("Insurance/Bonding", 0.10, 7) ] def add_application(self, company_name: str, trade: str, contact_email: str, years_in_business: int, annual_revenue: float, bonding_capacity: float, emr_rate: float) -> SubcontractorApplication: self._counter += 1 app_id = f"PQ-{self._counter:03d}" app = SubcontractorApplication( app_id=app_id, company_name=company_name, trade=trade, contact_email=contact_email, years_in_business=years_in_business, annual_revenue=annual_revenue, bonding_capacity=bonding_capacity, emr_rate=emr_rate, status=QualificationStatus.PENDING ) self.applications[app_id] = app return app def score_application(self, app_id: str, scores: Dict[str, int]): if app_id not in self.applications: return app = self.applications[app_id] app.scores = scores self._evaluate_qualification(app) def _evaluate_qualification(self, app: SubcontractorApplication): passed = True for criteria in self.criteria: score = app.scores.get(criteria.name, 0) if score < criteria.min_score: passed = False break if passed and app.total_score >= 60: app.status = QualificationStatus.QUALIFIED elif app.total_score >= 50: app.status = QualificationStatus.CONDITIONALLY_QUALIFIED else: app.status = QualificationStatus.NOT_QUALIFIED def get_qualified(self, trade: str = None) -> List[SubcontractorApplication]: qualified = [a for a in self.applications.values() if a.status in [QualificationStatus.QUALIFIED, QualificationStatus.CONDITIONALLY_QUALIFIED]] if trade: qualified = [a for a in qualified if a.trade.lower() == trade.lower()] return qualified def export_register(self, output_path: str): data = [{ 'ID': a.app_id, 'Company': a.company_name, 'Trade': a.trade, 'Years': a.years_in_business, 'Revenue': a.annual_revenue, 'EMR': a.emr_rate, 'Status': a.status.value, 'Score': a.total_score } for a in self.applications.values()] pd.DataFrame(data).to_excel(output_path, index=False)
pythonprequal = SubcontractorPrequalification("Office Tower") app = prequal.add_application("ABC Electric", "Electrical", "info@abc.com", years_in_business=15, annual_revenue=10000000, bonding_capacity=5000000, emr_rate=0.85) prequal.score_application(app.app_id, { "Safety Record": 8, "Financial Stability": 7, "Experience": 8, "References": 7, "Capacity": 8, "Insurance/Bonding": 9 }) qualified = prequal.get_qualified("Electrical")
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | fail→pass | 9,282 | 9,740 | +5% | 1 | 1 | 0% | 1,814 | 3,433 | +89% | 0 | 0 | — |
case-20 | pass→pass | 15,217 | 18,254 | +20% | 1 | 1 | 0% | 2,551 | 4,701 | +84% | 0 | 0 | — |
case-03 | fail→pass | 8,541 | 13,219 | +55% | 1 | 1 | 0% | 1,856 | 4,408 | +138% | 0 | 0 | — |
case-01 | fail→pass | 13,443 | 25,939 | +93% | 1 | 1 | 0% | 2,730 | 7,723 | +183% | 0 | 0 | — |
case-02 | fail→pass | 9,379 | 14,924 | +59% | 1 | 1 | 0% | 1,758 | 4,608 | +162% | 0 | 0 | — |
case-05 | pass→fail | 11,366 | 7,216 | -37% | 1 | 1 | 0% | 1,777 | 2,837 | +60% | 0 | 0 | — |
case-06 | fail→pass | 10,879 | 3,586 | -67% | 1 | 1 | 0% | 1,694 | 1,986 | +17% | 0 | 0 | — |
case-07 | fail→pass | 5,457 | 3,962 | -27% | 1 | 1 | 0% | 965 | 2,115 | +119% | 0 | 0 | — |
case-08 | pass→pass | 5,728 | 3,302 | -42% | 1 | 1 | 0% | 908 | 1,974 | +117% | 0 | 0 | — |
case-09 | fail→pass | 8,313 | 2,870 | -65% | 1 | 1 | 0% | 1,269 | 1,851 | +46% | 0 | 0 | — |
case-10 | fail→pass | 12,502 | 2,914 | -77% | 1 | 1 | 0% | 2,070 | 1,893 | -9% | 0 | 0 | — |
case-11 | pass→pass | 9,299 | 3,144 | -66% | 1 | 1 | 0% | 1,544 | 1,906 | +23% | 0 | 0 | — |
case-12 | fail→pass | 6,139 | 3,150 | -49% | 1 | 1 | 0% | 924 | 1,986 | +115% | 0 | 0 | — |
case-13 | fail→pass | 5,610 | 3,091 | -45% | 1 | 1 | 0% | 884 | 1,948 | +120% | 0 | 0 | — |
case-14 | fail→pass | 8,268 | 2,519 | -70% | 1 | 1 | 0% | 1,384 | 1,764 | +27% | 0 | 0 | — |
case-15 | pass→pass | 7,900 | 5,332 | -33% | 1 | 1 | 0% | 1,215 | 2,364 | +95% | 0 | 0 | — |
case-16 | pass→pass | 6,310 | 2,671 | -58% | 1 | 1 | 0% | 983 | 1,783 | +81% | 0 | 0 | — |
case-17 | pass→pass | 6,799 | 3,323 | -51% | 1 | 1 | 0% | 1,092 | 1,923 | +76% | 0 | 0 | — |
case-18 | pass→pass | 9,450 | 2,577 | -73% | 1 | 1 | 0% | 1,423 | 1,778 | +25% | 0 | 0 | — |
case-19 | fail→pass | 5,825 | 1,570 | -73% | 1 | 1 | 0% | 913 | 1,572 | +72% | 0 | 0 | — |
case-21 | pass→pass | 14,089 | 13,662 | -3% | 1 | 1 | 0% | 2,438 | 4,178 | +71% | 0 | 0 | — |
case-22 | pass→pass | 16,213 | 18,479 | +14% | 1 | 1 | 0% | 2,734 | 5,105 | +87% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +50 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.