Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
This skill enables automatic extraction of valuable patterns, solutions, and best practices from construction automation sessions to build institutional knowledge.
When to Use
Activate this skill:
At the end of complex estimation sessions
After solving non-trivial data processing problems
# Example learned patternpattern:name:"electrical_cost_adjustment_pattern"category:"estimation"context:"When estimating electrical work for high-rise buildings"problem:"Standard rates don't account for vertical transportation costs"solution:|
Apply height factor multiplier:
- Floors 1-5: 1.0x base rate
- Floors 6-15: 1.15x base rate
- Floors 16-30: 1.25x base rate
- Floors 30+: 1.35x base rate
confidence:0.85source_sessions: ["session_2026_01_15", "session_2026_01_20"]
validations:3
2.2 BIM Data Processing Patterns
pattern:name:"revit_level_extraction"category:"data_processing"context:"Extracting elements by level from Revit exports"problem:"Elements sometimes missing level association"solution:|
1. First check 'Level' parameter
2. If missing, check 'Reference Level' parameter
3. If still missing, derive from bounding box Z coordinate
4. Map Z ranges to known level elevations
code_snippet:|
def get_element_level(element: dict, levels: list) -> str:
# Direct level parameter
if level := element.get('Level'):
return level
# Reference level fallbackifref_level:=element.get('ReferenceLevel'):returnref_level# Derive from geometryz_coord=element['BoundingBox']['Min']['Z']returnfind_nearest_level(z_coord,levels)confidence:0.92
2.3 Integration Patterns
pattern:name:"procore_rate_limit_handling"category:"integration"context:"Syncing data with Procore API"problem:"API returns 429 Too Many Requests during bulk operations"solution:|
Implement exponential backoff with jitter:
1. Initial delay: 1 second
2. Multiply by 2 on each retry
3. Add random jitter (0-500ms)
4. Max retries: 5
5. Max delay: 32 seconds
code_snippet:|
async def procore_request_with_retry(url, data):
delay = 1
for attempt in range(5):
try:
response = await procore_api.post(url, data)
return response
except RateLimitError:
jitter = random.uniform(0, 0.5)
await asyncio.sleep(delay + jitter)
delay *= 2
raise MaxRetriesExceeded()
confidence:0.95
2.4 Error Resolution Patterns
pattern:name:"cwicr_no_match_resolution"category:"error_handling"context:"CWICR semantic search returns no relevant matches"problem:"Query too specific or uses non-standard terminology"solution:|
Resolution steps:
1. Simplify query to core concepts
2. Remove brand names and specifications
3. Try alternative terminology (US vs UK terms)
4. Expand search to parent category
5. If still no match, flag for manual mapping
examples:-original:"Kohler K-4519 wall-mounted water closet"simplified:"wall mounted toilet"-original:"Lutron Caseta wireless dimmer switch"simplified:"dimmer switch"confidence:0.88
3. Learning Pipeline
classConstructionLearningPipeline:
"""Continuous learning pipeline for construction automation"""def__init__(self, knowledge_base_path: str):
self.kb_path = knowledge_base_path
self.patterns = self._load_patterns()
deflearn_from_session(self, session: dict) -> list:
"""Extract and store learnings from session"""# Analyze session
analyzer = ConstructionSessionAnalyzer()
new_patterns = analyzer.analyze_session(session['log'])
# Validate patterns
validated = []
for pattern in new_patterns['successful_solutions']:
ifself._validate_pattern(pattern):
# Check if similar pattern exists
existing = self._find_similar_pattern(pattern)
if existing:
# Reinforce existing patternself._reinforce_pattern(existing, pattern)
else:
# Add new patternself._add_pattern(pattern)
validated.append(pattern)
# Persist to knowledge baseself._save_patterns()
return validated
defapply_learnings(self, context: dict) -> list:
"""Retrieve relevant patterns for current context"""
relevant_patterns = []
for pattern inself.patterns:
similarity = self._calculate_similarity(pattern['context'], context)
if similarity > 0.7:
relevant_patterns.append({
'pattern': pattern,
'relevance': similarity
})
returnsorted(relevant_patterns, key=lambda x: x['relevance'], reverse=True)
def_validate_pattern(self, pattern: dict) -> bool:
"""Validate pattern before adding to knowledge base"""# Check minimum confidenceif pattern.get('confidence', 0) < 0.6:
returnFalse# Check for code quality (if code snippet)if code := pattern.get('code_snippet'):
ifnotself._is_valid_code(code):
returnFalse# Check for completeness
required_fields = ['name', 'category', 'context', 'solution']
ifnotall(f in pattern for f in required_fields):
returnFalsereturnTrue