Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Comprehensive verification system for construction automation deliverables. Use after completing estimates, schedules, reports, or data processing tasks to ensure quality.
.claude/skills/datadrivenconstruction-verification-loop-construction/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 117% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 169% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 110% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 627% | 0% |
A systematic verification framework ensuring quality of construction automation outputs before delivery or deployment.
Invoke this skill:
pythondef verify_data_integrity(output: dict) -> VerificationResult: """Check data completeness and consistency""" checks = [] # Completeness check required_fields = get_required_fields(output['type']) missing = [f for f in required_fields if f not in output] checks.append({ 'name': 'Completeness', 'status': 'PASS' if not missing else 'FAIL', 'details': f'Missing fields: {missing}' if missing else 'All required fields present' }) # Consistency check inconsistencies = find_inconsistencies(output) checks.append({ 'name': 'Consistency', 'status': 'PASS' if not inconsistencies else 'WARN', 'details': inconsistencies or 'No inconsistencies found' }) # Referential integrity broken_refs = check_references(output) checks.append({ 'name': 'Referential Integrity', 'status': 'PASS' if not broken_refs else 'FAIL', 'details': f'Broken references: {broken_refs}' if broken_refs else 'All references valid' }) return VerificationResult(checks)
pythondef verify_business_logic(output: dict) -> VerificationResult: """Verify construction-specific business rules""" checks = [] # Cost estimate checks if output['type'] == 'cost_estimate': # Verify totals match line items calculated_total = sum(item['amount'] for item in output['line_items']) declared_total = output['total'] variance = abs(calculated_total - declared_total) checks.append({ 'name': 'Total Accuracy', 'status': 'PASS' if variance < 0.01 else 'FAIL', 'details': f'Calculated: {calculated_total}, Declared: {declared_total}' }) # Verify markup applied correctly for item in output['line_items']: expected_markup = item['base_cost'] * (1 + item['markup_rate']) if abs(item['amount'] - expected_markup) > 0.01: checks.append({ 'name': f'Markup Check - {item["id"]}', 'status': 'FAIL', 'details': f'Expected: {expected_markup}, Got: {item["amount"]}' }) # Schedule checks if output['type'] == 'schedule': # Verify dependencies for task in output['tasks']: for pred_id in task.get('predecessors', []): pred = find_task(output['tasks'], pred_id) if pred and pred['end_date'] > task['start_date']: checks.append({ 'name': f'Dependency Violation - {task["id"]}', 'status': 'FAIL', 'details': f'Task starts before predecessor {pred_id} ends' }) # Verify resource allocation resource_conflicts = find_resource_conflicts(output['tasks']) checks.append({ 'name': 'Resource Conflicts', 'status': 'PASS' if not resource_conflicts else 'WARN', 'details': resource_conflicts or 'No resource conflicts' }) return VerificationResult(checks)
For Cost Estimates:
For Schedules:
For BIM Data:
pythondef verify_standards_compliance(output: dict) -> VerificationResult: """Verify compliance with construction standards""" checks = [] # CSI classification check if 'csi_codes' in output: invalid_codes = [] for code in output['csi_codes']: if not validate_csi_code(code): invalid_codes.append(code) checks.append({ 'name': 'CSI Code Validation', 'status': 'PASS' if not invalid_codes else 'WARN', 'details': f'Invalid codes: {invalid_codes}' if invalid_codes else 'All codes valid' }) # CWICR mapping check if output.get('cwicr_mapped'): unmapped = [item for item in output['items'] if not item.get('cwicr_id')] checks.append({ 'name': 'CWICR Mapping', 'status': 'PASS' if not unmapped else 'WARN', 'details': f'{len(unmapped)} items unmapped' if unmapped else 'All items mapped' }) # Document format check if output['type'] == 'report': format_issues = validate_report_format(output) checks.append({ 'name': 'Report Format', 'status': 'PASS' if not format_issues else 'WARN', 'details': format_issues or 'Format compliant' }) return VerificationResult(checks)
pythondef verify_output_quality(output: dict) -> VerificationResult: """Check output quality and presentation""" checks = [] # Formatting check if output['format'] == 'excel': checks.extend([ { 'name': 'Column Headers', 'status': check_headers_present(output), 'details': 'Headers in first row' }, { 'name': 'Number Formatting', 'status': check_number_format(output), 'details': 'Currencies and percentages formatted' }, { 'name': 'Print Area', 'status': check_print_area(output), 'details': 'Print area set for clean output' } ]) if output['format'] == 'pdf': checks.extend([ { 'name': 'Page Layout', 'status': check_page_layout(output), 'details': 'Margins and orientation correct' }, { 'name': 'Images Rendered', 'status': check_images(output), 'details': 'All images/charts visible' }, { 'name': 'Fonts Embedded', 'status': check_fonts(output), 'details': 'Fonts embedded for portability' } ]) # Data visualization check if 'charts' in output: for chart in output['charts']: checks.append({ 'name': f'Chart - {chart["title"]}', 'status': validate_chart(chart), 'details': 'Labels, legends, and data visible' }) return VerificationResult(checks)
pythondef verify_cross_references(output: dict, sources: list) -> VerificationResult: """Validate output against source data""" checks = [] for source in sources: # Compare key metrics metrics = extract_comparable_metrics(output, source) for metric_name, (output_val, source_val) in metrics.items(): variance_pct = abs(output_val - source_val) / source_val * 100 if source_val else 0 status = 'PASS' if variance_pct > 5: status = 'WARN' if variance_pct > 10: status = 'FAIL' checks.append({ 'name': f'{metric_name} vs {source["name"]}', 'status': status, 'details': f'Output: {output_val}, Source: {source_val}, Variance: {variance_pct:.1f}%' }) return VerificationResult(checks)
After running all phases, produce a verification report:
═══════════════════════════════════════════════════════════════
VERIFICATION REPORT
═══════════════════════════════════════════════════════════════
Output Type: Cost Estimate
Project: Downtown Office Tower
Generated: 2026-01-24 14:30:00
Verified By: DDC Verification Loop v1.0
───────────────────────────────────────────────────────────────
PHASE 1: DATA INTEGRITY
───────────────────────────────────────────────────────────────
✓ Completeness PASS All required fields present
✓ Consistency PASS No inconsistencies found
✓ Referential PASS All references valid
───────────────────────────────────────────────────────────────
PHASE 2: BUSINESS LOGIC
───────────────────────────────────────────────────────────────
✓ Total Accuracy PASS Calculated: $1,523,456.78, Declared: $1,523,456.78
✓ Markup Check PASS All markups applied correctly
⚠ Range Check WARN 3 items outside typical ranges
───────────────────────────────────────────────────────────────
PHASE 3: STANDARDS COMPLIANCE
───────────────────────────────────────────────────────────────
✓ CSI Codes PASS All codes valid
✓ CWICR Mapping PASS 156/156 items mapped
✓ Unit Standards PASS All units metric
───────────────────────────────────────────────────────────────
PHASE 4: OUTPUT QUALITY
───────────────────────────────────────────────────────────────
✓ Excel Format PASS Headers, formatting correct
✓ Charts PASS All visualizations rendered
✓ Print Ready PASS Print area configured
───────────────────────────────────────────────────────────────
PHASE 5: CROSS-REFERENCE
───────────────────────────────────────────────────────────────
✓ vs BIM QTO PASS Variance: 0.2%
✓ vs Historical PASS Within expected range
⚠ vs Budget WARN 5.3% over budget baseline
═══════════════════════════════════════════════════════════════
SUMMARY
═══════════════════════════════════════════════════════════════
Total Checks: 18
Passed: 16
Warnings: 2
Failed: 0
OVERALL STATUS: ✓ READY FOR DELIVERY
Recommendations:
1. Review items outside typical ranges (see Appendix A)
2. Discuss budget variance with PM before submission
═══════════════════════════════════════════════════════════════pythonclass ConstructionVerificationPipeline: """Automated verification for construction outputs""" def __init__(self, output_type: str): self.output_type = output_type self.phases = self._get_phases_for_type(output_type) def verify(self, output: dict, sources: list = None) -> VerificationReport: results = [] for phase in self.phases: phase_result = phase.execute(output, sources) results.append(phase_result) # Stop on critical failure if phase_result.has_critical_failure(): break return VerificationReport( output_type=self.output_type, phases=results, overall_status=self._calculate_overall_status(results) ) def _calculate_overall_status(self, results: list) -> str: if any(r.has_failures() for r in results): return 'NOT READY - FIX REQUIRED' if any(r.has_warnings() for r in results): return 'READY WITH WARNINGS' return 'READY FOR DELIVERY' # Usage pipeline = ConstructionVerificationPipeline('cost_estimate') report = pipeline.verify(estimate_output, sources=[bim_model, specifications]) print(report.to_markdown())
This verification skill integrates with other DDC skills:
cost-estimation-* skillsqto-report skillgantt-chart or 4d-simulation skillsetl-pipeline skillFor long automation sessions, run verification at checkpoints:
markdownRecommended checkpoints: - After processing each BIM model - After generating each major section of estimate - After completing each phase of schedule - Before any external data submission Command: /verify-construction
Quality is not negotiable in construction. Verify before you deliver.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | pass→pass | 20,357 | 15,881 | -22% | 1 | 1 | 0% | 3,551 | 6,162 | +74% | 0 | 0 | — |
case-01 | fail→pass | 25,113 | 16,374 | -35% | 1 | 1 | 0% | 4,295 | 6,211 | +45% | 0 | 0 | — |
case-03 | pass→pass | 13,742 | 11,895 | -13% | 1 | 1 | 0% | 2,158 | 5,390 | +150% | 0 | 0 | — |
case-04 | pass→pass | 9,270 | 4,768 | -49% | 1 | 1 | 0% | 1,634 | 4,195 | +157% | 0 | 0 | — |
case-05 | pass→pass | 11,196 | 6,753 | -40% | 1 | 1 | 0% | 2,036 | 4,567 | +124% | 0 | 0 | — |
case-06 | fail→pass | 14,115 | 11,603 | -18% | 1 | 1 | 0% | 2,533 | 5,502 | +117% | 0 | 0 | — |
case-07 | fail→pass | 9,131 | 3,847 | -58% | 1 | 1 | 0% | 1,492 | 4,012 | +169% | 0 | 0 | — |
case-08 | pass→pass | 5,713 | 2,900 | -49% | 1 | 1 | 0% | 925 | 3,814 | +312% | 0 | 0 | — |
case-09 | pass→pass | 8,287 | 3,931 | -53% | 1 | 1 | 0% | 1,313 | 4,024 | +206% | 0 | 0 | — |
case-10 | pass→pass | 6,617 | 3,880 | -41% | 1 | 1 | 0% | 1,026 | 3,983 | +288% | 0 | 0 | — |
case-11 | fail→fail | 19,188 | 23,817 | +24% | 1 | 1 | 0% | 2,961 | 7,106 | +140% | 0 | 0 | — |
case-12 | fail→pass | 15,872 | 10,128 | -36% | 1 | 1 | 0% | 2,338 | 4,899 | +110% | 0 | 0 | — |
case-13 | fail→pass | 3,519 | 3,285 | -7% | 1 | 1 | 0% | 545 | 3,961 | +627% | 0 | 0 | — |
case-14 | fail→pass | 5,518 | 4,351 | -21% | 1 | 1 | 0% | 957 | 4,151 | +334% | 0 | 0 | — |
case-15 | fail→pass | 2,775 | 2,500 | -10% | 1 | 1 | 0% | 432 | 3,803 | +780% | 0 | 0 | — |
case-16 | fail→pass | 17,637 | 16,421 | -7% | 1 | 1 | 0% | 2,679 | 6,163 | +130% | 0 | 0 | — |
case-17 | pass→pass | 6,978 | 4,931 | -29% | 1 | 1 | 0% | 1,319 | 4,211 | +219% | 0 | 0 | — |
case-18 | fail→pass | 6,336 | 4,111 | -35% | 1 | 1 | 0% | 962 | 4,041 | +320% | 0 | 0 | — |
case-19 | pass→pass | 3,336 | 3,206 | -4% | 1 | 1 | 0% | 579 | 3,870 | +568% | 0 | 0 | — |
case-20 | pass→pass | 15,714 | 9,573 | -39% | 1 | 1 | 0% | 2,418 | 4,865 | +101% | 0 | 0 | — |
case-21 | pass→pass | 15,233 | 14,168 | -7% | 1 | 1 | 0% | 2,466 | 5,862 | +138% | 0 | 0 | — |
case-22 | pass→pass | 11,777 | 4,253 | -64% | 1 | 1 | 0% | 1,840 | 4,119 | +124% | 0 | 0 | — |
case-23 | fail→fail | 28,245 | 28,931 | +2% | 1 | 1 | 0% | 6,201 | 9,534 | +54% | 0 | 0 | — |
case-24 | fail→fail | 23,582 | 23,975 | +2% | 1 | 1 | 0% | 5,068 | 8,638 | +70% | 0 | 0 | — |
case-25 | fail→fail | 25,152 | 26,942 | +7% | 1 | 1 | 0% | 5,434 | 9,123 | +68% | 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. 25 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 25 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
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.