datadrivenconstruction/ddc_skills_for_ai_agents_in_construction98 installs
project-closeout-checklist
Manage project closeout activities. Track completion of documentation, warranties, and final inspections.
How do I install this agent skill?
npx skills add https://github.com/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction --skill project-closeout-checklistIs this agent skill safe to install?
- Gen Agent Trust Hubpass
The skill manages project closeout checklists for the construction industry. It processes user-supplied data in common formats, which presents a surface for indirect prompt injection, but the skill lacks high-risk capabilities such as network communication or command execution.
- Socketpass
No alerts
- Snykpass
Risk: LOW · No issues
- ZeroLeakspass
Score: 93/100 · 2 sections analyzed
What does this agent skill do?
Project Closeout Checklist
Technical Implementation
import pandas as pd
from datetime import date
from typing import Dict, Any, List, Optional
from dataclasses import dataclass, field
from enum import Enum
class ChecklistCategory(Enum):
DOCUMENTATION = "documentation"
FINANCIAL = "financial"
INSPECTIONS = "inspections"
TRAINING = "training"
WARRANTIES = "warranties"
PUNCHLIST = "punchlist"
TURNOVER = "turnover"
class ItemStatus(Enum):
NOT_STARTED = "not_started"
IN_PROGRESS = "in_progress"
COMPLETE = "complete"
NOT_APPLICABLE = "not_applicable"
@dataclass
class CloseoutItem:
item_id: str
description: str
category: ChecklistCategory
responsible_party: str
due_date: date
status: ItemStatus
completed_date: Optional[date] = None
notes: str = ""
attachments: List[str] = field(default_factory=list)
class ProjectCloseoutChecklist:
def __init__(self, project_name: str, substantial_completion: date):
self.project_name = project_name
self.substantial_completion = substantial_completion
self.items: Dict[str, CloseoutItem] = {}
self._load_standard_items()
def _load_standard_items(self):
standard = [
("Documentation", ChecklistCategory.DOCUMENTATION, [
"As-built drawings", "O&M manuals", "Attic stock",
"Keying schedule", "Equipment list"
]),
("Financial", ChecklistCategory.FINANCIAL, [
"Final payment application", "Release of liens",
"Consent of surety", "Final change orders"
]),
("Inspections", ChecklistCategory.INSPECTIONS, [
"Final building inspection", "Fire marshal inspection",
"Elevator inspection", "Certificate of Occupancy"
]),
("Training", ChecklistCategory.TRAINING, [
"HVAC system training", "Fire alarm training",
"Security system training", "BAS training"
]),
("Warranties", ChecklistCategory.WARRANTIES, [
"Roofing warranty", "HVAC warranty", "Elevator warranty",
"General contractor warranty"
])
]
counter = 0
for category_name, category, items in standard:
for desc in items:
counter += 1
item_id = f"CLO-{counter:03d}"
self.items[item_id] = CloseoutItem(
item_id=item_id,
description=desc,
category=category,
responsible_party="Contractor",
due_date=self.substantial_completion,
status=ItemStatus.NOT_STARTED
)
def add_item(self, description: str, category: ChecklistCategory,
responsible_party: str, due_date: date) -> CloseoutItem:
item_id = f"CLO-{len(self.items) + 1:03d}"
item = CloseoutItem(
item_id=item_id,
description=description,
category=category,
responsible_party=responsible_party,
due_date=due_date,
status=ItemStatus.NOT_STARTED
)
self.items[item_id] = item
return item
def update_status(self, item_id: str, status: ItemStatus, notes: str = ""):
if item_id in self.items:
self.items[item_id].status = status
if status == ItemStatus.COMPLETE:
self.items[item_id].completed_date = date.today()
if notes:
self.items[item_id].notes = notes
def get_completion_percentage(self) -> float:
applicable = [i for i in self.items.values()
if i.status != ItemStatus.NOT_APPLICABLE]
complete = [i for i in applicable if i.status == ItemStatus.COMPLETE]
return (len(complete) / len(applicable) * 100) if applicable else 0
def get_outstanding_items(self) -> List[CloseoutItem]:
return [i for i in self.items.values()
if i.status in [ItemStatus.NOT_STARTED, ItemStatus.IN_PROGRESS]]
def get_summary_by_category(self) -> Dict[str, Dict[str, int]]:
summary = {}
for item in self.items.values():
cat = item.category.value
if cat not in summary:
summary[cat] = {'total': 0, 'complete': 0, 'outstanding': 0}
summary[cat]['total'] += 1
if item.status == ItemStatus.COMPLETE:
summary[cat]['complete'] += 1
elif item.status != ItemStatus.NOT_APPLICABLE:
summary[cat]['outstanding'] += 1
return summary
def export_checklist(self, output_path: str):
data = [{
'ID': i.item_id,
'Description': i.description,
'Category': i.category.value,
'Responsible': i.responsible_party,
'Due': i.due_date,
'Status': i.status.value,
'Completed': i.completed_date,
'Notes': i.notes
} for i in self.items.values()]
pd.DataFrame(data).to_excel(output_path, index=False)
Quick Start
checklist = ProjectCloseoutChecklist("Office Tower", date(2024, 12, 1))
# Update item status
checklist.update_status("CLO-001", ItemStatus.COMPLETE, "Received from architect")
# Check progress
print(f"Completion: {checklist.get_completion_percentage():.1f}%")
outstanding = checklist.get_outstanding_items()
print(f"Outstanding items: {len(outstanding)}")
Resources
- DDC Book: Chapter 5 - Project Closeout
How can the creator link this skill?
Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.
<a href="https://skillzs.dev/skills/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction/project-closeout-checklist">View project-closeout-checklist on skillZs</a>