Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Track material procurement from requisition to delivery. Monitor lead times, vendors, and costs.
.claude/skills/datadrivenconstruction-material-procurement-tracker/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 336% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 405% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 56% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 55% | 0% |
Long lead items and material procurement require careful tracking to avoid schedule delays.
pythonimport pandas as pd from datetime import date, timedelta from typing import Dict, Any, List, Optional from dataclasses import dataclass, field from enum import Enum class ProcurementStatus(Enum): REQUISITIONED = "requisitioned" RFQ_SENT = "rfq_sent" QUOTED = "quoted" PO_ISSUED = "po_issued" IN_PRODUCTION = "in_production" SHIPPED = "shipped" DELIVERED = "delivered" class Priority(Enum): CRITICAL = "critical" HIGH = "high" NORMAL = "normal" LOW = "low" @dataclass class ProcurementItem: item_id: str description: str spec_section: str quantity: float unit: str required_date: date lead_time_days: int status: ProcurementStatus priority: Priority vendor: str = "" po_number: str = "" po_amount: float = 0.0 order_date: Optional[date] = None expected_delivery: Optional[date] = None actual_delivery: Optional[date] = None @property def must_order_by(self) -> date: return self.required_date - timedelta(days=self.lead_time_days) @property def is_late_to_order(self) -> bool: if self.status in [ProcurementStatus.PO_ISSUED, ProcurementStatus.IN_PRODUCTION, ProcurementStatus.SHIPPED, ProcurementStatus.DELIVERED]: return False return date.today() > self.must_order_by class MaterialProcurementTracker: def __init__(self, project_name: str): self.project_name = project_name self.items: Dict[str, ProcurementItem] = {} self._counter = 0 def add_item(self, description: str, spec_section: str, quantity: float, unit: str, required_date: date, lead_time_days: int, priority: Priority = Priority.NORMAL) -> ProcurementItem: self._counter += 1 item_id = f"PROC-{self._counter:04d}" item = ProcurementItem( item_id=item_id, description=description, spec_section=spec_section, quantity=quantity, unit=unit, required_date=required_date, lead_time_days=lead_time_days, status=ProcurementStatus.REQUISITIONED, priority=priority ) self.items[item_id] = item return item def issue_po(self, item_id: str, vendor: str, po_number: str, amount: float, expected_delivery: date): if item_id in self.items: item = self.items[item_id] item.status = ProcurementStatus.PO_ISSUED item.vendor = vendor item.po_number = po_number item.po_amount = amount item.order_date = date.today() item.expected_delivery = expected_delivery def update_status(self, item_id: str, status: ProcurementStatus): if item_id in self.items: self.items[item_id].status = status if status == ProcurementStatus.DELIVERED: self.items[item_id].actual_delivery = date.today() def get_items_to_order(self) -> List[ProcurementItem]: """Get items that need to be ordered soon.""" cutoff = date.today() + timedelta(days=14) return [i for i in self.items.values() if i.status in [ProcurementStatus.REQUISITIONED, ProcurementStatus.RFQ_SENT, ProcurementStatus.QUOTED] and i.must_order_by <= cutoff] def get_late_items(self) -> List[ProcurementItem]: return [i for i in self.items.values() if i.is_late_to_order] def get_summary(self) -> Dict[str, Any]: by_status = {} total_value = 0 for item in self.items.values(): status = item.status.value by_status[status] = by_status.get(status, 0) + 1 total_value += item.po_amount return { 'total_items': len(self.items), 'by_status': by_status, 'total_po_value': total_value, 'items_to_order': len(self.get_items_to_order()), 'late_items': len(self.get_late_items()) } def export_log(self, output_path: str): data = [{ 'ID': i.item_id, 'Description': i.description, 'Spec': i.spec_section, 'Qty': i.quantity, 'Unit': i.unit, 'Required': i.required_date, 'Lead Time': i.lead_time_days, 'Must Order By': i.must_order_by, 'Status': i.status.value, 'Vendor': i.vendor, 'PO': i.po_number, 'Amount': i.po_amount } for i in self.items.values()] pd.DataFrame(data).to_excel(output_path, index=False)
pythontracker = MaterialProcurementTracker("Office Tower") item = tracker.add_item( description="Structural Steel W14x90", spec_section="05 12 00", quantity=500, unit="TON", required_date=date(2024, 6, 1), lead_time_days=90, priority=Priority.CRITICAL ) tracker.issue_po(item.item_id, "ABC Steel", "PO-2024-001", 450000, date(2024, 5, 15)) urgent = tracker.get_items_to_order() print(f"Items needing order: {len(urgent)}")
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-03 | pass→pass | 10,644 | 4,493 | -58% | 1 | 1 | 0% | 2,177 | 2,491 | +14% | 0 | 0 | — |
case-01 | fail→pass | 6,591 | 15,516 | +135% | 1 | 1 | 0% | 1,191 | 5,188 | +336% | 0 | 0 | — |
case-02 | fail→pass | 5,309 | 12,728 | +140% | 1 | 1 | 0% | 888 | 4,484 | +405% | 0 | 0 | — |
case-04 | pass→pass | 12,544 | 7,413 | -41% | 1 | 1 | 0% | 2,306 | 3,022 | +31% | 0 | 0 | — |
case-05 | fail→pass | 10,316 | 5,544 | -46% | 1 | 1 | 0% | 1,662 | 2,585 | +56% | 0 | 0 | — |
case-06 | pass→pass | 11,581 | 5,217 | -55% | 1 | 1 | 0% | 1,966 | 2,516 | +28% | 0 | 0 | — |
case-07 | fail→pass | 11,092 | 2,743 | -75% | 1 | 1 | 0% | 1,934 | 2,114 | +9% | 0 | 0 | — |
case-08 | fail→pass | 8,940 | 4,382 | -51% | 1 | 1 | 0% | 1,476 | 2,283 | +55% | 0 | 0 | — |
case-09 | fail→pass | 8,716 | 3,081 | -65% | 1 | 1 | 0% | 1,392 | 2,149 | +54% | 0 | 0 | — |
case-10 | fail→fail | 6,703 | 4,228 | -37% | 1 | 1 | 0% | 1,096 | 2,142 | +95% | 0 | 0 | — |
case-11 | pass→pass | 8,200 | 2,885 | -65% | 1 | 1 | 0% | 1,255 | 2,085 | +66% | 0 | 0 | — |
case-12 | pass→pass | 12,021 | 4,549 | -62% | 1 | 1 | 0% | 1,829 | 2,390 | +31% | 0 | 0 | — |
case-13 | fail→pass | 12,765 | 2,978 | -77% | 1 | 1 | 0% | 1,513 | 2,140 | +41% | 0 | 0 | — |
case-14 | pass→pass | 14,715 | 3,691 | -75% | 1 | 1 | 0% | 2,308 | 2,342 | +1% | 0 | 0 | — |
case-15 | pass→pass | 8,825 | 6,387 | -28% | 1 | 1 | 0% | 1,684 | 2,935 | +74% | 0 | 0 | — |
case-16 | fail→pass | 9,254 | 4,121 | -55% | 1 | 1 | 0% | 1,500 | 2,225 | +48% | 0 | 0 | — |
case-17 | fail→pass | 6,686 | 2,717 | -59% | 1 | 1 | 0% | 1,065 | 2,131 | +100% | 0 | 0 | — |
case-18 | fail→pass | 7,309 | 2,255 | -69% | 1 | 1 | 0% | 1,180 | 1,952 | +65% | 0 | 0 | — |
case-19 | fail→pass | 5,167 | 1,626 | -69% | 1 | 1 | 0% | 770 | 1,833 | +138% | 0 | 0 | — |
case-20 | pass→pass | 17,326 | 15,159 | -13% | 1 | 1 | 0% | 2,867 | 4,782 | +67% | 0 | 0 | — |
case-21 | pass→pass | 6,577 | 5,839 | -11% | 1 | 1 | 0% | 1,518 | 2,856 | +88% | 0 | 0 | — |
case-22 | pass→pass | 17,750 | 21,077 | +19% | 1 | 1 | 0% | 2,686 | 5,188 | +93% | 0 | 0 | — |
case-23 | pass→pass | 17,271 | 20,127 | +17% | 1 | 1 | 0% | 2,706 | 4,994 | +85% | 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. 23 cases were attempted. The headline lift of +48 percentage points is the difference between those two pass rates over the 23 comparable cases.
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.