icdev 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1105) hide show
  1. icdev/__init__.py +18 -0
  2. icdev/_paths.py +85 -0
  3. icdev/_version.py +3 -0
  4. icdev/data/__init__.py +1 -0
  5. icdev/data/args/__init__.py +1 -0
  6. icdev/data/args/agent_authority.yaml +61 -0
  7. icdev/data/args/agent_config.yaml +355 -0
  8. icdev/data/args/agentic_fitness.yaml +31 -0
  9. icdev/data/args/ai_governance_config.yaml +137 -0
  10. icdev/data/args/atlas_critique_config.yaml +66 -0
  11. icdev/data/args/bedrock_models.yaml +63 -0
  12. icdev/data/args/cicd_config.yaml +82 -0
  13. icdev/data/args/classification_config.yaml +232 -0
  14. icdev/data/args/cli_config.yaml +154 -0
  15. icdev/data/args/cloud_config.yaml +63 -0
  16. icdev/data/args/code_pattern_config.yaml +151 -0
  17. icdev/data/args/code_quality_config.yaml +47 -0
  18. icdev/data/args/companion_registry.yaml +202 -0
  19. icdev/data/args/context_config.yaml +82 -0
  20. icdev/data/args/csp_monitor_config.yaml +268 -0
  21. icdev/data/args/cui_markings.yaml +35 -0
  22. icdev/data/args/db_config.yaml +40 -0
  23. icdev/data/args/deployment_profiles.yaml +248 -0
  24. icdev/data/args/dev_profile_config.yaml +144 -0
  25. icdev/data/args/devsecops_config.yaml +286 -0
  26. icdev/data/args/endpoint_security_config.yaml +137 -0
  27. icdev/data/args/extension_config.yaml +79 -0
  28. icdev/data/args/file_access_tiers.yaml +88 -0
  29. icdev/data/args/framework_registry.yaml +415 -0
  30. icdev/data/args/innovation_config.yaml +431 -0
  31. icdev/data/args/installation_manifest.yaml +1087 -0
  32. icdev/data/args/llm_config.yaml +495 -0
  33. icdev/data/args/maintenance_config.yaml +55 -0
  34. icdev/data/args/memory_config.yaml +83 -0
  35. icdev/data/args/monitoring_config.yaml +127 -0
  36. icdev/data/args/mosa_config.yaml +190 -0
  37. icdev/data/args/nlq_config.yaml +35 -0
  38. icdev/data/args/observability_config.yaml +39 -0
  39. icdev/data/args/observability_tracing_config.yaml +170 -0
  40. icdev/data/args/oscal_tools_config.yaml +43 -0
  41. icdev/data/args/owasp_agentic_config.yaml +171 -0
  42. icdev/data/args/phase_registry.yaml +618 -0
  43. icdev/data/args/project_defaults.yaml +235 -0
  44. icdev/data/args/prompt_chains.yaml +163 -0
  45. icdev/data/args/resilience_config.yaml +50 -0
  46. icdev/data/args/ricoas_config.yaml +191 -0
  47. icdev/data/args/role_personas.yaml +362 -0
  48. icdev/data/args/scaling_config.yaml +176 -0
  49. icdev/data/args/security_gates.yaml +685 -0
  50. icdev/data/args/skill_injection_config.yaml +322 -0
  51. icdev/data/args/spec_config.yaml +53 -0
  52. icdev/data/args/supply_chain_config.yaml +76 -0
  53. icdev/data/args/translation_config.yaml +228 -0
  54. icdev/data/args/workflow_templates/ato_acceleration.yaml +54 -0
  55. icdev/data/args/workflow_templates/build_deploy.yaml +63 -0
  56. icdev/data/args/workflow_templates/full_compliance.yaml +43 -0
  57. icdev/data/args/workflow_templates/security_hardening.yaml +55 -0
  58. icdev/data/args/worktree_config.yaml +34 -0
  59. icdev/data/args/zta_config.yaml +247 -0
  60. icdev/data/context/__init__.py +1 -0
  61. icdev/data/context/agent/__init__.py +1 -0
  62. icdev/data/context/agent/response_schemas/__init__.py +1 -0
  63. icdev/data/context/agent/response_schemas/debate_position.json +46 -0
  64. icdev/data/context/agent/response_schemas/fitness_scorecard.json +74 -0
  65. icdev/data/context/agent/response_schemas/review_decision.json +39 -0
  66. icdev/data/context/agent/response_schemas/task_decomposition.json +82 -0
  67. icdev/data/context/agent/response_schemas/veto_decision.json +40 -0
  68. icdev/data/context/agentic/__init__.py +1 -0
  69. icdev/data/context/agentic/architecture_patterns.md +269 -0
  70. icdev/data/context/agentic/capability_registry.yaml +202 -0
  71. icdev/data/context/agentic/csp_mcp_registry.yaml +280 -0
  72. icdev/data/context/agentic/fitness_rubric.md +56 -0
  73. icdev/data/context/agentic/governance_baseline.md +205 -0
  74. icdev/data/context/ci/__init__.py +1 -0
  75. icdev/data/context/ci/worktree_templates.json +44 -0
  76. icdev/data/context/cloud/__init__.py +1 -0
  77. icdev/data/context/cloud/csp_service_registry.json +739 -0
  78. icdev/data/context/compliance/__init__.py +1 -0
  79. icdev/data/context/compliance/atlas_mitigations.json +293 -0
  80. icdev/data/context/compliance/atlas_techniques.json +833 -0
  81. icdev/data/context/compliance/cisa_sbd_requirements.json +432 -0
  82. icdev/data/context/compliance/cjis_security_policy.json +522 -0
  83. icdev/data/context/compliance/cmmc_practices.json +2494 -0
  84. icdev/data/context/compliance/cmmc_report_template.md +142 -0
  85. icdev/data/context/compliance/cnssi_1253_overlay.json +109 -0
  86. icdev/data/context/compliance/control_crosswalk.json +1914 -0
  87. icdev/data/context/compliance/control_families/__init__.py +1 -0
  88. icdev/data/context/compliance/csp_certifications.json +251 -0
  89. icdev/data/context/compliance/cssp_report_template.md +193 -0
  90. icdev/data/context/compliance/cui_templates/__init__.py +1 -0
  91. icdev/data/context/compliance/cui_templates/banner_block.txt +4 -0
  92. icdev/data/context/compliance/cui_templates/code_header.txt +8 -0
  93. icdev/data/context/compliance/cui_templates/document_template.md +35 -0
  94. icdev/data/context/compliance/data_type_framework_map.json +321 -0
  95. icdev/data/context/compliance/data_type_registry.json +147 -0
  96. icdev/data/context/compliance/dod_cssp_8530.json +463 -0
  97. icdev/data/context/compliance/eu_ai_act_annex_iii.json +108 -0
  98. icdev/data/context/compliance/export_templates/__init__.py +1 -0
  99. icdev/data/context/compliance/export_templates/emass_controls.csv.j2 +4 -0
  100. icdev/data/context/compliance/export_templates/evidence_package.md.j2 +39 -0
  101. icdev/data/context/compliance/export_templates/executive_summary.md.j2 +55 -0
  102. icdev/data/context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
  103. icdev/data/context/compliance/fedramp_20x_ksi_schemas.json +133 -0
  104. icdev/data/context/compliance/fedramp_high_baseline.json +4370 -0
  105. icdev/data/context/compliance/fedramp_moderate_baseline.json +2183 -0
  106. icdev/data/context/compliance/fedramp_report_template.md +181 -0
  107. icdev/data/context/compliance/fips_200_areas.json +362 -0
  108. icdev/data/context/compliance/gao_ai_accountability.json +262 -0
  109. icdev/data/context/compliance/hipaa_security_rule.json +720 -0
  110. icdev/data/context/compliance/hitrust_csf_v11.json +930 -0
  111. icdev/data/context/compliance/impact_level_profiles.json +251 -0
  112. icdev/data/context/compliance/incident_response_template.md +1110 -0
  113. icdev/data/context/compliance/iso27001_2022_controls.json +750 -0
  114. icdev/data/context/compliance/iso27001_nist_bridge.json +382 -0
  115. icdev/data/context/compliance/iso42001_controls.json +254 -0
  116. icdev/data/context/compliance/ivv_checklist_template.md +80 -0
  117. icdev/data/context/compliance/ivv_report_template.md +116 -0
  118. icdev/data/context/compliance/ivv_requirements.json +372 -0
  119. icdev/data/context/compliance/mosa_crosswalk.json +327 -0
  120. icdev/data/context/compliance/mosa_framework.json +250 -0
  121. icdev/data/context/compliance/narrative_templates/AC.md.j2 +101 -0
  122. icdev/data/context/compliance/narrative_templates/AU.md.j2 +106 -0
  123. icdev/data/context/compliance/narrative_templates/IA.md.j2 +104 -0
  124. icdev/data/context/compliance/narrative_templates/SC.md.j2 +102 -0
  125. icdev/data/context/compliance/narrative_templates/SI.md.j2 +111 -0
  126. icdev/data/context/compliance/narrative_templates/__init__.py +1 -0
  127. icdev/data/context/compliance/narrative_templates/default.md.j2 +50 -0
  128. icdev/data/context/compliance/narrative_templates/executive_summary.j2 +27 -0
  129. icdev/data/context/compliance/narrative_templates/poam_milestone.j2 +19 -0
  130. icdev/data/context/compliance/narrative_templates/ssp_section.j2 +11 -0
  131. icdev/data/context/compliance/nist_800_171_controls.json +1552 -0
  132. icdev/data/context/compliance/nist_800_207_crosswalk.json +399 -0
  133. icdev/data/context/compliance/nist_800_207_zta.json +258 -0
  134. icdev/data/context/compliance/nist_800_53.json +324 -0
  135. icdev/data/context/compliance/nist_ai_600_1_genai.json +326 -0
  136. icdev/data/context/compliance/nist_ai_rmf.json +206 -0
  137. icdev/data/context/compliance/nist_sp_800_60_types.json +1667 -0
  138. icdev/data/context/compliance/omb_m25_21_high_impact_ai.json +248 -0
  139. icdev/data/context/compliance/omb_m26_04_unbiased_ai.json +262 -0
  140. icdev/data/context/compliance/owasp_agentic_asi.json +133 -0
  141. icdev/data/context/compliance/owasp_agentic_threats.json +285 -0
  142. icdev/data/context/compliance/owasp_llm_top10.json +274 -0
  143. icdev/data/context/compliance/pci_dss_v4.json +510 -0
  144. icdev/data/context/compliance/poam_template.md +117 -0
  145. icdev/data/context/compliance/safeai_controls.json +512 -0
  146. icdev/data/context/compliance/sbd_report_template.md +77 -0
  147. icdev/data/context/compliance/siem_config_templates/__init__.py +1 -0
  148. icdev/data/context/compliance/siem_config_templates/filebeat.yml +213 -0
  149. icdev/data/context/compliance/siem_config_templates/log_sources.json +208 -0
  150. icdev/data/context/compliance/soc2_trust_criteria.json +661 -0
  151. icdev/data/context/compliance/ssp_template.md +432 -0
  152. icdev/data/context/compliance/stig_templates/__init__.py +1 -0
  153. icdev/data/context/compliance/stig_templates/webapp_stig.json +139 -0
  154. icdev/data/context/compliance/xai_requirements.json +108 -0
  155. icdev/data/context/dashboard/__init__.py +1 -0
  156. icdev/data/context/dashboard/nlq_examples.json +50 -0
  157. icdev/data/context/dashboard/schema_descriptions.json +23 -0
  158. icdev/data/context/integration/__init__.py +1 -0
  159. icdev/data/context/integration/approval_workflows.json +32 -0
  160. icdev/data/context/integration/gitlab_field_mappings.json +33 -0
  161. icdev/data/context/integration/jira_field_mappings.json +32 -0
  162. icdev/data/context/integration/reqif_export_schema.json +23 -0
  163. icdev/data/context/integration/servicenow_field_mappings.json +22 -0
  164. icdev/data/context/languages/__init__.py +1 -0
  165. icdev/data/context/languages/framework_patterns.json +205 -0
  166. icdev/data/context/languages/language_registry.json +279 -0
  167. icdev/data/context/llm/__init__.py +1 -0
  168. icdev/data/context/llm/example_provider.py +86 -0
  169. icdev/data/context/mbse/__init__.py +1 -0
  170. icdev/data/context/mbse/des_report_template.md +162 -0
  171. icdev/data/context/mbse/des_requirements.json +411 -0
  172. icdev/data/context/mbse/digital_thread_patterns.json +403 -0
  173. icdev/data/context/mbse/reqif_schema.json +280 -0
  174. icdev/data/context/mbse/sysml_element_types.json +432 -0
  175. icdev/data/context/modernization/__init__.py +1 -0
  176. icdev/data/context/modernization/db_type_mappings.json +148 -0
  177. icdev/data/context/modernization/decomposition_patterns.json +284 -0
  178. icdev/data/context/modernization/framework_migration_patterns.json +359 -0
  179. icdev/data/context/modernization/migration_report_template.md +168 -0
  180. icdev/data/context/modernization/seven_rs_catalog.json +369 -0
  181. icdev/data/context/modernization/version_upgrade_rules.json +279 -0
  182. icdev/data/context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
  183. icdev/data/context/oscal/README.md +43 -0
  184. icdev/data/context/patterns/__init__.py +1 -0
  185. icdev/data/context/profiles/__init__.py +1 -0
  186. icdev/data/context/profiles/dod_baseline_v1.yaml +145 -0
  187. icdev/data/context/profiles/fedramp_baseline_v1.yaml +143 -0
  188. icdev/data/context/profiles/financial_baseline_v1.yaml +142 -0
  189. icdev/data/context/profiles/healthcare_baseline_v1.yaml +135 -0
  190. icdev/data/context/profiles/law_enforcement_v1.yaml +129 -0
  191. icdev/data/context/profiles/startup_v1.yaml +134 -0
  192. icdev/data/context/requirements/__init__.py +1 -0
  193. icdev/data/context/requirements/ambiguity_patterns.json +97 -0
  194. icdev/data/context/requirements/boundary_impact_rules.json +123 -0
  195. icdev/data/context/requirements/default_constitutions.json +67 -0
  196. icdev/data/context/requirements/document_extraction_rules.json +58 -0
  197. icdev/data/context/requirements/gap_patterns.json +108 -0
  198. icdev/data/context/requirements/readiness_rubric.json +78 -0
  199. icdev/data/context/requirements/red_alternative_patterns.json +210 -0
  200. icdev/data/context/requirements/safe_templates.json +72 -0
  201. icdev/data/context/requirements/spec_quality_checklist.json +122 -0
  202. icdev/data/context/simulation/__init__.py +1 -0
  203. icdev/data/context/simulation/architecture_patterns.json +36 -0
  204. icdev/data/context/simulation/coa_templates.json +38 -0
  205. icdev/data/context/simulation/cost_models.json +23 -0
  206. icdev/data/context/simulation/risk_categories.json +46 -0
  207. icdev/data/context/supply_chain/__init__.py +1 -0
  208. icdev/data/context/supply_chain/isa_templates.json +129 -0
  209. icdev/data/context/supply_chain/nist_800_161_controls.json +247 -0
  210. icdev/data/context/supply_chain/scrm_risk_matrix.json +147 -0
  211. icdev/data/context/templates/__init__.py +1 -0
  212. icdev/data/context/templates/ansible/__init__.py +1 -0
  213. icdev/data/context/templates/ansible/playbooks/__init__.py +1 -0
  214. icdev/data/context/templates/ansible/roles/__init__.py +1 -0
  215. icdev/data/context/templates/gitlab_ci/__init__.py +1 -0
  216. icdev/data/context/templates/grafana/__init__.py +1 -0
  217. icdev/data/context/templates/kubernetes/__init__.py +1 -0
  218. icdev/data/context/templates/project/__init__.py +1 -0
  219. icdev/data/context/templates/project/api/__init__.py +1 -0
  220. icdev/data/context/templates/project/cli/__init__.py +1 -0
  221. icdev/data/context/templates/project/data_pipeline/__init__.py +1 -0
  222. icdev/data/context/templates/project/iac/__init__.py +1 -0
  223. icdev/data/context/templates/project/javascript_frontend/__init__.py +1 -0
  224. icdev/data/context/templates/project/javascript_frontend/src/__init__.py +1 -0
  225. icdev/data/context/templates/project/javascript_frontend/tests/__init__.py +1 -0
  226. icdev/data/context/templates/project/microservice/__init__.py +1 -0
  227. icdev/data/context/templates/project/python_backend/__init__.py +1 -0
  228. icdev/data/context/templates/project/python_backend/src/__init__.py +1 -0
  229. icdev/data/context/templates/project/python_backend/tests/__init__.py +1 -0
  230. icdev/data/context/templates/project/python_backend/tests/features/__init__.py +1 -0
  231. icdev/data/context/templates/project/python_backend/tests/steps/__init__.py +1 -0
  232. icdev/data/context/templates/terraform/__init__.py +1 -0
  233. icdev/data/context/templates/terraform/govcloud_base/__init__.py +1 -0
  234. icdev/data/context/templates/terraform/modules/__init__.py +1 -0
  235. icdev/data/context/tone/__init__.py +1 -0
  236. icdev/data/context/translation/dependency_mappings.json +186 -0
  237. icdev/data/context/translation/type_mappings.json +149 -0
  238. icdev/data/docs/README.md +187 -0
  239. icdev/data/docs/__init__.py +1 -0
  240. icdev/data/docs/admin/gateway-guide.md +338 -0
  241. icdev/data/docs/admin/marketplace-guide.md +396 -0
  242. icdev/data/docs/admin/monitoring-guide.md +509 -0
  243. icdev/data/docs/architecture/compliance-framework.md +764 -0
  244. icdev/data/docs/architecture/database-schema.md +689 -0
  245. icdev/data/docs/architecture/gotcha-framework.md +518 -0
  246. icdev/data/docs/architecture/multi-agent-system.md +603 -0
  247. icdev/data/docs/dx/README.md +106 -0
  248. icdev/data/docs/dx/__init__.py +1 -0
  249. icdev/data/docs/dx/ci-cd-integration.md +378 -0
  250. icdev/data/docs/dx/claude-code-guide.md +213 -0
  251. icdev/data/docs/dx/companion-guide.md +232 -0
  252. icdev/data/docs/dx/dev-profiles.md +309 -0
  253. icdev/data/docs/dx/icdev-yaml-spec.md +219 -0
  254. icdev/data/docs/dx/integration-tiers.md +279 -0
  255. icdev/data/docs/dx/llm-routing-guide.md +456 -0
  256. icdev/data/docs/dx/quickstart.md +192 -0
  257. icdev/data/docs/dx/sdk-reference.md +356 -0
  258. icdev/data/docs/dx/unified-mcp-setup.md +525 -0
  259. icdev/data/docs/features/__init__.py +1 -0
  260. icdev/data/docs/features/phase-01-gotcha-framework.md +249 -0
  261. icdev/data/docs/features/phase-02-atlas-build-workflow.md +223 -0
  262. icdev/data/docs/features/phase-03-tdd-bdd-testing.md +261 -0
  263. icdev/data/docs/features/phase-04-nist-compliance.md +255 -0
  264. icdev/data/docs/features/phase-05-security-scanning.md +229 -0
  265. icdev/data/docs/features/phase-06-infrastructure-deployment.md +288 -0
  266. icdev/data/docs/features/phase-07-code-review-gates.md +276 -0
  267. icdev/data/docs/features/phase-08-self-healing.md +223 -0
  268. icdev/data/docs/features/phase-09-monitoring-observability.md +230 -0
  269. icdev/data/docs/features/phase-10-dashboard-web-ui.md +218 -0
  270. icdev/data/docs/features/phase-11-multi-agent-architecture.md +272 -0
  271. icdev/data/docs/features/phase-12-integration-testing.md +228 -0
  272. icdev/data/docs/features/phase-13-cicd-integration.md +257 -0
  273. icdev/data/docs/features/phase-14-secure-by-design-ivv.md +240 -0
  274. icdev/data/docs/features/phase-15-maintenance-audit.md +192 -0
  275. icdev/data/docs/features/phase-16-ato-acceleration.md +228 -0
  276. icdev/data/docs/features/phase-17-multi-framework-compliance.md +223 -0
  277. icdev/data/docs/features/phase-18-mbse-integration.md +242 -0
  278. icdev/data/docs/features/phase-19-agentic-generation.md +202 -0
  279. icdev/data/docs/features/phase-20-fips-security-categorization.md +198 -0
  280. icdev/data/docs/features/phase-21-saas-multi-tenancy.md +273 -0
  281. icdev/data/docs/features/phase-22-federated-gotcha-marketplace.md +242 -0
  282. icdev/data/docs/features/phase-23-universal-compliance-platform.md +238 -0
  283. icdev/data/docs/features/phase-24-devsecops-pipeline-security.md +198 -0
  284. icdev/data/docs/features/phase-25-zero-trust-architecture.md +220 -0
  285. icdev/data/docs/features/phase-26-dod-mosa.md +205 -0
  286. icdev/data/docs/features/phase-27-cli-capabilities.md +222 -0
  287. icdev/data/docs/features/phase-28-remote-command-gateway.md +235 -0
  288. icdev/data/docs/features/phase-29-proactive-monitoring.md +212 -0
  289. icdev/data/docs/features/phase-30-dashboard-auth.md +215 -0
  290. icdev/data/docs/features/phase-31-dashboard-ux-low-impact.md +188 -0
  291. icdev/data/docs/features/phase-32-dashboard-ux-medium-impact.md +223 -0
  292. icdev/data/docs/features/phase-33-modular-installation.md +218 -0
  293. icdev/data/docs/features/phase-34-dev-profiles.md +239 -0
  294. icdev/data/docs/features/phase-35-innovation-engine.md +257 -0
  295. icdev/data/docs/features/phase-36-evolutionary-intelligence.md +351 -0
  296. icdev/data/docs/features/phase-37-mitre-atlas-integration.md +485 -0
  297. icdev/data/docs/features/phase-38-cloud-agnostic-architecture.md +1033 -0
  298. icdev/data/docs/features/phase-39-observability-operations.md +178 -0
  299. icdev/data/docs/features/phase-40-nlq-compliance-queries.md +176 -0
  300. icdev/data/docs/features/phase-41-parallel-cicd.md +169 -0
  301. icdev/data/docs/features/phase-42-framework-planning.md +177 -0
  302. icdev/data/docs/features/phase-43-cross-language-translation.md +225 -0
  303. icdev/data/docs/features/phase-44-innovation-adaptation.md +227 -0
  304. icdev/data/docs/features/phase-45-owasp-agentic-security.md +239 -0
  305. icdev/data/docs/features/phase-46-observability-traceability-xai.md +240 -0
  306. icdev/data/docs/features/phase-47-unified-mcp-gateway.md +257 -0
  307. icdev/data/docs/features/phase-48-ai-transparency.md +203 -0
  308. icdev/data/docs/features/phase-49-ai-accountability.md +243 -0
  309. icdev/data/docs/features/phase-50-ai-governance-intake-chat.md +195 -0
  310. icdev/data/docs/features/phase-51-unified-chat-dashboard.md +240 -0
  311. icdev/data/docs/features/phase-52-code-intelligence.md +244 -0
  312. icdev/data/docs/features/phase-53-fedramp-20x-owasp-asi.md +359 -0
  313. icdev/data/docs/features/phase-54-slsa-swft-orchestration.md +379 -0
  314. icdev/data/docs/features/phase-55-a2a-v03-mcp-oauth.md +322 -0
  315. icdev/data/docs/features/phase-56-evidence-lineage.md +352 -0
  316. icdev/data/docs/features/phase-57-eu-ai-act-iron-bank.md +319 -0
  317. icdev/data/docs/features/phase-58-creative-engine.md +370 -0
  318. icdev/data/docs/features/phase-59-govcon-intelligence.md +535 -0
  319. icdev/data/docs/features/phase-60-cpmp.md +528 -0
  320. icdev/data/docs/features/phase-61-orchestration-improvements.md +534 -0
  321. icdev/data/docs/operations/dashboard-guide.md +354 -0
  322. icdev/data/docs/operations/deployment-guide.md +556 -0
  323. icdev/data/docs/operations/saas-admin-guide.md +439 -0
  324. icdev/data/docs/operations/security-operations-guide.md +733 -0
  325. icdev/data/docs/runbooks/backup-restore.md +412 -0
  326. icdev/data/docs/runbooks/troubleshooting.md +499 -0
  327. icdev/data/features/__init__.py +1 -0
  328. icdev/data/features/cicd_integration.feature +41 -0
  329. icdev/data/features/compliance_gates.feature +46 -0
  330. icdev/data/features/dashboard.feature +72 -0
  331. icdev/data/features/environment.py +25 -0
  332. icdev/data/features/project_management.feature +32 -0
  333. icdev/data/features/requirements_intake.feature +42 -0
  334. icdev/data/features/saas_platform.feature +53 -0
  335. icdev/data/features/security_scanning.feature +36 -0
  336. icdev/data/features/steps/__init__.py +1 -0
  337. icdev/data/features/steps/cicd_steps.py +465 -0
  338. icdev/data/features/steps/compliance_steps.py +308 -0
  339. icdev/data/features/steps/dashboard_steps.py +88 -0
  340. icdev/data/features/steps/project_steps.py +126 -0
  341. icdev/data/features/steps/requirements_intake_steps.py +689 -0
  342. icdev/data/features/steps/saas_platform_steps.py +572 -0
  343. icdev/data/features/steps/security_steps.py +236 -0
  344. icdev/data/features/steps/testing_steps.py +226 -0
  345. icdev/data/features/testing_pipeline.feature +42 -0
  346. icdev/data/goals/__init__.py +1 -0
  347. icdev/data/goals/agent_management.md +144 -0
  348. icdev/data/goals/agentic_generation.md +345 -0
  349. icdev/data/goals/agentic_threat_model.md +309 -0
  350. icdev/data/goals/ai_accountability.md +90 -0
  351. icdev/data/goals/ai_governance_intake.md +132 -0
  352. icdev/data/goals/ai_transparency.md +76 -0
  353. icdev/data/goals/atlas_integration.md +405 -0
  354. icdev/data/goals/ato_acceleration.md +139 -0
  355. icdev/data/goals/boundary_supply_chain.md +206 -0
  356. icdev/data/goals/build_app.md +544 -0
  357. icdev/data/goals/cicd_integration.md +86 -0
  358. icdev/data/goals/claude_dir_maintenance.md +77 -0
  359. icdev/data/goals/cli_capabilities.md +340 -0
  360. icdev/data/goals/cloud_agnostic.md +312 -0
  361. icdev/data/goals/code_intelligence.md +197 -0
  362. icdev/data/goals/code_review.md +94 -0
  363. icdev/data/goals/compliance_workflow.md +858 -0
  364. icdev/data/goals/continuous_harmonization.md +140 -0
  365. icdev/data/goals/cross_language_translation.md +171 -0
  366. icdev/data/goals/dashboard.md +142 -0
  367. icdev/data/goals/deploy_workflow.md +390 -0
  368. icdev/data/goals/devsecops_workflow.md +408 -0
  369. icdev/data/goals/evolutionary_intelligence.md +305 -0
  370. icdev/data/goals/external_integration.md +113 -0
  371. icdev/data/goals/framework_planning.md +63 -0
  372. icdev/data/goals/init_project.md +235 -0
  373. icdev/data/goals/innovation_engine.md +199 -0
  374. icdev/data/goals/integration_testing.md +189 -0
  375. icdev/data/goals/maintenance_audit.md +196 -0
  376. icdev/data/goals/manifest.md +56 -0
  377. icdev/data/goals/mbse_integration.md +504 -0
  378. icdev/data/goals/modernization_workflow.md +618 -0
  379. icdev/data/goals/monitoring.md +126 -0
  380. icdev/data/goals/mosa_workflow.md +463 -0
  381. icdev/data/goals/multi_agent_orchestration.md +68 -0
  382. icdev/data/goals/nlq_compliance.md +63 -0
  383. icdev/data/goals/observability.md +64 -0
  384. icdev/data/goals/observability_traceability_xai.md +154 -0
  385. icdev/data/goals/owasp_agentic_security.md +395 -0
  386. icdev/data/goals/parallel_cicd.md +61 -0
  387. icdev/data/goals/requirements_intake.md +213 -0
  388. icdev/data/goals/sbd_ivv_workflow.md +195 -0
  389. icdev/data/goals/security_categorization.md +133 -0
  390. icdev/data/goals/security_scan.md +381 -0
  391. icdev/data/goals/self_healing.md +120 -0
  392. icdev/data/goals/simulation_engine.md +111 -0
  393. icdev/data/goals/tdd_workflow.md +403 -0
  394. icdev/data/goals/zero_trust_architecture.md +403 -0
  395. icdev/data/hardprompts/__init__.py +1 -0
  396. icdev/data/hardprompts/agent/__init__.py +1 -0
  397. icdev/data/hardprompts/agent/agentic_architect.md +100 -0
  398. icdev/data/hardprompts/agent/debate_prompt.md +32 -0
  399. icdev/data/hardprompts/agent/fitness_evaluation.md +48 -0
  400. icdev/data/hardprompts/agent/governance_review.md +214 -0
  401. icdev/data/hardprompts/agent/reviewer_prompt.md +34 -0
  402. icdev/data/hardprompts/agent/skill_design.md +172 -0
  403. icdev/data/hardprompts/agent/task_decomposition.md +275 -0
  404. icdev/data/hardprompts/agent/veto_check_prompt.md +33 -0
  405. icdev/data/hardprompts/architect/__init__.py +1 -0
  406. icdev/data/hardprompts/architect/api_design.md +283 -0
  407. icdev/data/hardprompts/architect/data_model.md +277 -0
  408. icdev/data/hardprompts/architect/system_design.md +180 -0
  409. icdev/data/hardprompts/builder/__init__.py +1 -0
  410. icdev/data/hardprompts/builder/code_generation.md +59 -0
  411. icdev/data/hardprompts/builder/refactor.md +58 -0
  412. icdev/data/hardprompts/builder/scaffold_project.md +69 -0
  413. icdev/data/hardprompts/builder/test_generation.md +87 -0
  414. icdev/data/hardprompts/ci/__init__.py +1 -0
  415. icdev/data/hardprompts/ci/worktree_setup.md +35 -0
  416. icdev/data/hardprompts/compliance/__init__.py +1 -0
  417. icdev/data/hardprompts/compliance/cmmc_assessment.md +63 -0
  418. icdev/data/hardprompts/compliance/cssp_assessment.md +75 -0
  419. icdev/data/hardprompts/compliance/cui_marking.md +86 -0
  420. icdev/data/hardprompts/compliance/fedramp_assessment.md +55 -0
  421. icdev/data/hardprompts/compliance/ivv_assessment.md +96 -0
  422. icdev/data/hardprompts/compliance/poam_generation.md +57 -0
  423. icdev/data/hardprompts/compliance/sbd_assessment.md +101 -0
  424. icdev/data/hardprompts/compliance/security_categorization.md +74 -0
  425. icdev/data/hardprompts/compliance/ssp_generation.md +56 -0
  426. icdev/data/hardprompts/compliance/stig_evaluation.md +63 -0
  427. icdev/data/hardprompts/dashboard/__init__.py +1 -0
  428. icdev/data/hardprompts/dashboard/nlq_system_prompt.md +26 -0
  429. icdev/data/hardprompts/infra/__init__.py +1 -0
  430. icdev/data/hardprompts/infra/k8s_manifests.md +118 -0
  431. icdev/data/hardprompts/infra/pipeline_generation.md +160 -0
  432. icdev/data/hardprompts/infra/terraform_generation.md +92 -0
  433. icdev/data/hardprompts/integration/__init__.py +1 -0
  434. icdev/data/hardprompts/integration/approval_review.md +17 -0
  435. icdev/data/hardprompts/integration/jira_mapping.md +25 -0
  436. icdev/data/hardprompts/integration/servicenow_mapping.md +14 -0
  437. icdev/data/hardprompts/knowledge/__init__.py +1 -0
  438. icdev/data/hardprompts/knowledge/pattern_detection.md +73 -0
  439. icdev/data/hardprompts/knowledge/recommendation_engine.md +90 -0
  440. icdev/data/hardprompts/knowledge/root_cause_analysis.md +91 -0
  441. icdev/data/hardprompts/maintenance/__init__.py +1 -0
  442. icdev/data/hardprompts/maintenance/maintenance_assessment.md +82 -0
  443. icdev/data/hardprompts/mbse/__init__.py +1 -0
  444. icdev/data/hardprompts/mbse/digital_thread.md +67 -0
  445. icdev/data/hardprompts/mbse/model_import.md +62 -0
  446. icdev/data/hardprompts/mbse/model_to_code.md +65 -0
  447. icdev/data/hardprompts/modernization/__init__.py +1 -0
  448. icdev/data/hardprompts/modernization/legacy_analysis.md +93 -0
  449. icdev/data/hardprompts/modernization/migration_planning.md +150 -0
  450. icdev/data/hardprompts/modernization/seven_r_assessment.md +107 -0
  451. icdev/data/hardprompts/requirements/__init__.py +1 -0
  452. icdev/data/hardprompts/requirements/bdd_generation.md +35 -0
  453. icdev/data/hardprompts/requirements/clarification_prioritization.md +29 -0
  454. icdev/data/hardprompts/requirements/decomposition.md +60 -0
  455. icdev/data/hardprompts/requirements/document_extraction.md +45 -0
  456. icdev/data/hardprompts/requirements/gap_detection.md +70 -0
  457. icdev/data/hardprompts/requirements/intake_conversation.md +101 -0
  458. icdev/data/hardprompts/requirements/readiness_assessment.md +39 -0
  459. icdev/data/hardprompts/requirements/spec_quality.md +33 -0
  460. icdev/data/hardprompts/requirements/traceability_analysis.md +23 -0
  461. icdev/data/hardprompts/security/__init__.py +1 -0
  462. icdev/data/hardprompts/security/endpoint_security.md +78 -0
  463. icdev/data/hardprompts/security/threat_model.md +70 -0
  464. icdev/data/hardprompts/security/vulnerability_assessment.md +81 -0
  465. icdev/data/hardprompts/simulation/__init__.py +1 -0
  466. icdev/data/hardprompts/simulation/architecture_impact.md +27 -0
  467. icdev/data/hardprompts/simulation/coa_alternative.md +27 -0
  468. icdev/data/hardprompts/simulation/coa_generation.md +25 -0
  469. icdev/data/hardprompts/simulation/compliance_impact.md +28 -0
  470. icdev/data/hardprompts/simulation/cost_estimation.md +33 -0
  471. icdev/data/hardprompts/simulation/risk_assessment.md +28 -0
  472. icdev/data/hardprompts/translation/code_translation.md +68 -0
  473. icdev/data/hardprompts/translation/dependency_suggestion.md +44 -0
  474. icdev/data/hardprompts/translation/test_translation.md +64 -0
  475. icdev/data/hardprompts/translation/translation_repair.md +59 -0
  476. icdev/py.typed +0 -0
  477. icdev/tools/__init__.py +1 -0
  478. icdev/tools/_gen_formatter.py +12 -0
  479. icdev/tools/a2a/__init__.py +1 -0
  480. icdev/tools/a2a/agent_cards/architect.json +43 -0
  481. icdev/tools/a2a/agent_cards/builder.json +50 -0
  482. icdev/tools/a2a/agent_cards/compliance.json +57 -0
  483. icdev/tools/a2a/agent_cards/devsecops.json +71 -0
  484. icdev/tools/a2a/agent_cards/infra.json +57 -0
  485. icdev/tools/a2a/agent_cards/integration.json +57 -0
  486. icdev/tools/a2a/agent_cards/knowledge.json +43 -0
  487. icdev/tools/a2a/agent_cards/mbse.json +57 -0
  488. icdev/tools/a2a/agent_cards/modernization.json +50 -0
  489. icdev/tools/a2a/agent_cards/monitor.json +43 -0
  490. icdev/tools/a2a/agent_cards/orchestrator.json +36 -0
  491. icdev/tools/a2a/agent_cards/requirements_analyst.json +64 -0
  492. icdev/tools/a2a/agent_cards/security.json +50 -0
  493. icdev/tools/a2a/agent_cards/simulation.json +57 -0
  494. icdev/tools/a2a/agent_cards/supply_chain.json +50 -0
  495. icdev/tools/a2a/agent_client.py +349 -0
  496. icdev/tools/a2a/agent_registry.py +412 -0
  497. icdev/tools/a2a/agent_server.py +579 -0
  498. icdev/tools/a2a/task.py +200 -0
  499. icdev/tools/agent/__init__.py +2 -0
  500. icdev/tools/agent/a2a_agent_card_generator.py +285 -0
  501. icdev/tools/agent/a2a_discovery_server.py +250 -0
  502. icdev/tools/agent/agent_executor.py +529 -0
  503. icdev/tools/agent/agent_memory.py +557 -0
  504. icdev/tools/agent/agent_models.py +51 -0
  505. icdev/tools/agent/atlas_critique.py +908 -0
  506. icdev/tools/agent/authority.py +443 -0
  507. icdev/tools/agent/bedrock_client.py +1075 -0
  508. icdev/tools/agent/collaboration.py +871 -0
  509. icdev/tools/agent/dispatcher_mode.py +665 -0
  510. icdev/tools/agent/mailbox.py +575 -0
  511. icdev/tools/agent/prompt_chain_executor.py +1064 -0
  512. icdev/tools/agent/session_purpose.py +350 -0
  513. icdev/tools/agent/skill_router.py +638 -0
  514. icdev/tools/agent/skill_selector.py +486 -0
  515. icdev/tools/agent/team_orchestrator.py +1108 -0
  516. icdev/tools/agent/token_tracker.py +290 -0
  517. icdev/tools/analysis/__init__.py +1 -0
  518. icdev/tools/analysis/code_analyzer.py +780 -0
  519. icdev/tools/analysis/runtime_feedback.py +389 -0
  520. icdev/tools/audit/__init__.py +1 -0
  521. icdev/tools/audit/audit_logger.py +196 -0
  522. icdev/tools/audit/audit_query.py +157 -0
  523. icdev/tools/audit/decision_recorder.py +72 -0
  524. icdev/tools/builder/__init__.py +1 -0
  525. icdev/tools/builder/agentic_fitness.py +534 -0
  526. icdev/tools/builder/agentic_test_templates/test_a2a_callback.py +117 -0
  527. icdev/tools/builder/agentic_test_templates/test_a2a_lifecycle.feature +52 -0
  528. icdev/tools/builder/agentic_test_templates/test_agent_card.feature +37 -0
  529. icdev/tools/builder/agentic_test_templates/test_agent_health.py +128 -0
  530. icdev/tools/builder/agentic_test_templates/test_memory_system.feature +50 -0
  531. icdev/tools/builder/agentic_test_templates/test_skill_execution.feature +40 -0
  532. icdev/tools/builder/app_blueprint.py +1583 -0
  533. icdev/tools/builder/child_app_generator.py +2852 -0
  534. icdev/tools/builder/claude_md_generator.py +1734 -0
  535. icdev/tools/builder/code_generator.py +3703 -0
  536. icdev/tools/builder/db_init_generator.py +1709 -0
  537. icdev/tools/builder/dev_profile_manager.py +954 -0
  538. icdev/tools/builder/formatter.py +768 -0
  539. icdev/tools/builder/goal_adapter.py +592 -0
  540. icdev/tools/builder/gotcha_validator.py +812 -0
  541. icdev/tools/builder/language_support.py +441 -0
  542. icdev/tools/builder/linter.py +976 -0
  543. icdev/tools/builder/profile_detector.py +657 -0
  544. icdev/tools/builder/profile_md_generator.py +723 -0
  545. icdev/tools/builder/scaffolder.py +1590 -0
  546. icdev/tools/builder/scaffolder_extended.py +1771 -0
  547. icdev/tools/builder/test_writer.py +950 -0
  548. icdev/tools/ci/__init__.py +2 -0
  549. icdev/tools/ci/connectors/__init__.py +2 -0
  550. icdev/tools/ci/connectors/base_connector.py +80 -0
  551. icdev/tools/ci/connectors/connector_registry.py +188 -0
  552. icdev/tools/ci/connectors/mattermost_connector.py +159 -0
  553. icdev/tools/ci/connectors/slack_connector.py +197 -0
  554. icdev/tools/ci/core/__init__.py +2 -0
  555. icdev/tools/ci/core/air_gap_detector.py +115 -0
  556. icdev/tools/ci/core/comment_handler.py +192 -0
  557. icdev/tools/ci/core/conversation_manager.py +479 -0
  558. icdev/tools/ci/core/event_envelope.py +500 -0
  559. icdev/tools/ci/core/event_router.py +443 -0
  560. icdev/tools/ci/core/failure_parser.py +397 -0
  561. icdev/tools/ci/core/recovery_engine.py +527 -0
  562. icdev/tools/ci/modules/__init__.py +2 -0
  563. icdev/tools/ci/modules/agent.py +271 -0
  564. icdev/tools/ci/modules/git_ops.py +175 -0
  565. icdev/tools/ci/modules/state.py +117 -0
  566. icdev/tools/ci/modules/vcs.py +303 -0
  567. icdev/tools/ci/modules/workflow_ops.py +295 -0
  568. icdev/tools/ci/modules/worktree.py +340 -0
  569. icdev/tools/ci/pipeline_config_generator.py +558 -0
  570. icdev/tools/ci/triggers/__init__.py +2 -0
  571. icdev/tools/ci/triggers/gitlab_task_monitor.py +330 -0
  572. icdev/tools/ci/triggers/poll_trigger.py +237 -0
  573. icdev/tools/ci/triggers/webhook_server.py +356 -0
  574. icdev/tools/ci/workflows/__init__.py +2 -0
  575. icdev/tools/ci/workflows/icdev_build.py +140 -0
  576. icdev/tools/ci/workflows/icdev_comply.py +284 -0
  577. icdev/tools/ci/workflows/icdev_document.py +152 -0
  578. icdev/tools/ci/workflows/icdev_e2e.py +188 -0
  579. icdev/tools/ci/workflows/icdev_patch.py +186 -0
  580. icdev/tools/ci/workflows/icdev_plan.py +202 -0
  581. icdev/tools/ci/workflows/icdev_plan_build.py +41 -0
  582. icdev/tools/ci/workflows/icdev_plan_build_test.py +46 -0
  583. icdev/tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
  584. icdev/tools/ci/workflows/icdev_review.py +126 -0
  585. icdev/tools/ci/workflows/icdev_sdlc.py +261 -0
  586. icdev/tools/ci/workflows/icdev_test.py +240 -0
  587. icdev/tools/cli/__init__.py +1 -0
  588. icdev/tools/cli/output_formatter.py +756 -0
  589. icdev/tools/cli_formatter.py +42 -0
  590. icdev/tools/cloud/__init__.py +11 -0
  591. icdev/tools/cloud/cloud_mode_manager.py +364 -0
  592. icdev/tools/cloud/csp_changelog.py +383 -0
  593. icdev/tools/cloud/csp_health_checker.py +268 -0
  594. icdev/tools/cloud/csp_monitor.py +951 -0
  595. icdev/tools/cloud/iam_provider.py +593 -0
  596. icdev/tools/cloud/kms_provider.py +346 -0
  597. icdev/tools/cloud/monitoring_provider.py +628 -0
  598. icdev/tools/cloud/provider_factory.py +376 -0
  599. icdev/tools/cloud/region_validator.py +345 -0
  600. icdev/tools/cloud/registry_provider.py +563 -0
  601. icdev/tools/cloud/secrets_provider.py +486 -0
  602. icdev/tools/cloud/storage_provider.py +446 -0
  603. icdev/tools/compat/__init__.py +21 -0
  604. icdev/tools/compat/cli_harmonizer.py +251 -0
  605. icdev/tools/compat/datetime_utils.py +18 -0
  606. icdev/tools/compat/db_utils.py +160 -0
  607. icdev/tools/compat/platform_utils.py +123 -0
  608. icdev/tools/compliance/__init__.py +1 -0
  609. icdev/tools/compliance/accountability_manager.py +397 -0
  610. icdev/tools/compliance/ai_accountability_audit.py +294 -0
  611. icdev/tools/compliance/ai_impact_assessor.py +273 -0
  612. icdev/tools/compliance/ai_incident_response.py +301 -0
  613. icdev/tools/compliance/ai_inventory_manager.py +239 -0
  614. icdev/tools/compliance/ai_reassessment_scheduler.py +256 -0
  615. icdev/tools/compliance/ai_transparency_audit.py +248 -0
  616. icdev/tools/compliance/atlas_assessor.py +278 -0
  617. icdev/tools/compliance/atlas_report_generator.py +1211 -0
  618. icdev/tools/compliance/base_assessor.py +597 -0
  619. icdev/tools/compliance/cato_monitor.py +1385 -0
  620. icdev/tools/compliance/cato_scheduler.py +699 -0
  621. icdev/tools/compliance/cjis_assessor.py +76 -0
  622. icdev/tools/compliance/classification_manager.py +1353 -0
  623. icdev/tools/compliance/cmmc_assessor.py +1491 -0
  624. icdev/tools/compliance/cmmc_report_generator.py +1100 -0
  625. icdev/tools/compliance/compliance_detector.py +463 -0
  626. icdev/tools/compliance/compliance_exporter.py +427 -0
  627. icdev/tools/compliance/compliance_status.py +825 -0
  628. icdev/tools/compliance/control_mapper.py +505 -0
  629. icdev/tools/compliance/crosswalk_engine.py +1203 -0
  630. icdev/tools/compliance/cssp_assessor.py +1045 -0
  631. icdev/tools/compliance/cssp_evidence_collector.py +729 -0
  632. icdev/tools/compliance/cssp_report_generator.py +1116 -0
  633. icdev/tools/compliance/cui_marker.py +388 -0
  634. icdev/tools/compliance/diagram_validator.py +600 -0
  635. icdev/tools/compliance/emass/__init__.py +2 -0
  636. icdev/tools/compliance/emass/emass_client.py +840 -0
  637. icdev/tools/compliance/emass/emass_export.py +777 -0
  638. icdev/tools/compliance/emass/emass_sync.py +826 -0
  639. icdev/tools/compliance/eu_ai_act_classifier.py +194 -0
  640. icdev/tools/compliance/evidence_collector.py +468 -0
  641. icdev/tools/compliance/fairness_assessor.py +316 -0
  642. icdev/tools/compliance/fedramp_assessor.py +1808 -0
  643. icdev/tools/compliance/fedramp_authorization_packager.py +137 -0
  644. icdev/tools/compliance/fedramp_ksi_generator.py +355 -0
  645. icdev/tools/compliance/fedramp_report_generator.py +1128 -0
  646. icdev/tools/compliance/fips199_categorizer.py +881 -0
  647. icdev/tools/compliance/fips200_validator.py +315 -0
  648. icdev/tools/compliance/gao_ai_assessor.py +231 -0
  649. icdev/tools/compliance/gao_evidence_builder.py +308 -0
  650. icdev/tools/compliance/hipaa_assessor.py +78 -0
  651. icdev/tools/compliance/hitrust_assessor.py +49 -0
  652. icdev/tools/compliance/incident_response_plan.py +718 -0
  653. icdev/tools/compliance/iso27001_assessor.py +92 -0
  654. icdev/tools/compliance/iso42001_assessor.py +114 -0
  655. icdev/tools/compliance/ivv_assessor.py +2327 -0
  656. icdev/tools/compliance/ivv_report_generator.py +1662 -0
  657. icdev/tools/compliance/model_card_generator.py +297 -0
  658. icdev/tools/compliance/mosa_assessor.py +117 -0
  659. icdev/tools/compliance/multi_regime_assessor.py +451 -0
  660. icdev/tools/compliance/narrative_generator.py +1013 -0
  661. icdev/tools/compliance/nist_800_207_assessor.py +191 -0
  662. icdev/tools/compliance/nist_ai_600_1_assessor.py +188 -0
  663. icdev/tools/compliance/nist_ai_rmf_assessor.py +110 -0
  664. icdev/tools/compliance/nist_lookup.py +245 -0
  665. icdev/tools/compliance/omb_m25_21_assessor.py +228 -0
  666. icdev/tools/compliance/omb_m26_04_assessor.py +188 -0
  667. icdev/tools/compliance/oscal_catalog_adapter.py +395 -0
  668. icdev/tools/compliance/oscal_generator.py +2170 -0
  669. icdev/tools/compliance/oscal_tools.py +1182 -0
  670. icdev/tools/compliance/owasp_agentic_assessor.py +226 -0
  671. icdev/tools/compliance/owasp_asi_assessor.py +200 -0
  672. icdev/tools/compliance/owasp_llm_assessor.py +244 -0
  673. icdev/tools/compliance/pci_dss_assessor.py +80 -0
  674. icdev/tools/compliance/pi_compliance_tracker.py +1461 -0
  675. icdev/tools/compliance/poam_generator.py +405 -0
  676. icdev/tools/compliance/resolve_marking.py +283 -0
  677. icdev/tools/compliance/sbd_assessor.py +2068 -0
  678. icdev/tools/compliance/sbd_report_generator.py +1236 -0
  679. icdev/tools/compliance/sbom_generator.py +1008 -0
  680. icdev/tools/compliance/siem_config_generator.py +674 -0
  681. icdev/tools/compliance/slsa_attestation_generator.py +490 -0
  682. icdev/tools/compliance/soc2_assessor.py +77 -0
  683. icdev/tools/compliance/ssp_generator.py +573 -0
  684. icdev/tools/compliance/stig_checker.py +727 -0
  685. icdev/tools/compliance/swft_evidence_bundler.py +337 -0
  686. icdev/tools/compliance/system_card_generator.py +309 -0
  687. icdev/tools/compliance/traceability_matrix.py +1281 -0
  688. icdev/tools/compliance/universal_classification_manager.py +1172 -0
  689. icdev/tools/compliance/xacta/__init__.py +2 -0
  690. icdev/tools/compliance/xacta/xacta_client.py +449 -0
  691. icdev/tools/compliance/xacta/xacta_export.py +557 -0
  692. icdev/tools/compliance/xacta/xacta_sync.py +333 -0
  693. icdev/tools/compliance/xai_assessor.py +231 -0
  694. icdev/tools/dashboard/__init__.py +1 -0
  695. icdev/tools/dashboard/api/__init__.py +1 -0
  696. icdev/tools/dashboard/api/_pipeline_state.py +17 -0
  697. icdev/tools/dashboard/api/activity.py +206 -0
  698. icdev/tools/dashboard/api/admin.py +176 -0
  699. icdev/tools/dashboard/api/agents.py +53 -0
  700. icdev/tools/dashboard/api/ai_accountability.py +163 -0
  701. icdev/tools/dashboard/api/ai_transparency.py +198 -0
  702. icdev/tools/dashboard/api/audit.py +58 -0
  703. icdev/tools/dashboard/api/batch.py +666 -0
  704. icdev/tools/dashboard/api/chat.py +241 -0
  705. icdev/tools/dashboard/api/cicd.py +219 -0
  706. icdev/tools/dashboard/api/code_quality.py +223 -0
  707. icdev/tools/dashboard/api/compliance.py +171 -0
  708. icdev/tools/dashboard/api/cpmp.py +915 -0
  709. icdev/tools/dashboard/api/diagrams.py +65 -0
  710. icdev/tools/dashboard/api/events.py +250 -0
  711. icdev/tools/dashboard/api/evidence.py +99 -0
  712. icdev/tools/dashboard/api/fedramp_20x.py +77 -0
  713. icdev/tools/dashboard/api/govcon.py +1095 -0
  714. icdev/tools/dashboard/api/intake.py +1171 -0
  715. icdev/tools/dashboard/api/lineage.py +163 -0
  716. icdev/tools/dashboard/api/metrics.py +155 -0
  717. icdev/tools/dashboard/api/nlq.py +72 -0
  718. icdev/tools/dashboard/api/orchestration.py +472 -0
  719. icdev/tools/dashboard/api/oscal.py +183 -0
  720. icdev/tools/dashboard/api/prod_audit.py +183 -0
  721. icdev/tools/dashboard/api/projects.py +191 -0
  722. icdev/tools/dashboard/api/proposals.py +1084 -0
  723. icdev/tools/dashboard/api/traces.py +363 -0
  724. icdev/tools/dashboard/api/usage.py +234 -0
  725. icdev/tools/dashboard/app.py +1986 -0
  726. icdev/tools/dashboard/auth.py +500 -0
  727. icdev/tools/dashboard/byok.py +245 -0
  728. icdev/tools/dashboard/chat_manager.py +675 -0
  729. icdev/tools/dashboard/config.py +116 -0
  730. icdev/tools/dashboard/diagram_definitions.py +642 -0
  731. icdev/tools/dashboard/nlq_processor.py +323 -0
  732. icdev/tools/dashboard/phase_loader.py +136 -0
  733. icdev/tools/dashboard/sse_manager.py +89 -0
  734. icdev/tools/dashboard/state_tracker.py +267 -0
  735. icdev/tools/dashboard/static/css/style.css +706 -0
  736. icdev/tools/dashboard/static/css/ux.css +2047 -0
  737. icdev/tools/dashboard/static/js/activity.js +322 -0
  738. icdev/tools/dashboard/static/js/api.js +161 -0
  739. icdev/tools/dashboard/static/js/batch.js +814 -0
  740. icdev/tools/dashboard/static/js/charts.js +618 -0
  741. icdev/tools/dashboard/static/js/chat.js +1514 -0
  742. icdev/tools/dashboard/static/js/kanban.js +113 -0
  743. icdev/tools/dashboard/static/js/live.js +569 -0
  744. icdev/tools/dashboard/static/js/mermaid-icdev.js +332 -0
  745. icdev/tools/dashboard/static/js/proposals.js +588 -0
  746. icdev/tools/dashboard/static/js/shortcuts.js +544 -0
  747. icdev/tools/dashboard/static/js/tables.js +652 -0
  748. icdev/tools/dashboard/static/js/tour.js +524 -0
  749. icdev/tools/dashboard/static/js/ux.js +942 -0
  750. icdev/tools/dashboard/templates/404.html +10 -0
  751. icdev/tools/dashboard/templates/activity.html +80 -0
  752. icdev/tools/dashboard/templates/admin/users.html +144 -0
  753. icdev/tools/dashboard/templates/ai_accountability.html +235 -0
  754. icdev/tools/dashboard/templates/ai_transparency.html +263 -0
  755. icdev/tools/dashboard/templates/base.html +104 -0
  756. icdev/tools/dashboard/templates/batch.html +23 -0
  757. icdev/tools/dashboard/templates/chat.html +332 -0
  758. icdev/tools/dashboard/templates/children.html +149 -0
  759. icdev/tools/dashboard/templates/cicd.html +253 -0
  760. icdev/tools/dashboard/templates/code_quality.html +214 -0
  761. icdev/tools/dashboard/templates/cpmp/cor_detail.html +220 -0
  762. icdev/tools/dashboard/templates/cpmp/cor_portal.html +91 -0
  763. icdev/tools/dashboard/templates/cpmp/deliverable_detail.html +197 -0
  764. icdev/tools/dashboard/templates/cpmp/detail.html +578 -0
  765. icdev/tools/dashboard/templates/cpmp/portfolio.html +202 -0
  766. icdev/tools/dashboard/templates/dev_profiles.html +304 -0
  767. icdev/tools/dashboard/templates/diagrams.html +224 -0
  768. icdev/tools/dashboard/templates/events/timeline.html +232 -0
  769. icdev/tools/dashboard/templates/evidence.html +134 -0
  770. icdev/tools/dashboard/templates/fedramp_20x.html +207 -0
  771. icdev/tools/dashboard/templates/gateway.html +244 -0
  772. icdev/tools/dashboard/templates/govcon/capabilities.html +135 -0
  773. icdev/tools/dashboard/templates/govcon/pipeline.html +214 -0
  774. icdev/tools/dashboard/templates/govcon/requirements.html +120 -0
  775. icdev/tools/dashboard/templates/index.html +254 -0
  776. icdev/tools/dashboard/templates/lineage.html +141 -0
  777. icdev/tools/dashboard/templates/login.html +51 -0
  778. icdev/tools/dashboard/templates/monitoring/overview.html +193 -0
  779. icdev/tools/dashboard/templates/orchestration/dashboard.html +545 -0
  780. icdev/tools/dashboard/templates/oscal.html +263 -0
  781. icdev/tools/dashboard/templates/phases.html +150 -0
  782. icdev/tools/dashboard/templates/prod_audit.html +280 -0
  783. icdev/tools/dashboard/templates/profile.html +183 -0
  784. icdev/tools/dashboard/templates/projects/detail.html +583 -0
  785. icdev/tools/dashboard/templates/projects/list.html +47 -0
  786. icdev/tools/dashboard/templates/proposals/detail.html +1253 -0
  787. icdev/tools/dashboard/templates/proposals/list.html +179 -0
  788. icdev/tools/dashboard/templates/proposals/section_detail.html +193 -0
  789. icdev/tools/dashboard/templates/provenance.html +181 -0
  790. icdev/tools/dashboard/templates/query/nlq.html +234 -0
  791. icdev/tools/dashboard/templates/quick_paths.html +69 -0
  792. icdev/tools/dashboard/templates/traces.html +155 -0
  793. icdev/tools/dashboard/templates/translation_detail.html +199 -0
  794. icdev/tools/dashboard/templates/translations.html +162 -0
  795. icdev/tools/dashboard/templates/usage.html +225 -0
  796. icdev/tools/dashboard/templates/wizard.html +539 -0
  797. icdev/tools/dashboard/templates/xai.html +208 -0
  798. icdev/tools/dashboard/ux_helpers.py +962 -0
  799. icdev/tools/dashboard/websocket.py +81 -0
  800. icdev/tools/db/__init__.py +1 -0
  801. icdev/tools/db/backup.py +312 -0
  802. icdev/tools/db/backup_manager.py +832 -0
  803. icdev/tools/db/init_icdev_db.py +5900 -0
  804. icdev/tools/db/migrate.py +178 -0
  805. icdev/tools/db/migration_runner.py +549 -0
  806. icdev/tools/db/migrations/001_baseline/meta.json +9 -0
  807. icdev/tools/db/migrations/001_baseline/up.py +68 -0
  808. icdev/tools/db/migrations/002_memory_enhancements/down.sql +8 -0
  809. icdev/tools/db/migrations/002_memory_enhancements/meta.json +9 -0
  810. icdev/tools/db/migrations/002_memory_enhancements/up.py +118 -0
  811. icdev/tools/db/migrations/003_dev_profiles/meta.json +8 -0
  812. icdev/tools/db/migrations/003_dev_profiles/up.py +93 -0
  813. icdev/tools/db/migrations/004_innovation_engine/down.py +19 -0
  814. icdev/tools/db/migrations/004_innovation_engine/up.py +227 -0
  815. icdev/tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
  816. icdev/tools/db/migrations/005_phase_37_ai_security/up.py +258 -0
  817. icdev/tools/db/migrations/006_phase_36_evolution/down.py +21 -0
  818. icdev/tools/db/migrations/006_phase_36_evolution/up.py +323 -0
  819. icdev/tools/db/migrations/007_phase_38_cloud/down.py +14 -0
  820. icdev/tools/db/migrations/007_phase_38_cloud/up.py +110 -0
  821. icdev/tools/db/migrations/008_phase36_37_integration/up.py +55 -0
  822. icdev/tools/db/migrations/__init__.py +2 -0
  823. icdev/tools/devsecops/__init__.py +2 -0
  824. icdev/tools/devsecops/attestation_manager.py +458 -0
  825. icdev/tools/devsecops/network_segmentation_generator.py +614 -0
  826. icdev/tools/devsecops/pdp_config_generator.py +1256 -0
  827. icdev/tools/devsecops/pipeline_security_generator.py +484 -0
  828. icdev/tools/devsecops/policy_generator.py +653 -0
  829. icdev/tools/devsecops/profile_manager.py +388 -0
  830. icdev/tools/devsecops/service_mesh_generator.py +1073 -0
  831. icdev/tools/devsecops/zta_maturity_scorer.py +368 -0
  832. icdev/tools/devsecops/zta_terraform_generator.py +1303 -0
  833. icdev/tools/dx/__init__.py +3 -0
  834. icdev/tools/dx/companion.py +266 -0
  835. icdev/tools/dx/instruction_generator.py +753 -0
  836. icdev/tools/dx/mcp_config_generator.py +282 -0
  837. icdev/tools/dx/skill_translator.py +425 -0
  838. icdev/tools/dx/tool_detector.py +144 -0
  839. icdev/tools/extensions/__init__.py +21 -0
  840. icdev/tools/extensions/builtins/010_ai_governance_chat.py +277 -0
  841. icdev/tools/extensions/builtins/__init__.py +2 -0
  842. icdev/tools/extensions/extension_manager.py +455 -0
  843. icdev/tools/infra/__init__.py +1 -0
  844. icdev/tools/infra/ansible_generator.py +869 -0
  845. icdev/tools/infra/dockerfile_generator.py +361 -0
  846. icdev/tools/infra/infra_status.py +393 -0
  847. icdev/tools/infra/ironbank_metadata_generator.py +411 -0
  848. icdev/tools/infra/k8s_generator.py +1002 -0
  849. icdev/tools/infra/pipeline_generator.py +832 -0
  850. icdev/tools/infra/rollback.py +400 -0
  851. icdev/tools/infra/terraform_generator.py +1142 -0
  852. icdev/tools/infra/terraform_generator_azure.py +1254 -0
  853. icdev/tools/infra/terraform_generator_gcp.py +953 -0
  854. icdev/tools/infra/terraform_generator_ibm.py +360 -0
  855. icdev/tools/infra/terraform_generator_oci.py +919 -0
  856. icdev/tools/infra/terraform_generator_onprem.py +319 -0
  857. icdev/tools/innovation/__init__.py +8 -0
  858. icdev/tools/innovation/competitive_intel.py +492 -0
  859. icdev/tools/innovation/innovation_manager.py +681 -0
  860. icdev/tools/innovation/introspective_analyzer.py +774 -0
  861. icdev/tools/innovation/register_external_patterns.py +440 -0
  862. icdev/tools/innovation/signal_ranker.py +1038 -0
  863. icdev/tools/innovation/solution_generator.py +697 -0
  864. icdev/tools/innovation/standards_monitor.py +466 -0
  865. icdev/tools/innovation/trend_detector.py +1046 -0
  866. icdev/tools/innovation/triage_engine.py +1149 -0
  867. icdev/tools/innovation/web_scanner.py +894 -0
  868. icdev/tools/installer/__init__.py +1 -0
  869. icdev/tools/installer/compliance_configurator.py +637 -0
  870. icdev/tools/installer/installer.py +1711 -0
  871. icdev/tools/installer/module_registry.py +805 -0
  872. icdev/tools/installer/platform_setup.py +961 -0
  873. icdev/tools/integration/__init__.py +2 -0
  874. icdev/tools/integration/approval_manager.py +561 -0
  875. icdev/tools/integration/doors_exporter.py +627 -0
  876. icdev/tools/integration/gitlab_connector.py +784 -0
  877. icdev/tools/integration/jira_connector.py +774 -0
  878. icdev/tools/integration/servicenow_connector.py +693 -0
  879. icdev/tools/knowledge/__init__.py +1 -0
  880. icdev/tools/knowledge/knowledge_ingest.py +293 -0
  881. icdev/tools/knowledge/pattern_detector.py +693 -0
  882. icdev/tools/knowledge/recommendation_engine.py +461 -0
  883. icdev/tools/knowledge/self_heal_analyzer.py +504 -0
  884. icdev/tools/llm/__init__.py +72 -0
  885. icdev/tools/llm/anthropic_provider.py +170 -0
  886. icdev/tools/llm/azure_openai_provider.py +338 -0
  887. icdev/tools/llm/bedrock_provider.py +315 -0
  888. icdev/tools/llm/embedding_provider.py +438 -0
  889. icdev/tools/llm/gemini_provider.py +381 -0
  890. icdev/tools/llm/ibm_watsonx_provider.py +232 -0
  891. icdev/tools/llm/oci_genai_provider.py +462 -0
  892. icdev/tools/llm/ollama_provider.py +340 -0
  893. icdev/tools/llm/openai_provider.py +225 -0
  894. icdev/tools/llm/provider.py +355 -0
  895. icdev/tools/llm/provider_sdk.py +175 -0
  896. icdev/tools/llm/router.py +780 -0
  897. icdev/tools/llm/vertex_ai_provider.py +374 -0
  898. icdev/tools/maintenance/__init__.py +2 -0
  899. icdev/tools/maintenance/dependency_scanner.py +1030 -0
  900. icdev/tools/maintenance/maintenance_auditor.py +815 -0
  901. icdev/tools/maintenance/remediation_engine.py +966 -0
  902. icdev/tools/maintenance/vulnerability_checker.py +987 -0
  903. icdev/tools/mbse/__init__.py +3 -0
  904. icdev/tools/mbse/des_assessor.py +1186 -0
  905. icdev/tools/mbse/des_report_generator.py +800 -0
  906. icdev/tools/mbse/diagram_extractor.py +811 -0
  907. icdev/tools/mbse/digital_thread.py +1665 -0
  908. icdev/tools/mbse/model_code_generator.py +1122 -0
  909. icdev/tools/mbse/model_control_mapper.py +420 -0
  910. icdev/tools/mbse/pi_model_tracker.py +1093 -0
  911. icdev/tools/mbse/reqif_parser.py +1483 -0
  912. icdev/tools/mbse/sync_engine.py +1805 -0
  913. icdev/tools/mbse/xmi_parser.py +1573 -0
  914. icdev/tools/mcp/__init__.py +1 -0
  915. icdev/tools/mcp/base_server.py +535 -0
  916. icdev/tools/mcp/builder_server.py +725 -0
  917. icdev/tools/mcp/compliance_server.py +1407 -0
  918. icdev/tools/mcp/context_indexer.py +199 -0
  919. icdev/tools/mcp/context_server.py +305 -0
  920. icdev/tools/mcp/core_server.py +679 -0
  921. icdev/tools/mcp/devsecops_server.py +432 -0
  922. icdev/tools/mcp/gap_handlers.py +1079 -0
  923. icdev/tools/mcp/gateway_server.py +339 -0
  924. icdev/tools/mcp/generate_registry.py +623 -0
  925. icdev/tools/mcp/infra_server.py +264 -0
  926. icdev/tools/mcp/innovation_server.py +316 -0
  927. icdev/tools/mcp/integration_server.py +527 -0
  928. icdev/tools/mcp/knowledge_server.py +429 -0
  929. icdev/tools/mcp/maintenance_server.py +248 -0
  930. icdev/tools/mcp/marketplace_server.py +499 -0
  931. icdev/tools/mcp/mbse_server.py +398 -0
  932. icdev/tools/mcp/modernization_server.py +496 -0
  933. icdev/tools/mcp/observability_server.py +354 -0
  934. icdev/tools/mcp/requirements_server.py +415 -0
  935. icdev/tools/mcp/simulation_server.py +468 -0
  936. icdev/tools/mcp/standalone/__init__.py +2 -0
  937. icdev/tools/mcp/standalone/builder.py +59 -0
  938. icdev/tools/mcp/standalone/compliance.py +59 -0
  939. icdev/tools/mcp/standalone/core.py +59 -0
  940. icdev/tools/mcp/standalone/knowledge.py +59 -0
  941. icdev/tools/mcp/standalone/maintenance.py +59 -0
  942. icdev/tools/mcp/supply_chain_server.py +476 -0
  943. icdev/tools/mcp/tool_registry.py +2008 -0
  944. icdev/tools/mcp/unified_server.py +158 -0
  945. icdev/tools/memory/__init__.py +2 -0
  946. icdev/tools/memory/auto_capture.py +347 -0
  947. icdev/tools/memory/embed_memory.py +158 -0
  948. icdev/tools/memory/history_compressor.py +334 -0
  949. icdev/tools/memory/hybrid_search.py +236 -0
  950. icdev/tools/memory/maintenance_cron.py +289 -0
  951. icdev/tools/memory/memory_consolidation.py +444 -0
  952. icdev/tools/memory/memory_db.py +133 -0
  953. icdev/tools/memory/memory_read.py +102 -0
  954. icdev/tools/memory/memory_write.py +222 -0
  955. icdev/tools/memory/semantic_search.py +139 -0
  956. icdev/tools/memory/time_decay.py +435 -0
  957. icdev/tools/modernization/__init__.py +3 -0
  958. icdev/tools/modernization/architecture_extractor.py +734 -0
  959. icdev/tools/modernization/compliance_bridge.py +1499 -0
  960. icdev/tools/modernization/db_migration_planner.py +1385 -0
  961. icdev/tools/modernization/doc_generator.py +1428 -0
  962. icdev/tools/modernization/framework_migrator.py +1525 -0
  963. icdev/tools/modernization/legacy_analyzer.py +1948 -0
  964. icdev/tools/modernization/migration_code_generator.py +1639 -0
  965. icdev/tools/modernization/migration_report_generator.py +1653 -0
  966. icdev/tools/modernization/migration_tracker.py +1726 -0
  967. icdev/tools/modernization/monolith_decomposer.py +1508 -0
  968. icdev/tools/modernization/seven_r_assessor.py +1658 -0
  969. icdev/tools/modernization/strangler_fig_manager.py +1705 -0
  970. icdev/tools/modernization/ui_analyzer.py +771 -0
  971. icdev/tools/modernization/version_migrator.py +1392 -0
  972. icdev/tools/monitor/__init__.py +1 -0
  973. icdev/tools/monitor/alert_correlator.py +495 -0
  974. icdev/tools/monitor/auto_resolver.py +612 -0
  975. icdev/tools/monitor/health_checker.py +509 -0
  976. icdev/tools/monitor/heartbeat_daemon.py +792 -0
  977. icdev/tools/monitor/log_analyzer.py +516 -0
  978. icdev/tools/monitor/metric_collector.py +496 -0
  979. icdev/tools/mosa/__init__.py +10 -0
  980. icdev/tools/mosa/icd_generator.py +370 -0
  981. icdev/tools/mosa/modular_design_analyzer.py +683 -0
  982. icdev/tools/mosa/mosa_code_enforcer.py +349 -0
  983. icdev/tools/mosa/tsp_generator.py +265 -0
  984. icdev/tools/observability/__init__.py +100 -0
  985. icdev/tools/observability/genai_attributes.py +88 -0
  986. icdev/tools/observability/instrumentation.py +140 -0
  987. icdev/tools/observability/mlflow_exporter.py +194 -0
  988. icdev/tools/observability/otel_tracer.py +168 -0
  989. icdev/tools/observability/provenance/__init__.py +3 -0
  990. icdev/tools/observability/provenance/prov_recorder.py +324 -0
  991. icdev/tools/observability/shap/__init__.py +3 -0
  992. icdev/tools/observability/shap/agent_shap.py +275 -0
  993. icdev/tools/observability/sqlite_tracer.py +361 -0
  994. icdev/tools/observability/trace_context.py +205 -0
  995. icdev/tools/observability/tracer.py +230 -0
  996. icdev/tools/orchestration/__init__.py +2 -0
  997. icdev/tools/orchestration/workflow_composer.py +361 -0
  998. icdev/tools/project/__init__.py +1 -0
  999. icdev/tools/project/manifest_loader.py +418 -0
  1000. icdev/tools/project/project_create.py +350 -0
  1001. icdev/tools/project/project_list.py +174 -0
  1002. icdev/tools/project/project_scaffold.py +1715 -0
  1003. icdev/tools/project/project_status.py +479 -0
  1004. icdev/tools/project/session_context_builder.py +757 -0
  1005. icdev/tools/project/validate_manifest.py +55 -0
  1006. icdev/tools/registry/__init__.py +10 -0
  1007. icdev/tools/registry/absorption_engine.py +832 -0
  1008. icdev/tools/registry/capability_evaluator.py +668 -0
  1009. icdev/tools/registry/child_registry.py +617 -0
  1010. icdev/tools/registry/cross_pollinator.py +1065 -0
  1011. icdev/tools/registry/genome_manager.py +671 -0
  1012. icdev/tools/registry/learning_collector.py +912 -0
  1013. icdev/tools/registry/propagation_manager.py +942 -0
  1014. icdev/tools/registry/staging_manager.py +742 -0
  1015. icdev/tools/registry/telemetry_collector.py +423 -0
  1016. icdev/tools/requirements/__init__.py +1 -0
  1017. icdev/tools/requirements/ai_governance_scorer.py +208 -0
  1018. icdev/tools/requirements/boundary_analyzer.py +1293 -0
  1019. icdev/tools/requirements/clarification_engine.py +618 -0
  1020. icdev/tools/requirements/complexity_scorer.py +387 -0
  1021. icdev/tools/requirements/consistency_analyzer.py +803 -0
  1022. icdev/tools/requirements/constitution_manager.py +605 -0
  1023. icdev/tools/requirements/decomposition_engine.py +778 -0
  1024. icdev/tools/requirements/document_extractor.py +1016 -0
  1025. icdev/tools/requirements/elicitation_techniques.py +519 -0
  1026. icdev/tools/requirements/gap_detector.py +271 -0
  1027. icdev/tools/requirements/intake_engine.py +2188 -0
  1028. icdev/tools/requirements/prd_generator.py +847 -0
  1029. icdev/tools/requirements/prd_validator.py +595 -0
  1030. icdev/tools/requirements/readiness_scorer.py +313 -0
  1031. icdev/tools/requirements/spec_organizer.py +1029 -0
  1032. icdev/tools/requirements/spec_quality_checker.py +1097 -0
  1033. icdev/tools/requirements/traceability_builder.py +579 -0
  1034. icdev/tools/resilience/__init__.py +34 -0
  1035. icdev/tools/resilience/circuit_breaker.py +340 -0
  1036. icdev/tools/resilience/correlation.py +150 -0
  1037. icdev/tools/resilience/errors.py +81 -0
  1038. icdev/tools/resilience/retry.py +95 -0
  1039. icdev/tools/schemas/__init__.py +27 -0
  1040. icdev/tools/schemas/chat.py +61 -0
  1041. icdev/tools/schemas/compliance.py +56 -0
  1042. icdev/tools/schemas/core.py +85 -0
  1043. icdev/tools/schemas/innovation.py +37 -0
  1044. icdev/tools/schemas/validation.py +109 -0
  1045. icdev/tools/sdk/__init__.py +3 -0
  1046. icdev/tools/sdk/icdev_client.py +218 -0
  1047. icdev/tools/security/__init__.py +1 -0
  1048. icdev/tools/security/agent_output_validator.py +330 -0
  1049. icdev/tools/security/agent_trust_scorer.py +466 -0
  1050. icdev/tools/security/ai_bom_generator.py +725 -0
  1051. icdev/tools/security/ai_telemetry_logger.py +469 -0
  1052. icdev/tools/security/atlas_red_team.py +543 -0
  1053. icdev/tools/security/code_pattern_scanner.py +378 -0
  1054. icdev/tools/security/confabulation_detector.py +271 -0
  1055. icdev/tools/security/container_scanner.py +491 -0
  1056. icdev/tools/security/dependency_auditor.py +944 -0
  1057. icdev/tools/security/endpoint_security_scanner.py +579 -0
  1058. icdev/tools/security/mcp_tool_authorizer.py +243 -0
  1059. icdev/tools/security/prompt_injection_detector.py +737 -0
  1060. icdev/tools/security/sast_runner.py +948 -0
  1061. icdev/tools/security/secret_detector.py +378 -0
  1062. icdev/tools/security/tool_chain_validator.py +357 -0
  1063. icdev/tools/security/vuln_scanner.py +539 -0
  1064. icdev/tools/simulation/__init__.py +2 -0
  1065. icdev/tools/simulation/coa_generator.py +1552 -0
  1066. icdev/tools/simulation/monte_carlo.py +758 -0
  1067. icdev/tools/simulation/scenario_manager.py +1073 -0
  1068. icdev/tools/simulation/simulation_engine.py +1104 -0
  1069. icdev/tools/supply_chain/__init__.py +2 -0
  1070. icdev/tools/supply_chain/cve_triager.py +705 -0
  1071. icdev/tools/supply_chain/dependency_graph.py +645 -0
  1072. icdev/tools/supply_chain/isa_manager.py +540 -0
  1073. icdev/tools/supply_chain/scrm_assessor.py +546 -0
  1074. icdev/tools/testing/__init__.py +2 -0
  1075. icdev/tools/testing/acceptance_validator.py +411 -0
  1076. icdev/tools/testing/claude_dir_validator.py +831 -0
  1077. icdev/tools/testing/data_types.py +199 -0
  1078. icdev/tools/testing/e2e_runner.py +715 -0
  1079. icdev/tools/testing/fuzz_cli.py +306 -0
  1080. icdev/tools/testing/health_check.py +483 -0
  1081. icdev/tools/testing/platform_check.py +143 -0
  1082. icdev/tools/testing/production_audit.py +1862 -0
  1083. icdev/tools/testing/production_remediate.py +804 -0
  1084. icdev/tools/testing/screenshot_validator.py +539 -0
  1085. icdev/tools/testing/smoke_test.py +283 -0
  1086. icdev/tools/testing/test_agent_models.py +117 -0
  1087. icdev/tools/testing/test_orchestrator.py +957 -0
  1088. icdev/tools/testing/utils.py +229 -0
  1089. icdev/tools/translation/__init__.py +17 -0
  1090. icdev/tools/translation/code_translator.py +550 -0
  1091. icdev/tools/translation/dependency_mapper.py +277 -0
  1092. icdev/tools/translation/feature_map.py +395 -0
  1093. icdev/tools/translation/project_assembler.py +439 -0
  1094. icdev/tools/translation/source_extractor.py +609 -0
  1095. icdev/tools/translation/test_translator.py +333 -0
  1096. icdev/tools/translation/translation_manager.py +582 -0
  1097. icdev/tools/translation/translation_validator.py +662 -0
  1098. icdev/tools/translation/type_checker.py +371 -0
  1099. icdev-1.0.0.dist-info/METADATA +868 -0
  1100. icdev-1.0.0.dist-info/RECORD +1105 -0
  1101. icdev-1.0.0.dist-info/WHEEL +5 -0
  1102. icdev-1.0.0.dist-info/entry_points.txt +9 -0
  1103. icdev-1.0.0.dist-info/licenses/LICENSE +254 -0
  1104. icdev-1.0.0.dist-info/licenses/NOTICE +268 -0
  1105. icdev-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1552 @@
1
+ #!/usr/bin/env python3
2
+ # CUI // SP-CTI
3
+ # Controlled by: Department of Defense
4
+ # CUI Category: CTI
5
+ # Distribution: D
6
+ # POC: ICDEV System Administrator
7
+ """COA (Course of Action) Generator for the ICDEV RICOAS Digital Program Twin.
8
+
9
+ Generates 3 standard Courses of Action (Speed / Balanced / Comprehensive) plus
10
+ RED-tier alternative COAs. Each COA includes architecture summary, PI roadmap,
11
+ risk register, compliance impact, resource plan, cost estimate, supply-chain
12
+ impact, and boundary tier.
13
+
14
+ Usage:
15
+ # Generate the 3 standard COAs for an intake session
16
+ python tools/simulation/coa_generator.py --session-id <id> --generate-3-coas --json
17
+
18
+ # Generate with automatic simulation runs
19
+ python tools/simulation/coa_generator.py --session-id <id> --generate-3-coas --simulate --json
20
+
21
+ # Generate alternative COAs for a RED-tier requirement
22
+ python tools/simulation/coa_generator.py --session-id <id> --generate-alternative \\
23
+ --requirement-id <id> --json
24
+
25
+ # Compare all COAs for a session
26
+ python tools/simulation/coa_generator.py --session-id <id> --compare --json
27
+
28
+ # Select a COA
29
+ python tools/simulation/coa_generator.py --coa-id <id> --select \\
30
+ --selected-by "Jane Smith" --rationale "Best scope/risk balance" --json
31
+
32
+ # List COAs for a session
33
+ python tools/simulation/coa_generator.py --session-id <id> --list --json
34
+
35
+ Databases:
36
+ - data/icdev.db: intake_requirements, safe_decomposition,
37
+ boundary_impact_assessments, coa_definitions, coa_comparisons,
38
+ simulation_scenarios, simulation_results
39
+ """
40
+
41
+ import argparse
42
+ import json
43
+ import os
44
+ import sqlite3
45
+ import sys
46
+ import uuid
47
+ from datetime import datetime, timezone
48
+ from pathlib import Path
49
+ from icdev._paths import get_project_root
50
+
51
+ BASE_DIR = get_project_root()
52
+ DB_PATH = Path(os.environ.get("ICDEV_DB_PATH", str(BASE_DIR / "data" / "icdev.db")))
53
+
54
+ RED_ALT_PATTERNS_PATH = BASE_DIR / "context" / "requirements" / "red_alternative_patterns.json"
55
+
56
+ # Graceful import of audit logger
57
+ try:
58
+ from icdev.tools.audit.audit_logger import log_event
59
+ _HAS_AUDIT = True
60
+ except ImportError:
61
+ _HAS_AUDIT = False
62
+ def log_event(**kwargs) -> int: # type: ignore[misc]
63
+ return -1
64
+
65
+
66
+ # ---------------------------------------------------------------------------
67
+ # Constants
68
+ # ---------------------------------------------------------------------------
69
+
70
+ # T-shirt size to hours mapping (used for cost estimation)
71
+ _TSHIRT_HOURS = {
72
+ "XS": 8,
73
+ "S": 24,
74
+ "M": 80,
75
+ "L": 200,
76
+ "XL": 480,
77
+ "XXL": 960,
78
+ }
79
+
80
+ # Blended hourly rate for cost range estimates (low / high)
81
+ _RATE_LOW = 125 # USD/hr
82
+ _RATE_HIGH = 200 # USD/hr
83
+
84
+ # Tier rank for comparisons (lower is better from risk perspective)
85
+ _TIER_RANK = {"GREEN": 1, "YELLOW": 2, "ORANGE": 3, "RED": 4}
86
+ _RANK_TIER = {v: k for k, v in _TIER_RANK.items()}
87
+
88
+
89
+ # ---------------------------------------------------------------------------
90
+ # Database helpers
91
+ # ---------------------------------------------------------------------------
92
+
93
+ def _get_connection(db_path=None):
94
+ """Get database connection with dict-like row access."""
95
+ path = db_path or DB_PATH
96
+ if not path.exists():
97
+ raise FileNotFoundError(
98
+ f"Database not found: {path}\nRun: python tools/db/init_icdev_db.py"
99
+ )
100
+ conn = sqlite3.connect(str(path))
101
+ conn.row_factory = sqlite3.Row
102
+ return conn
103
+
104
+
105
+ def _generate_id(prefix="coa"):
106
+ """Generate a unique ID with prefix."""
107
+ return f"{prefix}-{uuid.uuid4().hex[:12]}"
108
+
109
+
110
+ def _now_iso():
111
+ """Return current UTC timestamp in ISO format."""
112
+ return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
113
+
114
+
115
+ # ---------------------------------------------------------------------------
116
+ # Data loaders
117
+ # ---------------------------------------------------------------------------
118
+
119
+ def _load_requirements(conn, session_id):
120
+ """Load intake requirements for a session, grouped by priority."""
121
+ rows = conn.execute(
122
+ "SELECT * FROM intake_requirements WHERE session_id = ? ORDER BY priority",
123
+ (session_id,),
124
+ ).fetchall()
125
+ reqs = [dict(r) for r in rows]
126
+ by_priority = {"critical": [], "high": [], "medium": [], "low": []}
127
+ for r in reqs:
128
+ by_priority.setdefault(r.get("priority", "medium"), []).append(r)
129
+ return reqs, by_priority
130
+
131
+
132
+ def _load_decomposition(conn, session_id):
133
+ """Load SAFe decomposition items for a session."""
134
+ rows = conn.execute(
135
+ "SELECT * FROM safe_decomposition WHERE session_id = ? ORDER BY level, title",
136
+ (session_id,),
137
+ ).fetchall()
138
+ return [dict(r) for r in rows]
139
+
140
+
141
+ def _load_boundary_assessments(conn, session_id):
142
+ """Load boundary impact assessments for a session."""
143
+ rows = conn.execute(
144
+ "SELECT * FROM boundary_impact_assessments WHERE session_id = ?",
145
+ (session_id,),
146
+ ).fetchall()
147
+ return [dict(r) for r in rows]
148
+
149
+
150
+ def _get_session(conn, session_id):
151
+ """Load the intake session record."""
152
+ row = conn.execute(
153
+ "SELECT * FROM intake_sessions WHERE id = ?", (session_id,)
154
+ ).fetchone()
155
+ if not row:
156
+ raise ValueError(f"Intake session not found: {session_id}")
157
+ return dict(row)
158
+
159
+
160
+ def _load_red_alternative_patterns():
161
+ """Load RED alternative patterns from context file."""
162
+ if not RED_ALT_PATTERNS_PATH.exists():
163
+ return {"alternative_patterns": [], "selection_criteria": {}}
164
+ with open(RED_ALT_PATTERNS_PATH, "r", encoding="utf-8") as f:
165
+ return json.load(f)
166
+
167
+
168
+ # ---------------------------------------------------------------------------
169
+ # Cost estimation helpers
170
+ # ---------------------------------------------------------------------------
171
+
172
+ def _sum_tshirt_hours(items):
173
+ """Sum estimated hours from T-shirt sizes of decomposition items."""
174
+ total = 0
175
+ breakdown = {}
176
+ for item in items:
177
+ size = item.get("t_shirt_size") or "M"
178
+ hours = _TSHIRT_HOURS.get(size, 80)
179
+ total += hours
180
+ breakdown[size] = breakdown.get(size, 0) + 1
181
+ return total, breakdown
182
+
183
+
184
+ def _cost_estimate(hours, breakdown):
185
+ """Build a cost estimate dict from total hours."""
186
+ return {
187
+ "hours": hours,
188
+ "cost_range_low": hours * _RATE_LOW,
189
+ "cost_range_high": hours * _RATE_HIGH,
190
+ "t_shirt_breakdown": breakdown,
191
+ }
192
+
193
+
194
+ # ---------------------------------------------------------------------------
195
+ # Boundary tier aggregation
196
+ # ---------------------------------------------------------------------------
197
+
198
+ def _best_tier(assessments):
199
+ """Return the best (lowest-impact) tier from assessments."""
200
+ if not assessments:
201
+ return "GREEN"
202
+ ranks = [_TIER_RANK.get(a.get("impact_tier", "GREEN"), 1) for a in assessments]
203
+ return _RANK_TIER.get(min(ranks), "GREEN")
204
+
205
+
206
+ def _worst_tier(assessments):
207
+ """Return the worst (highest-impact) tier from assessments."""
208
+ if not assessments:
209
+ return "GREEN"
210
+ ranks = [_TIER_RANK.get(a.get("impact_tier", "GREEN"), 1) for a in assessments]
211
+ return _RANK_TIER.get(max(ranks), "GREEN")
212
+
213
+
214
+ def _average_tier(assessments):
215
+ """Return the average (rounded) tier from assessments."""
216
+ if not assessments:
217
+ return "GREEN"
218
+ ranks = [_TIER_RANK.get(a.get("impact_tier", "GREEN"), 1) for a in assessments]
219
+ avg = sum(ranks) / len(ranks)
220
+ rounded = round(avg)
221
+ return _RANK_TIER.get(rounded, "YELLOW")
222
+
223
+
224
+ # ---------------------------------------------------------------------------
225
+ # Risk register generator
226
+ # ---------------------------------------------------------------------------
227
+
228
+ def _generate_risk_register(coa_type, reqs, assessments):
229
+ """Generate top-5 risks for a COA type."""
230
+ base_risks = {
231
+ "speed": [
232
+ {"id": "R-01", "description": "Insufficient test coverage due to accelerated timeline",
233
+ "probability": "high", "impact": "high",
234
+ "mitigation": "Automated test generation, prioritize critical path tests"},
235
+ {"id": "R-02", "description": "Technical debt accumulation from shortcuts",
236
+ "probability": "high", "impact": "medium",
237
+ "mitigation": "Schedule refactoring sprint in next PI"},
238
+ {"id": "R-03", "description": "Incomplete compliance artifacts",
239
+ "probability": "medium", "impact": "high",
240
+ "mitigation": "Parallel compliance artifact generation"},
241
+ {"id": "R-04", "description": "Integration defects from limited scope testing",
242
+ "probability": "medium", "impact": "medium",
243
+ "mitigation": "API contract testing at integration points"},
244
+ {"id": "R-05", "description": "Rework required when adding deferred features",
245
+ "probability": "high", "impact": "medium",
246
+ "mitigation": "Design for extensibility in core architecture"},
247
+ ],
248
+ "balanced": [
249
+ {"id": "R-01", "description": "Schedule pressure on P2 requirements",
250
+ "probability": "medium", "impact": "medium",
251
+ "mitigation": "WSJF prioritization, buffer sprints between PIs"},
252
+ {"id": "R-02", "description": "Resource contention across work streams",
253
+ "probability": "medium", "impact": "medium",
254
+ "mitigation": "SAFe capacity allocation, clear team assignments"},
255
+ {"id": "R-03", "description": "Boundary impact from YELLOW-tier items",
256
+ "probability": "low", "impact": "high",
257
+ "mitigation": "Early boundary assessment, incremental SSP updates"},
258
+ {"id": "R-04", "description": "Dependency on external system availability",
259
+ "probability": "low", "impact": "medium",
260
+ "mitigation": "Mock services for development, ISA tracking"},
261
+ {"id": "R-05", "description": "Compliance gap in deferred P3 items",
262
+ "probability": "low", "impact": "low",
263
+ "mitigation": "Compliance coverage tracking per PI"},
264
+ ],
265
+ "comprehensive": [
266
+ {"id": "R-01", "description": "Feature creep and scope growth beyond estimates",
267
+ "probability": "high", "impact": "medium",
268
+ "mitigation": "Strict change control board, PI commitment gates"},
269
+ {"id": "R-02", "description": "Extended timeline increases cost overrun risk",
270
+ "probability": "medium", "impact": "high",
271
+ "mitigation": "Earned value management, monthly burn-rate reviews"},
272
+ {"id": "R-03", "description": "Team fatigue on long-duration project",
273
+ "probability": "medium", "impact": "medium",
274
+ "mitigation": "Sprint rotation, innovation sprints between PIs"},
275
+ {"id": "R-04", "description": "Technology obsolescence during long build",
276
+ "probability": "low", "impact": "medium",
277
+ "mitigation": "Architecture Decision Records, modular design"},
278
+ {"id": "R-05", "description": "Stakeholder engagement decline over extended period",
279
+ "probability": "medium", "impact": "medium",
280
+ "mitigation": "PI demos, monthly stakeholder briefings"},
281
+ ],
282
+ }
283
+ risks = base_risks.get(coa_type, base_risks["balanced"])
284
+
285
+ # Add boundary-specific risk if RED-tier assessments exist
286
+ red_count = sum(1 for a in assessments if a.get("impact_tier") == "RED")
287
+ if red_count > 0 and len(risks) < 6:
288
+ risks.append({
289
+ "id": f"R-{len(risks)+1:02d}",
290
+ "description": f"{red_count} requirement(s) with RED boundary impact may invalidate ATO",
291
+ "probability": "high",
292
+ "impact": "critical",
293
+ "mitigation": "Generate alternative COAs, engage AO early",
294
+ })
295
+
296
+ return risks[:5]
297
+
298
+
299
+ # ---------------------------------------------------------------------------
300
+ # Architecture summary generator
301
+ # ---------------------------------------------------------------------------
302
+
303
+ def _generate_architecture(coa_type, reqs, decomposition):
304
+ """Generate architecture summary for a COA type."""
305
+ component_counts = {
306
+ "speed": {"services": 2, "databases": 1, "queues": 0, "caches": 0},
307
+ "balanced": {"services": 4, "databases": 1, "queues": 1, "caches": 1},
308
+ "comprehensive": {"services": 8, "databases": 2, "queues": 2, "caches": 2},
309
+ }
310
+ base = component_counts.get(coa_type, component_counts["balanced"])
311
+
312
+ # Scale based on decomposition size
313
+ epic_count = sum(1 for d in decomposition if d.get("level") == "epic")
314
+ if epic_count > 3:
315
+ scale = min(epic_count / 3.0, 2.0)
316
+ for key in base:
317
+ base[key] = max(1, int(base[key] * scale))
318
+
319
+ patterns = {
320
+ "speed": "Monolithic with modular boundaries",
321
+ "balanced": "Modular monolith with service extraction points",
322
+ "comprehensive": "Microservices with event-driven integration",
323
+ }
324
+
325
+ return {
326
+ "pattern": patterns.get(coa_type, patterns["balanced"]),
327
+ "components": base,
328
+ "infrastructure": {
329
+ "compute": "AWS GovCloud ECS" if coa_type == "speed" else "AWS GovCloud EKS",
330
+ "database": "RDS PostgreSQL",
331
+ "monitoring": "ELK + Prometheus/Grafana",
332
+ "ci_cd": "GitLab CI/CD",
333
+ },
334
+ "security": {
335
+ "auth": "CAC/PKI + OAuth 2.0",
336
+ "encryption": "FIPS 140-2 (TLS 1.3, AES-256)",
337
+ "network": "VPC with private subnets, NACLs",
338
+ },
339
+ }
340
+
341
+
342
+ # ---------------------------------------------------------------------------
343
+ # PI roadmap generator
344
+ # ---------------------------------------------------------------------------
345
+
346
+ def _generate_pi_roadmap(coa_type, reqs_by_priority, decomposition):
347
+ """Generate PI roadmap for a COA type."""
348
+ # Determine how many PIs
349
+ pi_counts = {"speed": 2, "balanced": 3, "comprehensive": 5}
350
+ num_pis = pi_counts.get(coa_type, 3)
351
+
352
+ # Gather items by PI target from decomposition
353
+ items_by_pi = {}
354
+ for item in decomposition:
355
+ pi = item.get("pi_target") or "PI-1"
356
+ items_by_pi.setdefault(pi, []).append(item.get("title", "Untitled"))
357
+
358
+ roadmap = []
359
+ for pi_num in range(1, num_pis + 1):
360
+ pi_key = f"PI-{pi_num}"
361
+ pi_items = items_by_pi.get(pi_key, [])
362
+
363
+ # If no items mapped to this PI, assign based on COA type
364
+ if not pi_items:
365
+ if coa_type == "speed" and pi_num == 1:
366
+ pi_items = [(r.get("refined_text") or r.get("raw_text") or "Requirement")[:80]
367
+ for r in reqs_by_priority.get("critical", [])
368
+ + reqs_by_priority.get("high", [])]
369
+ elif coa_type == "balanced":
370
+ if pi_num <= 2:
371
+ pool = reqs_by_priority.get("critical", []) + reqs_by_priority.get("high", [])
372
+ else:
373
+ pool = reqs_by_priority.get("medium", [])
374
+ pi_items = [(r.get("refined_text") or r.get("raw_text") or "Requirement")[:80]
375
+ for r in pool[:5]]
376
+ elif coa_type == "comprehensive":
377
+ all_reqs = []
378
+ for p in ("critical", "high", "medium", "low"):
379
+ all_reqs.extend(reqs_by_priority.get(p, []))
380
+ chunk = len(all_reqs) // num_pis if num_pis else 1
381
+ chunk = max(chunk, 1)
382
+ start = (pi_num - 1) * chunk
383
+ pi_items = [(r.get("refined_text") or r.get("raw_text") or "Requirement")[:80]
384
+ for r in all_reqs[start:start + chunk]]
385
+
386
+ milestones = []
387
+ if pi_num == 1:
388
+ milestones.append("Architecture baseline approved")
389
+ milestones.append("Initial ATO artifacts generated")
390
+ if pi_num == num_pis:
391
+ milestones.append("Full system integration test")
392
+ milestones.append("ATO package submission")
393
+ if 1 < pi_num < num_pis:
394
+ milestones.append(f"PI-{pi_num} integration review")
395
+
396
+ roadmap.append({
397
+ "pi": pi_key,
398
+ "items": pi_items[:10], # Cap at 10 items per PI
399
+ "milestones": milestones,
400
+ })
401
+
402
+ return roadmap
403
+
404
+
405
+ # ---------------------------------------------------------------------------
406
+ # Compliance impact generator
407
+ # ---------------------------------------------------------------------------
408
+
409
+ def _generate_compliance_impact(coa_type, assessments):
410
+ """Generate compliance impact summary for a COA type."""
411
+ coverage_map = {"speed": 70.0, "balanced": 85.0, "comprehensive": 95.0}
412
+ coverage = coverage_map.get(coa_type, 85.0)
413
+
414
+ affected_controls = set()
415
+ for a in assessments:
416
+ ctrls = a.get("affected_controls")
417
+ if ctrls:
418
+ try:
419
+ parsed = json.loads(ctrls) if isinstance(ctrls, str) else ctrls
420
+ if isinstance(parsed, list):
421
+ affected_controls.update(parsed)
422
+ except (json.JSONDecodeError, TypeError):
423
+ pass
424
+
425
+ return {
426
+ "coverage_pct": coverage,
427
+ "affected_controls": sorted(affected_controls)[:20],
428
+ "ssp_update_required": any(
429
+ a.get("impact_tier") in ("ORANGE", "RED") for a in assessments
430
+ ),
431
+ "poam_items_expected": max(0, int((100 - coverage) / 5)),
432
+ "frameworks": ["NIST 800-53", "FedRAMP Moderate", "CMMC Level 2"],
433
+ }
434
+
435
+
436
+ # ---------------------------------------------------------------------------
437
+ # Supply chain impact generator
438
+ # ---------------------------------------------------------------------------
439
+
440
+ def _generate_supply_chain_impact(coa_type, reqs):
441
+ """Generate supply chain impact summary."""
442
+ vendor_count = {"speed": 2, "balanced": 4, "comprehensive": 6}
443
+ return {
444
+ "estimated_vendor_count": vendor_count.get(coa_type, 4),
445
+ "scrm_assessment_required": coa_type != "speed",
446
+ "section_889_review": True,
447
+ "isa_agreements_needed": 1 if coa_type == "speed" else (
448
+ 2 if coa_type == "balanced" else 3
449
+ ),
450
+ "cots_components": max(1, len(reqs) // 3),
451
+ }
452
+
453
+
454
+ # ---------------------------------------------------------------------------
455
+ # Simulation helper (creates scenario + runs basic simulation)
456
+ # ---------------------------------------------------------------------------
457
+
458
+ def _create_simulation_for_coa(conn, coa_id, session_id, project_id, coa_type, coa_data):
459
+ """Create a simulation scenario and basic results for a COA."""
460
+ scenario_id = _generate_id("sim")
461
+ now = _now_iso()
462
+
463
+ base_state = {
464
+ "coa_id": coa_id,
465
+ "coa_type": coa_type,
466
+ "requirements_count": len(coa_data.get("requirements_included", [])),
467
+ "timeline_pis": coa_data.get("timeline_pis", 3),
468
+ "cost_estimate": coa_data.get("cost_estimate", {}),
469
+ }
470
+ modifications = {
471
+ "scenario_purpose": f"Simulate {coa_type} COA outcome",
472
+ "variables_tested": ["schedule", "cost", "risk", "compliance"],
473
+ }
474
+
475
+ conn.execute(
476
+ """INSERT INTO simulation_scenarios
477
+ (id, project_id, session_id, scenario_name, scenario_type,
478
+ base_state, modifications, status, classification, created_by, created_at)
479
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
480
+ (
481
+ scenario_id, project_id, session_id,
482
+ f"{coa_type.title()} COA Simulation",
483
+ "coa_comparison",
484
+ json.dumps(base_state), json.dumps(modifications),
485
+ "completed", "CUI", "icdev-simulation-engine", now,
486
+ ),
487
+ )
488
+
489
+ # Generate simulation results across dimensions
490
+ timeline_pis = coa_data.get("timeline_pis", 3)
491
+ hours = coa_data.get("cost_estimate", {}).get("hours", 200)
492
+ compliance_pct = coa_data.get("compliance_impact", {}).get("coverage_pct", 85.0)
493
+
494
+ dimensions = [
495
+ {
496
+ "dimension": "schedule",
497
+ "metric_name": "timeline_sprints",
498
+ "baseline_value": 20.0,
499
+ "simulated_value": float(timeline_pis * 5),
500
+ },
501
+ {
502
+ "dimension": "cost",
503
+ "metric_name": "total_hours",
504
+ "baseline_value": 500.0,
505
+ "simulated_value": float(hours),
506
+ },
507
+ {
508
+ "dimension": "compliance",
509
+ "metric_name": "coverage_pct",
510
+ "baseline_value": 80.0,
511
+ "simulated_value": compliance_pct,
512
+ },
513
+ {
514
+ "dimension": "risk",
515
+ "metric_name": "risk_score",
516
+ "baseline_value": 0.5,
517
+ "simulated_value": {"speed": 0.7, "balanced": 0.4, "comprehensive": 0.2}.get(
518
+ coa_type, 0.5
519
+ ),
520
+ },
521
+ ]
522
+
523
+ for dim in dimensions:
524
+ delta = dim["simulated_value"] - dim["baseline_value"]
525
+ delta_pct = (delta / dim["baseline_value"] * 100.0) if dim["baseline_value"] else 0.0
526
+ # Determine impact tier
527
+ abs_pct = abs(delta_pct)
528
+ if abs_pct < 10:
529
+ tier = "GREEN"
530
+ elif abs_pct < 25:
531
+ tier = "YELLOW"
532
+ elif abs_pct < 50:
533
+ tier = "ORANGE"
534
+ else:
535
+ tier = "RED"
536
+
537
+ conn.execute(
538
+ """INSERT INTO simulation_results
539
+ (scenario_id, dimension, metric_name, baseline_value,
540
+ simulated_value, delta, delta_pct, confidence, impact_tier,
541
+ details, calculated_at)
542
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
543
+ (
544
+ scenario_id, dim["dimension"], dim["metric_name"],
545
+ dim["baseline_value"], dim["simulated_value"],
546
+ round(delta, 2), round(delta_pct, 2),
547
+ 0.8, tier,
548
+ json.dumps({"coa_type": coa_type}), now,
549
+ ),
550
+ )
551
+
552
+ # Update scenario status
553
+ conn.execute(
554
+ "UPDATE simulation_scenarios SET status = 'completed', completed_at = ? WHERE id = ?",
555
+ (now, scenario_id),
556
+ )
557
+
558
+ return scenario_id
559
+
560
+
561
+ # ---------------------------------------------------------------------------
562
+ # Core functions
563
+ # ---------------------------------------------------------------------------
564
+
565
+ def generate_3_coas(session_id, project_id=None, simulate=False, db_path=None):
566
+ """Generate 3 Courses of Action (Speed / Balanced / Comprehensive).
567
+
568
+ Args:
569
+ session_id: The intake session ID.
570
+ project_id: Optional project ID override (read from session if None).
571
+ simulate: If True, create simulation scenarios and run them.
572
+ db_path: Optional database path override.
573
+
574
+ Returns:
575
+ dict with session_id, coas list, and recommendation.
576
+ """
577
+ conn = _get_connection(db_path)
578
+ try:
579
+ session = _get_session(conn, session_id)
580
+ project_id = project_id or session.get("project_id")
581
+ if not project_id:
582
+ raise ValueError("project_id is required (not found in session)")
583
+
584
+ reqs, reqs_by_priority = _load_requirements(conn, session_id)
585
+ decomposition = _load_decomposition(conn, session_id)
586
+ assessments = _load_boundary_assessments(conn, session_id)
587
+
588
+ now = _now_iso()
589
+
590
+ # Classify requirements by priority groups
591
+ p1_reqs = reqs_by_priority.get("critical", []) + reqs_by_priority.get("high", [])
592
+ p2_reqs = reqs_by_priority.get("medium", [])
593
+ p3_reqs = reqs_by_priority.get("low", [])
594
+
595
+ p1_ids = [r["id"] for r in p1_reqs]
596
+ p2_ids = [r["id"] for r in p2_reqs]
597
+ p3_ids = [r["id"] for r in p3_reqs]
598
+
599
+ # Classify decomposition items by associated requirements
600
+ def _items_for_req_ids(req_ids):
601
+ """Filter decomposition items whose source requirements intersect."""
602
+ matched = []
603
+ req_id_set = set(req_ids)
604
+ for item in decomposition:
605
+ src = item.get("source_requirement_ids")
606
+ if src:
607
+ try:
608
+ parsed = json.loads(src) if isinstance(src, str) else src
609
+ if isinstance(parsed, list) and req_id_set.intersection(parsed):
610
+ matched.append(item)
611
+ continue
612
+ except (json.JSONDecodeError, TypeError):
613
+ pass
614
+ # Include items not linked to any requirement in P1
615
+ if not src and req_ids is p1_ids:
616
+ matched.append(item)
617
+ return matched
618
+
619
+ p1_items = _items_for_req_ids(p1_ids)
620
+ p2_items = _items_for_req_ids(p2_ids)
621
+ # For comprehensive, use all decomposition items
622
+ all_items = decomposition if decomposition else p1_items + p2_items
623
+
624
+ # --- Speed COA ---
625
+ speed_hours, speed_breakdown = _sum_tshirt_hours(p1_items)
626
+ speed_cost = _cost_estimate(speed_hours, speed_breakdown)
627
+ speed_compliance = _generate_compliance_impact("speed", assessments)
628
+ speed_arch = _generate_architecture("speed", p1_reqs, p1_items)
629
+ speed_roadmap = _generate_pi_roadmap("speed", reqs_by_priority, p1_items)
630
+ speed_risks = _generate_risk_register("speed", p1_reqs, assessments)
631
+ speed_supply = _generate_supply_chain_impact("speed", p1_reqs)
632
+
633
+ speed_data = {
634
+ "coa_type": "speed",
635
+ "coa_name": "Speed: Minimum Viable Delivery",
636
+ "scope_description": "P1 (critical + high priority) requirements only",
637
+ "requirements_included": p1_ids,
638
+ "architecture_summary": speed_arch,
639
+ "pi_roadmap": speed_roadmap,
640
+ "risk_register": speed_risks,
641
+ "compliance_impact": speed_compliance,
642
+ "cost_estimate": speed_cost,
643
+ "supply_chain_impact": speed_supply,
644
+ "boundary_tier": _best_tier(assessments),
645
+ "timeline_sprints": 10,
646
+ "timeline_pis": min(2, max(1, len(speed_roadmap))),
647
+ "risk_level": "high",
648
+ "recommended": False,
649
+ "advantages": [
650
+ "Fastest delivery",
651
+ "Lowest initial cost",
652
+ "Quick feedback loop",
653
+ "Early capability delivery",
654
+ ],
655
+ "disadvantages": [
656
+ "Technical debt accumulation",
657
+ "Limited scope — P2/P3 deferred",
658
+ "Higher integration risk",
659
+ "May require significant rework later",
660
+ ],
661
+ }
662
+
663
+ # --- Balanced COA ---
664
+ balanced_items = p1_items + p2_items
665
+ balanced_hours, balanced_breakdown = _sum_tshirt_hours(balanced_items)
666
+ balanced_cost = _cost_estimate(balanced_hours, balanced_breakdown)
667
+ balanced_compliance = _generate_compliance_impact("balanced", assessments)
668
+ balanced_arch = _generate_architecture("balanced", p1_reqs + p2_reqs, balanced_items)
669
+ balanced_roadmap = _generate_pi_roadmap("balanced", reqs_by_priority, balanced_items)
670
+ balanced_risks = _generate_risk_register("balanced", p1_reqs + p2_reqs, assessments)
671
+ balanced_supply = _generate_supply_chain_impact("balanced", p1_reqs + p2_reqs)
672
+
673
+ balanced_data = {
674
+ "coa_type": "balanced",
675
+ "coa_name": "Balanced: Optimal Scope-Risk Tradeoff",
676
+ "scope_description": "P1 + P2 (critical, high, and medium priority) requirements",
677
+ "requirements_included": p1_ids + p2_ids,
678
+ "architecture_summary": balanced_arch,
679
+ "pi_roadmap": balanced_roadmap,
680
+ "risk_register": balanced_risks,
681
+ "compliance_impact": balanced_compliance,
682
+ "cost_estimate": balanced_cost,
683
+ "supply_chain_impact": balanced_supply,
684
+ "boundary_tier": _average_tier(assessments),
685
+ "timeline_sprints": 15,
686
+ "timeline_pis": min(3, max(2, len(balanced_roadmap))),
687
+ "risk_level": "moderate",
688
+ "recommended": True,
689
+ "advantages": [
690
+ "Good scope/risk balance",
691
+ "Reasonable timeline",
692
+ "Adequate compliance coverage",
693
+ "Sustainable development pace",
694
+ ],
695
+ "disadvantages": [
696
+ "Compromises on low-priority items",
697
+ "Moderate complexity",
698
+ ],
699
+ }
700
+
701
+ # --- Comprehensive COA ---
702
+ comp_hours, comp_breakdown = _sum_tshirt_hours(all_items)
703
+ comp_cost = _cost_estimate(comp_hours, comp_breakdown)
704
+ comp_compliance = _generate_compliance_impact("comprehensive", assessments)
705
+ comp_arch = _generate_architecture("comprehensive", reqs, all_items)
706
+ comp_roadmap = _generate_pi_roadmap("comprehensive", reqs_by_priority, all_items)
707
+ comp_risks = _generate_risk_register("comprehensive", reqs, assessments)
708
+ comp_supply = _generate_supply_chain_impact("comprehensive", reqs)
709
+
710
+ comp_data = {
711
+ "coa_type": "comprehensive",
712
+ "coa_name": "Comprehensive: Full Scope Delivery",
713
+ "scope_description": "All requirements (P1 + P2 + P3 — all priorities)",
714
+ "requirements_included": p1_ids + p2_ids + p3_ids,
715
+ "architecture_summary": comp_arch,
716
+ "pi_roadmap": comp_roadmap,
717
+ "risk_register": comp_risks,
718
+ "compliance_impact": comp_compliance,
719
+ "cost_estimate": comp_cost,
720
+ "supply_chain_impact": comp_supply,
721
+ "boundary_tier": _worst_tier(assessments),
722
+ "timeline_sprints": 25,
723
+ "timeline_pis": min(5, max(3, len(comp_roadmap))),
724
+ "risk_level": "low",
725
+ "recommended": False,
726
+ "advantages": [
727
+ "Complete scope coverage",
728
+ "Lowest residual risk",
729
+ "Full compliance coverage",
730
+ "Future-proof architecture",
731
+ ],
732
+ "disadvantages": [
733
+ "Longest timeline",
734
+ "Highest cost",
735
+ "Feature creep risk",
736
+ "Stakeholder patience required",
737
+ ],
738
+ }
739
+
740
+ # Insert all three COAs into the database
741
+ coas = []
742
+ for coa_data in (speed_data, balanced_data, comp_data):
743
+ coa_id = _generate_id("coa")
744
+ coa_data["id"] = coa_id
745
+
746
+ sim_scenario_id = None
747
+ if simulate:
748
+ sim_scenario_id = _create_simulation_for_coa(
749
+ conn, coa_id, session_id, project_id,
750
+ coa_data["coa_type"], coa_data,
751
+ )
752
+ coa_data["simulation_scenario_id"] = sim_scenario_id
753
+
754
+ conn.execute(
755
+ """INSERT INTO coa_definitions
756
+ (id, session_id, project_id, coa_type, coa_name, description,
757
+ architecture_summary, cost_estimate, risk_profile, timeline,
758
+ compliance_impact, supply_chain_impact, boundary_tier,
759
+ simulation_scenario_id, status, classification, created_at, updated_at)
760
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
761
+ (
762
+ coa_id, session_id, project_id,
763
+ coa_data["coa_type"],
764
+ coa_data["coa_name"],
765
+ coa_data["scope_description"],
766
+ json.dumps(coa_data["architecture_summary"]),
767
+ json.dumps(coa_data["cost_estimate"]),
768
+ json.dumps({
769
+ "risk_level": coa_data["risk_level"],
770
+ "risk_register": coa_data["risk_register"],
771
+ "advantages": coa_data["advantages"],
772
+ "disadvantages": coa_data["disadvantages"],
773
+ }),
774
+ json.dumps({
775
+ "timeline_sprints": coa_data["timeline_sprints"],
776
+ "timeline_pis": coa_data["timeline_pis"],
777
+ "pi_roadmap": coa_data["pi_roadmap"],
778
+ "requirements_included": coa_data["requirements_included"],
779
+ }),
780
+ json.dumps(coa_data["compliance_impact"]),
781
+ json.dumps(coa_data["supply_chain_impact"]),
782
+ coa_data["boundary_tier"],
783
+ sim_scenario_id,
784
+ "simulated" if simulate else "draft",
785
+ "CUI", now, now,
786
+ ),
787
+ )
788
+ coas.append(coa_data)
789
+
790
+ conn.commit()
791
+
792
+ # Audit
793
+ if _HAS_AUDIT:
794
+ log_event(
795
+ event_type="coa_generated",
796
+ actor="icdev-simulation-engine",
797
+ action=f"Generated 3 COAs for session {session_id}",
798
+ project_id=project_id,
799
+ details=json.dumps({
800
+ "session_id": session_id,
801
+ "coa_ids": [c["id"] for c in coas],
802
+ "simulated": simulate,
803
+ }),
804
+ )
805
+
806
+ return {
807
+ "session_id": session_id,
808
+ "project_id": project_id,
809
+ "coas": coas,
810
+ "recommendation": "balanced",
811
+ }
812
+
813
+ finally:
814
+ conn.close()
815
+
816
+
817
+ def generate_alternative_coa(session_id, requirement_id, project_id=None, db_path=None):
818
+ """Generate alternative COAs for a RED-tier requirement.
819
+
820
+ Reads boundary assessment and RED alternative patterns, then creates
821
+ COA variants that achieve the same intent within ATO boundaries.
822
+
823
+ Args:
824
+ session_id: The intake session ID.
825
+ requirement_id: The requirement with RED-tier impact.
826
+ project_id: Optional project ID override.
827
+ db_path: Optional database path override.
828
+
829
+ Returns:
830
+ dict with requirement_id, original_intent, and alternatives list.
831
+ """
832
+ conn = _get_connection(db_path)
833
+ try:
834
+ session = _get_session(conn, session_id)
835
+ project_id = project_id or session.get("project_id")
836
+ if not project_id:
837
+ raise ValueError("project_id is required (not found in session)")
838
+
839
+ # Load the requirement
840
+ req_row = conn.execute(
841
+ "SELECT * FROM intake_requirements WHERE id = ?",
842
+ (requirement_id,),
843
+ ).fetchone()
844
+ if not req_row:
845
+ raise ValueError(f"Requirement not found: {requirement_id}")
846
+ req = dict(req_row)
847
+ original_intent = req.get("refined_text") or req.get("raw_text", "")
848
+
849
+ # Load boundary assessment for this requirement
850
+ assessment_rows = conn.execute(
851
+ "SELECT * FROM boundary_impact_assessments WHERE requirement_id = ?",
852
+ (requirement_id,),
853
+ ).fetchall()
854
+ assessments = [dict(r) for r in assessment_rows]
855
+
856
+ if not assessments:
857
+ return {
858
+ "requirement_id": requirement_id,
859
+ "original_intent": original_intent,
860
+ "alternatives": [],
861
+ "message": "No boundary assessment found for this requirement",
862
+ }
863
+
864
+ # Determine applicable categories from assessments
865
+ applicable_categories = set()
866
+ for a in assessments:
867
+ cat = a.get("impact_category", "")
868
+ if cat:
869
+ applicable_categories.add(cat)
870
+
871
+ # Map boundary impact categories to RED alternative pattern triggers
872
+ category_to_trigger = {
873
+ "data_type_change": ["classification_change", "data_sensitivity"],
874
+ "boundary_change": ["boundary_expansion", "scope_increase"],
875
+ "new_interconnection": ["new_interconnection"],
876
+ "architecture": ["boundary_expansion", "scope_increase"],
877
+ "data_flow": ["data_sensitivity", "cross_network"],
878
+ "authentication": ["prohibited_technology"],
879
+ "authorization": ["scope_increase"],
880
+ "network": ["new_interconnection", "cross_network"],
881
+ "encryption": ["classification_change"],
882
+ "logging": ["scope_increase"],
883
+ "component_addition": ["boundary_expansion"],
884
+ }
885
+
886
+ triggers = set()
887
+ for cat in applicable_categories:
888
+ triggers.update(category_to_trigger.get(cat, ["boundary_expansion"]))
889
+
890
+ # Load patterns
891
+ patterns_data = _load_red_alternative_patterns()
892
+ all_patterns = patterns_data.get("alternative_patterns", [])
893
+ selection_criteria = patterns_data.get("selection_criteria", {})
894
+
895
+ # Filter applicable patterns
896
+ applicable_patterns = []
897
+ for pattern in all_patterns:
898
+ pattern_when = set(pattern.get("applicable_when", []))
899
+ if pattern_when.intersection(triggers):
900
+ applicable_patterns.append(pattern)
901
+
902
+ # If no patterns match, include the most generic ones
903
+ if not applicable_patterns:
904
+ applicable_patterns = [
905
+ p for p in all_patterns
906
+ if p.get("id") in ("ALT-PHASE", "ALT-SCOPE-REDUCE")
907
+ ]
908
+
909
+ now = _now_iso()
910
+ alternatives = []
911
+
912
+ # Score and sort patterns
913
+ tier_scores = selection_criteria.get("tier_scores", {
914
+ "GREEN": 1.0, "YELLOW": 0.75, "ORANGE": 0.5, "RED": 0.0,
915
+ })
916
+ cost_scores = selection_criteria.get("cost_scores", {
917
+ "low": 1.0, "medium": 0.6, "high": 0.3,
918
+ })
919
+ weights = selection_criteria.get("scoring_weights", {
920
+ "feasibility": 0.35, "resulting_tier_score": 0.25,
921
+ "timeline_score": 0.20, "cost_score": 0.20,
922
+ })
923
+
924
+ for pattern in applicable_patterns:
925
+ # Compute composite score
926
+ feasibility = pattern.get("feasibility", 0.5)
927
+ resulting_tier = pattern.get("resulting_tier", "YELLOW")
928
+ cost_impact = pattern.get("cost_impact", "medium")
929
+ timeline_days = pattern.get("estimated_timeline_days", 60)
930
+
931
+ tier_s = tier_scores.get(resulting_tier, 0.5)
932
+ cost_s = cost_scores.get(cost_impact, 0.5)
933
+ # Normalize timeline: 0-30 days = 1.0, 120+ days = 0.2
934
+ timeline_s = max(0.2, 1.0 - (timeline_days / 150.0))
935
+
936
+ score = (
937
+ weights.get("feasibility", 0.35) * feasibility
938
+ + weights.get("resulting_tier_score", 0.25) * tier_s
939
+ + weights.get("timeline_score", 0.20) * timeline_s
940
+ + weights.get("cost_score", 0.20) * cost_s
941
+ )
942
+
943
+ coa_id = _generate_id("coa")
944
+ alt_data = {
945
+ "id": coa_id,
946
+ "pattern_id": pattern.get("id"),
947
+ "pattern_name": pattern.get("name"),
948
+ "description": pattern.get("description"),
949
+ "resulting_tier": resulting_tier,
950
+ "feasibility": feasibility,
951
+ "tradeoffs": pattern.get("tradeoffs", []),
952
+ "implementation_steps": pattern.get("implementation_steps", []),
953
+ "estimated_timeline_days": timeline_days,
954
+ "cost_impact": cost_impact,
955
+ "composite_score": round(score, 3),
956
+ }
957
+
958
+ # Insert alternative COA into database
959
+ conn.execute(
960
+ """INSERT INTO coa_definitions
961
+ (id, session_id, project_id, coa_type, coa_name, description,
962
+ architecture_summary, cost_estimate, risk_profile, timeline,
963
+ compliance_impact, supply_chain_impact, boundary_tier,
964
+ status, classification, created_at, updated_at)
965
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
966
+ (
967
+ coa_id, session_id, project_id,
968
+ "alternative",
969
+ f"Alternative: {pattern.get('name', 'Unknown')}",
970
+ pattern.get("description", ""),
971
+ json.dumps({
972
+ "pattern_id": pattern.get("id"),
973
+ "implementation_steps": pattern.get("implementation_steps", []),
974
+ }),
975
+ json.dumps({
976
+ "cost_impact": cost_impact,
977
+ "estimated_timeline_days": timeline_days,
978
+ }),
979
+ json.dumps({
980
+ "risk_level": "varies",
981
+ "feasibility": feasibility,
982
+ "tradeoffs": pattern.get("tradeoffs", []),
983
+ }),
984
+ json.dumps({
985
+ "estimated_timeline_days": timeline_days,
986
+ "requirement_id": requirement_id,
987
+ }),
988
+ json.dumps({
989
+ "original_requirement": requirement_id,
990
+ "original_tier": "RED",
991
+ "resulting_tier": resulting_tier,
992
+ }),
993
+ json.dumps({}),
994
+ resulting_tier,
995
+ "draft", "CUI", now, now,
996
+ ),
997
+ )
998
+ alternatives.append(alt_data)
999
+
1000
+ # Sort by composite score descending
1001
+ alternatives.sort(key=lambda x: x.get("composite_score", 0), reverse=True)
1002
+
1003
+ conn.commit()
1004
+
1005
+ # Audit
1006
+ if _HAS_AUDIT:
1007
+ log_event(
1008
+ event_type="coa_alternative_generated",
1009
+ actor="icdev-simulation-engine",
1010
+ action=f"Generated {len(alternatives)} alternative COAs for RED-tier requirement {requirement_id}",
1011
+ project_id=project_id,
1012
+ details=json.dumps({
1013
+ "session_id": session_id,
1014
+ "requirement_id": requirement_id,
1015
+ "alternative_count": len(alternatives),
1016
+ "pattern_ids": [a.get("pattern_id") for a in alternatives],
1017
+ }),
1018
+ )
1019
+
1020
+ return {
1021
+ "requirement_id": requirement_id,
1022
+ "original_intent": original_intent,
1023
+ "alternatives": alternatives,
1024
+ }
1025
+
1026
+ finally:
1027
+ conn.close()
1028
+
1029
+
1030
+ def compare_coas(session_id, db_path=None):
1031
+ """Compare all COAs for a session across multiple dimensions.
1032
+
1033
+ Inserts pairwise comparison records into coa_comparisons.
1034
+
1035
+ Args:
1036
+ session_id: The intake session ID.
1037
+ db_path: Optional database path override.
1038
+
1039
+ Returns:
1040
+ dict with session_id, comparison_matrix, and recommendation.
1041
+ """
1042
+ conn = _get_connection(db_path)
1043
+ try:
1044
+ # Load all COAs for session
1045
+ rows = conn.execute(
1046
+ """SELECT * FROM coa_definitions
1047
+ WHERE session_id = ? AND coa_type IN ('speed', 'balanced', 'comprehensive')
1048
+ ORDER BY coa_type""",
1049
+ (session_id,),
1050
+ ).fetchall()
1051
+ coas = [dict(r) for r in rows]
1052
+
1053
+ if len(coas) < 2:
1054
+ return {
1055
+ "session_id": session_id,
1056
+ "comparison_matrix": [],
1057
+ "recommendation": None,
1058
+ "message": "Need at least 2 COAs to compare",
1059
+ }
1060
+
1061
+ now = _now_iso()
1062
+ dimensions = ["architecture", "compliance", "supply_chain", "schedule", "cost", "risk", "overall"]
1063
+ comparisons = []
1064
+
1065
+ # Score each COA across dimensions
1066
+ coa_scores = {}
1067
+ for coa in coas:
1068
+ cid = coa["id"]
1069
+ ctype = coa["coa_type"]
1070
+ scores = {}
1071
+
1072
+ # Architecture: comprehensive > balanced > speed
1073
+ scores["architecture"] = {"speed": 3.0, "balanced": 7.0, "comprehensive": 9.0}.get(ctype, 5.0)
1074
+
1075
+ # Compliance: higher coverage = better
1076
+ compliance = {}
1077
+ if coa.get("compliance_impact"):
1078
+ try:
1079
+ compliance = json.loads(coa["compliance_impact"]) if isinstance(coa["compliance_impact"], str) else coa["compliance_impact"]
1080
+ except (json.JSONDecodeError, TypeError):
1081
+ pass
1082
+ scores["compliance"] = compliance.get("coverage_pct", 80.0) / 10.0
1083
+
1084
+ # Supply chain: fewer vendors = less risk = higher score
1085
+ supply = {}
1086
+ if coa.get("supply_chain_impact"):
1087
+ try:
1088
+ supply = json.loads(coa["supply_chain_impact"]) if isinstance(coa["supply_chain_impact"], str) else coa["supply_chain_impact"]
1089
+ except (json.JSONDecodeError, TypeError):
1090
+ pass
1091
+ vendor_count = supply.get("estimated_vendor_count", 4)
1092
+ scores["supply_chain"] = max(1.0, 10.0 - vendor_count)
1093
+
1094
+ # Schedule: fewer PIs = faster = higher score
1095
+ timeline = {}
1096
+ if coa.get("timeline"):
1097
+ try:
1098
+ timeline = json.loads(coa["timeline"]) if isinstance(coa["timeline"], str) else coa["timeline"]
1099
+ except (json.JSONDecodeError, TypeError):
1100
+ pass
1101
+ pis = timeline.get("timeline_pis", 3)
1102
+ scores["schedule"] = max(1.0, 10.0 - pis * 1.5)
1103
+
1104
+ # Cost: lower cost = higher score
1105
+ cost = {}
1106
+ if coa.get("cost_estimate"):
1107
+ try:
1108
+ cost = json.loads(coa["cost_estimate"]) if isinstance(coa["cost_estimate"], str) else coa["cost_estimate"]
1109
+ except (json.JSONDecodeError, TypeError):
1110
+ pass
1111
+ hours = cost.get("hours", 200)
1112
+ scores["cost"] = max(1.0, 10.0 - (hours / 200.0))
1113
+
1114
+ # Risk: lower risk = higher score
1115
+ risk = {}
1116
+ if coa.get("risk_profile"):
1117
+ try:
1118
+ risk = json.loads(coa["risk_profile"]) if isinstance(coa["risk_profile"], str) else coa["risk_profile"]
1119
+ except (json.JSONDecodeError, TypeError):
1120
+ pass
1121
+ risk_level = risk.get("risk_level", "moderate")
1122
+ scores["risk"] = {"low": 9.0, "moderate": 6.0, "high": 3.0}.get(risk_level, 5.0)
1123
+
1124
+ # Overall: weighted average
1125
+ overall_weights = {
1126
+ "architecture": 0.15,
1127
+ "compliance": 0.20,
1128
+ "supply_chain": 0.10,
1129
+ "schedule": 0.20,
1130
+ "cost": 0.20,
1131
+ "risk": 0.15,
1132
+ }
1133
+ scores["overall"] = sum(
1134
+ scores.get(d, 5.0) * overall_weights.get(d, 0.15)
1135
+ for d in overall_weights
1136
+ )
1137
+
1138
+ coa_scores[cid] = {"scores": scores, "coa": coa}
1139
+
1140
+ # Generate pairwise comparisons
1141
+ coa_ids = [c["id"] for c in coas]
1142
+ for i in range(len(coa_ids)):
1143
+ for j in range(i + 1, len(coa_ids)):
1144
+ cid_a = coa_ids[i]
1145
+ cid_b = coa_ids[j]
1146
+ scores_a = coa_scores[cid_a]["scores"]
1147
+ scores_b = coa_scores[cid_b]["scores"]
1148
+ coa_a = coa_scores[cid_a]["coa"]
1149
+ coa_b = coa_scores[cid_b]["coa"]
1150
+
1151
+ for dim in dimensions:
1152
+ sa = round(scores_a.get(dim, 5.0), 2)
1153
+ sb = round(scores_b.get(dim, 5.0), 2)
1154
+
1155
+ if sa > sb:
1156
+ winner = "coa_a"
1157
+ elif sb > sa:
1158
+ winner = "coa_b"
1159
+ else:
1160
+ winner = "tie"
1161
+
1162
+ _generate_id("comp")
1163
+
1164
+ conn.execute(
1165
+ """INSERT INTO coa_comparisons
1166
+ (session_id, coa_a_id, coa_b_id, dimension,
1167
+ coa_a_score, coa_b_score, winner, rationale, created_at)
1168
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)""",
1169
+ (
1170
+ session_id, cid_a, cid_b, dim,
1171
+ sa, sb, winner,
1172
+ f"{coa_a['coa_type']}={sa} vs {coa_b['coa_type']}={sb}",
1173
+ now,
1174
+ ),
1175
+ )
1176
+
1177
+ comparisons.append({
1178
+ "coa_a_id": cid_a,
1179
+ "coa_a_type": coa_a["coa_type"],
1180
+ "coa_b_id": cid_b,
1181
+ "coa_b_type": coa_b["coa_type"],
1182
+ "dimension": dim,
1183
+ "coa_a_score": sa,
1184
+ "coa_b_score": sb,
1185
+ "winner": winner,
1186
+ })
1187
+
1188
+ conn.commit()
1189
+
1190
+ # Determine overall recommendation
1191
+ overall_scores = {
1192
+ cid: coa_scores[cid]["scores"].get("overall", 0)
1193
+ for cid in coa_ids
1194
+ }
1195
+ best_cid = max(overall_scores, key=overall_scores.get)
1196
+ recommendation = coa_scores[best_cid]["coa"]["coa_type"]
1197
+
1198
+ # Audit
1199
+ if _HAS_AUDIT:
1200
+ log_event(
1201
+ event_type="coa_compared",
1202
+ actor="icdev-simulation-engine",
1203
+ action=f"Compared {len(coas)} COAs across {len(dimensions)} dimensions",
1204
+ details=json.dumps({
1205
+ "session_id": session_id,
1206
+ "coa_count": len(coas),
1207
+ "comparison_count": len(comparisons),
1208
+ "recommendation": recommendation,
1209
+ }),
1210
+ )
1211
+
1212
+ return {
1213
+ "session_id": session_id,
1214
+ "comparison_matrix": comparisons,
1215
+ "coa_scores": {
1216
+ coa_scores[cid]["coa"]["coa_type"]: round(coa_scores[cid]["scores"]["overall"], 2)
1217
+ for cid in coa_ids
1218
+ },
1219
+ "recommendation": recommendation,
1220
+ }
1221
+
1222
+ finally:
1223
+ conn.close()
1224
+
1225
+
1226
+ def select_coa(coa_id, selected_by, rationale, db_path=None):
1227
+ """Mark a COA as selected and reject all others in the same session.
1228
+
1229
+ Args:
1230
+ coa_id: The COA ID to select.
1231
+ selected_by: Name of the person selecting.
1232
+ rationale: Reason for selection.
1233
+ db_path: Optional database path override.
1234
+
1235
+ Returns:
1236
+ dict with coa_id, coa_type, and selection_status.
1237
+ """
1238
+ conn = _get_connection(db_path)
1239
+ try:
1240
+ now = _now_iso()
1241
+
1242
+ # Load the COA
1243
+ row = conn.execute(
1244
+ "SELECT * FROM coa_definitions WHERE id = ?", (coa_id,)
1245
+ ).fetchone()
1246
+ if not row:
1247
+ raise ValueError(f"COA not found: {coa_id}")
1248
+ coa = dict(row)
1249
+ session_id = coa["session_id"]
1250
+ project_id = coa["project_id"]
1251
+
1252
+ # Reject all other COAs in same session
1253
+ conn.execute(
1254
+ """UPDATE coa_definitions
1255
+ SET status = 'rejected', updated_at = ?
1256
+ WHERE session_id = ? AND id != ? AND status NOT IN ('rejected', 'archived')""",
1257
+ (now, session_id, coa_id),
1258
+ )
1259
+
1260
+ # Select this COA
1261
+ conn.execute(
1262
+ """UPDATE coa_definitions
1263
+ SET status = 'selected', selected_by = ?, selected_at = ?,
1264
+ selection_rationale = ?, updated_at = ?
1265
+ WHERE id = ?""",
1266
+ (selected_by, now, rationale, now, coa_id),
1267
+ )
1268
+
1269
+ conn.commit()
1270
+
1271
+ # Audit
1272
+ if _HAS_AUDIT:
1273
+ log_event(
1274
+ event_type="coa_selected",
1275
+ actor=selected_by,
1276
+ action=f"Selected COA {coa_id} ({coa['coa_type']})",
1277
+ project_id=project_id,
1278
+ details=json.dumps({
1279
+ "coa_id": coa_id,
1280
+ "coa_type": coa["coa_type"],
1281
+ "session_id": session_id,
1282
+ "rationale": rationale,
1283
+ }),
1284
+ )
1285
+
1286
+ return {
1287
+ "coa_id": coa_id,
1288
+ "coa_type": coa["coa_type"],
1289
+ "coa_name": coa["coa_name"],
1290
+ "selection_status": "selected",
1291
+ "selected_by": selected_by,
1292
+ "rationale": rationale,
1293
+ }
1294
+
1295
+ finally:
1296
+ conn.close()
1297
+
1298
+
1299
+ def get_coa(coa_id, db_path=None):
1300
+ """Load a single COA by ID.
1301
+
1302
+ Args:
1303
+ coa_id: The COA ID to retrieve.
1304
+ db_path: Optional database path override.
1305
+
1306
+ Returns:
1307
+ dict with all COA fields (JSON fields parsed).
1308
+ """
1309
+ conn = _get_connection(db_path)
1310
+ try:
1311
+ row = conn.execute(
1312
+ "SELECT * FROM coa_definitions WHERE id = ?", (coa_id,)
1313
+ ).fetchone()
1314
+ if not row:
1315
+ raise ValueError(f"COA not found: {coa_id}")
1316
+ coa = dict(row)
1317
+
1318
+ # Parse JSON fields
1319
+ for field in ("architecture_summary", "cost_estimate", "risk_profile",
1320
+ "timeline", "compliance_impact", "supply_chain_impact"):
1321
+ val = coa.get(field)
1322
+ if val and isinstance(val, str):
1323
+ try:
1324
+ coa[field] = json.loads(val)
1325
+ except json.JSONDecodeError:
1326
+ pass
1327
+
1328
+ return coa
1329
+
1330
+ finally:
1331
+ conn.close()
1332
+
1333
+
1334
+ def list_coas(session_id, db_path=None):
1335
+ """List all COAs for a session.
1336
+
1337
+ Args:
1338
+ session_id: The intake session ID.
1339
+ db_path: Optional database path override.
1340
+
1341
+ Returns:
1342
+ dict with session_id and coas list.
1343
+ """
1344
+ conn = _get_connection(db_path)
1345
+ try:
1346
+ rows = conn.execute(
1347
+ """SELECT id, session_id, project_id, coa_type, coa_name,
1348
+ description, boundary_tier, status,
1349
+ selected_by, selected_at, selection_rationale,
1350
+ mission_fit_pct, created_at, updated_at
1351
+ FROM coa_definitions
1352
+ WHERE session_id = ?
1353
+ ORDER BY
1354
+ CASE coa_type
1355
+ WHEN 'speed' THEN 1
1356
+ WHEN 'balanced' THEN 2
1357
+ WHEN 'comprehensive' THEN 3
1358
+ WHEN 'alternative' THEN 4
1359
+ END,
1360
+ created_at""",
1361
+ (session_id,),
1362
+ ).fetchall()
1363
+ coas = [dict(r) for r in rows]
1364
+
1365
+ return {
1366
+ "session_id": session_id,
1367
+ "count": len(coas),
1368
+ "coas": coas,
1369
+ }
1370
+
1371
+ finally:
1372
+ conn.close()
1373
+
1374
+
1375
+ # ---------------------------------------------------------------------------
1376
+ # CLI
1377
+ # ---------------------------------------------------------------------------
1378
+
1379
+ def main():
1380
+ parser = argparse.ArgumentParser(
1381
+ description="RICOAS COA Generator — Generate and manage Courses of Action"
1382
+ )
1383
+ parser.add_argument("--session-id", help="Intake session ID")
1384
+ parser.add_argument("--project-id", help="Project ID (optional, read from session)")
1385
+ parser.add_argument("--coa-id", help="COA ID (for get/select)")
1386
+ parser.add_argument("--requirement-id", help="Requirement ID (for alternative COA)")
1387
+ parser.add_argument("--db", help="Database path override")
1388
+
1389
+ # Actions
1390
+ parser.add_argument("--generate-3-coas", action="store_true",
1391
+ help="Generate Speed/Balanced/Comprehensive COAs")
1392
+ parser.add_argument("--simulate", action="store_true",
1393
+ help="Also create and run simulations for each COA")
1394
+ parser.add_argument("--generate-alternative", action="store_true",
1395
+ help="Generate alternative COAs for RED-tier requirement")
1396
+ parser.add_argument("--compare", action="store_true",
1397
+ help="Compare all COAs for a session")
1398
+ parser.add_argument("--select", action="store_true",
1399
+ help="Select a COA")
1400
+ parser.add_argument("--selected-by", help="Name of person selecting COA")
1401
+ parser.add_argument("--rationale", help="Selection rationale")
1402
+ parser.add_argument("--list", action="store_true",
1403
+ help="List all COAs for a session")
1404
+ parser.add_argument("--get", action="store_true",
1405
+ help="Get a single COA by ID")
1406
+
1407
+ # Output format
1408
+ parser.add_argument("--json", action="store_true",
1409
+ help="Output as JSON")
1410
+
1411
+ args = parser.parse_args()
1412
+ db_path = Path(args.db) if args.db else None
1413
+
1414
+ try:
1415
+ if args.generate_3_coas:
1416
+ if not args.session_id:
1417
+ parser.error("--session-id is required for --generate-3-coas")
1418
+ result = generate_3_coas(
1419
+ session_id=args.session_id,
1420
+ project_id=args.project_id,
1421
+ simulate=args.simulate,
1422
+ db_path=db_path,
1423
+ )
1424
+ if args.json:
1425
+ print(json.dumps(result, indent=2, default=str))
1426
+ else:
1427
+ print(f"Generated 3 COAs for session: {args.session_id}")
1428
+ print(f" Recommendation: {result['recommendation']}")
1429
+ for coa in result["coas"]:
1430
+ print(f"\n [{coa['coa_type'].upper()}] {coa['coa_name']}")
1431
+ print(f" ID: {coa['id']}")
1432
+ print(f" Scope: {coa['scope_description']}")
1433
+ print(f" Requirements: {len(coa['requirements_included'])}")
1434
+ print(f" Timeline: {coa['timeline_pis']} PIs ({coa['timeline_sprints']} sprints)")
1435
+ ce = coa["cost_estimate"]
1436
+ print(f" Cost: ${ce['cost_range_low']:,.0f} - ${ce['cost_range_high']:,.0f}")
1437
+ print(f" Risk Level: {coa['risk_level']}")
1438
+ print(f" Boundary Tier: {coa['boundary_tier']}")
1439
+ print(f" Recommended: {coa['recommended']}")
1440
+
1441
+ elif args.generate_alternative:
1442
+ if not args.session_id:
1443
+ parser.error("--session-id is required for --generate-alternative")
1444
+ if not args.requirement_id:
1445
+ parser.error("--requirement-id is required for --generate-alternative")
1446
+ result = generate_alternative_coa(
1447
+ session_id=args.session_id,
1448
+ requirement_id=args.requirement_id,
1449
+ project_id=args.project_id,
1450
+ db_path=db_path,
1451
+ )
1452
+ if args.json:
1453
+ print(json.dumps(result, indent=2, default=str))
1454
+ else:
1455
+ print(f"Alternative COAs for requirement: {args.requirement_id}")
1456
+ print(f" Original intent: {result['original_intent'][:100]}...")
1457
+ for alt in result["alternatives"]:
1458
+ print(f"\n [{alt['pattern_id']}] {alt['pattern_name']}")
1459
+ print(f" ID: {alt['id']}")
1460
+ print(f" Resulting Tier: {alt['resulting_tier']}")
1461
+ print(f" Feasibility: {alt['feasibility']:.0%}")
1462
+ print(f" Score: {alt['composite_score']:.3f}")
1463
+ print(f" Timeline: {alt['estimated_timeline_days']} days")
1464
+ print(f" Cost Impact: {alt['cost_impact']}")
1465
+
1466
+ elif args.compare:
1467
+ if not args.session_id:
1468
+ parser.error("--session-id is required for --compare")
1469
+ result = compare_coas(
1470
+ session_id=args.session_id,
1471
+ db_path=db_path,
1472
+ )
1473
+ if args.json:
1474
+ print(json.dumps(result, indent=2, default=str))
1475
+ else:
1476
+ print(f"COA Comparison for session: {args.session_id}")
1477
+ print(f" Recommendation: {result['recommendation']}")
1478
+ if result.get("coa_scores"):
1479
+ print("\n Overall Scores:")
1480
+ for ctype, score in result["coa_scores"].items():
1481
+ marker = " <-- RECOMMENDED" if ctype == result["recommendation"] else ""
1482
+ print(f" {ctype}: {score:.2f}{marker}")
1483
+
1484
+ elif args.select:
1485
+ if not args.coa_id:
1486
+ parser.error("--coa-id is required for --select")
1487
+ if not args.selected_by:
1488
+ parser.error("--selected-by is required for --select")
1489
+ if not args.rationale:
1490
+ parser.error("--rationale is required for --select")
1491
+ result = select_coa(
1492
+ coa_id=args.coa_id,
1493
+ selected_by=args.selected_by,
1494
+ rationale=args.rationale,
1495
+ db_path=db_path,
1496
+ )
1497
+ if args.json:
1498
+ print(json.dumps(result, indent=2, default=str))
1499
+ else:
1500
+ print(f"COA Selected: {result['coa_id']}")
1501
+ print(f" Type: {result['coa_type']}")
1502
+ print(f" Name: {result['coa_name']}")
1503
+ print(f" Selected By: {result['selected_by']}")
1504
+ print(f" Rationale: {result['rationale']}")
1505
+
1506
+ elif args.list:
1507
+ if not args.session_id:
1508
+ parser.error("--session-id is required for --list")
1509
+ result = list_coas(
1510
+ session_id=args.session_id,
1511
+ db_path=db_path,
1512
+ )
1513
+ if args.json:
1514
+ print(json.dumps(result, indent=2, default=str))
1515
+ else:
1516
+ print(f"COAs for session: {args.session_id} ({result['count']} total)")
1517
+ for coa in result["coas"]:
1518
+ status = coa.get("status", "draft")
1519
+ marker = " ***" if status == "selected" else ""
1520
+ print(f"\n [{coa['coa_type'].upper()}] {coa['coa_name']}{marker}")
1521
+ print(f" ID: {coa['id']}")
1522
+ print(f" Status: {status}")
1523
+ print(f" Boundary Tier: {coa.get('boundary_tier', 'N/A')}")
1524
+
1525
+ elif args.get or args.coa_id:
1526
+ if not args.coa_id:
1527
+ parser.error("--coa-id is required for --get")
1528
+ result = get_coa(
1529
+ coa_id=args.coa_id,
1530
+ db_path=db_path,
1531
+ )
1532
+ if args.json:
1533
+ print(json.dumps(result, indent=2, default=str))
1534
+ else:
1535
+ print(f"COA: {result['id']}")
1536
+ print(f" Type: {result['coa_type']}")
1537
+ print(f" Name: {result['coa_name']}")
1538
+ print(f" Status: {result['status']}")
1539
+ print(f" Boundary Tier: {result.get('boundary_tier', 'N/A')}")
1540
+
1541
+ else:
1542
+ parser.print_help()
1543
+ sys.exit(1)
1544
+
1545
+ except (FileNotFoundError, ValueError) as e:
1546
+ print(f"ERROR: {e}", file=sys.stderr)
1547
+ sys.exit(1)
1548
+
1549
+
1550
+ if __name__ == "__main__":
1551
+ main()
1552
+ # [TEMPLATE: CUI // SP-CTI]