mcpField
V
verification-loop-construction

verification-loop-construction

github.com/datadrivenconstructionテスト・品質375106 回インストール1 週間前に更新
リポジトリ

verification-loop-construction について

建設自動化の出力を検証するスキルです。提出やデプロイの前に、見積もり、工程表、BIM/CAD データ、レポート、パイプラインを確認できます。データ整合性、業務ルール、規格、出力品質、ソースとの照合を含む5段階で構成されています。

主な機能

  1. 01データの完全性と一貫性の確認
  2. 02建設業務ルールの検証
  3. 03規格への準拠確認
  4. 04出力形式と品質のレビュー
  5. 05ソースデータとの照合検証
  6. 06検証レポートの生成

活用シーン

  1. 01顧客提出前の見積もり確認
  2. 02工程表とリソース配分の検証
  3. 03期待値に基づく BIM データの確認
  4. 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 スキルと統合されています。

  1. 見積もり後:cost-estimation-* スキルの実行後に実行します
  2. QTO 後:qto-report スキルの実行後に実行します
  3. スケジュール作成後:gantt-chart または 4d-simulation スキルの実行後に実行します
  4. パイプライン実行後: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

建設において品質に妥協はありません。納品前に検証しましょう。

コメント