verification-loop-construction について
建設自動化の出力を検証するスキルです。提出やデプロイの前に、見積もり、工程表、BIM/CAD データ、レポート、パイプラインを確認できます。データ整合性、業務ルール、規格、出力品質、ソースとの照合を含む5段階で構成されています。
主な機能
- 01データの完全性と一貫性の確認
- 02建設業務ルールの検証
- 03規格への準拠確認
- 04出力形式と品質のレビュー
- 05ソースデータとの照合検証
- 06検証レポートの生成
活用シーン
- 01顧客提出前の見積もり確認
- 02工程表とリソース配分の検証
- 03期待値に基づく BIM データの確認
- 04ソースデータに照らしたパイプライン出力の検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ datadrivenconstruction/ ddc_skills_for_ai_agents_in_construction --skill verification-loop-constructionインストール後、Claude Code で/verification-loop-constructionを入力して読み込まれたか確認します。
同梱ファイルclaw.jsoninstructions.md
詳細
建設自動化の検証ループ
成果物の納品またはデプロイ前に、建設自動化の出力品質を確保する体系的な検証フレームワークです。
使用するタイミング
次の場合にこのスキルを実行します。
- コスト見積もりの生成後
- スケジュールの作成または更新後
- BIM/CAD データの処理後
- レポート(毎日、毎週、毎月)の生成後
- データパイプラインの実行後
- クライアントへの書類提出前
- 自動化ワークフローのデプロイ前
検証フェーズ
フェーズ 1:データ整合性チェック
def 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)
データ整合性チェックリスト
- 必須フィールドがすべて入力されている
- レコードが重複していない
- 外部キーが正しく解決される
- 日付形式が統一されている
- 通貨の値が正しい形式で表示されている
- 測定単位が標準化されている
フェーズ 2:ビジネスロジックの検証
def 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)
ビジネスロジックのチェックリスト
コスト見積もりの場合:
- 明細項目の合計 = 表示された小計
- 小計 + マークアップ = 総合計
- 税額の計算が正しい
- 予備費が一貫して適用されている
- 単価が想定範囲内である
- 数量が QTO と一致している
スケジュールの場合:
- 依存関係が守られている(逆方向のリンクがない)
- クリティカルパスが正しく計算されている
- リソースが過剰に割り当てられていない
- マイルストーンの日付が正しく設定されている
- 稼働日/カレンダーが正しい
- フロート値が妥当である
BIM データの場合:
- 要素数が想定と一致している
- プロパティ値が範囲内である
- 空間的な関係が有効である
- レベルとの関連付けが正しい
- 分類コードが有効である
フェーズ 3:形式と規格への準拠
def 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)
規格準拠チェックリスト
- CSI MasterFormat コードが有効である(6 桁)
- UniFormat コードが有効である(使用している場合)
- CWICR マッピングが設定されている
- ISO 日付形式(YYYY-MM-DD)
- 通貨の形式が統一されている
- 測定単位が統一されている(メートル法/ヤード・ポンド法)
フェーズ 4:出力品質チェック
def 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)
出力品質チェックリスト
- ヘッダー/フッターがある
- ページ番号が正しい
- 会社のブランディングが適用されている
- グラフが読みやすい
- 表が適切に配置されている
- リンク/参照が機能している
フェーズ 5:相互参照の検証
def 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)
相互参照チェックリスト
- QTO が BIM モデルと一致している
- 見積もりが仕様書と一致している
- スケジュールが見積もりと整合している
- 予算が契約と一致している
- 進捗が現場データと一致している
- 実績値が予測値と一致している(許容範囲内)
検証レポートの形式
すべてのフェーズを実行した後、検証レポートを作成します。
═══════════════════════════════════════════════════════════════
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
═══════════════════════════════════════════════════════════════
自動検証パイプライン
class 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())
DDC ワークフローとの統合
この検証スキルは、ほかの DDC スキルと統合されています。
- 見積もり後:
cost-estimation-*スキルの実行後に実行します - QTO 後:
qto-reportスキルの実行後に実行します - スケジュール作成後:
gantt-chartまたは4d-simulationスキルの実行後に実行します - パイプライン実行後:
etl-pipelineスキルの実行後に実行します
継続的検証モード
長時間の自動化セッションでは、チェックポイントで検証を実行します。
Recommended 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
建設において品質に妥協はありません。納品前に検証しましょう。
コメント
Markdown 対応