#!/bin/bash # Evidence Report Generator # Parses smoke-test-report.json and generates evidence-report.json set -e SMOKE_REPORT="verification/smoke-test-report.json" EVIDENCE_REPORT="verification/evidence-report.json" echo "=== Generating Evidence Report ===" # Check if smoke test report exists if [ ! -f "$SMOKE_REPORT" ]; then echo "Error: $SMOKE_REPORT not found. Run smoke-test.sh first." exit 1 fi # Check if jq is available if ! command -v jq &>/dev/null; then echo "Error: jq is required but not installed." exit 1 fi # Extract summary counts TOTAL=$(jq '.summary.total' "$SMOKE_REPORT") PASSED=$(jq '.summary.passed' "$SMOKE_REPORT") FAILED=$(jq '.summary.failed' "$SMOKE_REPORT") WARNED=$(jq '.summary.warned' "$SMOKE_REPORT") SKIPPED=$(jq '.summary.skipped' "$SMOKE_REPORT") # Extract test results using proper JSON array parsing get_test_status() { local test_name="$1" jq -r ".results[] | select(.test == \"$test_name\") | .status" "$SMOKE_REPORT" 2>/dev/null || echo "UNKNOWN" } get_test_message() { local test_name="$1" jq -r ".results[] | select(.test == \"$test_name\") | .message" "$SMOKE_REPORT" 2>/dev/null || echo "No message" } # CI Pipeline Checklist (4 items) CI_BUILD=$(get_test_status "ci_build_stage") CI_BUILD_MSG=$(get_test_message "ci_build_stage") CI_TEST=$(get_test_status "ci_test_stage") CI_TEST_MSG=$(get_test_message "ci_test_stage") CI_PACKAGE=$(get_test_status "ci_package_stage") CI_PACKAGE_MSG=$(get_test_message "ci_package_stage") CI_DEPLOY=$(get_test_status "ci_deploy_stage") CI_DEPLOY_MSG=$(get_test_message "ci_deploy_stage") # Operational Risks Checklist (9 items) RISK_DEPLOY=$(get_test_status "risk_deployment_strategy") RISK_DEPLOY_MSG=$(get_test_message "risk_deployment_strategy") RISK_MONITOR=$(get_test_status "risk_monitoring") RISK_MONITOR_MSG=$(get_test_message "risk_monitoring") RISK_BACKUP=$(get_test_status "risk_backup") RISK_BACKUP_MSG=$(get_test_message "risk_backup") RISK_SECRET=$(get_test_status "risk_secret_management") RISK_SECRET_MSG=$(get_test_message "risk_secret_management") RISK_HEALTH=$(get_test_status "risk_health_check") RISK_HEALTH_MSG=$(get_test_message "risk_health_check") RISK_LOGGING=$(get_test_status "risk_logging") RISK_LOGGING_MSG=$(get_test_message "risk_logging") RISK_ERROR=$(get_test_status "risk_error_handling") RISK_ERROR_MSG=$(get_test_message "risk_error_handling") RISK_ROLLBACK=$(get_test_status "risk_rollback") RISK_ROLLBACK_MSG=$(get_test_message "risk_rollback") RISK_SHUTDOWN=$(get_test_status "risk_graceful_shutdown") RISK_SHUTDOWN_MSG=$(get_test_message "risk_graceful_shutdown") # Core Tests COMPILATION=$(get_test_status "compilation") COMPILATION_MSG=$(get_test_message "compilation") UNIT_TESTS=$(get_test_status "unit_tests") UNIT_TESTS_MSG=$(get_test_message "unit_tests") ROLE_MATRIX=$(get_test_status "role_matrix_impl") ROLE_MATRIX_MSG=$(get_test_message "role_matrix_impl") RUNTIME=$(get_test_status "runtime_integration") RUNTIME_MSG=$(get_test_message "runtime_integration") # Generate evidence report cat > "$EVIDENCE_REPORT" << 'EOF' { "evidence_report_version": "1.0", "generated_at": "__TIMESTAMP__", "source_report": "verification/smoke-test-report.json", "summary": { "total_checks": 0, "passed": 0, "failed": 0, "warnings": 0, "skipped": 0 }, "ci_pipeline_checklist": [], "operational_risks_checklist": [], "core_tests": [] } EOF # Build CI pipeline checklist JSON CI_CHECKLIST=$(cat << JQEOF [ {"id": "ci_build", "description": "Build stage configured", "status": "$CI_BUILD", "message": "$CI_BUILD_MSG"}, {"id": "ci_test", "description": "Test stage configured", "status": "$CI_TEST", "message": "$CI_TEST_MSG"}, {"id": "ci_package", "description": "Package stage configured", "status": "$CI_PACKAGE", "message": "$CI_PACKAGE_MSG"}, {"id": "ci_deploy", "description": "Deploy/CI-CD pipeline configured", "status": "$CI_DEPLOY", "message": "$CI_DEPLOY_MSG"} ] JQEOF ) # Build operational risks checklist JSON RISK_CHECKLIST=$(cat << JQEOF [ {"id": "risk_deployment", "description": "Deployment strategy defined", "status": "$RISK_DEPLOY", "message": "$RISK_DEPLOY_MSG"}, {"id": "risk_monitoring", "description": "Monitoring configured", "status": "$RISK_MONITOR", "message": "$RISK_MONITOR_MSG"}, {"id": "risk_backup", "description": "Backup mechanism in place", "status": "$RISK_BACKUP", "message": "$RISK_BACKUP_MSG"}, {"id": "risk_secret", "description": "Secret management configured", "status": "$RISK_SECRET", "message": "$RISK_SECRET_MSG"}, {"id": "risk_health", "description": "Health check endpoints defined", "status": "$RISK_HEALTH", "message": "$RISK_HEALTH_MSG"}, {"id": "risk_logging", "description": "Logging framework configured", "status": "$RISK_LOGGING", "message": "$RISK_LOGGING_MSG"}, {"id": "risk_error", "description": "Error handling implemented", "status": "$RISK_ERROR", "message": "$RISK_ERROR_MSG"}, {"id": "risk_rollback", "description": "Rollback strategy documented", "status": "$RISK_ROLLBACK", "message": "$RISK_ROLLBACK_MSG"}, {"id": "risk_shutdown", "description": "Graceful shutdown handling", "status": "$RISK_SHUTDOWN", "message": "$RISK_SHUTDOWN_MSG"} ] JQEOF ) # Build core tests JSON CORE_TESTS=$(cat << JQEOF [ {"id": "compilation", "description": "Code compilation", "status": "$COMPILATION", "message": "$COMPILATION_MSG"}, {"id": "unit_tests", "description": "Unit test execution", "status": "$UNIT_TESTS", "message": "$UNIT_TESTS_MSG"}, {"id": "role_matrix", "description": "Role matrix implementation", "status": "$ROLE_MATRIX", "message": "$ROLE_MATRIX_MSG"}, {"id": "runtime", "description": "Runtime integration", "status": "$RUNTIME", "message": "$RUNTIME_MSG"} ] JQEOF ) # Calculate checklist counts CI_PASSED=$(echo "$CI_CHECKLIST" | jq '[.[] | select(.status == "PASS")] | length') CI_FAILED=$(echo "$CI_CHECKLIST" | jq '[.[] | select(.status == "FAIL")] | length') CI_WARNED=$(echo "$CI_CHECKLIST" | jq '[.[] | select(.status == "WARN")] | length') RISK_PASSED=$(echo "$RISK_CHECKLIST" | jq '[.[] | select(.status == "PASS")] | length') RISK_FAILED=$(echo "$RISK_CHECKLIST" | jq '[.[] | select(.status == "FAIL")] | length') RISK_WARNED=$(echo "$RISK_CHECKLIST" | jq '[.[] | select(.status == "WARN")] | length') CORE_PASSED=$(echo "$CORE_TESTS" | jq '[.[] | select(.status == "PASS")] | length') CORE_FAILED=$(echo "$CORE_TESTS" | jq '[.[] | select(.status == "FAIL")] | length') CORE_WARNED=$(echo "$CORE_TESTS" | jq '[.[] | select(.status == "WARN")] | length') CORE_SKIPPED=$(echo "$CORE_TESTS" | jq '[.[] | select(.status == "SKIP")] | length') TOTAL_CHECKS=$((4 + 9 + 4)) TOTAL_PASSED=$((CI_PASSED + RISK_PASSED + CORE_PASSED)) TOTAL_FAILED=$((CI_FAILED + RISK_FAILED + CORE_FAILED)) TOTAL_WARNED=$((CI_WARNED + RISK_WARNED + CORE_WARNED)) TOTAL_SKIPPED=$((0 + 0 + CORE_SKIPPED)) # Update evidence report REPORT_CONTENT=$(cat "$EVIDENCE_REPORT") REPORT_CONTENT=$(echo "$REPORT_CONTENT" | sed "s/__TIMESTAMP__/$(date -Iseconds)/") REPORT_CONTENT=$(echo "$REPORT_CONTENT" | jq \ --argjson total "$TOTAL_CHECKS" \ --argjson passed "$TOTAL_PASSED" \ --argjson failed "$TOTAL_FAILED" \ --argjson warned "$TOTAL_WARNED" \ --argjson skipped "$TOTAL_SKIPPED" \ '.summary = {"total_checks": $total, "passed": $passed, "failed": $failed, "warnings": $warned, "skipped": $skipped}') REPORT_CONTENT=$(echo "$REPORT_CONTENT" | jq --argjson cil "$CI_CHECKLIST" '.ci_pipeline_checklist = $cil') REPORT_CONTENT=$(echo "$REPORT_CONTENT" | jq --argjson rcl "$RISK_CHECKLIST" '.operational_risks_checklist = $rcl') REPORT_CONTENT=$(echo "$REPORT_CONTENT" | jq --argjson ct "$CORE_TESTS" '.core_tests = $ct') echo "$REPORT_CONTENT" > "$EVIDENCE_REPORT" echo "" echo "=== Evidence Report Summary ===" echo "Total Checks: $TOTAL_CHECKS" echo "Passed: $TOTAL_PASSED" echo "Failed: $TOTAL_FAILED" echo "Warnings: $TOTAL_WARNED" echo "Skipped: $TOTAL_SKIPPED" echo "" echo "CI Pipeline (4 items): $CI_PASSED passed, $CI_FAILED failed, $CI_WARNED warnings" echo "Operational Risks (9 items): $RISK_PASSED passed, $RISK_FAILED failed, $RISK_WARNED warnings" echo "Core Tests (4 items): $CORE_PASSED passed, $CORE_FAILED failed, $CORE_WARNED warnings, $CORE_SKIPPED skipped" echo "" echo "Evidence report saved to: $EVIDENCE_REPORT" exit 0