{"baseline":{"methodology":{"endpoint":"GET /health","same_payload":true,"iterations":500,"latency_scope":"in-process local development reference only"},"results":[{"framework":"FastAPI","health_status":200,"payload_matches":true,"automatic_openapi":true,"response_schema":true,"test_client":true,"implementation_loc":3,"median_ms":0.7603,"p95_ms":1.7285,"overall_average_score":4.98,"score_basis":"4개 평가 요소의 동일 가중치 산술평균"},{"framework":"Flask","health_status":200,"payload_matches":true,"automatic_openapi":false,"response_schema":false,"test_client":true,"implementation_loc":3,"median_ms":0.0766,"p95_ms":0.1235,"overall_average_score":3.48,"score_basis":"4개 평가 요소의 동일 가중치 산술평균"}],"selected_framework":"FastAPI","selection_reason":"두 프레임워크 모두 동일한 /health 계약을 충족했다. Flask는 최소 응답에서 더 가벼웠지만, FastAPI는 별도 확장 없이 응답 스키마 검증과 OpenAPI 문서를 제공해 데이터셋·예측 API 확장에 더 적합했다.","source":{"repository":"oosuhada/agentic-ontology-dashboard","branch":"experiment/week1-streamlit-plotly-framework-comparison","commit":"3556b7d"},"overall_average_scores":{"FastAPI":4.98,"Flask":3.48}},"representative_dashboard":{"status":"measured","measured_at":"2026-08-05T11:01:02.113637+00:00","feature_count":3,"page":"/app/projects/manufacturing-demo-project","comparison_scope":"Three symmetric product features using the same GS fixtures, risk snapshot and shared business functions; only HTTP adapters differ","environment":{"platform":"macOS-27.0-arm64-arm-64bit-Mach-O","python":"3.14.6","measurement":"local loopback HTTP, separate server processes","rounds":3,"round_order":"alternating framework-first order across rounds and features","connection_mode":"new HTTP connection per request for both servers","fastapi_server":"Uvicorn single worker","flask_server":"Werkzeug development server, threaded","production_benchmark":false},"parity":{"all_feature_responses_equal":true,"feature_count":3,"validation_statuses_match":true,"validation_expected_statuses":true},"validation":{"case_count":5,"all_statuses_match":true,"all_expected_statuses":true,"successful_payloads_equal":true,"cases":[{"feature":"manufacturing_dashboard","name":"limit below minimum","method":"GET","endpoint":"/benchmark/manufacturing-dashboard?limit=0","json_body":null,"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"risk_event_search","name":"unsupported sort value","method":"GET","endpoint":"/benchmark/risk-events?sort=unsupported","json_body":null,"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"risk_event_search","name":"valid empty result","method":"GET","endpoint":"/benchmark/risk-events?risk_threshold=1&status=normal","json_body":null,"expected_status":200,"statuses":{"FastAPI":200,"Flask":200},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":true},{"feature":"maintenance_recommendation","name":"invalid operator role","method":"POST","endpoint":"/benchmark/maintenance-recommendation","json_body":{"event_id":"EVT-GS-004","operator_role":"unknown"},"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"maintenance_recommendation","name":"unknown event","method":"POST","endpoint":"/benchmark/maintenance-recommendation","json_body":{"event_id":"EVT-NOT-FOUND","operator_role":"process_manager"},"expected_status":404,"statuses":{"FastAPI":404,"Flask":404},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null}]},"implementation":{"shared_service":"framework_comparison.representative_dashboard","fastapi_adapter_loc":50,"flask_adapter_loc":80,"fastapi_validation":"Declarative query/body constraints + response_model","flask_validation":"Manual query parsing + Pydantic body/shared payload"},"features":{"manufacturing_dashboard":{"title":"제조 Dashboard 집계","method":"GET","endpoint":"/benchmark/manufacturing-dashboard?risk_threshold=0.0&limit=8","request_body":null,"comparison_scope":"Aggregate eight risk events, line summaries and sensor series","parity":{"responses_equal":true,"fastapi_payload_sha256":"d073b7fcc1799a947a61a29b70c53777c97b912d8ac17f4ac638678ae8974870","flask_payload_sha256":"d073b7fcc1799a947a61a29b70c53777c97b912d8ac17f4ac638678ae8974870","payload_bytes":{"FastAPI":12428,"Flask":12428}},"implementation":{"fastapi_adapter_loc":15,"flask_adapter_loc":33},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.636,"p50_ms":3.4082,"p95_ms":3.823,"p99_ms":11.5824,"throughput_rps":274.56,"wall_seconds":1.0927,"stable_payload":true,"payload_sha256":"0114fac75ba2ad8a4846a8f648c874a1597cf83f0f148e4b4e706f42bbc52248","payload_bytes":11601,"round_metrics":[{"p50_ms":3.3991,"p95_ms":3.823,"p99_ms":11.3168,"throughput_rps":275.5,"error_rate_percent":0.0},{"p50_ms":3.4082,"p95_ms":3.5257,"p99_ms":11.5824,"throughput_rps":274.56,"error_rate_percent":0.0},{"p50_ms":3.4237,"p95_ms":3.8631,"p99_ms":11.6567,"throughput_rps":271.17,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.8971,"p50_ms":7.8964,"p95_ms":17.8237,"p99_ms":20.7399,"throughput_rps":1001.27,"wall_seconds":0.2996,"stable_payload":true,"payload_sha256":"0114fac75ba2ad8a4846a8f648c874a1597cf83f0f148e4b4e706f42bbc52248","payload_bytes":11601,"round_metrics":[{"p50_ms":8.1214,"p95_ms":18.0313,"p99_ms":20.7399,"throughput_rps":980.3,"error_rate_percent":0.0},{"p50_ms":7.8964,"p95_ms":17.8237,"p99_ms":20.939,"throughput_rps":1001.27,"error_rate_percent":0.0},{"p50_ms":7.8874,"p95_ms":17.3425,"p99_ms":19.4562,"throughput_rps":1012.59,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.6159,"p50_ms":3.3705,"p95_ms":3.6115,"p99_ms":11.7216,"throughput_rps":276.05,"wall_seconds":1.0868,"stable_payload":true,"payload_sha256":"362fa207051c66909079646e21b32703dc1c51a9fabc911ed4fe6752c6d257d0","payload_bytes":11965,"round_metrics":[{"p50_ms":3.2636,"p95_ms":3.4707,"p99_ms":11.3342,"throughput_rps":287.4,"error_rate_percent":0.0},{"p50_ms":3.3803,"p95_ms":3.9732,"p99_ms":11.7483,"throughput_rps":272.83,"error_rate_percent":0.0},{"p50_ms":3.3705,"p95_ms":3.6115,"p99_ms":11.7216,"throughput_rps":276.05,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":10.1011,"p50_ms":8.0787,"p95_ms":18.2752,"p99_ms":23.4696,"throughput_rps":979.18,"wall_seconds":0.3064,"stable_payload":true,"payload_sha256":"362fa207051c66909079646e21b32703dc1c51a9fabc911ed4fe6752c6d257d0","payload_bytes":11965,"round_metrics":[{"p50_ms":8.0787,"p95_ms":18.6735,"p99_ms":22.6569,"throughput_rps":988.18,"error_rate_percent":0.0},{"p50_ms":7.9835,"p95_ms":18.0648,"p99_ms":26.5634,"throughput_rps":979.18,"error_rate_percent":0.0},{"p50_ms":8.4041,"p95_ms":18.2752,"p99_ms":23.4696,"throughput_rps":975.98,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.92,"Flask":4.94}},"risk_event_search":{"title":"위험 이벤트 검색·필터","method":"GET","endpoint":"/benchmark/risk-events?risk_threshold=0.6&status=warning&sort=probability_desc&limit=5&offset=0","request_body":null,"comparison_scope":"Filter, sort and paginate product risk events","parity":{"responses_equal":true,"fastapi_payload_sha256":"87d6788ce00a2ec53c5cf19fa9e6611d7efe7d4e2989a14e07dadaa88f625ba4","flask_payload_sha256":"87d6788ce00a2ec53c5cf19fa9e6611d7efe7d4e2989a14e07dadaa88f625ba4","payload_bytes":{"FastAPI":2193,"Flask":2193}},"implementation":{"fastapi_adapter_loc":23,"flask_adapter_loc":56},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.5782,"p50_ms":3.3308,"p95_ms":3.6527,"p99_ms":11.6175,"throughput_rps":278.96,"wall_seconds":1.0754,"stable_payload":true,"payload_sha256":"ed70b172533da4eeb45761cfb3d978d039b10bc7ca18a0da3571c75c46b67e1e","payload_bytes":2058,"round_metrics":[{"p50_ms":3.3308,"p95_ms":3.5398,"p99_ms":11.6175,"throughput_rps":279.52,"error_rate_percent":0.0},{"p50_ms":3.3402,"p95_ms":3.6527,"p99_ms":11.6304,"throughput_rps":278.96,"error_rate_percent":0.0},{"p50_ms":3.3265,"p95_ms":3.659,"p99_ms":11.4756,"throughput_rps":274.9,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.9298,"p50_ms":7.9047,"p95_ms":17.3627,"p99_ms":18.7136,"throughput_rps":999.0,"wall_seconds":0.3003,"stable_payload":true,"payload_sha256":"ed70b172533da4eeb45761cfb3d978d039b10bc7ca18a0da3571c75c46b67e1e","payload_bytes":2058,"round_metrics":[{"p50_ms":7.9047,"p95_ms":18.1582,"p99_ms":20.284,"throughput_rps":999.0,"error_rate_percent":0.0},{"p50_ms":7.8543,"p95_ms":17.3627,"p99_ms":18.3612,"throughput_rps":1017.72,"error_rate_percent":0.0},{"p50_ms":8.3232,"p95_ms":17.1769,"p99_ms":18.7136,"throughput_rps":992.47,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.4718,"p50_ms":3.2242,"p95_ms":3.5578,"p99_ms":11.6445,"throughput_rps":287.49,"wall_seconds":1.0435,"stable_payload":true,"payload_sha256":"620d7dcd6be72be2d5b045d30ff8c2a36ea9e45f137d7635ad7dd7bd08f4f359","payload_bytes":2197,"round_metrics":[{"p50_ms":3.2242,"p95_ms":3.586,"p99_ms":11.5878,"throughput_rps":287.0,"error_rate_percent":0.0},{"p50_ms":3.232,"p95_ms":3.499,"p99_ms":11.6445,"throughput_rps":287.49,"error_rate_percent":0.0},{"p50_ms":3.2222,"p95_ms":3.5578,"p99_ms":11.6888,"throughput_rps":289.38,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.4685,"p50_ms":7.4828,"p95_ms":17.9439,"p99_ms":20.3548,"throughput_rps":1026.44,"wall_seconds":0.2923,"stable_payload":true,"payload_sha256":"620d7dcd6be72be2d5b045d30ff8c2a36ea9e45f137d7635ad7dd7bd08f4f359","payload_bytes":2197,"round_metrics":[{"p50_ms":7.478,"p95_ms":17.5931,"p99_ms":18.7509,"throughput_rps":1026.44,"error_rate_percent":0.0},{"p50_ms":7.4828,"p95_ms":19.0312,"p99_ms":22.9193,"throughput_rps":1020.68,"error_rate_percent":0.0},{"p50_ms":7.5583,"p95_ms":17.9439,"p99_ms":20.3548,"throughput_rps":1041.17,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.9,"Flask":4.96}},"maintenance_recommendation":{"title":"정비 조치 추천","method":"POST","endpoint":"/benchmark/maintenance-recommendation","request_body":{"event_id":"EVT-GS-004","operator_role":"process_manager","include_evidence":true},"comparison_scope":"Validate a POST body and apply a deterministic maintenance rule","parity":{"responses_equal":true,"fastapi_payload_sha256":"3a13a15f7db52dd4c3edd828c874494819ac66c100f2fae311a7af5cfb1a673a","flask_payload_sha256":"3a13a15f7db52dd4c3edd828c874494819ac66c100f2fae311a7af5cfb1a673a","payload_bytes":{"FastAPI":1290,"Flask":1290}},"implementation":{"fastapi_adapter_loc":12,"flask_adapter_loc":13},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.5751,"p50_ms":3.3172,"p95_ms":3.6473,"p99_ms":11.6836,"throughput_rps":279.21,"wall_seconds":1.0745,"stable_payload":true,"payload_sha256":"8ca55514f40329d318cd7cb24b48c3aed03c68123cc0e81c00d2f0a532a5ca50","payload_bytes":1222,"round_metrics":[{"p50_ms":3.3172,"p95_ms":3.6473,"p99_ms":11.6597,"throughput_rps":277.62,"error_rate_percent":0.0},{"p50_ms":3.2961,"p95_ms":3.5204,"p99_ms":11.6836,"throughput_rps":282.63,"error_rate_percent":0.0},{"p50_ms":3.3229,"p95_ms":3.6624,"p99_ms":12.057,"throughput_rps":279.21,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.6755,"p50_ms":7.8068,"p95_ms":17.616,"p99_ms":20.3067,"throughput_rps":1010.78,"wall_seconds":0.2968,"stable_payload":true,"payload_sha256":"8ca55514f40329d318cd7cb24b48c3aed03c68123cc0e81c00d2f0a532a5ca50","payload_bytes":1222,"round_metrics":[{"p50_ms":7.5726,"p95_ms":17.5696,"p99_ms":18.484,"throughput_rps":1057.07,"error_rate_percent":0.0},{"p50_ms":7.8068,"p95_ms":17.616,"p99_ms":20.3067,"throughput_rps":1010.78,"error_rate_percent":0.0},{"p50_ms":9.3273,"p95_ms":21.1105,"p99_ms":27.8067,"throughput_rps":886.66,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.4789,"p50_ms":3.2191,"p95_ms":3.4648,"p99_ms":11.774,"throughput_rps":286.91,"wall_seconds":1.0456,"stable_payload":true,"payload_sha256":"d195d7d883eebadf413db041b8e6b15cf0bb6b905bea6d9926b5ca9aa1c67022","payload_bytes":1556,"round_metrics":[{"p50_ms":3.2171,"p95_ms":3.4648,"p99_ms":11.4978,"throughput_rps":290.19,"error_rate_percent":0.0},{"p50_ms":3.2191,"p95_ms":3.4774,"p99_ms":11.774,"throughput_rps":286.91,"error_rate_percent":0.0},{"p50_ms":3.2447,"p95_ms":3.398,"p99_ms":11.9313,"throughput_rps":286.41,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":10.1051,"p50_ms":8.2141,"p95_ms":19.0106,"p99_ms":21.69,"throughput_rps":973.31,"wall_seconds":0.3082,"stable_payload":true,"payload_sha256":"d195d7d883eebadf413db041b8e6b15cf0bb6b905bea6d9926b5ca9aa1c67022","payload_bytes":1556,"round_metrics":[{"p50_ms":7.8616,"p95_ms":18.7966,"p99_ms":21.69,"throughput_rps":993.75,"error_rate_percent":0.0},{"p50_ms":8.2141,"p95_ms":19.0106,"p99_ms":20.7807,"throughput_rps":973.31,"error_rate_percent":0.0},{"p50_ms":8.2563,"p95_ms":20.6689,"p99_ms":26.3381,"throughput_rps":921.41,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.9,"Flask":4.86}}},"performance_score_formula":"Per feature: equal average of normalized sequential p95, sequential throughput, concurrent p95 and concurrent throughput. Overall: arithmetic mean of three feature scores.","performance_scores":{"FastAPI":4.91,"Flask":4.92},"limitations":["Local Mac loopback measurement; not a cloud production benchmark.","FastAPI and Flask use their normal local servers, so the result includes server-stack overhead.","The shared functions use eight product GS fixtures and do not include a remote database or external model call."]},"representative_features":{"status":"measured","measured_at":"2026-08-05T11:01:02.113637+00:00","feature_count":3,"page":"/app/projects/manufacturing-demo-project","comparison_scope":"Three symmetric product features using the same GS fixtures, risk snapshot and shared business functions; only HTTP adapters differ","environment":{"platform":"macOS-27.0-arm64-arm-64bit-Mach-O","python":"3.14.6","measurement":"local loopback HTTP, separate server processes","rounds":3,"round_order":"alternating framework-first order across rounds and features","connection_mode":"new HTTP connection per request for both servers","fastapi_server":"Uvicorn single worker","flask_server":"Werkzeug development server, threaded","production_benchmark":false},"parity":{"all_feature_responses_equal":true,"feature_count":3,"validation_statuses_match":true,"validation_expected_statuses":true},"validation":{"case_count":5,"all_statuses_match":true,"all_expected_statuses":true,"successful_payloads_equal":true,"cases":[{"feature":"manufacturing_dashboard","name":"limit below minimum","method":"GET","endpoint":"/benchmark/manufacturing-dashboard?limit=0","json_body":null,"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"risk_event_search","name":"unsupported sort value","method":"GET","endpoint":"/benchmark/risk-events?sort=unsupported","json_body":null,"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"risk_event_search","name":"valid empty result","method":"GET","endpoint":"/benchmark/risk-events?risk_threshold=1&status=normal","json_body":null,"expected_status":200,"statuses":{"FastAPI":200,"Flask":200},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":true},{"feature":"maintenance_recommendation","name":"invalid operator role","method":"POST","endpoint":"/benchmark/maintenance-recommendation","json_body":{"event_id":"EVT-GS-004","operator_role":"unknown"},"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"maintenance_recommendation","name":"unknown event","method":"POST","endpoint":"/benchmark/maintenance-recommendation","json_body":{"event_id":"EVT-NOT-FOUND","operator_role":"process_manager"},"expected_status":404,"statuses":{"FastAPI":404,"Flask":404},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null}]},"implementation":{"shared_service":"framework_comparison.representative_dashboard","fastapi_adapter_loc":50,"flask_adapter_loc":80,"fastapi_validation":"Declarative query/body constraints + response_model","flask_validation":"Manual query parsing + Pydantic body/shared payload"},"features":{"manufacturing_dashboard":{"title":"제조 Dashboard 집계","method":"GET","endpoint":"/benchmark/manufacturing-dashboard?risk_threshold=0.0&limit=8","request_body":null,"comparison_scope":"Aggregate eight risk events, line summaries and sensor series","parity":{"responses_equal":true,"fastapi_payload_sha256":"d073b7fcc1799a947a61a29b70c53777c97b912d8ac17f4ac638678ae8974870","flask_payload_sha256":"d073b7fcc1799a947a61a29b70c53777c97b912d8ac17f4ac638678ae8974870","payload_bytes":{"FastAPI":12428,"Flask":12428}},"implementation":{"fastapi_adapter_loc":15,"flask_adapter_loc":33},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.636,"p50_ms":3.4082,"p95_ms":3.823,"p99_ms":11.5824,"throughput_rps":274.56,"wall_seconds":1.0927,"stable_payload":true,"payload_sha256":"0114fac75ba2ad8a4846a8f648c874a1597cf83f0f148e4b4e706f42bbc52248","payload_bytes":11601,"round_metrics":[{"p50_ms":3.3991,"p95_ms":3.823,"p99_ms":11.3168,"throughput_rps":275.5,"error_rate_percent":0.0},{"p50_ms":3.4082,"p95_ms":3.5257,"p99_ms":11.5824,"throughput_rps":274.56,"error_rate_percent":0.0},{"p50_ms":3.4237,"p95_ms":3.8631,"p99_ms":11.6567,"throughput_rps":271.17,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.8971,"p50_ms":7.8964,"p95_ms":17.8237,"p99_ms":20.7399,"throughput_rps":1001.27,"wall_seconds":0.2996,"stable_payload":true,"payload_sha256":"0114fac75ba2ad8a4846a8f648c874a1597cf83f0f148e4b4e706f42bbc52248","payload_bytes":11601,"round_metrics":[{"p50_ms":8.1214,"p95_ms":18.0313,"p99_ms":20.7399,"throughput_rps":980.3,"error_rate_percent":0.0},{"p50_ms":7.8964,"p95_ms":17.8237,"p99_ms":20.939,"throughput_rps":1001.27,"error_rate_percent":0.0},{"p50_ms":7.8874,"p95_ms":17.3425,"p99_ms":19.4562,"throughput_rps":1012.59,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.6159,"p50_ms":3.3705,"p95_ms":3.6115,"p99_ms":11.7216,"throughput_rps":276.05,"wall_seconds":1.0868,"stable_payload":true,"payload_sha256":"362fa207051c66909079646e21b32703dc1c51a9fabc911ed4fe6752c6d257d0","payload_bytes":11965,"round_metrics":[{"p50_ms":3.2636,"p95_ms":3.4707,"p99_ms":11.3342,"throughput_rps":287.4,"error_rate_percent":0.0},{"p50_ms":3.3803,"p95_ms":3.9732,"p99_ms":11.7483,"throughput_rps":272.83,"error_rate_percent":0.0},{"p50_ms":3.3705,"p95_ms":3.6115,"p99_ms":11.7216,"throughput_rps":276.05,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":10.1011,"p50_ms":8.0787,"p95_ms":18.2752,"p99_ms":23.4696,"throughput_rps":979.18,"wall_seconds":0.3064,"stable_payload":true,"payload_sha256":"362fa207051c66909079646e21b32703dc1c51a9fabc911ed4fe6752c6d257d0","payload_bytes":11965,"round_metrics":[{"p50_ms":8.0787,"p95_ms":18.6735,"p99_ms":22.6569,"throughput_rps":988.18,"error_rate_percent":0.0},{"p50_ms":7.9835,"p95_ms":18.0648,"p99_ms":26.5634,"throughput_rps":979.18,"error_rate_percent":0.0},{"p50_ms":8.4041,"p95_ms":18.2752,"p99_ms":23.4696,"throughput_rps":975.98,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.92,"Flask":4.94}},"risk_event_search":{"title":"위험 이벤트 검색·필터","method":"GET","endpoint":"/benchmark/risk-events?risk_threshold=0.6&status=warning&sort=probability_desc&limit=5&offset=0","request_body":null,"comparison_scope":"Filter, sort and paginate product risk events","parity":{"responses_equal":true,"fastapi_payload_sha256":"87d6788ce00a2ec53c5cf19fa9e6611d7efe7d4e2989a14e07dadaa88f625ba4","flask_payload_sha256":"87d6788ce00a2ec53c5cf19fa9e6611d7efe7d4e2989a14e07dadaa88f625ba4","payload_bytes":{"FastAPI":2193,"Flask":2193}},"implementation":{"fastapi_adapter_loc":23,"flask_adapter_loc":56},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.5782,"p50_ms":3.3308,"p95_ms":3.6527,"p99_ms":11.6175,"throughput_rps":278.96,"wall_seconds":1.0754,"stable_payload":true,"payload_sha256":"ed70b172533da4eeb45761cfb3d978d039b10bc7ca18a0da3571c75c46b67e1e","payload_bytes":2058,"round_metrics":[{"p50_ms":3.3308,"p95_ms":3.5398,"p99_ms":11.6175,"throughput_rps":279.52,"error_rate_percent":0.0},{"p50_ms":3.3402,"p95_ms":3.6527,"p99_ms":11.6304,"throughput_rps":278.96,"error_rate_percent":0.0},{"p50_ms":3.3265,"p95_ms":3.659,"p99_ms":11.4756,"throughput_rps":274.9,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.9298,"p50_ms":7.9047,"p95_ms":17.3627,"p99_ms":18.7136,"throughput_rps":999.0,"wall_seconds":0.3003,"stable_payload":true,"payload_sha256":"ed70b172533da4eeb45761cfb3d978d039b10bc7ca18a0da3571c75c46b67e1e","payload_bytes":2058,"round_metrics":[{"p50_ms":7.9047,"p95_ms":18.1582,"p99_ms":20.284,"throughput_rps":999.0,"error_rate_percent":0.0},{"p50_ms":7.8543,"p95_ms":17.3627,"p99_ms":18.3612,"throughput_rps":1017.72,"error_rate_percent":0.0},{"p50_ms":8.3232,"p95_ms":17.1769,"p99_ms":18.7136,"throughput_rps":992.47,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.4718,"p50_ms":3.2242,"p95_ms":3.5578,"p99_ms":11.6445,"throughput_rps":287.49,"wall_seconds":1.0435,"stable_payload":true,"payload_sha256":"620d7dcd6be72be2d5b045d30ff8c2a36ea9e45f137d7635ad7dd7bd08f4f359","payload_bytes":2197,"round_metrics":[{"p50_ms":3.2242,"p95_ms":3.586,"p99_ms":11.5878,"throughput_rps":287.0,"error_rate_percent":0.0},{"p50_ms":3.232,"p95_ms":3.499,"p99_ms":11.6445,"throughput_rps":287.49,"error_rate_percent":0.0},{"p50_ms":3.2222,"p95_ms":3.5578,"p99_ms":11.6888,"throughput_rps":289.38,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.4685,"p50_ms":7.4828,"p95_ms":17.9439,"p99_ms":20.3548,"throughput_rps":1026.44,"wall_seconds":0.2923,"stable_payload":true,"payload_sha256":"620d7dcd6be72be2d5b045d30ff8c2a36ea9e45f137d7635ad7dd7bd08f4f359","payload_bytes":2197,"round_metrics":[{"p50_ms":7.478,"p95_ms":17.5931,"p99_ms":18.7509,"throughput_rps":1026.44,"error_rate_percent":0.0},{"p50_ms":7.4828,"p95_ms":19.0312,"p99_ms":22.9193,"throughput_rps":1020.68,"error_rate_percent":0.0},{"p50_ms":7.5583,"p95_ms":17.9439,"p99_ms":20.3548,"throughput_rps":1041.17,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.9,"Flask":4.96}},"maintenance_recommendation":{"title":"정비 조치 추천","method":"POST","endpoint":"/benchmark/maintenance-recommendation","request_body":{"event_id":"EVT-GS-004","operator_role":"process_manager","include_evidence":true},"comparison_scope":"Validate a POST body and apply a deterministic maintenance rule","parity":{"responses_equal":true,"fastapi_payload_sha256":"3a13a15f7db52dd4c3edd828c874494819ac66c100f2fae311a7af5cfb1a673a","flask_payload_sha256":"3a13a15f7db52dd4c3edd828c874494819ac66c100f2fae311a7af5cfb1a673a","payload_bytes":{"FastAPI":1290,"Flask":1290}},"implementation":{"fastapi_adapter_loc":12,"flask_adapter_loc":13},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.5751,"p50_ms":3.3172,"p95_ms":3.6473,"p99_ms":11.6836,"throughput_rps":279.21,"wall_seconds":1.0745,"stable_payload":true,"payload_sha256":"8ca55514f40329d318cd7cb24b48c3aed03c68123cc0e81c00d2f0a532a5ca50","payload_bytes":1222,"round_metrics":[{"p50_ms":3.3172,"p95_ms":3.6473,"p99_ms":11.6597,"throughput_rps":277.62,"error_rate_percent":0.0},{"p50_ms":3.2961,"p95_ms":3.5204,"p99_ms":11.6836,"throughput_rps":282.63,"error_rate_percent":0.0},{"p50_ms":3.3229,"p95_ms":3.6624,"p99_ms":12.057,"throughput_rps":279.21,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.6755,"p50_ms":7.8068,"p95_ms":17.616,"p99_ms":20.3067,"throughput_rps":1010.78,"wall_seconds":0.2968,"stable_payload":true,"payload_sha256":"8ca55514f40329d318cd7cb24b48c3aed03c68123cc0e81c00d2f0a532a5ca50","payload_bytes":1222,"round_metrics":[{"p50_ms":7.5726,"p95_ms":17.5696,"p99_ms":18.484,"throughput_rps":1057.07,"error_rate_percent":0.0},{"p50_ms":7.8068,"p95_ms":17.616,"p99_ms":20.3067,"throughput_rps":1010.78,"error_rate_percent":0.0},{"p50_ms":9.3273,"p95_ms":21.1105,"p99_ms":27.8067,"throughput_rps":886.66,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.4789,"p50_ms":3.2191,"p95_ms":3.4648,"p99_ms":11.774,"throughput_rps":286.91,"wall_seconds":1.0456,"stable_payload":true,"payload_sha256":"d195d7d883eebadf413db041b8e6b15cf0bb6b905bea6d9926b5ca9aa1c67022","payload_bytes":1556,"round_metrics":[{"p50_ms":3.2171,"p95_ms":3.4648,"p99_ms":11.4978,"throughput_rps":290.19,"error_rate_percent":0.0},{"p50_ms":3.2191,"p95_ms":3.4774,"p99_ms":11.774,"throughput_rps":286.91,"error_rate_percent":0.0},{"p50_ms":3.2447,"p95_ms":3.398,"p99_ms":11.9313,"throughput_rps":286.41,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":10.1051,"p50_ms":8.2141,"p95_ms":19.0106,"p99_ms":21.69,"throughput_rps":973.31,"wall_seconds":0.3082,"stable_payload":true,"payload_sha256":"d195d7d883eebadf413db041b8e6b15cf0bb6b905bea6d9926b5ca9aa1c67022","payload_bytes":1556,"round_metrics":[{"p50_ms":7.8616,"p95_ms":18.7966,"p99_ms":21.69,"throughput_rps":993.75,"error_rate_percent":0.0},{"p50_ms":8.2141,"p95_ms":19.0106,"p99_ms":20.7807,"throughput_rps":973.31,"error_rate_percent":0.0},{"p50_ms":8.2563,"p95_ms":20.6689,"p99_ms":26.3381,"throughput_rps":921.41,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.9,"Flask":4.86}}},"performance_score_formula":"Per feature: equal average of normalized sequential p95, sequential throughput, concurrent p95 and concurrent throughput. Overall: arithmetic mean of three feature scores.","performance_scores":{"FastAPI":4.91,"Flask":4.92},"limitations":["Local Mac loopback measurement; not a cloud production benchmark.","FastAPI and Flask use their normal local servers, so the result includes server-stack overhead.","The shared functions use eight product GS fixtures and do not include a remote database or external model call."]},"full_surface":{"scope":{"application":"Ontology Dashboard MVP","path_count":162,"operation_count":172,"comparison_unit":"OpenAPI의 모든 경로와 HTTP 작업"},"fastapi":{"real_business_application":true,"automatic_openapi_operation_count":172,"automatic_request_validation_operation_count":147,"automatic_response_schema_operation_count":168,"field_level_response_schema_operation_count":167,"non_json_response_contract_operation_count":2,"no_content_contract_operation_count":2,"success_contract_operation_count":172,"runtime_response_validation_operation_count":168,"unauthenticated_probe":{"authenticated":false,"operation_count":172,"status_counts":{"200":3,"401":165,"403":2,"422":2},"unhandled_server_error_count":0,"unhandled_server_errors":[],"expected_503_count":0,"expected_503_operations":[]},"authenticated_probe":{"authenticated":true,"operation_count":172,"status_counts":{"200":34,"403":36,"404":9,"422":83,"503":10},"unhandled_server_error_count":0,"unhandled_server_errors":[],"expected_503_count":10,"expected_503_operations":[{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/context","status":503},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/dashboard","status":503},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/observations","status":503},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/release","status":503},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/replay/sessions/{session_id}","status":503},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/replay/sessions/{session_id}/events","status":503},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/results/latest","status":503},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/snapshots/{prediction_id}","status":503},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/timeline","status":503},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/versions","status":503}]}},"flask":{"real_business_application":false,"comparison_mode":"자동 생성 bare Flask 라우트 미러","registered_operation_count":172,"status_counts":{"200":172},"failure_count":0,"failures":[],"automatic_openapi_operation_count":0,"automatic_request_validation_operation_count":0,"automatic_response_schema_operation_count":0,"business_handler_operation_count":0,"manual_business_setup_operation_count":172},"schema_summary":{"path_count":162,"operation_count":172,"request_body_operation_count":72,"parameterized_operation_count":115,"response_schema_operation_count":170,"json_success_schema_operation_count":168,"field_level_json_success_schema_operation_count":167,"non_json_success_schema_operation_count":2,"no_content_success_operation_count":2,"success_contract_operation_count":172,"method_counts":{"DELETE":2,"GET":93,"PATCH":4,"POST":66,"PUT":7},"tag_counts":{"modeling":38,"dashboards":18,"admin":13,"predictive-maintenance-runtime":13,"ontology":12,"datasets":11,"manufacturing-domain-pack":11,"analyses":10,"auth":10,"role-workspaces":7,"planner":6,"project3":6,"projects":6,"predictions":5,"agent":3,"governance":3,"system":3,"exports":2},"operations":[{"method":"GET","path":"/health","operation_id":"health_health_get","tags":["system"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/system/polyglot-health","operation_id":"polyglot_health_api_system_polyglot_health_get","tags":["system"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/openapi-contract","operation_id":"openapi_contract_api_openapi_contract_get","tags":["system"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":false,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/auth/register","operation_id":"register_api_auth_register_post","tags":["auth"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/auth/login","operation_id":"login_api_auth_login_post","tags":["auth"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/auth/logout","operation_id":"logout_api_auth_logout_post","tags":["auth"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":false,"has_json_success_schema":false,"has_field_level_json_success_schema":false,"has_non_json_success_schema":false,"has_no_content_success":true},{"method":"GET","path":"/api/auth/me","operation_id":"me_api_auth_me_get","tags":["auth"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/auth/display-preferences","operation_id":"get_display_preferences_api_auth_display_preferences_get","tags":["auth"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PUT","path":"/api/auth/display-preferences","operation_id":"save_display_preferences_api_auth_display_preferences_put","tags":["auth"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PATCH","path":"/api/auth/active-project","operation_id":"set_active_project_api_auth_active_project_patch","tags":["auth"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/auth/refresh","operation_id":"refresh_session_api_auth_refresh_post","tags":["auth"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/auth/sessions","operation_id":"list_sessions_api_auth_sessions_get","tags":["auth"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"DELETE","path":"/api/auth/sessions/others","operation_id":"revoke_other_sessions_api_auth_sessions_others_delete","tags":["auth"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/agent/query","operation_id":"run_agent_query_api_agent_query_post","tags":["agent"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/agent/runs","operation_id":"list_agent_runs_api_agent_runs_get","tags":["agent"],"path_parameter_count":0,"query_parameter_count":7,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/agent/runs/{run_id}","operation_id":"inspect_agent_run_api_agent_runs__run_id__get","tags":["agent"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/adapters","operation_id":"list_adapters_api_adapters_get","tags":["datasets","predictions"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/datasets","operation_id":"list_project_datasets_api_projects__project_id__datasets_get","tags":["datasets","predictions"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/projects/{project_id}/datasets/ingest","operation_id":"ingest_project_dataset_api_projects__project_id__datasets_ingest_post","tags":["datasets","predictions"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/predictions","operation_id":"list_project_predictions_api_projects__project_id__predictions_get","tags":["datasets","predictions"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/projects/{project_id}/predictions","operation_id":"ingest_prediction_result_api_projects__project_id__predictions_post","tags":["datasets","predictions"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/dataset-catalog","operation_id":"list_datasets_api_projects__project_id__dataset_catalog_get","tags":["datasets"],"path_parameter_count":1,"query_parameter_count":6,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/projects/{project_id}/dataset-catalog","operation_id":"create_dataset_api_projects__project_id__dataset_catalog_post","tags":["datasets"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/dataset-catalog/{dataset_id}","operation_id":"dataset_detail_api_projects__project_id__dataset_catalog__dataset_id__get","tags":["datasets"],"path_parameter_count":2,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/projects/{project_id}/dataset-catalog/{dataset_id}/versions","operation_id":"create_dataset_version_api_projects__project_id__dataset_catalog__dataset_id__versions_post","tags":["datasets"],"path_parameter_count":2,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PUT","path":"/api/projects/{project_id}/dataset-catalog/{dataset_id}/versions/{version_id}/mapping","operation_id":"save_ontology_mapping_api_projects__project_id__dataset_catalog__dataset_id__versions__version_id__mapping_put","tags":["datasets"],"path_parameter_count":3,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/projects/{project_id}/dataset-catalog/{dataset_id}/versions/{version_id}/materializations","operation_id":"create_materialization_api_projects__project_id__dataset_catalog__dataset_id__versions__version_id__materializations_post","tags":["datasets"],"path_parameter_count":3,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/workspaces","operation_id":"list_workspaces_api_workspaces_get","tags":["ontology"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/domain-packs","operation_id":"list_domain_packs_api_domain_packs_get","tags":["ontology"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/ontology/registry","operation_id":"ontology_registry_api_ontology_registry_get","tags":["ontology"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/ontology/object-types","operation_id":"list_object_types_api_ontology_object_types_get","tags":["ontology"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/ontology/link-types","operation_id":"list_link_types_api_ontology_link_types_get","tags":["ontology"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/ontology/action-types","operation_id":"list_action_types_api_ontology_action_types_get","tags":["ontology"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/ontology/objects","operation_id":"query_ontology_objects_api_ontology_objects_get","tags":["ontology"],"path_parameter_count":0,"query_parameter_count":6,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/ontology/objects/aggregate","operation_id":"aggregate_ontology_objects_api_ontology_objects_aggregate_get","tags":["ontology"],"path_parameter_count":0,"query_parameter_count":6,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/ontology/objects/{object_id}","operation_id":"get_ontology_object_api_ontology_objects__object_id__get","tags":["ontology"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/ontology/objects/{object_id}/links","operation_id":"traverse_ontology_object_api_ontology_objects__object_id__links_get","tags":["ontology"],"path_parameter_count":1,"query_parameter_count":5,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/ontology/objects/{object_id}/action-invocations","operation_id":"list_ontology_action_invocations_api_ontology_objects__object_id__action_invocations_get","tags":["ontology"],"path_parameter_count":1,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/ontology/actions/invoke","operation_id":"invoke_ontology_action_api_ontology_actions_invoke_post","tags":["ontology"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/analyses","operation_id":"create_analysis_api_analyses_post","tags":["analyses"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/analyses/{analysis_id}","operation_id":"get_analysis_api_analyses__analysis_id__get","tags":["analyses"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PUT","path":"/api/analyses/{analysis_id}","operation_id":"update_analysis_api_analyses__analysis_id__put","tags":["analyses"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/analyses/{analysis_id}/run","operation_id":"run_analysis_api_analyses__analysis_id__run_post","tags":["analyses"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/analyses/{analysis_id}/materializations","operation_id":"materialize_analysis_result_api_analyses__analysis_id__materializations_post","tags":["analyses"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/analyses/{analysis_id}/jobs","operation_id":"queue_analysis_run_api_analyses__analysis_id__jobs_post","tags":["analyses"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/analysis-runs/{run_id}/cancel","operation_id":"cancel_analysis_run_api_analysis_runs__run_id__cancel_post","tags":["analyses"],"path_parameter_count":1,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/analysis-runs/{run_id}/nodes/{node_id}/rows","operation_id":"get_analysis_node_rows_api_analysis_runs__run_id__nodes__node_id__rows_get","tags":["analyses"],"path_parameter_count":2,"query_parameter_count":3,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/analysis-runs/{run_id}","operation_id":"get_analysis_run_api_analysis_runs__run_id__get","tags":["analyses"],"path_parameter_count":1,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/analyses/{analysis_id}/nodes/{node_id}/result","operation_id":"get_analysis_node_result_api_analyses__analysis_id__nodes__node_id__result_get","tags":["analyses"],"path_parameter_count":2,"query_parameter_count":3,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects","operation_id":"list_projects_api_projects_get","tags":["projects"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}","operation_id":"get_project_api_projects__project_id__get","tags":["projects"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces","operation_id":"list_project_workspaces_api_projects__project_id__workspaces_get","tags":["projects"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/events","operation_id":"list_project_events_api_projects__project_id__events_get","tags":["projects"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/admin/projects","operation_id":"create_project_api_admin_projects_post","tags":["projects"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PATCH","path":"/api/admin/projects/{project_id}","operation_id":"update_project_api_admin_projects__project_id__patch","tags":["projects"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/reports/draft","operation_id":"get_report_draft_api_reports_draft_get","tags":["dashboards"],"path_parameter_count":0,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PUT","path":"/api/reports/draft","operation_id":"save_report_draft_api_reports_draft_put","tags":["dashboards"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/dashboards/resolved","operation_id":"resolved_dashboard_api_dashboards_resolved_get","tags":["dashboards"],"path_parameter_count":0,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/dashboard-templates/{role_code}/versions","operation_id":"dashboard_template_versions_api_dashboard_templates__role_code__versions_get","tags":["dashboards"],"path_parameter_count":1,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/dashboard-templates/{role_code}/preview","operation_id":"preview_dashboard_template_api_dashboard_templates__role_code__preview_get","tags":["dashboards"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/dashboard-templates/{role_code}/publish","operation_id":"publish_dashboard_template_api_dashboard_templates__role_code__publish_post","tags":["dashboards"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/dashboard-templates/{role_code}/publish-requests","operation_id":"request_dashboard_template_publish_api_dashboard_templates__role_code__publish_requests_post","tags":["dashboards"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/dashboard-templates/{role_code}","operation_id":"current_dashboard_template_api_dashboard_templates__role_code__get","tags":["dashboards"],"path_parameter_count":1,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/boards/catalog","operation_id":"board_catalog_api_boards_catalog_get","tags":["dashboards"],"path_parameter_count":0,"query_parameter_count":4,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/dashboards/{dashboard_id}/boards/{board_id}/query","operation_id":"query_dashboard_board_api_dashboards__dashboard_id__boards__board_id__query_post","tags":["dashboards"],"path_parameter_count":2,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PUT","path":"/api/dashboards/preferences","operation_id":"save_dashboard_preferences_api_dashboards_preferences_put","tags":["dashboards"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/dashboards/preferences/restore","operation_id":"restore_dashboard_preferences_api_dashboards_preferences_restore_post","tags":["dashboards"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/dashboards/saved-views","operation_id":"list_dashboard_saved_views_api_dashboards_saved_views_get","tags":["dashboards"],"path_parameter_count":0,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/dashboards/saved-views","operation_id":"create_dashboard_saved_view_api_dashboards_saved_views_post","tags":["dashboards"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/dashboards/saved-views/{view_id}","operation_id":"get_dashboard_saved_view_api_dashboards_saved_views__view_id__get","tags":["dashboards"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"DELETE","path":"/api/dashboards/saved-views/{view_id}","operation_id":"delete_dashboard_saved_view_api_dashboards_saved_views__view_id__delete","tags":["dashboards"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":false,"has_json_success_schema":false,"has_field_level_json_success_schema":false,"has_non_json_success_schema":false,"has_no_content_success":true},{"method":"POST","path":"/api/dashboards/shares","operation_id":"create_dashboard_share_api_dashboards_shares_post","tags":["dashboards"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/dashboards/shares/{token}","operation_id":"resolve_dashboard_share_api_dashboards_shares__token__get","tags":["dashboards"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/exports","operation_id":"create_export_api_exports_post","tags":["exports"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":false,"has_field_level_json_success_schema":false,"has_non_json_success_schema":true,"has_no_content_success":false},{"method":"GET","path":"/api/exports/checkpoints","operation_id":"list_export_checkpoints_api_exports_checkpoints_get","tags":["exports"],"path_parameter_count":0,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/governance","operation_id":"governance_overview_api_projects__project_id__workspaces__workspace_id__governance_get","tags":["governance"],"path_parameter_count":2,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/governance/agent-runs/{run_id}","operation_id":"governance_agent_run_api_projects__project_id__workspaces__workspace_id__governance_agent_runs__run_id__get","tags":["governance"],"path_parameter_count":3,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/projects/{project_id}/workspaces/{workspace_id}/governance/projections/{projection_id}/retry","operation_id":"retry_projection_api_projects__project_id__workspaces__workspace_id__governance_projections__projection_id__retry_post","tags":["governance"],"path_parameter_count":3,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/planner/object-query","operation_id":"plan_object_query_api_planner_object_query_post","tags":["planner"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/planner/board-recommendations","operation_id":"recommend_boards_api_planner_board_recommendations_post","tags":["planner"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/planner/dashboard-drafts","operation_id":"generate_dashboard_draft_api_planner_dashboard_drafts_post","tags":["planner"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/planner/visualizations/recommend","operation_id":"recommend_visualization_api_planner_visualizations_recommend_post","tags":["planner"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/planner/visualizations/semantic-plan","operation_id":"plan_semantic_visualization_api_planner_visualizations_semantic_plan_post","tags":["planner"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/planner/grounded-narrative","operation_id":"generate_grounded_narrative_api_planner_grounded_narrative_post","tags":["planner"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/integrations/project3/status","operation_id":"project3_status_api_integrations_project3_status_get","tags":["project3"],"path_parameter_count":0,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/integrations/project3/schema","operation_id":"project3_schema_api_integrations_project3_schema_get","tags":["project3"],"path_parameter_count":0,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/integrations/project3/search","operation_id":"project3_search_api_integrations_project3_search_get","tags":["project3"],"path_parameter_count":0,"query_parameter_count":4,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/integrations/project3/subgraph","operation_id":"project3_subgraph_api_integrations_project3_subgraph_get","tags":["project3"],"path_parameter_count":0,"query_parameter_count":5,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/integrations/project3/query","operation_id":"project3_query_api_integrations_project3_query_post","tags":["project3"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/integrations/project3/rag","operation_id":"project3_rag_api_integrations_project3_rag_post","tags":["project3"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/context","operation_id":"runtime_context_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_context_get","tags":["predictive-maintenance-runtime"],"path_parameter_count":2,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/versions","operation_id":"runtime_versions_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_versions_get","tags":["predictive-maintenance-runtime"],"path_parameter_count":2,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PUT","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/selection","operation_id":"select_runtime_version_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_selection_put","tags":["predictive-maintenance-runtime"],"path_parameter_count":2,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/dashboard","operation_id":"dashboard_source_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_dashboard_get","tags":["predictive-maintenance-runtime"],"path_parameter_count":2,"query_parameter_count":4,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/release","operation_id":"release_overview_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_release_get","tags":["predictive-maintenance-runtime"],"path_parameter_count":2,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/results/latest","operation_id":"latest_product_results_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_results_latest_get","tags":["predictive-maintenance-runtime"],"path_parameter_count":2,"query_parameter_count":8,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/snapshots/{prediction_id}","operation_id":"snapshot_drilldown_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_snapshots__prediction_id__get","tags":["predictive-maintenance-runtime"],"path_parameter_count":3,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/timeline","operation_id":"prediction_timeline_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_timeline_get","tags":["predictive-maintenance-runtime"],"path_parameter_count":2,"query_parameter_count":6,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/observations","operation_id":"observation_window_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_observations_get","tags":["predictive-maintenance-runtime"],"path_parameter_count":2,"query_parameter_count":10,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/replay/sessions","operation_id":"start_replay_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_replay_sessions_post","tags":["predictive-maintenance-runtime"],"path_parameter_count":2,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/replay/sessions/{session_id}","operation_id":"replay_snapshot_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_replay_sessions__session_id__get","tags":["predictive-maintenance-runtime"],"path_parameter_count":3,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/replay/sessions/{session_id}/{action}","operation_id":"control_replay_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_replay_sessions__session_id___action__post","tags":["predictive-maintenance-runtime"],"path_parameter_count":4,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/projects/{project_id}/workspaces/{workspace_id}/predictive-maintenance/replay/sessions/{session_id}/events","operation_id":"replay_events_api_projects__project_id__workspaces__workspace_id__predictive_maintenance_replay_sessions__session_id__events_get","tags":["predictive-maintenance-runtime"],"path_parameter_count":3,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":false,"has_field_level_json_success_schema":false,"has_non_json_success_schema":true,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/contracts","operation_id":"modeling_contracts_api_modeling_contracts_get","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/intake/profiles","operation_id":"create_intake_profile_api_modeling_intake_profiles_post","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/intake/profiles/{profile_id}","operation_id":"get_intake_profile_api_modeling_intake_profiles__profile_id__get","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/manifest-drafts","operation_id":"create_manifest_draft_api_modeling_manifest_drafts_post","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/manifest-drafts/{draft_id}","operation_id":"get_manifest_draft_api_modeling_manifest_drafts__draft_id__get","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PATCH","path":"/api/modeling/manifest-drafts/{draft_id}","operation_id":"update_manifest_draft_api_modeling_manifest_drafts__draft_id__patch","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/manifest-drafts/{draft_id}/decision","operation_id":"decide_manifest_draft_api_modeling_manifest_drafts__draft_id__decision_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/manifest-drafts/{draft_id}/approved-manifest","operation_id":"approved_manifest_payload_api_modeling_manifest_drafts__draft_id__approved_manifest_get","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/manifest-drafts/{draft_id}/ingest","operation_id":"ingest_approved_manifest_draft_api_modeling_manifest_drafts__draft_id__ingest_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/mapping-sets","operation_id":"create_mapping_set_api_modeling_mapping_sets_post","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/mapping-sets/{mapping_set_id}","operation_id":"get_mapping_set_api_modeling_mapping_sets__mapping_set_id__get","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/mapping-sets/{mapping_set_id}/candidate-decision","operation_id":"decide_mapping_candidate_api_modeling_mapping_sets__mapping_set_id__candidate_decision_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/mapping-sets/{mapping_set_id}/decision","operation_id":"decide_mapping_set_api_modeling_mapping_sets__mapping_set_id__decision_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/mapping-sets/{mapping_set_id}/versions","operation_id":"clone_mapping_set_api_modeling_mapping_sets__mapping_set_id__versions_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/mapping-sets/{mapping_set_id}/capabilities","operation_id":"mapping_capabilities_api_modeling_mapping_sets__mapping_set_id__capabilities_get","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/feature-recipe-sets","operation_id":"create_feature_recipe_set_api_modeling_feature_recipe_sets_post","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/feature-recipe-sets/{recipe_set_id}","operation_id":"get_feature_recipe_set_api_modeling_feature_recipe_sets__recipe_set_id__get","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/feature-recipe-sets/{recipe_set_id}/decision","operation_id":"decide_feature_recipe_set_api_modeling_feature_recipe_sets__recipe_set_id__decision_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/feature-datasets/materialize","operation_id":"materialize_feature_dataset_api_modeling_feature_datasets_materialize_post","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/feature-datasets/{feature_dataset_version_id}","operation_id":"get_feature_dataset_version_api_modeling_feature_datasets__feature_dataset_version_id__get","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/experiment-capabilities","operation_id":"experiment_capabilities_api_modeling_experiment_capabilities_get","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/experiments","operation_id":"queue_experiment_api_modeling_experiments_post","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/experiments","operation_id":"list_experiments_api_modeling_experiments_get","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":3,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/experiments/{experiment_id}","operation_id":"get_experiment_api_modeling_experiments__experiment_id__get","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/experiments/{experiment_id}/retry","operation_id":"retry_experiment_api_modeling_experiments__experiment_id__retry_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/experiments/{experiment_id}/cancel","operation_id":"cancel_experiment_api_modeling_experiments__experiment_id__cancel_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/experiments/{experiment_id}/recover-stale","operation_id":"recover_stale_experiment_api_modeling_experiments__experiment_id__recover_stale_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/model-versions","operation_id":"create_model_version_api_modeling_model_versions_post","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/model-versions","operation_id":"list_model_versions_api_modeling_model_versions_get","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":3,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/model-versions/{model_version_id}","operation_id":"get_model_version_api_modeling_model_versions__model_version_id__get","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/model-versions/{model_version_id}/release-requests","operation_id":"request_model_release_api_modeling_model_versions__model_version_id__release_requests_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/model-release-requests","operation_id":"list_model_release_requests_api_modeling_model_release_requests_get","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":3,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/model-release-requests/{release_request_id}/decision","operation_id":"decide_model_release_api_modeling_model_release_requests__release_request_id__decision_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/model-versions/{model_version_id}/activate","operation_id":"activate_model_api_modeling_model_versions__model_version_id__activate_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/model-versions/rollback","operation_id":"rollback_model_api_modeling_model_versions_rollback_post","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/modeling/model-versions/{model_version_id}/score","operation_id":"score_model_version_api_modeling_model_versions__model_version_id__score_post","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/explanations/{explanation_id}","operation_id":"get_explanation_api_modeling_explanations__explanation_id__get","tags":["modeling"],"path_parameter_count":1,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/modeling/workbench","operation_id":"modeling_workbench_api_modeling_workbench_get","tags":["modeling"],"path_parameter_count":0,"query_parameter_count":3,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/role-workspaces/executive","operation_id":"executive_role_workspace_api_role_workspaces_executive_get","tags":["role-workspaces"],"path_parameter_count":0,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/role-workspaces/audit","operation_id":"audit_role_workspace_api_role_workspaces_audit_get","tags":["role-workspaces"],"path_parameter_count":0,"query_parameter_count":2,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/role-workspaces/audit/export-checkpoints","operation_id":"create_audit_export_checkpoint_api_role_workspaces_audit_export_checkpoints_post","tags":["role-workspaces"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/role-workspaces/field","operation_id":"field_role_workspace_api_role_workspaces_field_get","tags":["role-workspaces"],"path_parameter_count":0,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/role-workspaces/fde","operation_id":"fde_role_workspace_api_role_workspaces_fde_get","tags":["role-workspaces"],"path_parameter_count":0,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/role-workspaces/ml","operation_id":"ml_role_workspace_api_role_workspaces_ml_get","tags":["role-workspaces"],"path_parameter_count":0,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/role-workspaces/ml/release-requests","operation_id":"create_model_release_request_api_role_workspaces_ml_release_requests_post","tags":["role-workspaces"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/equipment","operation_id":"list_equipment_api_equipment_get","tags":["manufacturing-domain-pack"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/equipment/{equipment_id}","operation_id":"get_equipment_api_equipment__equipment_id__get","tags":["manufacturing-domain-pack"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/events","operation_id":"list_events_api_events_get","tags":["manufacturing-domain-pack"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/events/{event_id}","operation_id":"get_event_api_events__event_id__get","tags":["manufacturing-domain-pack"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/events/{event_id}/evidence","operation_id":"get_evidence_api_events__event_id__evidence_get","tags":["manufacturing-domain-pack"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/events/{event_id}/report","operation_id":"create_report_api_events__event_id__report_post","tags":["manufacturing-domain-pack"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/events/{event_id}/layout","operation_id":"create_layout_api_events__event_id__layout_post","tags":["manufacturing-domain-pack"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/events/{event_id}/decision","operation_id":"record_decision_api_events__event_id__decision_post","tags":["manufacturing-domain-pack"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/events/{event_id}/notes","operation_id":"add_note_api_events__event_id__notes_post","tags":["manufacturing-domain-pack"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/events/{event_id}/follow-up","operation_id":"follow_up_api_events__event_id__follow_up_post","tags":["manufacturing-domain-pack"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/events/{event_id}/activity","operation_id":"event_activity_api_events__event_id__activity_get","tags":["manufacturing-domain-pack"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/admin/overview","operation_id":"admin_overview_api_admin_overview_get","tags":["admin"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/admin/notifications","operation_id":"admin_notifications_api_admin_notifications_get","tags":["admin"],"path_parameter_count":0,"query_parameter_count":1,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/admin/notifications/{notification_id}/read","operation_id":"admin_mark_notification_read_api_admin_notifications__notification_id__read_post","tags":["admin"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/admin/users","operation_id":"admin_users_api_admin_users_get","tags":["admin"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/admin/projects/{project_id}/members","operation_id":"admin_project_members_api_admin_projects__project_id__members_get","tags":["admin"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PUT","path":"/api/admin/projects/{project_id}/members/{user_id}","operation_id":"admin_update_project_membership_api_admin_projects__project_id__members__user_id__put","tags":["admin"],"path_parameter_count":2,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"PATCH","path":"/api/admin/users/{user_id}","operation_id":"admin_update_user_api_admin_users__user_id__patch","tags":["admin"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/admin/roles","operation_id":"admin_roles_api_admin_roles_get","tags":["admin"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/admin/workspaces","operation_id":"admin_workspaces_api_admin_workspaces_get","tags":["admin"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/admin/audit","operation_id":"admin_audit_api_admin_audit_get","tags":["admin"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"GET","path":"/api/admin/workflow-approvals","operation_id":"admin_workflow_approvals_api_admin_workflow_approvals_get","tags":["admin"],"path_parameter_count":0,"query_parameter_count":0,"has_request_body":false,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/admin/template-publish-requests/{request_id}/decision","operation_id":"admin_decide_template_publish_request_api_admin_template_publish_requests__request_id__decision_post","tags":["admin"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false},{"method":"POST","path":"/api/admin/model-release-requests/{request_id}/decision","operation_id":"admin_decide_model_release_request_api_admin_model_release_requests__request_id__decision_post","tags":["admin"],"path_parameter_count":1,"query_parameter_count":0,"has_request_body":true,"has_response_schema":true,"has_json_success_schema":true,"has_field_level_json_success_schema":true,"has_non_json_success_schema":false,"has_no_content_success":false}]},"representative_dashboard":{"status":"measured","measured_at":"2026-08-05T11:01:02.113637+00:00","feature_count":3,"page":"/app/projects/manufacturing-demo-project","comparison_scope":"Three symmetric product features using the same GS fixtures, risk snapshot and shared business functions; only HTTP adapters differ","environment":{"platform":"macOS-27.0-arm64-arm-64bit-Mach-O","python":"3.14.6","measurement":"local loopback HTTP, separate server processes","rounds":3,"round_order":"alternating framework-first order across rounds and features","connection_mode":"new HTTP connection per request for both servers","fastapi_server":"Uvicorn single worker","flask_server":"Werkzeug development server, threaded","production_benchmark":false},"parity":{"all_feature_responses_equal":true,"feature_count":3,"validation_statuses_match":true,"validation_expected_statuses":true},"validation":{"case_count":5,"all_statuses_match":true,"all_expected_statuses":true,"successful_payloads_equal":true,"cases":[{"feature":"manufacturing_dashboard","name":"limit below minimum","method":"GET","endpoint":"/benchmark/manufacturing-dashboard?limit=0","json_body":null,"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"risk_event_search","name":"unsupported sort value","method":"GET","endpoint":"/benchmark/risk-events?sort=unsupported","json_body":null,"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"risk_event_search","name":"valid empty result","method":"GET","endpoint":"/benchmark/risk-events?risk_threshold=1&status=normal","json_body":null,"expected_status":200,"statuses":{"FastAPI":200,"Flask":200},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":true},{"feature":"maintenance_recommendation","name":"invalid operator role","method":"POST","endpoint":"/benchmark/maintenance-recommendation","json_body":{"event_id":"EVT-GS-004","operator_role":"unknown"},"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"maintenance_recommendation","name":"unknown event","method":"POST","endpoint":"/benchmark/maintenance-recommendation","json_body":{"event_id":"EVT-NOT-FOUND","operator_role":"process_manager"},"expected_status":404,"statuses":{"FastAPI":404,"Flask":404},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null}]},"implementation":{"shared_service":"framework_comparison.representative_dashboard","fastapi_adapter_loc":50,"flask_adapter_loc":80,"fastapi_validation":"Declarative query/body constraints + response_model","flask_validation":"Manual query parsing + Pydantic body/shared payload"},"features":{"manufacturing_dashboard":{"title":"제조 Dashboard 집계","method":"GET","endpoint":"/benchmark/manufacturing-dashboard?risk_threshold=0.0&limit=8","request_body":null,"comparison_scope":"Aggregate eight risk events, line summaries and sensor series","parity":{"responses_equal":true,"fastapi_payload_sha256":"d073b7fcc1799a947a61a29b70c53777c97b912d8ac17f4ac638678ae8974870","flask_payload_sha256":"d073b7fcc1799a947a61a29b70c53777c97b912d8ac17f4ac638678ae8974870","payload_bytes":{"FastAPI":12428,"Flask":12428}},"implementation":{"fastapi_adapter_loc":15,"flask_adapter_loc":33},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.636,"p50_ms":3.4082,"p95_ms":3.823,"p99_ms":11.5824,"throughput_rps":274.56,"wall_seconds":1.0927,"stable_payload":true,"payload_sha256":"0114fac75ba2ad8a4846a8f648c874a1597cf83f0f148e4b4e706f42bbc52248","payload_bytes":11601,"round_metrics":[{"p50_ms":3.3991,"p95_ms":3.823,"p99_ms":11.3168,"throughput_rps":275.5,"error_rate_percent":0.0},{"p50_ms":3.4082,"p95_ms":3.5257,"p99_ms":11.5824,"throughput_rps":274.56,"error_rate_percent":0.0},{"p50_ms":3.4237,"p95_ms":3.8631,"p99_ms":11.6567,"throughput_rps":271.17,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.8971,"p50_ms":7.8964,"p95_ms":17.8237,"p99_ms":20.7399,"throughput_rps":1001.27,"wall_seconds":0.2996,"stable_payload":true,"payload_sha256":"0114fac75ba2ad8a4846a8f648c874a1597cf83f0f148e4b4e706f42bbc52248","payload_bytes":11601,"round_metrics":[{"p50_ms":8.1214,"p95_ms":18.0313,"p99_ms":20.7399,"throughput_rps":980.3,"error_rate_percent":0.0},{"p50_ms":7.8964,"p95_ms":17.8237,"p99_ms":20.939,"throughput_rps":1001.27,"error_rate_percent":0.0},{"p50_ms":7.8874,"p95_ms":17.3425,"p99_ms":19.4562,"throughput_rps":1012.59,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.6159,"p50_ms":3.3705,"p95_ms":3.6115,"p99_ms":11.7216,"throughput_rps":276.05,"wall_seconds":1.0868,"stable_payload":true,"payload_sha256":"362fa207051c66909079646e21b32703dc1c51a9fabc911ed4fe6752c6d257d0","payload_bytes":11965,"round_metrics":[{"p50_ms":3.2636,"p95_ms":3.4707,"p99_ms":11.3342,"throughput_rps":287.4,"error_rate_percent":0.0},{"p50_ms":3.3803,"p95_ms":3.9732,"p99_ms":11.7483,"throughput_rps":272.83,"error_rate_percent":0.0},{"p50_ms":3.3705,"p95_ms":3.6115,"p99_ms":11.7216,"throughput_rps":276.05,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":10.1011,"p50_ms":8.0787,"p95_ms":18.2752,"p99_ms":23.4696,"throughput_rps":979.18,"wall_seconds":0.3064,"stable_payload":true,"payload_sha256":"362fa207051c66909079646e21b32703dc1c51a9fabc911ed4fe6752c6d257d0","payload_bytes":11965,"round_metrics":[{"p50_ms":8.0787,"p95_ms":18.6735,"p99_ms":22.6569,"throughput_rps":988.18,"error_rate_percent":0.0},{"p50_ms":7.9835,"p95_ms":18.0648,"p99_ms":26.5634,"throughput_rps":979.18,"error_rate_percent":0.0},{"p50_ms":8.4041,"p95_ms":18.2752,"p99_ms":23.4696,"throughput_rps":975.98,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.92,"Flask":4.94}},"risk_event_search":{"title":"위험 이벤트 검색·필터","method":"GET","endpoint":"/benchmark/risk-events?risk_threshold=0.6&status=warning&sort=probability_desc&limit=5&offset=0","request_body":null,"comparison_scope":"Filter, sort and paginate product risk events","parity":{"responses_equal":true,"fastapi_payload_sha256":"87d6788ce00a2ec53c5cf19fa9e6611d7efe7d4e2989a14e07dadaa88f625ba4","flask_payload_sha256":"87d6788ce00a2ec53c5cf19fa9e6611d7efe7d4e2989a14e07dadaa88f625ba4","payload_bytes":{"FastAPI":2193,"Flask":2193}},"implementation":{"fastapi_adapter_loc":23,"flask_adapter_loc":56},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.5782,"p50_ms":3.3308,"p95_ms":3.6527,"p99_ms":11.6175,"throughput_rps":278.96,"wall_seconds":1.0754,"stable_payload":true,"payload_sha256":"ed70b172533da4eeb45761cfb3d978d039b10bc7ca18a0da3571c75c46b67e1e","payload_bytes":2058,"round_metrics":[{"p50_ms":3.3308,"p95_ms":3.5398,"p99_ms":11.6175,"throughput_rps":279.52,"error_rate_percent":0.0},{"p50_ms":3.3402,"p95_ms":3.6527,"p99_ms":11.6304,"throughput_rps":278.96,"error_rate_percent":0.0},{"p50_ms":3.3265,"p95_ms":3.659,"p99_ms":11.4756,"throughput_rps":274.9,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.9298,"p50_ms":7.9047,"p95_ms":17.3627,"p99_ms":18.7136,"throughput_rps":999.0,"wall_seconds":0.3003,"stable_payload":true,"payload_sha256":"ed70b172533da4eeb45761cfb3d978d039b10bc7ca18a0da3571c75c46b67e1e","payload_bytes":2058,"round_metrics":[{"p50_ms":7.9047,"p95_ms":18.1582,"p99_ms":20.284,"throughput_rps":999.0,"error_rate_percent":0.0},{"p50_ms":7.8543,"p95_ms":17.3627,"p99_ms":18.3612,"throughput_rps":1017.72,"error_rate_percent":0.0},{"p50_ms":8.3232,"p95_ms":17.1769,"p99_ms":18.7136,"throughput_rps":992.47,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.4718,"p50_ms":3.2242,"p95_ms":3.5578,"p99_ms":11.6445,"throughput_rps":287.49,"wall_seconds":1.0435,"stable_payload":true,"payload_sha256":"620d7dcd6be72be2d5b045d30ff8c2a36ea9e45f137d7635ad7dd7bd08f4f359","payload_bytes":2197,"round_metrics":[{"p50_ms":3.2242,"p95_ms":3.586,"p99_ms":11.5878,"throughput_rps":287.0,"error_rate_percent":0.0},{"p50_ms":3.232,"p95_ms":3.499,"p99_ms":11.6445,"throughput_rps":287.49,"error_rate_percent":0.0},{"p50_ms":3.2222,"p95_ms":3.5578,"p99_ms":11.6888,"throughput_rps":289.38,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.4685,"p50_ms":7.4828,"p95_ms":17.9439,"p99_ms":20.3548,"throughput_rps":1026.44,"wall_seconds":0.2923,"stable_payload":true,"payload_sha256":"620d7dcd6be72be2d5b045d30ff8c2a36ea9e45f137d7635ad7dd7bd08f4f359","payload_bytes":2197,"round_metrics":[{"p50_ms":7.478,"p95_ms":17.5931,"p99_ms":18.7509,"throughput_rps":1026.44,"error_rate_percent":0.0},{"p50_ms":7.4828,"p95_ms":19.0312,"p99_ms":22.9193,"throughput_rps":1020.68,"error_rate_percent":0.0},{"p50_ms":7.5583,"p95_ms":17.9439,"p99_ms":20.3548,"throughput_rps":1041.17,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.9,"Flask":4.96}},"maintenance_recommendation":{"title":"정비 조치 추천","method":"POST","endpoint":"/benchmark/maintenance-recommendation","request_body":{"event_id":"EVT-GS-004","operator_role":"process_manager","include_evidence":true},"comparison_scope":"Validate a POST body and apply a deterministic maintenance rule","parity":{"responses_equal":true,"fastapi_payload_sha256":"3a13a15f7db52dd4c3edd828c874494819ac66c100f2fae311a7af5cfb1a673a","flask_payload_sha256":"3a13a15f7db52dd4c3edd828c874494819ac66c100f2fae311a7af5cfb1a673a","payload_bytes":{"FastAPI":1290,"Flask":1290}},"implementation":{"fastapi_adapter_loc":12,"flask_adapter_loc":13},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.5751,"p50_ms":3.3172,"p95_ms":3.6473,"p99_ms":11.6836,"throughput_rps":279.21,"wall_seconds":1.0745,"stable_payload":true,"payload_sha256":"8ca55514f40329d318cd7cb24b48c3aed03c68123cc0e81c00d2f0a532a5ca50","payload_bytes":1222,"round_metrics":[{"p50_ms":3.3172,"p95_ms":3.6473,"p99_ms":11.6597,"throughput_rps":277.62,"error_rate_percent":0.0},{"p50_ms":3.2961,"p95_ms":3.5204,"p99_ms":11.6836,"throughput_rps":282.63,"error_rate_percent":0.0},{"p50_ms":3.3229,"p95_ms":3.6624,"p99_ms":12.057,"throughput_rps":279.21,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.6755,"p50_ms":7.8068,"p95_ms":17.616,"p99_ms":20.3067,"throughput_rps":1010.78,"wall_seconds":0.2968,"stable_payload":true,"payload_sha256":"8ca55514f40329d318cd7cb24b48c3aed03c68123cc0e81c00d2f0a532a5ca50","payload_bytes":1222,"round_metrics":[{"p50_ms":7.5726,"p95_ms":17.5696,"p99_ms":18.484,"throughput_rps":1057.07,"error_rate_percent":0.0},{"p50_ms":7.8068,"p95_ms":17.616,"p99_ms":20.3067,"throughput_rps":1010.78,"error_rate_percent":0.0},{"p50_ms":9.3273,"p95_ms":21.1105,"p99_ms":27.8067,"throughput_rps":886.66,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.4789,"p50_ms":3.2191,"p95_ms":3.4648,"p99_ms":11.774,"throughput_rps":286.91,"wall_seconds":1.0456,"stable_payload":true,"payload_sha256":"d195d7d883eebadf413db041b8e6b15cf0bb6b905bea6d9926b5ca9aa1c67022","payload_bytes":1556,"round_metrics":[{"p50_ms":3.2171,"p95_ms":3.4648,"p99_ms":11.4978,"throughput_rps":290.19,"error_rate_percent":0.0},{"p50_ms":3.2191,"p95_ms":3.4774,"p99_ms":11.774,"throughput_rps":286.91,"error_rate_percent":0.0},{"p50_ms":3.2447,"p95_ms":3.398,"p99_ms":11.9313,"throughput_rps":286.41,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":10.1051,"p50_ms":8.2141,"p95_ms":19.0106,"p99_ms":21.69,"throughput_rps":973.31,"wall_seconds":0.3082,"stable_payload":true,"payload_sha256":"d195d7d883eebadf413db041b8e6b15cf0bb6b905bea6d9926b5ca9aa1c67022","payload_bytes":1556,"round_metrics":[{"p50_ms":7.8616,"p95_ms":18.7966,"p99_ms":21.69,"throughput_rps":993.75,"error_rate_percent":0.0},{"p50_ms":8.2141,"p95_ms":19.0106,"p99_ms":20.7807,"throughput_rps":973.31,"error_rate_percent":0.0},{"p50_ms":8.2563,"p95_ms":20.6689,"p99_ms":26.3381,"throughput_rps":921.41,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.9,"Flask":4.86}}},"performance_score_formula":"Per feature: equal average of normalized sequential p95, sequential throughput, concurrent p95 and concurrent throughput. Overall: arithmetic mean of three feature scores.","performance_scores":{"FastAPI":4.91,"Flask":4.92},"limitations":["Local Mac loopback measurement; not a cloud production benchmark.","FastAPI and Flask use their normal local servers, so the result includes server-stack overhead.","The shared functions use eight product GS fixtures and do not include a remote database or external model call."]},"representative_features":{"status":"measured","measured_at":"2026-08-05T11:01:02.113637+00:00","feature_count":3,"page":"/app/projects/manufacturing-demo-project","comparison_scope":"Three symmetric product features using the same GS fixtures, risk snapshot and shared business functions; only HTTP adapters differ","environment":{"platform":"macOS-27.0-arm64-arm-64bit-Mach-O","python":"3.14.6","measurement":"local loopback HTTP, separate server processes","rounds":3,"round_order":"alternating framework-first order across rounds and features","connection_mode":"new HTTP connection per request for both servers","fastapi_server":"Uvicorn single worker","flask_server":"Werkzeug development server, threaded","production_benchmark":false},"parity":{"all_feature_responses_equal":true,"feature_count":3,"validation_statuses_match":true,"validation_expected_statuses":true},"validation":{"case_count":5,"all_statuses_match":true,"all_expected_statuses":true,"successful_payloads_equal":true,"cases":[{"feature":"manufacturing_dashboard","name":"limit below minimum","method":"GET","endpoint":"/benchmark/manufacturing-dashboard?limit=0","json_body":null,"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"risk_event_search","name":"unsupported sort value","method":"GET","endpoint":"/benchmark/risk-events?sort=unsupported","json_body":null,"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"risk_event_search","name":"valid empty result","method":"GET","endpoint":"/benchmark/risk-events?risk_threshold=1&status=normal","json_body":null,"expected_status":200,"statuses":{"FastAPI":200,"Flask":200},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":true},{"feature":"maintenance_recommendation","name":"invalid operator role","method":"POST","endpoint":"/benchmark/maintenance-recommendation","json_body":{"event_id":"EVT-GS-004","operator_role":"unknown"},"expected_status":422,"statuses":{"FastAPI":422,"Flask":422},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null},{"feature":"maintenance_recommendation","name":"unknown event","method":"POST","endpoint":"/benchmark/maintenance-recommendation","json_body":{"event_id":"EVT-NOT-FOUND","operator_role":"process_manager"},"expected_status":404,"statuses":{"FastAPI":404,"Flask":404},"status_match":true,"expected_status_match":true,"payload_equal_when_successful":null}]},"implementation":{"shared_service":"framework_comparison.representative_dashboard","fastapi_adapter_loc":50,"flask_adapter_loc":80,"fastapi_validation":"Declarative query/body constraints + response_model","flask_validation":"Manual query parsing + Pydantic body/shared payload"},"features":{"manufacturing_dashboard":{"title":"제조 Dashboard 집계","method":"GET","endpoint":"/benchmark/manufacturing-dashboard?risk_threshold=0.0&limit=8","request_body":null,"comparison_scope":"Aggregate eight risk events, line summaries and sensor series","parity":{"responses_equal":true,"fastapi_payload_sha256":"d073b7fcc1799a947a61a29b70c53777c97b912d8ac17f4ac638678ae8974870","flask_payload_sha256":"d073b7fcc1799a947a61a29b70c53777c97b912d8ac17f4ac638678ae8974870","payload_bytes":{"FastAPI":12428,"Flask":12428}},"implementation":{"fastapi_adapter_loc":15,"flask_adapter_loc":33},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.636,"p50_ms":3.4082,"p95_ms":3.823,"p99_ms":11.5824,"throughput_rps":274.56,"wall_seconds":1.0927,"stable_payload":true,"payload_sha256":"0114fac75ba2ad8a4846a8f648c874a1597cf83f0f148e4b4e706f42bbc52248","payload_bytes":11601,"round_metrics":[{"p50_ms":3.3991,"p95_ms":3.823,"p99_ms":11.3168,"throughput_rps":275.5,"error_rate_percent":0.0},{"p50_ms":3.4082,"p95_ms":3.5257,"p99_ms":11.5824,"throughput_rps":274.56,"error_rate_percent":0.0},{"p50_ms":3.4237,"p95_ms":3.8631,"p99_ms":11.6567,"throughput_rps":271.17,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.8971,"p50_ms":7.8964,"p95_ms":17.8237,"p99_ms":20.7399,"throughput_rps":1001.27,"wall_seconds":0.2996,"stable_payload":true,"payload_sha256":"0114fac75ba2ad8a4846a8f648c874a1597cf83f0f148e4b4e706f42bbc52248","payload_bytes":11601,"round_metrics":[{"p50_ms":8.1214,"p95_ms":18.0313,"p99_ms":20.7399,"throughput_rps":980.3,"error_rate_percent":0.0},{"p50_ms":7.8964,"p95_ms":17.8237,"p99_ms":20.939,"throughput_rps":1001.27,"error_rate_percent":0.0},{"p50_ms":7.8874,"p95_ms":17.3425,"p99_ms":19.4562,"throughput_rps":1012.59,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.6159,"p50_ms":3.3705,"p95_ms":3.6115,"p99_ms":11.7216,"throughput_rps":276.05,"wall_seconds":1.0868,"stable_payload":true,"payload_sha256":"362fa207051c66909079646e21b32703dc1c51a9fabc911ed4fe6752c6d257d0","payload_bytes":11965,"round_metrics":[{"p50_ms":3.2636,"p95_ms":3.4707,"p99_ms":11.3342,"throughput_rps":287.4,"error_rate_percent":0.0},{"p50_ms":3.3803,"p95_ms":3.9732,"p99_ms":11.7483,"throughput_rps":272.83,"error_rate_percent":0.0},{"p50_ms":3.3705,"p95_ms":3.6115,"p99_ms":11.7216,"throughput_rps":276.05,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":10.1011,"p50_ms":8.0787,"p95_ms":18.2752,"p99_ms":23.4696,"throughput_rps":979.18,"wall_seconds":0.3064,"stable_payload":true,"payload_sha256":"362fa207051c66909079646e21b32703dc1c51a9fabc911ed4fe6752c6d257d0","payload_bytes":11965,"round_metrics":[{"p50_ms":8.0787,"p95_ms":18.6735,"p99_ms":22.6569,"throughput_rps":988.18,"error_rate_percent":0.0},{"p50_ms":7.9835,"p95_ms":18.0648,"p99_ms":26.5634,"throughput_rps":979.18,"error_rate_percent":0.0},{"p50_ms":8.4041,"p95_ms":18.2752,"p99_ms":23.4696,"throughput_rps":975.98,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.92,"Flask":4.94}},"risk_event_search":{"title":"위험 이벤트 검색·필터","method":"GET","endpoint":"/benchmark/risk-events?risk_threshold=0.6&status=warning&sort=probability_desc&limit=5&offset=0","request_body":null,"comparison_scope":"Filter, sort and paginate product risk events","parity":{"responses_equal":true,"fastapi_payload_sha256":"87d6788ce00a2ec53c5cf19fa9e6611d7efe7d4e2989a14e07dadaa88f625ba4","flask_payload_sha256":"87d6788ce00a2ec53c5cf19fa9e6611d7efe7d4e2989a14e07dadaa88f625ba4","payload_bytes":{"FastAPI":2193,"Flask":2193}},"implementation":{"fastapi_adapter_loc":23,"flask_adapter_loc":56},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.5782,"p50_ms":3.3308,"p95_ms":3.6527,"p99_ms":11.6175,"throughput_rps":278.96,"wall_seconds":1.0754,"stable_payload":true,"payload_sha256":"ed70b172533da4eeb45761cfb3d978d039b10bc7ca18a0da3571c75c46b67e1e","payload_bytes":2058,"round_metrics":[{"p50_ms":3.3308,"p95_ms":3.5398,"p99_ms":11.6175,"throughput_rps":279.52,"error_rate_percent":0.0},{"p50_ms":3.3402,"p95_ms":3.6527,"p99_ms":11.6304,"throughput_rps":278.96,"error_rate_percent":0.0},{"p50_ms":3.3265,"p95_ms":3.659,"p99_ms":11.4756,"throughput_rps":274.9,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.9298,"p50_ms":7.9047,"p95_ms":17.3627,"p99_ms":18.7136,"throughput_rps":999.0,"wall_seconds":0.3003,"stable_payload":true,"payload_sha256":"ed70b172533da4eeb45761cfb3d978d039b10bc7ca18a0da3571c75c46b67e1e","payload_bytes":2058,"round_metrics":[{"p50_ms":7.9047,"p95_ms":18.1582,"p99_ms":20.284,"throughput_rps":999.0,"error_rate_percent":0.0},{"p50_ms":7.8543,"p95_ms":17.3627,"p99_ms":18.3612,"throughput_rps":1017.72,"error_rate_percent":0.0},{"p50_ms":8.3232,"p95_ms":17.1769,"p99_ms":18.7136,"throughput_rps":992.47,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.4718,"p50_ms":3.2242,"p95_ms":3.5578,"p99_ms":11.6445,"throughput_rps":287.49,"wall_seconds":1.0435,"stable_payload":true,"payload_sha256":"620d7dcd6be72be2d5b045d30ff8c2a36ea9e45f137d7635ad7dd7bd08f4f359","payload_bytes":2197,"round_metrics":[{"p50_ms":3.2242,"p95_ms":3.586,"p99_ms":11.5878,"throughput_rps":287.0,"error_rate_percent":0.0},{"p50_ms":3.232,"p95_ms":3.499,"p99_ms":11.6445,"throughput_rps":287.49,"error_rate_percent":0.0},{"p50_ms":3.2222,"p95_ms":3.5578,"p99_ms":11.6888,"throughput_rps":289.38,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.4685,"p50_ms":7.4828,"p95_ms":17.9439,"p99_ms":20.3548,"throughput_rps":1026.44,"wall_seconds":0.2923,"stable_payload":true,"payload_sha256":"620d7dcd6be72be2d5b045d30ff8c2a36ea9e45f137d7635ad7dd7bd08f4f359","payload_bytes":2197,"round_metrics":[{"p50_ms":7.478,"p95_ms":17.5931,"p99_ms":18.7509,"throughput_rps":1026.44,"error_rate_percent":0.0},{"p50_ms":7.4828,"p95_ms":19.0312,"p99_ms":22.9193,"throughput_rps":1020.68,"error_rate_percent":0.0},{"p50_ms":7.5583,"p95_ms":17.9439,"p99_ms":20.3548,"throughput_rps":1041.17,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.9,"Flask":4.96}},"maintenance_recommendation":{"title":"정비 조치 추천","method":"POST","endpoint":"/benchmark/maintenance-recommendation","request_body":{"event_id":"EVT-GS-004","operator_role":"process_manager","include_evidence":true},"comparison_scope":"Validate a POST body and apply a deterministic maintenance rule","parity":{"responses_equal":true,"fastapi_payload_sha256":"3a13a15f7db52dd4c3edd828c874494819ac66c100f2fae311a7af5cfb1a673a","flask_payload_sha256":"3a13a15f7db52dd4c3edd828c874494819ac66c100f2fae311a7af5cfb1a673a","payload_bytes":{"FastAPI":1290,"Flask":1290}},"implementation":{"fastapi_adapter_loc":12,"flask_adapter_loc":13},"results":{"FastAPI":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.5751,"p50_ms":3.3172,"p95_ms":3.6473,"p99_ms":11.6836,"throughput_rps":279.21,"wall_seconds":1.0745,"stable_payload":true,"payload_sha256":"8ca55514f40329d318cd7cb24b48c3aed03c68123cc0e81c00d2f0a532a5ca50","payload_bytes":1222,"round_metrics":[{"p50_ms":3.3172,"p95_ms":3.6473,"p99_ms":11.6597,"throughput_rps":277.62,"error_rate_percent":0.0},{"p50_ms":3.2961,"p95_ms":3.5204,"p99_ms":11.6836,"throughput_rps":282.63,"error_rate_percent":0.0},{"p50_ms":3.3229,"p95_ms":3.6624,"p99_ms":12.057,"throughput_rps":279.21,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":9.6755,"p50_ms":7.8068,"p95_ms":17.616,"p99_ms":20.3067,"throughput_rps":1010.78,"wall_seconds":0.2968,"stable_payload":true,"payload_sha256":"8ca55514f40329d318cd7cb24b48c3aed03c68123cc0e81c00d2f0a532a5ca50","payload_bytes":1222,"round_metrics":[{"p50_ms":7.5726,"p95_ms":17.5696,"p99_ms":18.484,"throughput_rps":1057.07,"error_rate_percent":0.0},{"p50_ms":7.8068,"p95_ms":17.616,"p99_ms":20.3067,"throughput_rps":1010.78,"error_rate_percent":0.0},{"p50_ms":9.3273,"p95_ms":21.1105,"p99_ms":27.8067,"throughput_rps":886.66,"error_rate_percent":0.0}]}},"Flask":{"sequential":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":1,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":3.4789,"p50_ms":3.2191,"p95_ms":3.4648,"p99_ms":11.774,"throughput_rps":286.91,"wall_seconds":1.0456,"stable_payload":true,"payload_sha256":"d195d7d883eebadf413db041b8e6b15cf0bb6b905bea6d9926b5ca9aa1c67022","payload_bytes":1556,"round_metrics":[{"p50_ms":3.2171,"p95_ms":3.4648,"p99_ms":11.4978,"throughput_rps":290.19,"error_rate_percent":0.0},{"p50_ms":3.2191,"p95_ms":3.4774,"p99_ms":11.774,"throughput_rps":286.91,"error_rate_percent":0.0},{"p50_ms":3.2447,"p95_ms":3.398,"p99_ms":11.9313,"throughput_rps":286.41,"error_rate_percent":0.0}]},"concurrent":{"round_count":3,"requests_per_round":300,"request_count":900,"concurrency":10,"connection_mode":"new HTTP connection per request","success_count":900,"error_count":0,"error_rate_percent":0.0,"mean_ms":10.1051,"p50_ms":8.2141,"p95_ms":19.0106,"p99_ms":21.69,"throughput_rps":973.31,"wall_seconds":0.3082,"stable_payload":true,"payload_sha256":"d195d7d883eebadf413db041b8e6b15cf0bb6b905bea6d9926b5ca9aa1c67022","payload_bytes":1556,"round_metrics":[{"p50_ms":7.8616,"p95_ms":18.7966,"p99_ms":21.69,"throughput_rps":993.75,"error_rate_percent":0.0},{"p50_ms":8.2141,"p95_ms":19.0106,"p99_ms":20.7807,"throughput_rps":973.31,"error_rate_percent":0.0},{"p50_ms":8.2563,"p95_ms":20.6689,"p99_ms":26.3381,"throughput_rps":921.41,"error_rate_percent":0.0}]}}},"performance_scores":{"FastAPI":4.9,"Flask":4.86}}},"performance_score_formula":"Per feature: equal average of normalized sequential p95, sequential throughput, concurrent p95 and concurrent throughput. Overall: arithmetic mean of three feature scores.","performance_scores":{"FastAPI":4.91,"Flask":4.92},"limitations":["Local Mac loopback measurement; not a cloud production benchmark.","FastAPI and Flask use their normal local servers, so the result includes server-stack overhead.","The shared functions use eight product GS fixtures and do not include a remote database or external model call."]},"conclusion":{"selected_framework":"FastAPI","reason":"개발 생산성·계약 자동화·검증 안정성·대표 업무 API 성능 네 항목을 각각 25%로 동일하게 평가했습니다. Dashboard 집계·위험 검색·정비 추천 등 대표 기능 3개를 양쪽에 실제 구현한 결과까지 반영했으며, FastAPI는 adapter 코드량·계약 자동화·검증에서 앞서 FastAPI 99.55점, Flask 69.6점으로 FastAPI를 선택했습니다. 이번 결론은 기존 코드를 옮기는 비용이 아니라 새 제품을 구축할 때의 개발 방식과 기본 제공 기능을 기준으로 한 판단입니다.","limitation":"대표 기능 3개는 FastAPI와 Flask에 동일하게 구현했지만, 전체 172개 제품 업무 작업을 Flask로 다시 구현한 것은 아닙니다. 성능 값은 로컬 Mac loopback과 각 프레임워크의 로컬 서버 stack을 포함한 측정이며 운영 환경 성능을 보장하지 않습니다.","selection_basis":[{"title":"대표 업무 API 3종 대칭 구현","fastapi":"Dashboard·검색·추천 + 자동 query·body·응답 검증","flask":"같은 3개 기능 + 수동 query·body 검증"},{"title":"성공 응답 계약","fastapi":"JSON Schema 168개 · binary/SSE 2개 · no-content 2개","flask":"자동 생성 0개 · 모두 수동 선언 필요"},{"title":"자동 검증과 문서화","fastapi":"요청 검증 대상 147개 · 응답 런타임 검증 168개","flask":"기본 구성 0개 · 확장 라이브러리와 수동 연결 필요"},{"title":"실제 HTTP 성능","fastapi":"3개 기능 평균 4.91/5","flask":"3개 기능 평균 4.92/5"}],"evaluation":{"scale":"각 항목 5점 만점, 가중 합계 100점","weights_are_project_specific":true,"equal_weight_per_criterion":25,"criteria":[{"id":"development_productivity","title":"개발 완성도와 구현 생산성","weight":25,"fastapi_score":5,"flask_score":3,"observed_result":"서로 다른 대표 기능 3개(제조 Dashboard 집계, 위험 이벤트 검색·필터, 정비 조치 추천)의 HTTP adapter를 실제 구현한 결과 FastAPI는 50 LOC, Flask는 수동 query·body 검증을 포함해 80 LOC였습니다. FastAPI 전체 제품은 별도로 172개 업무 작업을 실행합니다.","fastapi_reason":"세 기능에서 query·body 제약과 응답 계약을 route 선언에 함께 표현해 adapter 코드가 더 짧았습니다.","flask_reason":"route 자체는 단순하지만 동일한 query·POST 검증과 오류 계약을 맞추기 위한 수동 코드가 추가됐습니다."},{"id":"contract_automation","title":"API 계약과 문서 자동화","weight":25,"fastapi_score":5,"flask_score":2,"observed_result":"FastAPI는 OpenAPI 172개, JSON 성공 응답 Schema 168개, binary·SSE 계약 2개, no-content 계약 2개를 생성했습니다. bare Flask 자동 생성 결과는 0개입니다.","fastapi_reason":"라우터 코드와 Swagger 문서가 같은 계약을 사용해 변경 누락 위험이 작습니다.","flask_reason":"확장 라이브러리를 사용하면 구현할 수 있지만 bare Flask 기본 구성에는 포함되지 않습니다."},{"id":"validation_safety","title":"요청·응답 검증과 오류 안전성","weight":25,"fastapi_score":5,"flask_score":4,"observed_result":"대표 기능 3개의 정상 응답 JSON과 SHA-256이 모두 일치했고, 입력·빈 결과·존재하지 않는 이벤트를 포함한 5개 검증 사례에서 HTTP 상태도 일치했습니다. FastAPI는 Query·Pydantic body constraint와 response_model로 자동 검증했고 Flask는 같은 결과를 수동 parser와 Pydantic 호출로 구현했습니다. 전체 FastAPI에서는 요청 검증 147개, JSON 응답 검증 168개, 미처리 5xx 0건을 확인했습니다.","fastapi_reason":"잘못된 입력과 구현·응답 계약 불일치를 실행 중에 바로 탐지합니다.","flask_reason":"세 대표 기능의 오류 상태는 동일했지만 query·body·응답 검증을 route마다 수동 연결해야 합니다."},{"id":"representative_performance","title":"대표 업무 API 성능과 경량성","weight":25,"fastapi_score":4.91,"flask_score":4.92,"observed_result":"대표 기능 3개를 각각 별도 HTTP 프로세스에서 순차·동시성 10으로 3라운드 교차 측정했습니다. 기능별 점수는 제조 Dashboard 집계 FastAPI 4.92/5, Flask 4.94/5 · 위험 이벤트 검색·필터 FastAPI 4.9/5, Flask 4.96/5 · 정비 조치 추천 FastAPI 4.9/5, Flask 4.86/5이며, 세 기능 평균은 FastAPI 4.91/5, Flask 4.92/5입니다. 모든 정상 부하의 오류율은 0%였습니다.","fastapi_reason":"세 기능의 순차 p95·처리량과 동시성 p95·처리량을 같은 비중으로 계산한 평균을 반영했습니다.","flask_reason":"세 기능별 동일 지표를 측정하고 기능 평균을 계산해 단일 API 우연성의 영향을 줄였습니다."}],"totals":{"fastapi":99.55,"flask":69.6},"decision_rule":"네 평가 요소를 동일한 비중으로 계산했습니다. 단순 endpoint 속도에서 Flask가 얻은 우위를 그대로 반영하되, 대규모 API 구조화·계약 자동화·검증 기능도 같은 비중으로 평가했습니다."},"framework_summaries":{"fastapi":{"tested_results":["실제 업무 핸들러 172개 실행","OpenAPI 172개 자동 생성","요청 검증 대상 147개","JSON 응답 런타임 검증 168개","인증 전수 프로브 처리되지 않은 5xx 0건","대표 기능 3개 성능 평균 4.91/5"],"advantages":["typed router·의존성 주입·Pydantic을 이용해 큰 API 구조를 일관되게 구성할 수 있습니다.","코드·검증·Swagger 문서가 하나의 계약을 공유합니다.","잘못된 입력과 응답 계약 불일치를 런타임에서 탐지합니다."],"disadvantages":["대표 기능별로 프레임워크 우위가 달라 환경에 따른 성능 변동을 고려해야 합니다.","Pydantic 모델과 타입 계약을 지속적으로 관리해야 합니다."]},"flask":{"tested_results":["라우트 미러 172개 등록 성공","대표 업무 API 3개 실제 구현","기본 구성 자동 OpenAPI·요청 검증·응답 Schema 0개","대표 기능 3개 성능 평균 4.92/5"],"advantages":["세 기능의 3라운드 성능 평균으로 단일 endpoint보다 신중하게 비교했습니다.","필요한 기능만 선택해 붙이는 유연성이 있습니다."],"disadvantages":["큰 API에서는 프로젝트 구조와 확장 도구 조합을 별도로 설계해야 합니다.","OpenAPI·Schema·요청 및 응답 검증은 기본 제공되지 않아 별도 구성이 필요합니다.","대표 API 외 전체 업무 애플리케이션은 구현하지 않아 172개 전체의 성능은 직접 비교하지 못했습니다."]}}}}}