Skip to main contentclaims-documentation
Document construction claims for disputes and recovery. Compile evidence, calculate damages, track notice requirements, and prepare claim packages.
설치로 이동 Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/ThomasMoreAI/legal-skills-open --skill claims-documentation명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
이 저장소의 다른 Skills
fetching-arbitration-rules Use when retrieving arbitration institutional rules (ICC, LCIA, SCC, SIAC, HKIAC, VIAC, МКАС/МАК при ТПП України, UNCITRAL) — fetching current version, verifying redaction applicable to the date of arbitration agreement, constructing URLs for official rule texts
determining-pl-request-regime Use when choosing the Polish legal regime for letters, requests, applications, complaints, petitions, public-information requests, KPA filings, PPSA complaints, RODO access requests, registry extracts, court-file access, tax/ZUS/cudzoziemcy/USC procedures, or professional lawyer letters. Prevents mixing UDIP, KPA, PPSA, RODO, registry, special-procedure, and advocate/radca letter regimes.
applying-new-york-convention Use when preparing applications for recognition and enforcement of foreign arbitral awards in Poland, applications for setting aside arbitral awards under KPC art. 1205–1211, or opposing such applications — mapping Article V of the 1958 New York Convention to art. 1214–1215 of the Polish KPC, identifying grounds for refusal, structuring public policy arguments
| name | claims-documentation |
| title | Claims Documentation |
| description | Document construction claims for disputes and recovery. Compile evidence, calculate damages, track notice requirements, and prepare claim packages. |
| author | datadrivenconstruction |
| author_url | https://github.com/datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction/tree/main/4_DDC_Curated/Contract-Legal/claims-documentation |
| license | MIT |
| version | 0.1.0 |
| execution_mode | open |
| jurisdiction | general |
| practice | construction |
| language | en |
Claims Documentation
Overview
Document and manage construction claims for schedule delays, cost impacts, and scope disputes. Track contractual notice requirements, compile supporting evidence, calculate damages, and prepare comprehensive claim packages.
Claims Process
┌─────────────────────────────────────────────────────────────────┐
│ CLAIMS PROCESS │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Notice → Document → Quantify → Submit → Negotiate │
│ ────── ──────── ──────── ────── ───────── │
│ 📋 Identify 📂 Collect 💰 Calculate 📤 Package 🤝 Resolve │
│ 📧 Timely 📸 Evidence ⏱️ Time 📋 Format ⚖️ Settle │
│ 📝 Written 📄 Chain 📊 Cost ✓ Review 💵 Payment │
│ │
└─────────────────────────────────────────────────────────────────┘
Technical Implementation
from dataclasses import dataclass, field
from typing import List, Dict, Optional
from datetime import datetime, timedelta
from enum import Enum
class ClaimType(Enum):
DELAY = "delay"
DISRUPTION = "disruption"
ACCELERATION = "acceleration"
DIFFERING_CONDITIONS = "differing_conditions"
OWNER_CHANGE = "owner_change"
SUSPENSION = "suspension"
TERMINATION = "termination"
DEFECTIVE_SPECS = "defective_specs"
class ClaimStatus(Enum):
DRAFT = "draft"
NOTICE_SENT = "notice_sent"
DOCUMENTING = "documenting"
SUBMITTED = "submitted"
UNDER_REVIEW =
NEGOTIATING =
SETTLED =
DISPUTED =
LITIGATION =
WITHDRAWN =
():
DAILY_REPORT =
PHOTO =
VIDEO =
EMAIL =
LETTER =
MEETING_MINUTES =
SCHEDULE =
COST_RECORD =
INVOICE =
TIMESHEET =
WEATHER_DATA =
DELIVERY_TICKET =
INSPECTION_REPORT =
RFI =
SUBMITTAL =
:
:
evidence_type: EvidenceType
description:
date: datetime
file_path:
source:
relevance:
authenticated: =
:
notice_type:
deadline_days:
recipient:
method:
contract_reference:
sent: =
sent_date: [datetime] =
confirmation: =
:
category:
description:
amount:
basis:
supporting_docs: [] = field(default_factory=)
:
:
claim_type: ClaimType
title:
description:
status: ClaimStatus
event_date: datetime
discovery_date: datetime
responsible_party:
contract_references: [] = field(default_factory=)
notice_requirements: [NoticeRequirement] = field(default_factory=)
notice_compliant: =
evidence: [Evidence] = field(default_factory=)
narrative: =
time_claimed_days: =
cost_claimed: =
damage_calculations: [DamageCalculation] = field(default_factory=)
time_awarded_days: =
amount_awarded: =
settlement_date: [datetime] =
settlement_notes: =
:
DEFAULT_NOTICE_REQUIREMENTS = {
ClaimType.DELAY: [
{: , : , : },
{: , : , : },
],
ClaimType.DIFFERING_CONDITIONS: [
{: , : , : },
{: , : , : },
],
ClaimType.OWNER_CHANGE: [
{: , : , : },
],
}
():
.project_name = project_name
.contract_date = contract_date
.claims: [, Claim] = {}
() -> Claim:
claim_id =
claim = Claim(
=claim_id,
claim_type=claim_type,
title=title,
description=description,
status=ClaimStatus.DRAFT,
event_date=event_date,
discovery_date=datetime.now(),
responsible_party=responsible_party
)
req .DEFAULT_NOTICE_REQUIREMENTS.get(claim_type, []):
notice = NoticeRequirement(
notice_type=req[],
deadline_days=req[],
recipient=responsible_party,
method=req[],
contract_reference=
)
claim.notice_requirements.append(notice)
.claims[claim_id] = claim
claim
() -> NoticeRequirement:
claim_id .claims:
ValueError()
claim = .claims[claim_id]
notice claim.notice_requirements:
notice.notice_type == notice_type:
notice.sent =
notice.sent_date = datetime.now()
notice.confirmation = confirmation
claim.notice_compliant = (n.sent n claim.notice_requirements)
claim.status == ClaimStatus.DRAFT:
claim.status = ClaimStatus.NOTICE_SENT
notice
ValueError()
() -> []:
claim_id .claims:
ValueError()
claim = .claims[claim_id]
status = []
notice claim.notice_requirements:
deadline = claim.event_date + timedelta(days=notice.deadline_days)
days_remaining = (deadline - datetime.now()).days
status.append({
: notice.notice_type,
: deadline,
: days_remaining,
: notice.sent,
: days_remaining < notice.sent,
: notice.sent ( days_remaining < )
})
status
() -> Evidence:
claim_id .claims:
ValueError()
evidence_id =
evidence = Evidence(
=evidence_id,
evidence_type=evidence_type,
description=description,
date=date,
file_path=file_path,
source=source,
relevance=relevance
)
.claims[claim_id].evidence.append(evidence)
.claims[claim_id].status == ClaimStatus.NOTICE_SENT:
.claims[claim_id].status = ClaimStatus.DOCUMENTING
evidence
() -> DamageCalculation:
claim_id .claims:
ValueError()
calc = DamageCalculation(
category=category,
description=description,
amount=amount,
basis=basis,
supporting_docs=supporting_docs []
)
claim = .claims[claim_id]
claim.damage_calculations.append(calc)
claim.cost_claimed = (c.amount c claim.damage_calculations)
calc
() -> :
claim_id .claims:
ValueError()
claim = .claims[claim_id]
extended_general_conditions = delay_days * daily_rate
.add_damage_calculation(
claim_id, ,
,
extended_general_conditions,
)
escalation =
include_escalation:
escalation = extended_general_conditions *
.add_damage_calculation(
claim_id, ,
,
escalation,
)
claim.time_claimed_days = delay_days
{
: delay_days,
: daily_rate,
: extended_general_conditions,
: escalation,
: claim.cost_claimed
}
():
claim_id .claims:
ValueError()
.claims[claim_id].narrative = narrative
() -> Claim:
claim_id .claims:
ValueError()
claim = .claims[claim_id]
claim.status = ClaimStatus.SUBMITTED
claim
() -> Claim:
claim_id .claims:
ValueError()
claim = .claims[claim_id]
claim.status = ClaimStatus.SETTLED
claim.time_awarded_days = time_awarded
claim.amount_awarded = amount_awarded
claim.settlement_date = datetime.now()
claim.settlement_notes = notes
claim
() -> :
claim_id .claims:
claim = .claims[claim_id]
lines = [
,
,
,
,
,
,
]
i, ev ((claim.evidence, key= e: e.date), ):
lines.append(
)
.join(lines)
() -> :
claim_id .claims:
claim = .claims[claim_id]
lines = [
,
,
,
,
,
,
,
,
,
,
,
,
,
,
claim.description,
,
,
,
,
,
,
claim.narrative claim.narrative ,
,
,
,
]
ref claim.contract_references:
lines.append()
lines.extend([
,
,
,
,
])
notice claim.notice_requirements:
deadline = claim.event_date + timedelta(days=notice.deadline_days)
status = notice.sent
sent = notice.sent_date.strftime() notice.sent_date
lines.append()
lines.extend([
,
,
,
,
])
calc claim.damage_calculations:
lines.append()
lines.extend([
,
,
,
,
,
,
])
by_type = {}
ev claim.evidence:
t = ev.evidence_type.value
by_type[t] = by_type.get(t, ) +
t, count (by_type.items()):
lines.append()
.join(lines)
"under_review"
"negotiating"
"settled"
"disputed"
"litigation"
"withdrawn"
class
EvidenceType
Enum
"daily_report"
"photo"
"video"
"email"
"letter"
"meeting_minutes"
"schedule"
"cost_record"
"invoice"
"timesheet"
"weather_data"
"delivery_ticket"
"inspection_report"
"rfi"
"submittal"
@dataclass
class
Evidence
id
str
str
str
str
str
bool
False
@dataclass
class
NoticeRequirement
str
int
str
str
str
bool
False
Optional
None
str
""
@dataclass
class
DamageCalculation
str
str
float
str
List
str
list
@dataclass
class
Claim
id
str
str
str
str
List
str
list
List
list
bool
False
List
list
str
""
int
0
float
0.0
List
list
int
0
float
0.0
Optional
None
str
""
class
ClaimsDocumentor
"""Document and manage construction claims."""
"notice_type"
"Intent to Claim"
"deadline_days"
21
"method"
"Written"
"notice_type"
"Detailed Claim"
"deadline_days"
45
"method"
"Written"
"notice_type"
"Immediate Notice"
"deadline_days"
2
"method"
"Written/Verbal"
"notice_type"
"Written Notice"
"deadline_days"
7
"method"
"Written"
"notice_type"
"Notice of Impact"
"deadline_days"
14
"method"
"Written"
def
__init__
self, project_name: str, contract_date: datetime
self
self
self
Dict
str
def
create_claim
self, claim_type: ClaimType, title: str,
description: str, event_date: datetime,
responsible_party: str
"""Create new claim."""
f"CLM-{datetime.now().strftime('%Y%m%d%H%M%S')}"
id
for
in
self
"notice_type"
"deadline_days"
"method"
""
self
return
def
record_notice_sent
self, claim_id: str, notice_type: str,
confirmation: str = ""
"""Record that notice was sent."""
if
not
in
self
raise
f"Claim {claim_id} not found"
self
for
in
if
True
all
for
in
if
return
raise
f"Notice type {notice_type} not found"
def
check_notice_deadlines
self, claim_id: str
List
Dict
"""Check status of notice deadlines."""
if
not
in
self
raise
f"Claim {claim_id} not found"
self
for
in
"notice_type"
"deadline"
"days_remaining"
"sent"
"overdue"
0
and
not
"status"
"Sent"
if
else
"OVERDUE"
if
0
else
f"{days_remaining} days left"
return
def
add_evidence
self, claim_id: str, evidence_type: EvidenceType,
description: str, date: datetime, file_path: str,
source: str, relevance: str
"""Add evidence to claim."""
if
not
in
self
raise
f"Claim {claim_id} not found"
f"EVD-{len(self.claims[claim_id].evidence)+1:04d}"
id
self
if
self
self
return
def
add_damage_calculation
self, claim_id: str, category: str,
description: str, amount: float,
basis: str, supporting_docs: List[str] = None
"""Add damage calculation to claim."""
if
not
in
self
raise
f"Claim {claim_id} not found"
or
self
sum
for
in
return
def
calculate_delay_damages
self, claim_id: str, delay_days: int,
daily_rate: float,
include_escalation: bool = True
Dict
"""Calculate delay damages using Eichleay formula or daily rate."""
if
not
in
self
raise
f"Claim {claim_id} not found"
self
self
"Extended General Conditions"
f"{delay_days} days × ${daily_rate:,.2f}/day"
"Daily rate method"
0
if
0.03
self
"Material/Labor Escalation"
"Cost increase due to extended duration"
"3% escalation factor"
return
"delay_days"
"daily_rate"
"extended_gc"
"escalation"
"total"
def
write_narrative
self, claim_id: str, narrative: str
"""Write claim narrative."""
if
not
in
self
raise
f"Claim {claim_id} not found"
self
def
submit_claim
self, claim_id: str
"""Submit claim."""
if
not
in
self
raise
f"Claim {claim_id} not found"
self
return
def
record_settlement
self, claim_id: str, time_awarded: int,
amount_awarded: float, notes: str = ""
"""Record claim settlement."""
if
not
in
self
raise
f"Claim {claim_id} not found"
self
return
def
generate_evidence_index
self, claim_id: str
str
"""Generate evidence index."""
if
not
in
self
return
"Claim not found"
self
"# Evidence Index"
""
f"**Claim:** {claim.title}"
f"**Claim ID:** {claim.id}"
""
"| # | Type | Date | Description | Source | Relevance |"
"|---|------|------|-------------|--------|-----------|"
for
in
enumerate
sorted
lambda
1
f"| {i} | {ev.evidence_type.value} | {ev.date.strftime('%Y-%m-%d')} | "
f"{ev.description[:30]} | {ev.source} | {ev.relevance[:30]} |"
return
"\n"
def
generate_claim_package
self, claim_id: str
str
"""Generate complete claim package."""
if
not
in
self
return
"Claim not found"
self
"# CLAIM PACKAGE"
""
f"## Claim: {claim.title}"
""
f"**Claim ID:** {claim.id}"
f"**Type:** {claim.claim_type.value.replace('_', ' ').title()}"
f"**Status:** {claim.status.value}"
f"**Event Date:** {claim.event_date.strftime('%Y-%m-%d')}"
f"**Responsible Party:** {claim.responsible_party}"
""
"---"
""
"## 1. Executive Summary"
""
""
f"**Time Claimed:** {claim.time_claimed_days} days"
f"**Amount Claimed:** ${claim.cost_claimed:,.2f}"
""
"## 2. Factual Narrative"
""
if
else
"*Narrative pending*"
""
"## 3. Contract References"
""
for
in
f"- {ref}"
""
"## 4. Notice Compliance"
""
"| Notice Type | Deadline | Status | Sent Date |"
"|-------------|----------|--------|-----------|"
for
in
"✓ Sent"
if
else
"Pending"
'%Y-%m-%d'
if
else
"-"
f"| {notice.notice_type} | {deadline.strftime('%Y-%m-%d')} | {status} | {sent} |"
""
"## 5. Damage Calculations"
""
"| Category | Description | Amount | Basis |"
"|----------|-------------|--------|-------|"
for
in
f"| {calc.category} | {calc.description} | ${calc.amount:,.2f} | {calc.basis} |"
""
f"**Total Claimed: ${claim.cost_claimed:,.2f}**"
""
"## 6. Evidence Summary"
""
f"Total Documents: {len(claim.evidence)}"
""
for
in
0
1
for
in
sorted
f"- {t.replace('_', ' ').title()}: {count}"
return
"\n"
Quick Start
from datetime import datetime, timedelta
documentor = ClaimsDocumentor("Office Tower", datetime(2024, 1, 1))
claim = documentor.create_claim(
claim_type=ClaimType.DELAY,
title="Owner-Caused Delay - Design Changes",
description="Multiple design changes to structural system caused 45-day delay",
event_date=datetime(2024, 6, 15),
responsible_party="Owner"
)
deadlines = documentor.check_notice_deadlines(claim.id)
for d in deadlines:
print(f"{d['notice_type']}: {d['status']}")
documentor.record_notice_sent(claim.id, "Intent to Claim", "Certified Mail #12345")
documentor.add_evidence(
claim.id,
EvidenceType.RFI,
"RFI-042 requesting structural clarification",
datetime(2024, 6, 10),
"/docs/RFI-042.pdf",
"Project Files",
"Shows owner's delayed response"
)
damages = documentor.calculate_delay_damages(
claim.id,
delay_days=45,
daily_rate=5000.0
)
print(f"Total damages: ${damages['total']:,.2f}")
documentor.write_narrative(claim.id, """
On June 15, 2024, the Owner issued a design change directive requiring
modifications to the structural steel at Levels 5-8. This change...
""")
print(documentor.generate_claim_package(claim.id))
Requirements
pip install (no external dependencies)