Skip to main content
ClaudeWave
Skill173 repo starsupdated 3mo ago

rfi-management

Complete RFI (Request for Information) management system. Create, track, route, and analyze RFIs with automatic notifications and response deadline tracking.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction /tmp/rfi-management && cp -r /tmp/rfi-management/1_DDC_Toolkit/Document-Control/rfi-management ~/.claude/skills/rfi-management
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

# RFI Management System for Construction

Comprehensive system for managing Requests for Information (RFIs) throughout the construction project lifecycle.

## Business Case

**Problem**: RFI management is chaotic:
- RFIs get lost in email threads
- Response deadlines missed
- No visibility into RFI status
- Difficult to track cost/schedule impacts
- Manual logging wastes hours weekly

**Solution**: Structured RFI management that:
- Auto-assigns RFI numbers
- Routes to correct parties
- Tracks response deadlines
- Sends automatic reminders
- Maintains audit trail
- Analyzes trends and impacts

**ROI**: 60% faster RFI response time, 90% reduction in lost RFIs

## RFI Workflow

```
┌──────────────────────────────────────────────────────────────────────┐
│                        RFI LIFECYCLE                                  │
├──────────────────────────────────────────────────────────────────────┤
│                                                                       │
│   ┌─────────┐    ┌─────────┐    ┌─────────┐    ┌─────────┐          │
│   │ CREATE  │───►│ SUBMIT  │───►│ REVIEW  │───►│ RESPOND │          │
│   │         │    │         │    │         │    │         │          │
│   │ • Draft │    │ • Route │    │ • Assign│    │ • Answer│          │
│   │ • Attach│    │ • Notify│    │ • Track │    │ • Approve│         │
│   └─────────┘    └─────────┘    └─────────┘    └─────────┘          │
│        │              │              │              │                │
│        ▼              ▼              ▼              ▼                │
│   ┌─────────────────────────────────────────────────────────────┐   │
│   │                    RFI DATABASE                              │   │
│   │  • RFI Log        • Attachments      • Response History     │   │
│   │  • Status Track   • Cost Impacts     • Schedule Impacts     │   │
│   └─────────────────────────────────────────────────────────────┘   │
│                                                                       │
│   ┌─────────┐    ┌─────────┐    ┌─────────┐                         │
│   │ CLOSE   │◄───│ VERIFY  │◄───│IMPLEMENT│                         │
│   │         │    │         │    │         │                         │
│   │ • Archive│   │ • Check │    │ • Action│                         │
│   │ • Report│    │ • Accept│    │ • Update│                         │
│   └─────────┘    └─────────┘    └─────────┘                         │
│                                                                       │
└──────────────────────────────────────────────────────────────────────┘
```

## Data Structure

### RFI Log Schema

```python
RFI_SCHEMA = {
    # Identification
    'rfi_number': str,          # RFI-001, RFI-002, etc.
    'project_id': str,          # Project identifier
    'revision': int,            # Revision number (0, 1, 2...)

    # Description
    'subject': str,             # Brief title
    'question': str,            # Detailed question
    'spec_section': str,        # CSI spec reference
    'drawing_ref': str,         # Drawing reference (A-101, S-201)
    'location': str,            # Building/floor/area

    # Parties
    'submitted_by': str,        # Originator name
    'submitted_by_company': str,# Originator company
    'assigned_to': str,         # Responsible party
    'cc_list': list,            # Additional recipients

    # Dates
    'date_submitted': date,     # When submitted
    'date_required': date,      # When response needed
    'date_responded': date,     # When answered
    'date_closed': date,        # When closed

    # Status
    'status': str,              # Draft/Open/Pending/Answered/Closed
    'priority': str,            # Critical/High/Medium/Low

    # Response
    'response': str,            # Answer text
    'response_by': str,         # Who answered
    'attachments': list,        # File links

    # Impact
    'cost_impact': bool,        # Has cost impact?
    'cost_amount': float,       # Estimated cost
    'schedule_impact': bool,    # Has schedule impact?
    'schedule_days': int,       # Days of delay
    'change_order_ref': str,    # Related CO number
}
```

## Python Implementation

```python
import pandas as pd
from datetime import datetime, date, timedelta
from typing import Optional, List, Dict
from dataclasses import dataclass, field
from enum import Enum
import uuid

class RFIStatus(Enum):
    DRAFT = "Draft"
    OPEN = "Open"
    PENDING = "Pending Review"
    ANSWERED = "Answered"
    CLOSED = "Closed"
    VOID = "Void"

class RFIPriority(Enum):
    CRITICAL = "Critical"  # Stops work
    HIGH = "High"          # Impacts critical path
    MEDIUM = "Medium"      # Standard
    LOW = "Low"            # Informational

@dataclass
class RFI:
    """Request for Information data class"""
    rfi_number: str
    project_id: str
    subject: str
    question: str

    # Optional fields with defaults
    spec_section: str = ""
    drawing_ref: str = ""
    location: str = ""
    submitted_by: str = ""
    submitted_by_company: str = ""
    assigned_to: str = ""
    cc_list: List[str] = field(default_factory=list)

    date_submitted: date = field(default_factory=date.today)
    date_required: date = None
    date_responded: date = None
    date_closed: date = None

    status: RFIStatus = RFIStatus.DRAFT
    priority: RFIPriority = RFIPriority.MEDIUM

    response: str = ""
    response_by: str = ""
    attachments: List[str] = field(default_factory=list)

    cost_impact: bool = False
    cost_amount: float = 0.0
    schedule_impact: bool = False
    schedule_days: int = 0
    change_order_ref: str = ""

    revision: int = 0

    def __post_init__(self):
        if self.date_required is None:
            # Default: 7 days for response
            self.date_required = self.date_submitted + timedelta(days=7)


class RFIManager:
    """Complete RFI management system"""

    def __init__(self, project_id: str, storage_path: str = None):
        self.project_id = project_id
        self.sto