icdev 0.0.3__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 (1214) hide show
  1. args/agent_config.yaml +113 -0
  2. args/audit_regimes/cisa_sbd.json +381 -0
  3. args/audit_regimes/cmmc_l2.json +906 -0
  4. args/audit_regimes/dod_cssp.json +393 -0
  5. args/audit_regimes/dodi_5000_87.json +297 -0
  6. args/audit_regimes/fedramp_moderate.json +650 -0
  7. args/audit_regimes/ieee_1012.json +373 -0
  8. args/audit_regimes/nist_800_171.json +624 -0
  9. args/audit_regimes/nist_800_53.json +907 -0
  10. args/cloudforge_blueprints/aws_commercial.yaml +29 -0
  11. args/cloudforge_blueprints/aws_govcloud_il4.yaml +34 -0
  12. args/cloudforge_blueprints/aws_govcloud_il5.yaml +38 -0
  13. args/cloudforge_blueprints/azure_commercial.yaml +28 -0
  14. args/cloudforge_blueprints/azure_gov_il4.yaml +32 -0
  15. args/cloudforge_blueprints/azure_gov_il5.yaml +36 -0
  16. args/cloudforge_blueprints/gcp_commercial.yaml +28 -0
  17. args/cloudforge_blueprints/oci_commercial.yaml +28 -0
  18. args/cloudforge_config.yaml +231 -0
  19. args/cloudforge_runbook_templates/backup_verify.yaml +98 -0
  20. args/cloudforge_runbook_templates/dr_failover.yaml +107 -0
  21. args/cloudforge_runbook_templates/health_check.yaml +97 -0
  22. args/cloudforge_runbook_templates/incident_response.yaml +101 -0
  23. args/cloudforge_runbook_templates/migration_cutover.yaml +105 -0
  24. args/cloudforge_runbook_templates/patch_rollout.yaml +92 -0
  25. args/cloudforge_runbook_templates/zone_provision.yaml +93 -0
  26. args/code_pattern_config.yaml +151 -0
  27. args/code_quality_config.yaml +47 -0
  28. args/compliance_config.yaml +17 -0
  29. args/control_inheritance.yaml +177 -0
  30. args/csp_mcp_config.yaml +41 -0
  31. args/cui_markings.yaml +35 -0
  32. args/databridge_config.yaml +232 -0
  33. args/db_config.yaml +116 -0
  34. args/decision_tables/agent_trust_decision.yaml +143 -0
  35. args/decision_tables/ato_boundary_impact.yaml +132 -0
  36. args/decision_tables/deployment_approval.yaml +152 -0
  37. args/degradation_matrix.yaml +163 -0
  38. args/devsecops_config.yaml +286 -0
  39. args/endpoint_security_config.yaml +207 -0
  40. args/exit_criteria.yaml +102 -0
  41. args/feature_flags.yaml +235 -0
  42. args/file_access_tiers.yaml +88 -0
  43. args/forge_studio/blueprint_config.yaml +27 -0
  44. args/forge_studio/component_catalog.json +411 -0
  45. args/forge_studio/workflow_templates.yaml +103 -0
  46. args/govcon_config.yaml +41 -0
  47. args/harness_config.yaml +67 -0
  48. args/innovation_config.yaml +321 -0
  49. args/knowledge_graph_config.yaml +113 -0
  50. args/llm_config.yaml +222 -0
  51. args/marketplace_config.yaml +260 -0
  52. args/monitoring_config.yaml +127 -0
  53. args/mosa_config.yaml +190 -0
  54. args/observability_tracing_config.yaml +170 -0
  55. args/owasp_agentic_config.yaml +171 -0
  56. args/pipeline_gates.yaml +197 -0
  57. args/project_defaults.yaml +235 -0
  58. args/prompt_chains.yaml +163 -0
  59. args/rag_config.yaml +167 -0
  60. args/research_config.yaml +89 -0
  61. args/resilience_config.yaml +197 -0
  62. args/ricoas_config.yaml +191 -0
  63. args/security_gates.yaml +763 -0
  64. args/storage_config.yaml +63 -0
  65. args/writeguard_config.yaml +131 -0
  66. args/zta_config.yaml +247 -0
  67. context/__init__.py +6 -0
  68. context/agent/__init__.py +6 -0
  69. context/agent/response_schemas/__init__.py +6 -0
  70. context/agent/response_schemas/debate_position.json +46 -0
  71. context/agent/response_schemas/fitness_scorecard.json +74 -0
  72. context/agent/response_schemas/review_decision.json +39 -0
  73. context/agent/response_schemas/task_decomposition.json +82 -0
  74. context/agent/response_schemas/veto_decision.json +40 -0
  75. context/agentic/__init__.py +6 -0
  76. context/agentic/architecture_patterns.md +269 -0
  77. context/agentic/capability_registry.yaml +223 -0
  78. context/agentic/csp_integration.md +30 -0
  79. context/agentic/csp_mcp_registry.yaml +280 -0
  80. context/agentic/fitness_rubric.md +56 -0
  81. context/agentic/governance_baseline.md +205 -0
  82. context/ci/__init__.py +6 -0
  83. context/ci/worktree_templates.json +44 -0
  84. context/cloud/__init__.py +6 -0
  85. context/cloud/csp_service_registry.json +739 -0
  86. context/compliance/__init__.py +6 -0
  87. context/compliance/ai_rmf_crosswalk.yaml +226 -0
  88. context/compliance/atlas_mitigations.json +293 -0
  89. context/compliance/atlas_techniques.json +833 -0
  90. context/compliance/cisa_sbd_requirements.json +477 -0
  91. context/compliance/cjis_security_policy.json +522 -0
  92. context/compliance/cmmc_practices.json +2494 -0
  93. context/compliance/cmmc_report_template.md +142 -0
  94. context/compliance/cnssi_1253_overlay.json +109 -0
  95. context/compliance/control_crosswalk.json +1914 -0
  96. context/compliance/control_families/__init__.py +6 -0
  97. context/compliance/csp_certifications.json +251 -0
  98. context/compliance/cssp_report_template.md +193 -0
  99. context/compliance/cui_templates/__init__.py +6 -0
  100. context/compliance/cui_templates/banner_block.txt +4 -0
  101. context/compliance/cui_templates/code_header.txt +8 -0
  102. context/compliance/cui_templates/document_template.md +35 -0
  103. context/compliance/data_type_framework_map.json +321 -0
  104. context/compliance/data_type_registry.json +147 -0
  105. context/compliance/dod_cssp_8530.json +463 -0
  106. context/compliance/eu_ai_act_annex_iii.json +108 -0
  107. context/compliance/export_templates/__init__.py +6 -0
  108. context/compliance/export_templates/emass_controls.csv.j2 +4 -0
  109. context/compliance/export_templates/evidence_package.md.j2 +39 -0
  110. context/compliance/export_templates/executive_summary.md.j2 +55 -0
  111. context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
  112. context/compliance/fedramp_20x_ksi_schemas.json +133 -0
  113. context/compliance/fedramp_high_baseline.json +4370 -0
  114. context/compliance/fedramp_moderate_baseline.json +2183 -0
  115. context/compliance/fedramp_report_template.md +181 -0
  116. context/compliance/fips_200_areas.json +362 -0
  117. context/compliance/gao_ai_accountability.json +262 -0
  118. context/compliance/hipaa_security_rule.json +720 -0
  119. context/compliance/hitrust_csf_v11.json +930 -0
  120. context/compliance/impact_level_profiles.json +251 -0
  121. context/compliance/incident_response_template.md +1110 -0
  122. context/compliance/iso27001_2022_controls.json +750 -0
  123. context/compliance/iso27001_nist_bridge.json +382 -0
  124. context/compliance/iso42001_controls.json +254 -0
  125. context/compliance/ivv_checklist_template.md +80 -0
  126. context/compliance/ivv_report_template.md +116 -0
  127. context/compliance/ivv_requirements.json +372 -0
  128. context/compliance/mosa_crosswalk.json +327 -0
  129. context/compliance/mosa_framework.json +250 -0
  130. context/compliance/narrative_templates/AC.md.j2 +101 -0
  131. context/compliance/narrative_templates/AU.md.j2 +106 -0
  132. context/compliance/narrative_templates/IA.md.j2 +104 -0
  133. context/compliance/narrative_templates/SC.md.j2 +102 -0
  134. context/compliance/narrative_templates/SI.md.j2 +111 -0
  135. context/compliance/narrative_templates/__init__.py +6 -0
  136. context/compliance/narrative_templates/default.md.j2 +50 -0
  137. context/compliance/narrative_templates/executive_summary.j2 +27 -0
  138. context/compliance/narrative_templates/poam_milestone.j2 +19 -0
  139. context/compliance/narrative_templates/ssp_section.j2 +11 -0
  140. context/compliance/nist_800_171_controls.json +1552 -0
  141. context/compliance/nist_800_207_crosswalk.json +399 -0
  142. context/compliance/nist_800_207_zta.json +258 -0
  143. context/compliance/nist_800_53.json +324 -0
  144. context/compliance/nist_ai_600_1_genai.json +326 -0
  145. context/compliance/nist_ai_rmf.json +206 -0
  146. context/compliance/nist_sp_800_60_types.json +1667 -0
  147. context/compliance/omb_m25_21_high_impact_ai.json +248 -0
  148. context/compliance/omb_m26_04_unbiased_ai.json +262 -0
  149. context/compliance/owasp_agentic_asi.json +133 -0
  150. context/compliance/owasp_agentic_threats.json +285 -0
  151. context/compliance/owasp_llm_top10.json +274 -0
  152. context/compliance/pci_dss_v4.json +510 -0
  153. context/compliance/poam_template.md +117 -0
  154. context/compliance/safeai_controls.json +512 -0
  155. context/compliance/sbd_report_template.md +77 -0
  156. context/compliance/siem_config_templates/__init__.py +6 -0
  157. context/compliance/siem_config_templates/filebeat.yml +213 -0
  158. context/compliance/siem_config_templates/log_sources.json +208 -0
  159. context/compliance/soc2_trust_criteria.json +661 -0
  160. context/compliance/ssp_template.md +432 -0
  161. context/compliance/stig_templates/__init__.py +6 -0
  162. context/compliance/stig_templates/webapp_stig.json +139 -0
  163. context/compliance/xai_requirements.json +108 -0
  164. context/dashboard/__init__.py +6 -0
  165. context/dashboard/nlq_examples.json +50 -0
  166. context/dashboard/schema_descriptions.json +23 -0
  167. context/icdev_methodology.md +100 -0
  168. context/integration/__init__.py +6 -0
  169. context/integration/approval_workflows.json +32 -0
  170. context/integration/gitlab_field_mappings.json +33 -0
  171. context/integration/jira_field_mappings.json +32 -0
  172. context/integration/reqif_export_schema.json +23 -0
  173. context/integration/servicenow_field_mappings.json +22 -0
  174. context/languages/__init__.py +6 -0
  175. context/languages/framework_patterns.json +205 -0
  176. context/languages/language_registry.json +279 -0
  177. context/llm/__init__.py +6 -0
  178. context/llm/example_provider.py +89 -0
  179. context/marketplace/assets/writeguard-core.yaml +100 -0
  180. context/marketplace/assets/writeguard-govcon.yaml +45 -0
  181. context/marketplace/assets/writeguard-style-guides.yaml +44 -0
  182. context/mbse/__init__.py +6 -0
  183. context/mbse/des_report_template.md +162 -0
  184. context/mbse/des_requirements.json +411 -0
  185. context/mbse/digital_thread_patterns.json +403 -0
  186. context/mbse/reqif_schema.json +280 -0
  187. context/mbse/sysml_element_types.json +432 -0
  188. context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
  189. context/oscal/README.md +43 -0
  190. context/patterns/__init__.py +6 -0
  191. context/profiles/__init__.py +6 -0
  192. context/profiles/dod_baseline_v1.yaml +145 -0
  193. context/profiles/fedramp_baseline_v1.yaml +143 -0
  194. context/profiles/financial_baseline_v1.yaml +142 -0
  195. context/profiles/healthcare_baseline_v1.yaml +135 -0
  196. context/profiles/law_enforcement_v1.yaml +129 -0
  197. context/profiles/startup_v1.yaml +134 -0
  198. context/rag/source_mappings.json +42 -0
  199. context/requirements/__init__.py +6 -0
  200. context/requirements/ambiguity_patterns.json +97 -0
  201. context/requirements/boundary_impact_rules.json +123 -0
  202. context/requirements/default_constitutions.json +67 -0
  203. context/requirements/document_extraction_rules.json +58 -0
  204. context/requirements/gap_patterns.json +108 -0
  205. context/requirements/readiness_rubric.json +78 -0
  206. context/requirements/red_alternative_patterns.json +210 -0
  207. context/requirements/safe_templates.json +72 -0
  208. context/requirements/spec_quality_checklist.json +122 -0
  209. context/research/regulatory_registry.json +114 -0
  210. context/research/verticals/cybersecurity.json +127 -0
  211. context/research/verticals/defense.json +104 -0
  212. context/research/verticals/fintech.json +125 -0
  213. context/research/verticals/healthcare.json +118 -0
  214. context/research/verticals/logistics.json +117 -0
  215. context/research/verticals/trading.json +145 -0
  216. context/simulation/__init__.py +6 -0
  217. context/simulation/architecture_patterns.json +36 -0
  218. context/simulation/coa_templates.json +38 -0
  219. context/simulation/cost_models.json +23 -0
  220. context/simulation/risk_categories.json +46 -0
  221. context/supply_chain/__init__.py +6 -0
  222. context/supply_chain/isa_templates.json +129 -0
  223. context/supply_chain/nist_800_161_controls.json +247 -0
  224. context/supply_chain/scrm_risk_matrix.json +147 -0
  225. context/templates/__init__.py +6 -0
  226. context/templates/ansible/__init__.py +6 -0
  227. context/templates/ansible/playbooks/__init__.py +6 -0
  228. context/templates/ansible/roles/__init__.py +6 -0
  229. context/templates/gitlab_ci/__init__.py +6 -0
  230. context/templates/grafana/__init__.py +6 -0
  231. context/templates/kubernetes/__init__.py +6 -0
  232. context/templates/project/__init__.py +6 -0
  233. context/templates/project/api/__init__.py +6 -0
  234. context/templates/project/cli/__init__.py +6 -0
  235. context/templates/project/data_pipeline/__init__.py +6 -0
  236. context/templates/project/iac/__init__.py +6 -0
  237. context/templates/project/javascript_frontend/__init__.py +6 -0
  238. context/templates/project/javascript_frontend/src/__init__.py +6 -0
  239. context/templates/project/javascript_frontend/tests/__init__.py +6 -0
  240. context/templates/project/microservice/__init__.py +6 -0
  241. context/templates/project/python_backend/__init__.py +6 -0
  242. context/templates/project/python_backend/src/__init__.py +6 -0
  243. context/templates/project/python_backend/tests/__init__.py +6 -0
  244. context/templates/project/python_backend/tests/features/__init__.py +6 -0
  245. context/templates/project/python_backend/tests/steps/__init__.py +6 -0
  246. context/templates/terraform/__init__.py +6 -0
  247. context/templates/terraform/govcloud_base/__init__.py +6 -0
  248. context/templates/terraform/modules/__init__.py +6 -0
  249. context/tone/__init__.py +6 -0
  250. context/writing/grammar_rules/common_errors.json +306 -0
  251. context/writing/grammar_rules/govcon_vocabulary.json +113 -0
  252. context/writing/style_guides/academic.yaml +43 -0
  253. context/writing/style_guides/business.yaml +42 -0
  254. context/writing/style_guides/government.yaml +59 -0
  255. context/writing/style_guides/proposal.yaml +58 -0
  256. context/writing/style_guides/technical.yaml +43 -0
  257. docs/adr/README.md +66 -0
  258. docs/adr/connector-forge-decisions.md +318 -0
  259. docs/adr/core-decisions.md +289 -0
  260. docs/adr/db-decisions.md +94 -0
  261. docs/adr/harness-decisions.md +122 -0
  262. docs/adr/innovation-decisions.md +262 -0
  263. docs/adr/marketplace-decisions.md +109 -0
  264. docs/adr/sbd-decisions.md +109 -0
  265. docs/adr/scale-engine-decisions.md +108 -0
  266. docs/adr/writeguard-decisions.md +136 -0
  267. docs/architecture/bounded-contexts.md +1032 -0
  268. docs/features/phase-65-writeguard.md +139 -0
  269. docs/features/phase-66-marketplace-commerce.md +79 -0
  270. docs/features/phase-67-knowledge-ingestion-rag-autodraft.md +97 -0
  271. docs/features/phase-68-enhanced-autodraft-pipeline.md +109 -0
  272. docs/features/phase-69-proposalai-marketplace-module.md +131 -0
  273. docs/features/phase-70-databridge.md +214 -0
  274. docs/features/phase-71-databridge-messaging.md +102 -0
  275. docs/implementation-plan-architecture-evolution.md +614 -0
  276. docs/marketplace/CONTRIBUTING.md +124 -0
  277. docs/marketplace/module_manifest_schema.yaml +83 -0
  278. docs/research/ai-architecture-patterns-2024-2026.md +1236 -0
  279. docs/research/app-builder-platform-analysis.md +582 -0
  280. docs/research/architecture-patterns-c4-ddd-agentic.md +871 -0
  281. docs/research/flowable-boat-competitive-analysis.md +426 -0
  282. docs/research/modern-dev-practices-2024-2026.md +1615 -0
  283. docs/research/secure-by-design-cloudyrion-adaptation.md +270 -0
  284. goals/agent_management.md +144 -0
  285. goals/ai_accountability.md +90 -0
  286. goals/ai_narratives.md +79 -0
  287. goals/ai_transparency.md +76 -0
  288. goals/ato_simulator.md +78 -0
  289. goals/audit_engine.md +177 -0
  290. goals/bite_sized_plans.md +225 -0
  291. goals/boundary_supply_chain.md +206 -0
  292. goals/brainstorming_gate.md +186 -0
  293. goals/build_app.md +604 -0
  294. goals/cato_live_evidence.md +77 -0
  295. goals/cloudforge.md +106 -0
  296. goals/code_intelligence.md +197 -0
  297. goals/compliance_workflow.md +858 -0
  298. goals/connector_forge.md +133 -0
  299. goals/databridge.md +128 -0
  300. goals/deploy_workflow.md +390 -0
  301. goals/developer_scorecard.md +78 -0
  302. goals/devsecops_workflow.md +408 -0
  303. goals/firmware_sbom.md +79 -0
  304. goals/forge_hub.md +78 -0
  305. goals/golden_path.md +77 -0
  306. goals/harness_engineering.md +91 -0
  307. goals/integration_testing.md +189 -0
  308. goals/knowledge_graph.md +128 -0
  309. goals/maintenance_audit.md +196 -0
  310. goals/manifest.md +50 -0
  311. goals/monitoring.md +126 -0
  312. goals/mosa_workflow.md +463 -0
  313. goals/multi_agent_orchestration.md +68 -0
  314. goals/observability_traceability_xai.md +154 -0
  315. goals/owasp_agentic_security.md +395 -0
  316. goals/pr_intelligence.md +78 -0
  317. goals/requirements_intake.md +213 -0
  318. goals/secure_by_design.md +135 -0
  319. goals/security_scan.md +381 -0
  320. goals/self_healing.md +120 -0
  321. goals/simulation_engine.md +111 -0
  322. goals/subagent_review.md +205 -0
  323. goals/systematic_debugging.md +257 -0
  324. goals/tdd_workflow.md +403 -0
  325. goals/template_exchange.md +77 -0
  326. goals/thread_heatmap.md +77 -0
  327. goals/threat_modeler.md +77 -0
  328. goals/verification_iron_law.md +192 -0
  329. goals/vsm_dashboard.md +76 -0
  330. goals/writeguard.md +89 -0
  331. goals/zero_trust_architecture.md +403 -0
  332. hardprompts/__init__.py +6 -0
  333. hardprompts/agent/__init__.py +6 -0
  334. hardprompts/agent/agentic_architect.md +100 -0
  335. hardprompts/agent/debate_prompt.md +32 -0
  336. hardprompts/agent/fitness_evaluation.md +48 -0
  337. hardprompts/agent/governance_review.md +214 -0
  338. hardprompts/agent/reviewer_prompt.md +34 -0
  339. hardprompts/agent/skill_design.md +172 -0
  340. hardprompts/agent/task_decomposition.md +275 -0
  341. hardprompts/agent/veto_check_prompt.md +33 -0
  342. hardprompts/architect/__init__.py +6 -0
  343. hardprompts/architect/api_design.md +283 -0
  344. hardprompts/architect/data_model.md +277 -0
  345. hardprompts/architect/system_design.md +180 -0
  346. hardprompts/builder/__init__.py +6 -0
  347. hardprompts/builder/code_generation.md +59 -0
  348. hardprompts/builder/refactor.md +58 -0
  349. hardprompts/builder/scaffold_project.md +69 -0
  350. hardprompts/builder/test_generation.md +87 -0
  351. hardprompts/ci/__init__.py +6 -0
  352. hardprompts/ci/worktree_setup.md +35 -0
  353. hardprompts/compliance/__init__.py +6 -0
  354. hardprompts/compliance/cmmc_assessment.md +63 -0
  355. hardprompts/compliance/cssp_assessment.md +75 -0
  356. hardprompts/compliance/cui_marking.md +86 -0
  357. hardprompts/compliance/fedramp_assessment.md +55 -0
  358. hardprompts/compliance/ivv_assessment.md +96 -0
  359. hardprompts/compliance/poam_generation.md +57 -0
  360. hardprompts/compliance/sbd_assessment.md +101 -0
  361. hardprompts/compliance/security_categorization.md +74 -0
  362. hardprompts/compliance/ssp_generation.md +56 -0
  363. hardprompts/compliance/stig_evaluation.md +63 -0
  364. hardprompts/dashboard/__init__.py +6 -0
  365. hardprompts/dashboard/nlq_system_prompt.md +26 -0
  366. hardprompts/infra/__init__.py +6 -0
  367. hardprompts/infra/k8s_manifests.md +118 -0
  368. hardprompts/infra/pipeline_generation.md +160 -0
  369. hardprompts/infra/terraform_generation.md +92 -0
  370. hardprompts/integration/__init__.py +6 -0
  371. hardprompts/integration/approval_review.md +17 -0
  372. hardprompts/integration/jira_mapping.md +25 -0
  373. hardprompts/integration/servicenow_mapping.md +14 -0
  374. hardprompts/knowledge/__init__.py +6 -0
  375. hardprompts/knowledge/pattern_detection.md +73 -0
  376. hardprompts/knowledge/recommendation_engine.md +90 -0
  377. hardprompts/knowledge/root_cause_analysis.md +91 -0
  378. hardprompts/maintenance/__init__.py +6 -0
  379. hardprompts/maintenance/maintenance_assessment.md +82 -0
  380. hardprompts/mbse/__init__.py +6 -0
  381. hardprompts/mbse/digital_thread.md +67 -0
  382. hardprompts/mbse/model_import.md +62 -0
  383. hardprompts/mbse/model_to_code.md +65 -0
  384. hardprompts/modernization/__init__.py +6 -0
  385. hardprompts/modernization/legacy_analysis.md +93 -0
  386. hardprompts/modernization/migration_planning.md +150 -0
  387. hardprompts/modernization/seven_r_assessment.md +107 -0
  388. hardprompts/proposal_draft.md +53 -0
  389. hardprompts/rag_citation.md +12 -0
  390. hardprompts/rag_rerank.md +31 -0
  391. hardprompts/requirements/__init__.py +6 -0
  392. hardprompts/requirements/bdd_generation.md +35 -0
  393. hardprompts/requirements/clarification_prioritization.md +29 -0
  394. hardprompts/requirements/decomposition.md +60 -0
  395. hardprompts/requirements/document_extraction.md +45 -0
  396. hardprompts/requirements/gap_detection.md +70 -0
  397. hardprompts/requirements/intake_conversation.md +101 -0
  398. hardprompts/requirements/readiness_assessment.md +39 -0
  399. hardprompts/requirements/spec_quality.md +33 -0
  400. hardprompts/requirements/traceability_analysis.md +23 -0
  401. hardprompts/security/__init__.py +6 -0
  402. hardprompts/security/endpoint_security.md +78 -0
  403. hardprompts/security/threat_model.md +70 -0
  404. hardprompts/security/vulnerability_assessment.md +81 -0
  405. hardprompts/simulation/__init__.py +6 -0
  406. hardprompts/simulation/architecture_impact.md +27 -0
  407. hardprompts/simulation/coa_alternative.md +27 -0
  408. hardprompts/simulation/coa_generation.md +25 -0
  409. hardprompts/simulation/compliance_impact.md +28 -0
  410. hardprompts/simulation/cost_estimation.md +33 -0
  411. hardprompts/simulation/risk_assessment.md +28 -0
  412. hardprompts/translation/code_translation.md +68 -0
  413. hardprompts/translation/dependency_suggestion.md +44 -0
  414. hardprompts/translation/test_translation.md +64 -0
  415. hardprompts/translation/translation_repair.md +59 -0
  416. icdev-0.0.3.dist-info/METADATA +909 -0
  417. icdev-0.0.3.dist-info/RECORD +1214 -0
  418. icdev-0.0.3.dist-info/WHEEL +5 -0
  419. icdev-0.0.3.dist-info/entry_points.txt +9 -0
  420. icdev-0.0.3.dist-info/licenses/LICENSE +201 -0
  421. icdev-0.0.3.dist-info/licenses/NOTICE +11 -0
  422. icdev-0.0.3.dist-info/top_level.txt +7 -0
  423. memory/MEMORY.md +52 -0
  424. memory/logs/2026-02-14.md +17 -0
  425. memory/logs/2026-03-03.md +2 -0
  426. memory/logs/__init__.py +1 -0
  427. tools/a2a/icdev_callback_client.py +210 -0
  428. tools/agent/cards/architect_card.json +29 -0
  429. tools/agent/cards/builder_card.json +34 -0
  430. tools/agent/cards/compliance_card.json +29 -0
  431. tools/agent/cards/connector_forge_card.json +49 -0
  432. tools/agent/cards/devsecops_zta_card.json +24 -0
  433. tools/agent/cards/knowledge_card.json +29 -0
  434. tools/agent/cards/monitor_card.json +29 -0
  435. tools/agent/cards/orchestrator_card.json +29 -0
  436. tools/agent/cards/requirements_analyst_card.json +24 -0
  437. tools/agent/cards/security_card.json +29 -0
  438. tools/agent/cards/simulation_card.json +24 -0
  439. tools/agent/cards/supply_chain_card.json +24 -0
  440. tools/analysis/__init__.py +1 -0
  441. tools/analysis/code_analyzer.py +770 -0
  442. tools/analysis/runtime_feedback.py +379 -0
  443. tools/analytics/__init__.py +2 -0
  444. tools/analytics/scorecard.py +538 -0
  445. tools/analytics/vsm_engine.py +612 -0
  446. tools/architecture/__init__.py +2 -0
  447. tools/architecture/adr_extractor.py +393 -0
  448. tools/audit/__init__.py +1 -0
  449. tools/audit/audit_logger.py +199 -0
  450. tools/audit/audit_query.py +153 -0
  451. tools/audit/decision_recorder.py +73 -0
  452. tools/audit_engine/__init__.py +12 -0
  453. tools/audit_engine/ai_advisor.py +906 -0
  454. tools/audit_engine/cli.py +286 -0
  455. tools/audit_engine/comparator.py +305 -0
  456. tools/audit_engine/eject_scaffolder.py +399 -0
  457. tools/audit_engine/engine.py +614 -0
  458. tools/audit_engine/git_fetcher.py +341 -0
  459. tools/audit_engine/regime_loader.py +200 -0
  460. tools/audit_engine/regime_updater.py +325 -0
  461. tools/audit_engine/report_card.py +289 -0
  462. tools/audit_engine/scanner.py +684 -0
  463. tools/audit_engine/self_heal.py +1042 -0
  464. tools/ci/__init__.py +2 -0
  465. tools/ci/connectors/__init__.py +2 -0
  466. tools/ci/connectors/base_connector.py +80 -0
  467. tools/ci/connectors/connector_registry.py +188 -0
  468. tools/ci/connectors/mattermost_connector.py +159 -0
  469. tools/ci/connectors/slack_connector.py +197 -0
  470. tools/ci/core/__init__.py +2 -0
  471. tools/ci/core/air_gap_detector.py +115 -0
  472. tools/ci/core/comment_handler.py +192 -0
  473. tools/ci/core/conversation_manager.py +480 -0
  474. tools/ci/core/event_envelope.py +500 -0
  475. tools/ci/core/event_router.py +444 -0
  476. tools/ci/core/failure_parser.py +397 -0
  477. tools/ci/core/recovery_engine.py +527 -0
  478. tools/ci/gate_enforcer.py +361 -0
  479. tools/ci/modules/__init__.py +2 -0
  480. tools/ci/modules/agent.py +271 -0
  481. tools/ci/modules/git_ops.py +175 -0
  482. tools/ci/modules/state.py +117 -0
  483. tools/ci/modules/vcs.py +303 -0
  484. tools/ci/modules/workflow_ops.py +295 -0
  485. tools/ci/modules/worktree.py +337 -0
  486. tools/ci/pipeline_config_generator.py +558 -0
  487. tools/ci/pr_intelligence.py +485 -0
  488. tools/ci/triggers/__init__.py +2 -0
  489. tools/ci/triggers/gitlab_task_monitor.py +327 -0
  490. tools/ci/triggers/poll_trigger.py +237 -0
  491. tools/ci/triggers/webhook_server.py +356 -0
  492. tools/ci/workflows/__init__.py +2 -0
  493. tools/ci/workflows/icdev_build.py +140 -0
  494. tools/ci/workflows/icdev_comply.py +284 -0
  495. tools/ci/workflows/icdev_document.py +152 -0
  496. tools/ci/workflows/icdev_e2e.py +188 -0
  497. tools/ci/workflows/icdev_patch.py +186 -0
  498. tools/ci/workflows/icdev_plan.py +202 -0
  499. tools/ci/workflows/icdev_plan_build.py +41 -0
  500. tools/ci/workflows/icdev_plan_build_test.py +46 -0
  501. tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
  502. tools/ci/workflows/icdev_review.py +126 -0
  503. tools/ci/workflows/icdev_sdlc.py +261 -0
  504. tools/ci/workflows/icdev_test.py +240 -0
  505. tools/cli/__init__.py +1 -0
  506. tools/cli/output_formatter.py +756 -0
  507. tools/cloudforge/__init__.py +12 -0
  508. tools/cloudforge/airgap/__init__.py +2 -0
  509. tools/cloudforge/airgap/il_classifier.py +70 -0
  510. tools/cloudforge/airgap/offline_validator.py +42 -0
  511. tools/cloudforge/airgap/shift_emulator.py +155 -0
  512. tools/cloudforge/airgap/sneakernet.py +91 -0
  513. tools/cloudforge/cd_hub/__init__.py +2 -0
  514. tools/cloudforge/cd_hub/canary_deployer.py +88 -0
  515. tools/cloudforge/cd_hub/gitops_renderer.py +123 -0
  516. tools/cloudforge/cd_hub/hub_controller.py +143 -0
  517. tools/cloudforge/cd_hub/pipeline_bridge.py +30 -0
  518. tools/cloudforge/cd_hub/rollback_engine.py +29 -0
  519. tools/cloudforge/cd_hub/spoke_agent.py +51 -0
  520. tools/cloudforge/compliance/__init__.py +2 -0
  521. tools/cloudforge/compliance/ato_accelerator.py +272 -0
  522. tools/cloudforge/compliance/control_inheritor.py +127 -0
  523. tools/cloudforge/compliance/evidence_generator.py +129 -0
  524. tools/cloudforge/compliance/poam_bridge.py +41 -0
  525. tools/cloudforge/compliance/ssp_bridge.py +52 -0
  526. tools/cloudforge/compliance/stig_bridge.py +41 -0
  527. tools/cloudforge/container_forge/__init__.py +2 -0
  528. tools/cloudforge/container_forge/bigbang_renderer.py +85 -0
  529. tools/cloudforge/container_forge/hardener.py +169 -0
  530. tools/cloudforge/container_forge/image_scanner_bridge.py +33 -0
  531. tools/cloudforge/container_forge/runtime_policy.py +87 -0
  532. tools/cloudforge/container_forge/sbom_bridge.py +42 -0
  533. tools/cloudforge/finops/__init__.py +2 -0
  534. tools/cloudforge/finops/anomaly_detector.py +78 -0
  535. tools/cloudforge/finops/budget_tracker.py +96 -0
  536. tools/cloudforge/finops/chargeback.py +69 -0
  537. tools/cloudforge/finops/cost_collector.py +141 -0
  538. tools/cloudforge/finops/optimizer.py +55 -0
  539. tools/cloudforge/hybrid/__init__.py +2 -0
  540. tools/cloudforge/hybrid/connection_manager.py +141 -0
  541. tools/cloudforge/hybrid/dns_federator.py +56 -0
  542. tools/cloudforge/hybrid/health_monitor.py +108 -0
  543. tools/cloudforge/hybrid/identity_federator.py +53 -0
  544. tools/cloudforge/hybrid/network_bridge.py +68 -0
  545. tools/cloudforge/hybrid/topology_manager.py +147 -0
  546. tools/cloudforge/hybrid/workload_abstractor.py +92 -0
  547. tools/cloudforge/iac/__init__.py +2 -0
  548. tools/cloudforge/iac/drift_detector.py +154 -0
  549. tools/cloudforge/iac/module_library.py +265 -0
  550. tools/cloudforge/iac/opentofu_adapter.py +89 -0
  551. tools/cloudforge/iac/pulumi_renderer.py +292 -0
  552. tools/cloudforge/iac/state_backend.py +146 -0
  553. tools/cloudforge/iac/terraform_renderer.py +626 -0
  554. tools/cloudforge/landing_zone/__init__.py +2 -0
  555. tools/cloudforge/landing_zone/blueprint_loader.py +98 -0
  556. tools/cloudforge/landing_zone/blueprint_validator.py +113 -0
  557. tools/cloudforge/landing_zone/zone_provisioner.py +306 -0
  558. tools/cloudforge/landing_zone/zone_state.py +143 -0
  559. tools/cloudforge/mbse_thread/__init__.py +2 -0
  560. tools/cloudforge/mbse_thread/ato_thread_weaver.py +111 -0
  561. tools/cloudforge/mbse_thread/control_tracer.py +68 -0
  562. tools/cloudforge/mbse_thread/system_boundary.py +83 -0
  563. tools/cloudforge/metastore/__init__.py +2 -0
  564. tools/cloudforge/metastore/dependency_graph.py +202 -0
  565. tools/cloudforge/metastore/discovery.py +192 -0
  566. tools/cloudforge/metastore/registry.py +185 -0
  567. tools/cloudforge/metastore/rto_tracker.py +92 -0
  568. tools/cloudforge/metastore/runbook_linker.py +82 -0
  569. tools/cloudforge/migration/__init__.py +2 -0
  570. tools/cloudforge/migration/assessor.py +187 -0
  571. tools/cloudforge/migration/cutover_orchestrator.py +117 -0
  572. tools/cloudforge/migration/databridge_bridge.py +92 -0
  573. tools/cloudforge/migration/planner.py +98 -0
  574. tools/cloudforge/migration/risk_scorer.py +97 -0
  575. tools/cloudforge/migration/validation_runner.py +45 -0
  576. tools/cloudforge/migration/workload_inventory.py +107 -0
  577. tools/cloudforge/provider.py +319 -0
  578. tools/cloudforge/providers/__init__.py +2 -0
  579. tools/cloudforge/providers/aws_commercial.py +92 -0
  580. tools/cloudforge/providers/aws_govcloud.py +229 -0
  581. tools/cloudforge/providers/aws_secret.py +83 -0
  582. tools/cloudforge/providers/azure_commercial.py +80 -0
  583. tools/cloudforge/providers/azure_gov.py +91 -0
  584. tools/cloudforge/providers/azure_secret.py +71 -0
  585. tools/cloudforge/providers/gcp.py +102 -0
  586. tools/cloudforge/providers/oci.py +102 -0
  587. tools/cloudforge/registry.py +140 -0
  588. tools/cloudforge/runbooks/__init__.py +2 -0
  589. tools/cloudforge/runbooks/ai_generator.py +119 -0
  590. tools/cloudforge/runbooks/dag_validator.py +219 -0
  591. tools/cloudforge/runbooks/engine.py +470 -0
  592. tools/cloudforge/runbooks/models.py +99 -0
  593. tools/cloudforge/runbooks/snippet_library.py +158 -0
  594. tools/cloudforge/runbooks/template_loader.py +122 -0
  595. tools/cloudforge/runbooks/visualization.py +108 -0
  596. tools/cloudforge/siem/__init__.py +2 -0
  597. tools/cloudforge/siem/alert_rules.py +86 -0
  598. tools/cloudforge/siem/correlation_engine.py +61 -0
  599. tools/cloudforge/siem/log_aggregator.py +113 -0
  600. tools/cloudforge/siem/siem_dashboard_data.py +28 -0
  601. tools/cloudforge/supply_chain/__init__.py +2 -0
  602. tools/cloudforge/supply_chain/bridge.py +33 -0
  603. tools/cloudforge/supply_chain/iac_dependency_scanner.py +36 -0
  604. tools/cloudforge/supply_chain/provider_trust_scorer.py +54 -0
  605. tools/compat/__init__.py +21 -0
  606. tools/compat/cli_harmonizer.py +251 -0
  607. tools/compat/datetime_utils.py +18 -0
  608. tools/compat/db_utils.py +190 -0
  609. tools/compat/platform_utils.py +123 -0
  610. tools/compliance/__init__.py +1 -0
  611. tools/compliance/accountability_manager.py +391 -0
  612. tools/compliance/ai_accountability_audit.py +287 -0
  613. tools/compliance/ai_impact_assessor.py +267 -0
  614. tools/compliance/ai_incident_response.py +295 -0
  615. tools/compliance/ai_inventory_manager.py +233 -0
  616. tools/compliance/ai_reassessment_scheduler.py +250 -0
  617. tools/compliance/ai_transparency_audit.py +247 -0
  618. tools/compliance/atlas_assessor.py +276 -0
  619. tools/compliance/atlas_report_generator.py +1199 -0
  620. tools/compliance/base_assessor.py +591 -0
  621. tools/compliance/cato_live_engine.py +607 -0
  622. tools/compliance/cato_monitor.py +1371 -0
  623. tools/compliance/cato_scheduler.py +698 -0
  624. tools/compliance/cjis_assessor.py +76 -0
  625. tools/compliance/classification_manager.py +1340 -0
  626. tools/compliance/cmmc_assessor.py +1478 -0
  627. tools/compliance/cmmc_report_generator.py +1087 -0
  628. tools/compliance/compliance_detector.py +452 -0
  629. tools/compliance/compliance_exporter.py +418 -0
  630. tools/compliance/compliance_status.py +810 -0
  631. tools/compliance/control_mapper.py +488 -0
  632. tools/compliance/crosswalk_engine.py +1208 -0
  633. tools/compliance/cssp_assessor.py +1032 -0
  634. tools/compliance/cssp_evidence_collector.py +716 -0
  635. tools/compliance/cssp_report_generator.py +1103 -0
  636. tools/compliance/cui_marker.py +387 -0
  637. tools/compliance/diagram_validator.py +599 -0
  638. tools/compliance/emass/__init__.py +2 -0
  639. tools/compliance/emass/emass_client.py +822 -0
  640. tools/compliance/emass/emass_export.py +758 -0
  641. tools/compliance/emass/emass_sync.py +807 -0
  642. tools/compliance/eu_ai_act_classifier.py +193 -0
  643. tools/compliance/evidence_collector.py +459 -0
  644. tools/compliance/fairness_assessor.py +310 -0
  645. tools/compliance/fedramp_20x_ksi_emitter.py +692 -0
  646. tools/compliance/fedramp_assessor.py +1795 -0
  647. tools/compliance/fedramp_authorization_packager.py +137 -0
  648. tools/compliance/fedramp_ksi_generator.py +349 -0
  649. tools/compliance/fedramp_report_generator.py +1115 -0
  650. tools/compliance/fips199_categorizer.py +869 -0
  651. tools/compliance/fips200_validator.py +304 -0
  652. tools/compliance/firmware_sbom.py +646 -0
  653. tools/compliance/gao_ai_assessor.py +228 -0
  654. tools/compliance/gao_evidence_builder.py +302 -0
  655. tools/compliance/hipaa_assessor.py +78 -0
  656. tools/compliance/hitrust_assessor.py +49 -0
  657. tools/compliance/incident_response_plan.py +705 -0
  658. tools/compliance/inheritance_engine.py +693 -0
  659. tools/compliance/iso27001_assessor.py +92 -0
  660. tools/compliance/iso42001_assessor.py +114 -0
  661. tools/compliance/ivv_assessor.py +2314 -0
  662. tools/compliance/ivv_report_generator.py +1649 -0
  663. tools/compliance/model_card_generator.py +291 -0
  664. tools/compliance/mosa_assessor.py +117 -0
  665. tools/compliance/multi_regime_assessor.py +441 -0
  666. tools/compliance/narrative_generator.py +1012 -0
  667. tools/compliance/narrative_quality_gate.py +701 -0
  668. tools/compliance/narrative_workflow.py +814 -0
  669. tools/compliance/nist_800_207_assessor.py +191 -0
  670. tools/compliance/nist_ai_600_1_assessor.py +185 -0
  671. tools/compliance/nist_ai_rmf_assessor.py +110 -0
  672. tools/compliance/nist_lookup.py +244 -0
  673. tools/compliance/omb_m25_21_assessor.py +225 -0
  674. tools/compliance/omb_m26_04_assessor.py +185 -0
  675. tools/compliance/oscal_catalog_adapter.py +395 -0
  676. tools/compliance/oscal_generator.py +2157 -0
  677. tools/compliance/oscal_tools.py +1182 -0
  678. tools/compliance/oscal_validator.py +692 -0
  679. tools/compliance/owasp_agentic_assessor.py +227 -0
  680. tools/compliance/owasp_asi_assessor.py +197 -0
  681. tools/compliance/owasp_llm_assessor.py +245 -0
  682. tools/compliance/pci_dss_assessor.py +80 -0
  683. tools/compliance/pi_compliance_tracker.py +1447 -0
  684. tools/compliance/poam_generator.py +388 -0
  685. tools/compliance/resolve_marking.py +272 -0
  686. tools/compliance/sbd_assessor.py +2070 -0
  687. tools/compliance/sbd_report_generator.py +1223 -0
  688. tools/compliance/sbom_generator.py +993 -0
  689. tools/compliance/siem_config_generator.py +661 -0
  690. tools/compliance/slsa_attestation_generator.py +479 -0
  691. tools/compliance/soc2_assessor.py +77 -0
  692. tools/compliance/ssp_generator.py +556 -0
  693. tools/compliance/stig_checker.py +712 -0
  694. tools/compliance/swft_evidence_bundler.py +326 -0
  695. tools/compliance/system_card_generator.py +303 -0
  696. tools/compliance/template_exchange.py +513 -0
  697. tools/compliance/traceability_matrix.py +1268 -0
  698. tools/compliance/universal_classification_manager.py +1159 -0
  699. tools/compliance/xacta/__init__.py +2 -0
  700. tools/compliance/xacta/xacta_client.py +438 -0
  701. tools/compliance/xacta/xacta_export.py +546 -0
  702. tools/compliance/xacta/xacta_sync.py +322 -0
  703. tools/compliance/xai_assessor.py +231 -0
  704. tools/core/__init__.py +2 -0
  705. tools/core/circuit_breaker.py +353 -0
  706. tools/core/compliance_sidecar.py +344 -0
  707. tools/core/container.py +110 -0
  708. tools/core/errors.py +256 -0
  709. tools/core/feature_flags.py +311 -0
  710. tools/core/task_dlq.py +350 -0
  711. tools/dashboard/__init__.py +2 -0
  712. tools/dashboard/app.py +6288 -0
  713. tools/dashboard/templates/agent_evolution.html +287 -0
  714. tools/dashboard/templates/agents/list.html +71 -0
  715. tools/dashboard/templates/agents.html +132 -0
  716. tools/dashboard/templates/architecture.html +289 -0
  717. tools/dashboard/templates/ato_simulator.html +170 -0
  718. tools/dashboard/templates/audit_engine.html +844 -0
  719. tools/dashboard/templates/base.html +236 -0
  720. tools/dashboard/templates/cato_live.html +116 -0
  721. tools/dashboard/templates/cloudforge.html +195 -0
  722. tools/dashboard/templates/cloudforge_finops.html +111 -0
  723. tools/dashboard/templates/cloudforge_hybrid.html +122 -0
  724. tools/dashboard/templates/cloudforge_metastore.html +234 -0
  725. tools/dashboard/templates/cloudforge_migration.html +87 -0
  726. tools/dashboard/templates/cloudforge_runbooks.html +201 -0
  727. tools/dashboard/templates/cloudforge_siem.html +94 -0
  728. tools/dashboard/templates/compliance_accel.html +292 -0
  729. tools/dashboard/templates/crashes.html +122 -0
  730. tools/dashboard/templates/databridge.html +305 -0
  731. tools/dashboard/templates/databridge_analytics.html +195 -0
  732. tools/dashboard/templates/databridge_mapping.html +345 -0
  733. tools/dashboard/templates/databridge_messaging.html +321 -0
  734. tools/dashboard/templates/decisions.html +258 -0
  735. tools/dashboard/templates/devices.html +151 -0
  736. tools/dashboard/templates/devsecops_maturity.html +278 -0
  737. tools/dashboard/templates/edge_ai.html +128 -0
  738. tools/dashboard/templates/firmware.html +120 -0
  739. tools/dashboard/templates/firmware_sbom.html +193 -0
  740. tools/dashboard/templates/forge_hub.html +196 -0
  741. tools/dashboard/templates/forge_studio.html +379 -0
  742. tools/dashboard/templates/forge_studio_analytics.html +360 -0
  743. tools/dashboard/templates/forge_studio_builder.html +1637 -0
  744. tools/dashboard/templates/forge_studio_compliance.html +310 -0
  745. tools/dashboard/templates/forge_studio_deploy.html +573 -0
  746. tools/dashboard/templates/forge_studio_enterprise.html +888 -0
  747. tools/dashboard/templates/forge_studio_marketplace.html +502 -0
  748. tools/dashboard/templates/forge_studio_workflow.html +696 -0
  749. tools/dashboard/templates/golden_path.html +175 -0
  750. tools/dashboard/templates/govcon.html +280 -0
  751. tools/dashboard/templates/harness.html +148 -0
  752. tools/dashboard/templates/index.html +207 -0
  753. tools/dashboard/templates/intelligence.html +336 -0
  754. tools/dashboard/templates/knowledge/index.html +190 -0
  755. tools/dashboard/templates/knowledge_graph.html +739 -0
  756. tools/dashboard/templates/login.html +51 -0
  757. tools/dashboard/templates/marketplace.html +336 -0
  758. tools/dashboard/templates/marketplace_admin.html +247 -0
  759. tools/dashboard/templates/missions.html +403 -0
  760. tools/dashboard/templates/narratives.html +154 -0
  761. tools/dashboard/templates/pr_intelligence.html +151 -0
  762. tools/dashboard/templates/proposals/detail.html +300 -0
  763. tools/dashboard/templates/proposals/list.html +52 -0
  764. tools/dashboard/templates/proposals/sam_detail.html +132 -0
  765. tools/dashboard/templates/proposals/section_detail.html +375 -0
  766. tools/dashboard/templates/research.html +222 -0
  767. tools/dashboard/templates/resilience.html +300 -0
  768. tools/dashboard/templates/scorecard.html +162 -0
  769. tools/dashboard/templates/simulator.html +131 -0
  770. tools/dashboard/templates/template_exchange.html +147 -0
  771. tools/dashboard/templates/thread_heatmap.html +151 -0
  772. tools/dashboard/templates/threat_model.html +195 -0
  773. tools/dashboard/templates/vsm.html +141 -0
  774. tools/dashboard/templates/writeguard.html +277 -0
  775. tools/databridge/__init__.py +5 -0
  776. tools/databridge/agent/__init__.py +2 -0
  777. tools/databridge/agent/daemon.py +227 -0
  778. tools/databridge/agent/tunnel.py +101 -0
  779. tools/databridge/agent/ws_relay.py +91 -0
  780. tools/databridge/analytics.py +167 -0
  781. tools/databridge/arrow_pipeline.py +327 -0
  782. tools/databridge/connection_manager.py +424 -0
  783. tools/databridge/connector.py +331 -0
  784. tools/databridge/connectors/__init__.py +2 -0
  785. tools/databridge/connectors/argocd_connector.py +160 -0
  786. tools/databridge/connectors/avro_connector.py +203 -0
  787. tools/databridge/connectors/azure_blob.py +63 -0
  788. tools/databridge/connectors/cdc_connector.py +205 -0
  789. tools/databridge/connectors/csv_connector.py +172 -0
  790. tools/databridge/connectors/datadog_connector.py +153 -0
  791. tools/databridge/connectors/discord_messaging.py +215 -0
  792. tools/databridge/connectors/dynamics365.py +151 -0
  793. tools/databridge/connectors/elasticsearch_connector.py +145 -0
  794. tools/databridge/connectors/email_base.py +114 -0
  795. tools/databridge/connectors/excel_connector.py +175 -0
  796. tools/databridge/connectors/fsspec_base.py +300 -0
  797. tools/databridge/connectors/gcs.py +53 -0
  798. tools/databridge/connectors/github_connector.py +138 -0
  799. tools/databridge/connectors/gitlab_connector.py +132 -0
  800. tools/databridge/connectors/gmail_connector.py +182 -0
  801. tools/databridge/connectors/hdfs.py +57 -0
  802. tools/databridge/connectors/health_base.py +401 -0
  803. tools/databridge/connectors/hubspot.py +124 -0
  804. tools/databridge/connectors/imap_connector.py +171 -0
  805. tools/databridge/connectors/jenkins_connector.py +138 -0
  806. tools/databridge/connectors/jira_connector.py +86 -0
  807. tools/databridge/connectors/json_connector.py +184 -0
  808. tools/databridge/connectors/kafka_connector.py +246 -0
  809. tools/databridge/connectors/kinesis_connector.py +238 -0
  810. tools/databridge/connectors/local_fs.py +30 -0
  811. tools/databridge/connectors/matrix.py +197 -0
  812. tools/databridge/connectors/mattermost_messaging.py +184 -0
  813. tools/databridge/connectors/messaging_base.py +172 -0
  814. tools/databridge/connectors/mssql.py +63 -0
  815. tools/databridge/connectors/mysql.py +57 -0
  816. tools/databridge/connectors/netsuite.py +170 -0
  817. tools/databridge/connectors/o365_mail.py +196 -0
  818. tools/databridge/connectors/oracle.py +65 -0
  819. tools/databridge/connectors/pagerduty_connector.py +162 -0
  820. tools/databridge/connectors/parquet_connector.py +131 -0
  821. tools/databridge/connectors/postgresql.py +58 -0
  822. tools/databridge/connectors/s3.py +65 -0
  823. tools/databridge/connectors/saas_base.py +198 -0
  824. tools/databridge/connectors/salesforce.py +126 -0
  825. tools/databridge/connectors/sap.py +89 -0
  826. tools/databridge/connectors/servicenow.py +60 -0
  827. tools/databridge/connectors/signal_messaging.py +150 -0
  828. tools/databridge/connectors/slack_messaging.py +203 -0
  829. tools/databridge/connectors/smtp_connector.py +126 -0
  830. tools/databridge/connectors/soap_base.py +258 -0
  831. tools/databridge/connectors/splunk_connector.py +171 -0
  832. tools/databridge/connectors/sql_base.py +310 -0
  833. tools/databridge/connectors/sqlite_connector.py +76 -0
  834. tools/databridge/connectors/teams.py +148 -0
  835. tools/databridge/connectors/telegram.py +192 -0
  836. tools/databridge/connectors/whatsapp.py +137 -0
  837. tools/databridge/data_profiler.py +99 -0
  838. tools/databridge/forge/__init__.py +6 -0
  839. tools/databridge/forge/base_selector.py +150 -0
  840. tools/databridge/forge/code_generator.py +206 -0
  841. tools/databridge/forge/community_hub.py +539 -0
  842. tools/databridge/forge/forge_agent.py +306 -0
  843. tools/databridge/forge/import_handler.py +133 -0
  844. tools/databridge/forge/integration_tester.py +127 -0
  845. tools/databridge/forge/marketplace_publisher.py +164 -0
  846. tools/databridge/forge/promoter.py +159 -0
  847. tools/databridge/forge/sandbox_manager.py +257 -0
  848. tools/databridge/forge/spec_parser.py +358 -0
  849. tools/databridge/forge/static_validator.py +363 -0
  850. tools/databridge/forge/templates/__init__.py +591 -0
  851. tools/databridge/format_converter.py +188 -0
  852. tools/databridge/mapping_engine.py +348 -0
  853. tools/databridge/messaging/__init__.py +5 -0
  854. tools/databridge/messaging/agent_bridge.py +254 -0
  855. tools/databridge/messaging/message_envelope.py +111 -0
  856. tools/databridge/messaging/message_logger.py +204 -0
  857. tools/databridge/messaging/messaging_daemon.py +326 -0
  858. tools/databridge/messaging/oauth2_manager.py +411 -0
  859. tools/databridge/pii_detector.py +221 -0
  860. tools/databridge/registry.py +352 -0
  861. tools/databridge/relay_server.py +105 -0
  862. tools/databridge/scale/__init__.py +16 -0
  863. tools/databridge/scale/backpressure.py +134 -0
  864. tools/databridge/scale/chunked_pipeline.py +169 -0
  865. tools/databridge/scale/connection_pool.py +293 -0
  866. tools/databridge/scale/engine.py +492 -0
  867. tools/databridge/scale/worker_pool.py +140 -0
  868. tools/databridge/scale/write_batcher.py +250 -0
  869. tools/databridge/schema_engine.py +324 -0
  870. tools/databridge/stream_manager.py +225 -0
  871. tools/databridge/sync_engine.py +411 -0
  872. tools/databridge/transforms.py +302 -0
  873. tools/db/__init__.py +1 -0
  874. tools/db/backup.py +312 -0
  875. tools/db/backup_manager.py +832 -0
  876. tools/db/init_icdev_db.py +7753 -0
  877. tools/db/init_sparkpilot_db.py +431 -0
  878. tools/db/migrate.py +177 -0
  879. tools/db/migrate_innovation_audit.py +165 -0
  880. tools/db/migration_runner.py +548 -0
  881. tools/db/migrations/001_baseline/meta.json +9 -0
  882. tools/db/migrations/001_baseline/up.py +67 -0
  883. tools/db/migrations/002_memory_enhancements/down.sql +8 -0
  884. tools/db/migrations/002_memory_enhancements/meta.json +9 -0
  885. tools/db/migrations/002_memory_enhancements/up.py +119 -0
  886. tools/db/migrations/003_dev_profiles/meta.json +8 -0
  887. tools/db/migrations/003_dev_profiles/up.py +93 -0
  888. tools/db/migrations/004_innovation_engine/down.py +19 -0
  889. tools/db/migrations/004_innovation_engine/up.py +227 -0
  890. tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
  891. tools/db/migrations/005_phase_37_ai_security/up.py +257 -0
  892. tools/db/migrations/006_phase_36_evolution/down.py +21 -0
  893. tools/db/migrations/006_phase_36_evolution/up.py +323 -0
  894. tools/db/migrations/007_phase_38_cloud/down.py +14 -0
  895. tools/db/migrations/007_phase_38_cloud/up.py +110 -0
  896. tools/db/migrations/008_phase36_37_integration/up.py +55 -0
  897. tools/db/migrations/__init__.py +2 -0
  898. tools/db/pg_migrate.py +642 -0
  899. tools/db/storage.py +1080 -0
  900. tools/decisions/__init__.py +2 -0
  901. tools/decisions/dmn_engine.py +695 -0
  902. tools/devsecops/__init__.py +2 -0
  903. tools/devsecops/attestation_manager.py +449 -0
  904. tools/devsecops/network_segmentation_generator.py +604 -0
  905. tools/devsecops/pdp_config_generator.py +1246 -0
  906. tools/devsecops/pipeline_security_generator.py +475 -0
  907. tools/devsecops/policy_generator.py +644 -0
  908. tools/devsecops/profile_manager.py +374 -0
  909. tools/devsecops/service_mesh_generator.py +1063 -0
  910. tools/devsecops/zta_maturity_scorer.py +355 -0
  911. tools/devsecops/zta_terraform_generator.py +1301 -0
  912. tools/edge_ai/__init__.py +2 -0
  913. tools/edge_ai/model_manager.py +200 -0
  914. tools/embedded/__init__.py +2 -0
  915. tools/embedded/cmake_generator.py +318 -0
  916. tools/embedded/crash_analyzer.py +191 -0
  917. tools/embedded/nl_to_firmware.py +277 -0
  918. tools/events/__init__.py +1 -0
  919. tools/events/event_bus.py +199 -0
  920. tools/finetune/pair_generator.py +832 -0
  921. tools/fleet/__init__.py +2 -0
  922. tools/fleet/device_registry.py +148 -0
  923. tools/fleet/ota_manager.py +153 -0
  924. tools/forge_studio/__init__.py +13 -0
  925. tools/forge_studio/analytics/__init__.py +0 -0
  926. tools/forge_studio/analytics/process_miner.py +383 -0
  927. tools/forge_studio/audit.py +183 -0
  928. tools/forge_studio/blueprint/__init__.py +2 -0
  929. tools/forge_studio/blueprint/build_tracker.py +317 -0
  930. tools/forge_studio/blueprint/export_engine.py +441 -0
  931. tools/forge_studio/blueprint/parent_client.py +335 -0
  932. tools/forge_studio/catalog/__init__.py +2 -0
  933. tools/forge_studio/catalog/component_registry.py +176 -0
  934. tools/forge_studio/catalog/schema_validator.py +193 -0
  935. tools/forge_studio/compliance/__init__.py +1 -0
  936. tools/forge_studio/compliance/compliance_wiring.py +554 -0
  937. tools/forge_studio/deploy/__init__.py +1 -0
  938. tools/forge_studio/deploy/airgap_packager.py +466 -0
  939. tools/forge_studio/deploy/deploy_engine.py +1792 -0
  940. tools/forge_studio/deploy/env_manager.py +431 -0
  941. tools/forge_studio/eject/__init__.py +2 -0
  942. tools/forge_studio/eject/docker_compose_generator.py +237 -0
  943. tools/forge_studio/eject/eject_engine.py +230 -0
  944. tools/forge_studio/eject/expo_scaffolder.py +303 -0
  945. tools/forge_studio/eject/nextjs_scaffolder.py +338 -0
  946. tools/forge_studio/enterprise/__init__.py +0 -0
  947. tools/forge_studio/enterprise/custom_frameworks.py +826 -0
  948. tools/forge_studio/enterprise/hardening_engine.py +1530 -0
  949. tools/forge_studio/enterprise/sso_manager.py +718 -0
  950. tools/forge_studio/enterprise/whitelabel_engine.py +887 -0
  951. tools/forge_studio/formula/__init__.py +0 -0
  952. tools/forge_studio/formula/expression_engine.py +562 -0
  953. tools/forge_studio/formula/formula_registry.py +265 -0
  954. tools/forge_studio/generator/__init__.py +2 -0
  955. tools/forge_studio/generator/app_generator.py +584 -0
  956. tools/forge_studio/generator/complexity_detector.py +368 -0
  957. tools/forge_studio/generator/prompt_templates.py +104 -0
  958. tools/forge_studio/generator/spec_builder.py +192 -0
  959. tools/forge_studio/intake_bridge.py +898 -0
  960. tools/forge_studio/marketplace/__init__.py +0 -0
  961. tools/forge_studio/marketplace/component_hub.py +428 -0
  962. tools/forge_studio/models.py +369 -0
  963. tools/forge_studio/renderer/__init__.py +2 -0
  964. tools/forge_studio/renderer/json_render_engine.py +623 -0
  965. tools/forge_studio/renderer/layout_engine.py +214 -0
  966. tools/forge_studio/renderer/rn_component_map.py +182 -0
  967. tools/forge_studio/supabase/__init__.py +2 -0
  968. tools/forge_studio/supabase/auth_generator.py +283 -0
  969. tools/forge_studio/supabase/migration_generator.py +93 -0
  970. tools/forge_studio/supabase/schema_generator.py +281 -0
  971. tools/forge_studio/tenant_manager.py +387 -0
  972. tools/forge_studio/workflow/__init__.py +2 -0
  973. tools/forge_studio/workflow/bpmn_adapter.py +489 -0
  974. tools/govcon/draft_orchestrator.py +1151 -0
  975. tools/govcon/engine_enrichment.py +373 -0
  976. tools/govcon/knowledge_base.py +487 -0
  977. tools/govcon/knowledge_ingestion.py +510 -0
  978. tools/govcon/sam_scanner.py +754 -0
  979. tools/harness/__init__.py +6 -0
  980. tools/harness/exit_criteria_evaluator.py +231 -0
  981. tools/harness/maturity_assessor.py +347 -0
  982. tools/harness/scaffold_harness.py +416 -0
  983. tools/harness/trace_analyzer.py +281 -0
  984. tools/infra/__init__.py +1 -0
  985. tools/infra/ansible_generator.py +867 -0
  986. tools/infra/dockerfile_generator.py +359 -0
  987. tools/infra/infra_status.py +384 -0
  988. tools/infra/ironbank_metadata_generator.py +403 -0
  989. tools/infra/k8s_generator.py +1000 -0
  990. tools/infra/pipeline_generator.py +830 -0
  991. tools/infra/rollback.py +389 -0
  992. tools/infra/terraform_generator.py +1140 -0
  993. tools/infra/terraform_generator_azure.py +1252 -0
  994. tools/infra/terraform_generator_gcp.py +951 -0
  995. tools/infra/terraform_generator_ibm.py +359 -0
  996. tools/infra/terraform_generator_oci.py +918 -0
  997. tools/infra/terraform_generator_onprem.py +318 -0
  998. tools/knowledge/__init__.py +1 -0
  999. tools/knowledge/knowledge_ingest.py +281 -0
  1000. tools/knowledge/pattern_detector.py +681 -0
  1001. tools/knowledge/recommendation_engine.py +449 -0
  1002. tools/knowledge/self_heal_analyzer.py +492 -0
  1003. tools/knowledge_graph/__init__.py +2 -0
  1004. tools/knowledge_graph/graph_rag.py +498 -0
  1005. tools/knowledge_graph/ingester.py +406 -0
  1006. tools/knowledge_graph/insight_generator.py +369 -0
  1007. tools/knowledge_graph/text_network.py +832 -0
  1008. tools/llm/__init__.py +72 -0
  1009. tools/llm/anthropic_provider.py +170 -0
  1010. tools/llm/azure_openai_provider.py +338 -0
  1011. tools/llm/bedrock_provider.py +315 -0
  1012. tools/llm/embedding_provider.py +438 -0
  1013. tools/llm/gemini_provider.py +381 -0
  1014. tools/llm/ibm_watsonx_provider.py +231 -0
  1015. tools/llm/oci_genai_provider.py +462 -0
  1016. tools/llm/ollama_provider.py +350 -0
  1017. tools/llm/openai_provider.py +225 -0
  1018. tools/llm/prompt_registry.py +447 -0
  1019. tools/llm/provider.py +355 -0
  1020. tools/llm/provider_sdk.py +175 -0
  1021. tools/llm/router.py +1124 -0
  1022. tools/llm/semantic_cache.py +394 -0
  1023. tools/llm/vertex_ai_provider.py +374 -0
  1024. tools/maintenance/__init__.py +2 -0
  1025. tools/maintenance/dependency_scanner.py +1016 -0
  1026. tools/maintenance/maintenance_auditor.py +804 -0
  1027. tools/maintenance/remediation_engine.py +957 -0
  1028. tools/maintenance/vulnerability_checker.py +978 -0
  1029. tools/manifest.md +1066 -0
  1030. tools/marketplace/asset_installer.py +639 -0
  1031. tools/marketplace/feedback_validator.py +359 -0
  1032. tools/marketplace/license_client.py +458 -0
  1033. tools/marketplace/module_crypto.py +544 -0
  1034. tools/marketplace/module_runtime.py +236 -0
  1035. tools/marketplace/token_store.py +264 -0
  1036. tools/mbse/__init__.py +3 -0
  1037. tools/mbse/des_assessor.py +1173 -0
  1038. tools/mbse/des_report_generator.py +787 -0
  1039. tools/mbse/diagram_extractor.py +792 -0
  1040. tools/mbse/digital_thread.py +1650 -0
  1041. tools/mbse/model_code_generator.py +1115 -0
  1042. tools/mbse/model_control_mapper.py +410 -0
  1043. tools/mbse/pi_model_tracker.py +1079 -0
  1044. tools/mbse/reqif_parser.py +1468 -0
  1045. tools/mbse/sync_engine.py +1789 -0
  1046. tools/mbse/thread_heatmap.py +445 -0
  1047. tools/mbse/xmi_parser.py +1558 -0
  1048. tools/mcp/builder_server.py +64 -0
  1049. tools/mcp/compliance_server.py +64 -0
  1050. tools/mcp/connector_forge_server.py +155 -0
  1051. tools/mcp/core_server.py +64 -0
  1052. tools/mcp/devsecops_server.py +11 -0
  1053. tools/mcp/devsecops_zta_server.py +64 -0
  1054. tools/mcp/knowledge_server.py +64 -0
  1055. tools/mcp/monitor_server.py +64 -0
  1056. tools/mcp/ops_server.py +300 -0
  1057. tools/mcp/requirements_analyst_server.py +64 -0
  1058. tools/mcp/requirements_server.py +11 -0
  1059. tools/mcp/security_server.py +64 -0
  1060. tools/mcp/simulation_server.py +64 -0
  1061. tools/mcp/supply_chain_server.py +64 -0
  1062. tools/mcp/tool_registry.py +299 -0
  1063. tools/memory/__init__.py +2 -0
  1064. tools/memory/auto_capture.py +346 -0
  1065. tools/memory/embed_memory.py +157 -0
  1066. tools/memory/history_compressor.py +334 -0
  1067. tools/memory/hybrid_search.py +235 -0
  1068. tools/memory/maintenance_cron.py +288 -0
  1069. tools/memory/memory_consolidation.py +439 -0
  1070. tools/memory/memory_db.py +132 -0
  1071. tools/memory/memory_read.py +101 -0
  1072. tools/memory/memory_write.py +221 -0
  1073. tools/memory/semantic_search.py +138 -0
  1074. tools/memory/time_decay.py +434 -0
  1075. tools/missions/__init__.py +2 -0
  1076. tools/missions/mission_engine.py +459 -0
  1077. tools/monitor/__init__.py +1 -0
  1078. tools/monitor/alert_correlator.py +486 -0
  1079. tools/monitor/auto_resolver.py +603 -0
  1080. tools/monitor/health_checker.py +507 -0
  1081. tools/monitor/heartbeat_daemon.py +779 -0
  1082. tools/monitor/log_analyzer.py +507 -0
  1083. tools/monitor/metric_collector.py +484 -0
  1084. tools/mosa/__init__.py +10 -0
  1085. tools/mosa/icd_generator.py +358 -0
  1086. tools/mosa/modular_design_analyzer.py +682 -0
  1087. tools/mosa/mosa_code_enforcer.py +348 -0
  1088. tools/mosa/tsp_generator.py +265 -0
  1089. tools/observability/__init__.py +100 -0
  1090. tools/observability/genai_attributes.py +88 -0
  1091. tools/observability/instrumentation.py +140 -0
  1092. tools/observability/mlflow_exporter.py +193 -0
  1093. tools/observability/otel_tracer.py +168 -0
  1094. tools/observability/provenance/__init__.py +3 -0
  1095. tools/observability/provenance/prov_recorder.py +322 -0
  1096. tools/observability/shap/__init__.py +3 -0
  1097. tools/observability/shap/agent_shap.py +274 -0
  1098. tools/observability/sqlite_tracer.py +360 -0
  1099. tools/observability/trace_context.py +205 -0
  1100. tools/observability/tracer.py +230 -0
  1101. tools/orchestration/__init__.py +1 -0
  1102. tools/orchestration/peer_channels.py +254 -0
  1103. tools/orchestration/saga_coordinator.py +390 -0
  1104. tools/project/__init__.py +1 -0
  1105. tools/project/manifest_loader.py +418 -0
  1106. tools/project/project_create.py +350 -0
  1107. tools/project/project_list.py +171 -0
  1108. tools/project/project_scaffold.py +1715 -0
  1109. tools/project/project_status.py +478 -0
  1110. tools/project/session_context_builder.py +752 -0
  1111. tools/project/validate_manifest.py +54 -0
  1112. tools/rag/corrective_rag.py +582 -0
  1113. tools/rag/source_registry.py +482 -0
  1114. tools/requirements/__init__.py +1 -0
  1115. tools/requirements/ai_governance_scorer.py +207 -0
  1116. tools/requirements/boundary_analyzer.py +1281 -0
  1117. tools/requirements/clarification_engine.py +605 -0
  1118. tools/requirements/complexity_scorer.py +369 -0
  1119. tools/requirements/consistency_analyzer.py +789 -0
  1120. tools/requirements/constitution_manager.py +592 -0
  1121. tools/requirements/decomposition_engine.py +764 -0
  1122. tools/requirements/document_extractor.py +1002 -0
  1123. tools/requirements/elicitation_techniques.py +508 -0
  1124. tools/requirements/gap_detector.py +260 -0
  1125. tools/requirements/intake_engine.py +2175 -0
  1126. tools/requirements/prd_generator.py +839 -0
  1127. tools/requirements/prd_validator.py +584 -0
  1128. tools/requirements/readiness_scorer.py +302 -0
  1129. tools/requirements/spec_organizer.py +1015 -0
  1130. tools/requirements/spec_quality_checker.py +1083 -0
  1131. tools/requirements/traceability_builder.py +566 -0
  1132. tools/research/__init__.py +3 -0
  1133. tools/research/academic_scanner.py +130 -0
  1134. tools/research/build_buy_analyzer.py +229 -0
  1135. tools/research/challenge_scorer.py +280 -0
  1136. tools/research/community_scanner.py +174 -0
  1137. tools/research/cross_engine_bridge.py +124 -0
  1138. tools/research/dossier_generator.py +305 -0
  1139. tools/research/landscape_scanner.py +315 -0
  1140. tools/research/regulatory_scanner.py +248 -0
  1141. tools/research/research_manager.py +469 -0
  1142. tools/research/source_scanner.py +150 -0
  1143. tools/research/vertical_loader.py +118 -0
  1144. tools/saas/__init__.py +0 -0
  1145. tools/saas/licensing/__init__.py +0 -0
  1146. tools/saas/licensing/license_validator.py +345 -0
  1147. tools/scaffold/__init__.py +2 -0
  1148. tools/scaffold/golden_path.py +504 -0
  1149. tools/security/__init__.py +1 -0
  1150. tools/security/agent_output_validator.py +330 -0
  1151. tools/security/agent_trust_scorer.py +652 -0
  1152. tools/security/ai_bom_generator.py +718 -0
  1153. tools/security/ai_telemetry_logger.py +469 -0
  1154. tools/security/atlas_red_team.py +541 -0
  1155. tools/security/code_pattern_scanner.py +382 -0
  1156. tools/security/confabulation_detector.py +265 -0
  1157. tools/security/container_scanner.py +489 -0
  1158. tools/security/dependency_auditor.py +942 -0
  1159. tools/security/endpoint_security_scanner.py +626 -0
  1160. tools/security/mcp_tool_authorizer.py +242 -0
  1161. tools/security/output_verifier.py +427 -0
  1162. tools/security/prompt_injection_detector.py +737 -0
  1163. tools/security/sast_runner.py +946 -0
  1164. tools/security/secret_detector.py +376 -0
  1165. tools/security/threat_modeler.py +678 -0
  1166. tools/security/tool_chain_validator.py +357 -0
  1167. tools/security/vuln_scanner.py +536 -0
  1168. tools/simulation/__init__.py +2 -0
  1169. tools/simulation/ato_simulator.py +517 -0
  1170. tools/simulation/coa_generator.py +1539 -0
  1171. tools/simulation/monte_carlo.py +745 -0
  1172. tools/simulation/scenario_manager.py +1060 -0
  1173. tools/simulation/simulation_engine.py +1091 -0
  1174. tools/simulator/__init__.py +2 -0
  1175. tools/simulator/sim_runner.py +272 -0
  1176. tools/supply_chain/__init__.py +2 -0
  1177. tools/supply_chain/cve_triager.py +690 -0
  1178. tools/supply_chain/dependency_graph.py +630 -0
  1179. tools/supply_chain/isa_manager.py +526 -0
  1180. tools/supply_chain/scrm_assessor.py +531 -0
  1181. tools/supply_chain/slsa_verifier.py +473 -0
  1182. tools/testing/__init__.py +2 -0
  1183. tools/testing/acceptance_validator.py +411 -0
  1184. tools/testing/api_surface_extractor.py +749 -0
  1185. tools/testing/claude_dir_validator.py +831 -0
  1186. tools/testing/data_types.py +199 -0
  1187. tools/testing/e2e_runner.py +715 -0
  1188. tools/testing/fuzz_cli.py +306 -0
  1189. tools/testing/health_check.py +483 -0
  1190. tools/testing/platform_check.py +143 -0
  1191. tools/testing/production_audit.py +1836 -0
  1192. tools/testing/production_remediate.py +803 -0
  1193. tools/testing/screenshot_validator.py +538 -0
  1194. tools/testing/smoke_test.py +283 -0
  1195. tools/testing/test_agent_models.py +117 -0
  1196. tools/testing/test_orchestrator.py +957 -0
  1197. tools/testing/utils.py +229 -0
  1198. tools/writeguard/__init__.py +1 -0
  1199. tools/writeguard/main.py +1 -0
  1200. tools/writing/__init__.py +7 -0
  1201. tools/writing/ai_content_detector.py +316 -0
  1202. tools/writing/analysis_engine.py +454 -0
  1203. tools/writing/batch_analyzer.py +276 -0
  1204. tools/writing/coherence_analyzer.py +221 -0
  1205. tools/writing/govcon_bridge.py +509 -0
  1206. tools/writing/grammar_checker.py +270 -0
  1207. tools/writing/plagiarism_detector.py +106 -0
  1208. tools/writing/readability_scorer.py +201 -0
  1209. tools/writing/rewriter.py +96 -0
  1210. tools/writing/signal_registrar.py +167 -0
  1211. tools/writing/snippet_manager.py +276 -0
  1212. tools/writing/style_enforcer.py +220 -0
  1213. tools/writing/style_guide_manager.py +438 -0
  1214. tools/writing/tone_profiler.py +168 -0
@@ -0,0 +1,1539 @@
1
+ #!/usr/bin/env python3
2
+ # CUI // SP-CTI
3
+ # Controlled by: Department of Defense
4
+ # CUI Category: CTI
5
+ # Distribution: D
6
+ # POC: SPARKPILOT System Administrator
7
+ """COA (Course of Action) Generator for the SPARKPILOT 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 sys
45
+ import uuid
46
+ from datetime import datetime, timezone
47
+ from pathlib import Path
48
+ from tools.db.storage import get_connection
49
+
50
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
51
+
52
+ RED_ALT_PATTERNS_PATH = BASE_DIR / "context" / "requirements" / "red_alternative_patterns.json"
53
+
54
+ # Graceful import of audit logger
55
+ try:
56
+ from tools.audit.audit_logger import log_event
57
+ _HAS_AUDIT = True
58
+ except ImportError:
59
+ _HAS_AUDIT = False
60
+ def log_event(**kwargs) -> int: # type: ignore[misc]
61
+ return -1
62
+
63
+
64
+ # ---------------------------------------------------------------------------
65
+ # Constants
66
+ # ---------------------------------------------------------------------------
67
+
68
+ # T-shirt size to hours mapping (used for cost estimation)
69
+ _TSHIRT_HOURS = {
70
+ "XS": 8,
71
+ "S": 24,
72
+ "M": 80,
73
+ "L": 200,
74
+ "XL": 480,
75
+ "XXL": 960,
76
+ }
77
+
78
+ # Blended hourly rate for cost range estimates (low / high)
79
+ _RATE_LOW = 125 # USD/hr
80
+ _RATE_HIGH = 200 # USD/hr
81
+
82
+ # Tier rank for comparisons (lower is better from risk perspective)
83
+ _TIER_RANK = {"GREEN": 1, "YELLOW": 2, "ORANGE": 3, "RED": 4}
84
+ _RANK_TIER = {v: k for k, v in _TIER_RANK.items()}
85
+
86
+
87
+ # ---------------------------------------------------------------------------
88
+ # Database helpers
89
+ # ---------------------------------------------------------------------------
90
+
91
+
92
+ def _generate_id(prefix="coa"):
93
+ """Generate a unique ID with prefix."""
94
+ return f"{prefix}-{uuid.uuid4().hex[:12]}"
95
+
96
+
97
+ def _now_iso():
98
+ """Return current UTC timestamp in ISO format."""
99
+ return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
100
+
101
+
102
+ # ---------------------------------------------------------------------------
103
+ # Data loaders
104
+ # ---------------------------------------------------------------------------
105
+
106
+ def _load_requirements(conn, session_id):
107
+ """Load intake requirements for a session, grouped by priority."""
108
+ rows = conn.execute(
109
+ "SELECT * FROM intake_requirements WHERE session_id = ? ORDER BY priority",
110
+ (session_id,),
111
+ ).fetchall()
112
+ reqs = [dict(r) for r in rows]
113
+ by_priority = {"critical": [], "high": [], "medium": [], "low": []}
114
+ for r in reqs:
115
+ by_priority.setdefault(r.get("priority", "medium"), []).append(r)
116
+ return reqs, by_priority
117
+
118
+
119
+ def _load_decomposition(conn, session_id):
120
+ """Load SAFe decomposition items for a session."""
121
+ rows = conn.execute(
122
+ "SELECT * FROM safe_decomposition WHERE session_id = ? ORDER BY level, title",
123
+ (session_id,),
124
+ ).fetchall()
125
+ return [dict(r) for r in rows]
126
+
127
+
128
+ def _load_boundary_assessments(conn, session_id):
129
+ """Load boundary impact assessments for a session."""
130
+ rows = conn.execute(
131
+ "SELECT * FROM boundary_impact_assessments WHERE session_id = ?",
132
+ (session_id,),
133
+ ).fetchall()
134
+ return [dict(r) for r in rows]
135
+
136
+
137
+ def _get_session(conn, session_id):
138
+ """Load the intake session record."""
139
+ row = conn.execute(
140
+ "SELECT * FROM intake_sessions WHERE id = ?", (session_id,)
141
+ ).fetchone()
142
+ if not row:
143
+ raise ValueError(f"Intake session not found: {session_id}")
144
+ return dict(row)
145
+
146
+
147
+ def _load_red_alternative_patterns():
148
+ """Load RED alternative patterns from context file."""
149
+ if not RED_ALT_PATTERNS_PATH.exists():
150
+ return {"alternative_patterns": [], "selection_criteria": {}}
151
+ with open(RED_ALT_PATTERNS_PATH, "r", encoding="utf-8") as f:
152
+ return json.load(f)
153
+
154
+
155
+ # ---------------------------------------------------------------------------
156
+ # Cost estimation helpers
157
+ # ---------------------------------------------------------------------------
158
+
159
+ def _sum_tshirt_hours(items):
160
+ """Sum estimated hours from T-shirt sizes of decomposition items."""
161
+ total = 0
162
+ breakdown = {}
163
+ for item in items:
164
+ size = item.get("t_shirt_size") or "M"
165
+ hours = _TSHIRT_HOURS.get(size, 80)
166
+ total += hours
167
+ breakdown[size] = breakdown.get(size, 0) + 1
168
+ return total, breakdown
169
+
170
+
171
+ def _cost_estimate(hours, breakdown):
172
+ """Build a cost estimate dict from total hours."""
173
+ return {
174
+ "hours": hours,
175
+ "cost_range_low": hours * _RATE_LOW,
176
+ "cost_range_high": hours * _RATE_HIGH,
177
+ "t_shirt_breakdown": breakdown,
178
+ }
179
+
180
+
181
+ # ---------------------------------------------------------------------------
182
+ # Boundary tier aggregation
183
+ # ---------------------------------------------------------------------------
184
+
185
+ def _best_tier(assessments):
186
+ """Return the best (lowest-impact) tier from assessments."""
187
+ if not assessments:
188
+ return "GREEN"
189
+ ranks = [_TIER_RANK.get(a.get("impact_tier", "GREEN"), 1) for a in assessments]
190
+ return _RANK_TIER.get(min(ranks), "GREEN")
191
+
192
+
193
+ def _worst_tier(assessments):
194
+ """Return the worst (highest-impact) tier from assessments."""
195
+ if not assessments:
196
+ return "GREEN"
197
+ ranks = [_TIER_RANK.get(a.get("impact_tier", "GREEN"), 1) for a in assessments]
198
+ return _RANK_TIER.get(max(ranks), "GREEN")
199
+
200
+
201
+ def _average_tier(assessments):
202
+ """Return the average (rounded) tier from assessments."""
203
+ if not assessments:
204
+ return "GREEN"
205
+ ranks = [_TIER_RANK.get(a.get("impact_tier", "GREEN"), 1) for a in assessments]
206
+ avg = sum(ranks) / len(ranks)
207
+ rounded = round(avg)
208
+ return _RANK_TIER.get(rounded, "YELLOW")
209
+
210
+
211
+ # ---------------------------------------------------------------------------
212
+ # Risk register generator
213
+ # ---------------------------------------------------------------------------
214
+
215
+ def _generate_risk_register(coa_type, reqs, assessments):
216
+ """Generate top-5 risks for a COA type."""
217
+ base_risks = {
218
+ "speed": [
219
+ {"id": "R-01", "description": "Insufficient test coverage due to accelerated timeline",
220
+ "probability": "high", "impact": "high",
221
+ "mitigation": "Automated test generation, prioritize critical path tests"},
222
+ {"id": "R-02", "description": "Technical debt accumulation from shortcuts",
223
+ "probability": "high", "impact": "medium",
224
+ "mitigation": "Schedule refactoring sprint in next PI"},
225
+ {"id": "R-03", "description": "Incomplete compliance artifacts",
226
+ "probability": "medium", "impact": "high",
227
+ "mitigation": "Parallel compliance artifact generation"},
228
+ {"id": "R-04", "description": "Integration defects from limited scope testing",
229
+ "probability": "medium", "impact": "medium",
230
+ "mitigation": "API contract testing at integration points"},
231
+ {"id": "R-05", "description": "Rework required when adding deferred features",
232
+ "probability": "high", "impact": "medium",
233
+ "mitigation": "Design for extensibility in core architecture"},
234
+ ],
235
+ "balanced": [
236
+ {"id": "R-01", "description": "Schedule pressure on P2 requirements",
237
+ "probability": "medium", "impact": "medium",
238
+ "mitigation": "WSJF prioritization, buffer sprints between PIs"},
239
+ {"id": "R-02", "description": "Resource contention across work streams",
240
+ "probability": "medium", "impact": "medium",
241
+ "mitigation": "SAFe capacity allocation, clear team assignments"},
242
+ {"id": "R-03", "description": "Boundary impact from YELLOW-tier items",
243
+ "probability": "low", "impact": "high",
244
+ "mitigation": "Early boundary assessment, incremental SSP updates"},
245
+ {"id": "R-04", "description": "Dependency on external system availability",
246
+ "probability": "low", "impact": "medium",
247
+ "mitigation": "Mock services for development, ISA tracking"},
248
+ {"id": "R-05", "description": "Compliance gap in deferred P3 items",
249
+ "probability": "low", "impact": "low",
250
+ "mitigation": "Compliance coverage tracking per PI"},
251
+ ],
252
+ "comprehensive": [
253
+ {"id": "R-01", "description": "Feature creep and scope growth beyond estimates",
254
+ "probability": "high", "impact": "medium",
255
+ "mitigation": "Strict change control board, PI commitment gates"},
256
+ {"id": "R-02", "description": "Extended timeline increases cost overrun risk",
257
+ "probability": "medium", "impact": "high",
258
+ "mitigation": "Earned value management, monthly burn-rate reviews"},
259
+ {"id": "R-03", "description": "Team fatigue on long-duration project",
260
+ "probability": "medium", "impact": "medium",
261
+ "mitigation": "Sprint rotation, innovation sprints between PIs"},
262
+ {"id": "R-04", "description": "Technology obsolescence during long build",
263
+ "probability": "low", "impact": "medium",
264
+ "mitigation": "Architecture Decision Records, modular design"},
265
+ {"id": "R-05", "description": "Stakeholder engagement decline over extended period",
266
+ "probability": "medium", "impact": "medium",
267
+ "mitigation": "PI demos, monthly stakeholder briefings"},
268
+ ],
269
+ }
270
+ risks = base_risks.get(coa_type, base_risks["balanced"])
271
+
272
+ # Add boundary-specific risk if RED-tier assessments exist
273
+ red_count = sum(1 for a in assessments if a.get("impact_tier") == "RED")
274
+ if red_count > 0 and len(risks) < 6:
275
+ risks.append({
276
+ "id": f"R-{len(risks)+1:02d}",
277
+ "description": f"{red_count} requirement(s) with RED boundary impact may invalidate ATO",
278
+ "probability": "high",
279
+ "impact": "critical",
280
+ "mitigation": "Generate alternative COAs, engage AO early",
281
+ })
282
+
283
+ return risks[:5]
284
+
285
+
286
+ # ---------------------------------------------------------------------------
287
+ # Architecture summary generator
288
+ # ---------------------------------------------------------------------------
289
+
290
+ def _generate_architecture(coa_type, reqs, decomposition):
291
+ """Generate architecture summary for a COA type."""
292
+ component_counts = {
293
+ "speed": {"services": 2, "databases": 1, "queues": 0, "caches": 0},
294
+ "balanced": {"services": 4, "databases": 1, "queues": 1, "caches": 1},
295
+ "comprehensive": {"services": 8, "databases": 2, "queues": 2, "caches": 2},
296
+ }
297
+ base = component_counts.get(coa_type, component_counts["balanced"])
298
+
299
+ # Scale based on decomposition size
300
+ epic_count = sum(1 for d in decomposition if d.get("level") == "epic")
301
+ if epic_count > 3:
302
+ scale = min(epic_count / 3.0, 2.0)
303
+ for key in base:
304
+ base[key] = max(1, int(base[key] * scale))
305
+
306
+ patterns = {
307
+ "speed": "Monolithic with modular boundaries",
308
+ "balanced": "Modular monolith with service extraction points",
309
+ "comprehensive": "Microservices with event-driven integration",
310
+ }
311
+
312
+ return {
313
+ "pattern": patterns.get(coa_type, patterns["balanced"]),
314
+ "components": base,
315
+ "infrastructure": {
316
+ "compute": "AWS GovCloud ECS" if coa_type == "speed" else "AWS GovCloud EKS",
317
+ "database": "RDS PostgreSQL",
318
+ "monitoring": "ELK + Prometheus/Grafana",
319
+ "ci_cd": "GitLab CI/CD",
320
+ },
321
+ "security": {
322
+ "auth": "CAC/PKI + OAuth 2.0",
323
+ "encryption": "FIPS 140-2 (TLS 1.3, AES-256)",
324
+ "network": "VPC with private subnets, NACLs",
325
+ },
326
+ }
327
+
328
+
329
+ # ---------------------------------------------------------------------------
330
+ # PI roadmap generator
331
+ # ---------------------------------------------------------------------------
332
+
333
+ def _generate_pi_roadmap(coa_type, reqs_by_priority, decomposition):
334
+ """Generate PI roadmap for a COA type."""
335
+ # Determine how many PIs
336
+ pi_counts = {"speed": 2, "balanced": 3, "comprehensive": 5}
337
+ num_pis = pi_counts.get(coa_type, 3)
338
+
339
+ # Gather items by PI target from decomposition
340
+ items_by_pi = {}
341
+ for item in decomposition:
342
+ pi = item.get("pi_target") or "PI-1"
343
+ items_by_pi.setdefault(pi, []).append(item.get("title", "Untitled"))
344
+
345
+ roadmap = []
346
+ for pi_num in range(1, num_pis + 1):
347
+ pi_key = f"PI-{pi_num}"
348
+ pi_items = items_by_pi.get(pi_key, [])
349
+
350
+ # If no items mapped to this PI, assign based on COA type
351
+ if not pi_items:
352
+ if coa_type == "speed" and pi_num == 1:
353
+ pi_items = [(r.get("refined_text") or r.get("raw_text") or "Requirement")[:80]
354
+ for r in reqs_by_priority.get("critical", [])
355
+ + reqs_by_priority.get("high", [])]
356
+ elif coa_type == "balanced":
357
+ if pi_num <= 2:
358
+ pool = reqs_by_priority.get("critical", []) + reqs_by_priority.get("high", [])
359
+ else:
360
+ pool = reqs_by_priority.get("medium", [])
361
+ pi_items = [(r.get("refined_text") or r.get("raw_text") or "Requirement")[:80]
362
+ for r in pool[:5]]
363
+ elif coa_type == "comprehensive":
364
+ all_reqs = []
365
+ for p in ("critical", "high", "medium", "low"):
366
+ all_reqs.extend(reqs_by_priority.get(p, []))
367
+ chunk = len(all_reqs) // num_pis if num_pis else 1
368
+ chunk = max(chunk, 1)
369
+ start = (pi_num - 1) * chunk
370
+ pi_items = [(r.get("refined_text") or r.get("raw_text") or "Requirement")[:80]
371
+ for r in all_reqs[start:start + chunk]]
372
+
373
+ milestones = []
374
+ if pi_num == 1:
375
+ milestones.append("Architecture baseline approved")
376
+ milestones.append("Initial ATO artifacts generated")
377
+ if pi_num == num_pis:
378
+ milestones.append("Full system integration test")
379
+ milestones.append("ATO package submission")
380
+ if 1 < pi_num < num_pis:
381
+ milestones.append(f"PI-{pi_num} integration review")
382
+
383
+ roadmap.append({
384
+ "pi": pi_key,
385
+ "items": pi_items[:10], # Cap at 10 items per PI
386
+ "milestones": milestones,
387
+ })
388
+
389
+ return roadmap
390
+
391
+
392
+ # ---------------------------------------------------------------------------
393
+ # Compliance impact generator
394
+ # ---------------------------------------------------------------------------
395
+
396
+ def _generate_compliance_impact(coa_type, assessments):
397
+ """Generate compliance impact summary for a COA type."""
398
+ coverage_map = {"speed": 70.0, "balanced": 85.0, "comprehensive": 95.0}
399
+ coverage = coverage_map.get(coa_type, 85.0)
400
+
401
+ affected_controls = set()
402
+ for a in assessments:
403
+ ctrls = a.get("affected_controls")
404
+ if ctrls:
405
+ try:
406
+ parsed = json.loads(ctrls) if isinstance(ctrls, str) else ctrls
407
+ if isinstance(parsed, list):
408
+ affected_controls.update(parsed)
409
+ except (json.JSONDecodeError, TypeError):
410
+ pass
411
+
412
+ return {
413
+ "coverage_pct": coverage,
414
+ "affected_controls": sorted(affected_controls)[:20],
415
+ "ssp_update_required": any(
416
+ a.get("impact_tier") in ("ORANGE", "RED") for a in assessments
417
+ ),
418
+ "poam_items_expected": max(0, int((100 - coverage) / 5)),
419
+ "frameworks": ["NIST 800-53", "FedRAMP Moderate", "CMMC Level 2"],
420
+ }
421
+
422
+
423
+ # ---------------------------------------------------------------------------
424
+ # Supply chain impact generator
425
+ # ---------------------------------------------------------------------------
426
+
427
+ def _generate_supply_chain_impact(coa_type, reqs):
428
+ """Generate supply chain impact summary."""
429
+ vendor_count = {"speed": 2, "balanced": 4, "comprehensive": 6}
430
+ return {
431
+ "estimated_vendor_count": vendor_count.get(coa_type, 4),
432
+ "scrm_assessment_required": coa_type != "speed",
433
+ "section_889_review": True,
434
+ "isa_agreements_needed": 1 if coa_type == "speed" else (
435
+ 2 if coa_type == "balanced" else 3
436
+ ),
437
+ "cots_components": max(1, len(reqs) // 3),
438
+ }
439
+
440
+
441
+ # ---------------------------------------------------------------------------
442
+ # Simulation helper (creates scenario + runs basic simulation)
443
+ # ---------------------------------------------------------------------------
444
+
445
+ def _create_simulation_for_coa(conn, coa_id, session_id, project_id, coa_type, coa_data):
446
+ """Create a simulation scenario and basic results for a COA."""
447
+ scenario_id = _generate_id("sim")
448
+ now = _now_iso()
449
+
450
+ base_state = {
451
+ "coa_id": coa_id,
452
+ "coa_type": coa_type,
453
+ "requirements_count": len(coa_data.get("requirements_included", [])),
454
+ "timeline_pis": coa_data.get("timeline_pis", 3),
455
+ "cost_estimate": coa_data.get("cost_estimate", {}),
456
+ }
457
+ modifications = {
458
+ "scenario_purpose": f"Simulate {coa_type} COA outcome",
459
+ "variables_tested": ["schedule", "cost", "risk", "compliance"],
460
+ }
461
+
462
+ conn.execute(
463
+ """INSERT INTO simulation_scenarios
464
+ (id, project_id, session_id, scenario_name, scenario_type,
465
+ base_state, modifications, status, classification, created_by, created_at)
466
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
467
+ (
468
+ scenario_id, project_id, session_id,
469
+ f"{coa_type.title()} COA Simulation",
470
+ "coa_comparison",
471
+ json.dumps(base_state), json.dumps(modifications),
472
+ "completed", "CUI", "sparkpilot-simulation-engine", now,
473
+ ),
474
+ )
475
+
476
+ # Generate simulation results across dimensions
477
+ timeline_pis = coa_data.get("timeline_pis", 3)
478
+ hours = coa_data.get("cost_estimate", {}).get("hours", 200)
479
+ compliance_pct = coa_data.get("compliance_impact", {}).get("coverage_pct", 85.0)
480
+
481
+ dimensions = [
482
+ {
483
+ "dimension": "schedule",
484
+ "metric_name": "timeline_sprints",
485
+ "baseline_value": 20.0,
486
+ "simulated_value": float(timeline_pis * 5),
487
+ },
488
+ {
489
+ "dimension": "cost",
490
+ "metric_name": "total_hours",
491
+ "baseline_value": 500.0,
492
+ "simulated_value": float(hours),
493
+ },
494
+ {
495
+ "dimension": "compliance",
496
+ "metric_name": "coverage_pct",
497
+ "baseline_value": 80.0,
498
+ "simulated_value": compliance_pct,
499
+ },
500
+ {
501
+ "dimension": "risk",
502
+ "metric_name": "risk_score",
503
+ "baseline_value": 0.5,
504
+ "simulated_value": {"speed": 0.7, "balanced": 0.4, "comprehensive": 0.2}.get(
505
+ coa_type, 0.5
506
+ ),
507
+ },
508
+ ]
509
+
510
+ for dim in dimensions:
511
+ delta = dim["simulated_value"] - dim["baseline_value"]
512
+ delta_pct = (delta / dim["baseline_value"] * 100.0) if dim["baseline_value"] else 0.0
513
+ # Determine impact tier
514
+ abs_pct = abs(delta_pct)
515
+ if abs_pct < 10:
516
+ tier = "GREEN"
517
+ elif abs_pct < 25:
518
+ tier = "YELLOW"
519
+ elif abs_pct < 50:
520
+ tier = "ORANGE"
521
+ else:
522
+ tier = "RED"
523
+
524
+ conn.execute(
525
+ """INSERT INTO simulation_results
526
+ (scenario_id, dimension, metric_name, baseline_value,
527
+ simulated_value, delta, delta_pct, confidence, impact_tier,
528
+ details, calculated_at)
529
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
530
+ (
531
+ scenario_id, dim["dimension"], dim["metric_name"],
532
+ dim["baseline_value"], dim["simulated_value"],
533
+ round(delta, 2), round(delta_pct, 2),
534
+ 0.8, tier,
535
+ json.dumps({"coa_type": coa_type}), now,
536
+ ),
537
+ )
538
+
539
+ # Update scenario status
540
+ conn.execute(
541
+ "UPDATE simulation_scenarios SET status = 'completed', completed_at = ? WHERE id = ?",
542
+ (now, scenario_id),
543
+ )
544
+
545
+ return scenario_id
546
+
547
+
548
+ # ---------------------------------------------------------------------------
549
+ # Core functions
550
+ # ---------------------------------------------------------------------------
551
+
552
+ def generate_3_coas(session_id, project_id=None, simulate=False, db_path=None):
553
+ """Generate 3 Courses of Action (Speed / Balanced / Comprehensive).
554
+
555
+ Args:
556
+ session_id: The intake session ID.
557
+ project_id: Optional project ID override (read from session if None).
558
+ simulate: If True, create simulation scenarios and run them.
559
+ db_path: Optional database path override.
560
+
561
+ Returns:
562
+ dict with session_id, coas list, and recommendation.
563
+ """
564
+ conn = get_connection(db_path=db_path)
565
+ try:
566
+ session = _get_session(conn, session_id)
567
+ project_id = project_id or session.get("project_id")
568
+ if not project_id:
569
+ raise ValueError("project_id is required (not found in session)")
570
+
571
+ reqs, reqs_by_priority = _load_requirements(conn, session_id)
572
+ decomposition = _load_decomposition(conn, session_id)
573
+ assessments = _load_boundary_assessments(conn, session_id)
574
+
575
+ now = _now_iso()
576
+
577
+ # Classify requirements by priority groups
578
+ p1_reqs = reqs_by_priority.get("critical", []) + reqs_by_priority.get("high", [])
579
+ p2_reqs = reqs_by_priority.get("medium", [])
580
+ p3_reqs = reqs_by_priority.get("low", [])
581
+
582
+ p1_ids = [r["id"] for r in p1_reqs]
583
+ p2_ids = [r["id"] for r in p2_reqs]
584
+ p3_ids = [r["id"] for r in p3_reqs]
585
+
586
+ # Classify decomposition items by associated requirements
587
+ def _items_for_req_ids(req_ids):
588
+ """Filter decomposition items whose source requirements intersect."""
589
+ matched = []
590
+ req_id_set = set(req_ids)
591
+ for item in decomposition:
592
+ src = item.get("source_requirement_ids")
593
+ if src:
594
+ try:
595
+ parsed = json.loads(src) if isinstance(src, str) else src
596
+ if isinstance(parsed, list) and req_id_set.intersection(parsed):
597
+ matched.append(item)
598
+ continue
599
+ except (json.JSONDecodeError, TypeError):
600
+ pass
601
+ # Include items not linked to any requirement in P1
602
+ if not src and req_ids is p1_ids:
603
+ matched.append(item)
604
+ return matched
605
+
606
+ p1_items = _items_for_req_ids(p1_ids)
607
+ p2_items = _items_for_req_ids(p2_ids)
608
+ # For comprehensive, use all decomposition items
609
+ all_items = decomposition if decomposition else p1_items + p2_items
610
+
611
+ # --- Speed COA ---
612
+ speed_hours, speed_breakdown = _sum_tshirt_hours(p1_items)
613
+ speed_cost = _cost_estimate(speed_hours, speed_breakdown)
614
+ speed_compliance = _generate_compliance_impact("speed", assessments)
615
+ speed_arch = _generate_architecture("speed", p1_reqs, p1_items)
616
+ speed_roadmap = _generate_pi_roadmap("speed", reqs_by_priority, p1_items)
617
+ speed_risks = _generate_risk_register("speed", p1_reqs, assessments)
618
+ speed_supply = _generate_supply_chain_impact("speed", p1_reqs)
619
+
620
+ speed_data = {
621
+ "coa_type": "speed",
622
+ "coa_name": "Speed: Minimum Viable Delivery",
623
+ "scope_description": "P1 (critical + high priority) requirements only",
624
+ "requirements_included": p1_ids,
625
+ "architecture_summary": speed_arch,
626
+ "pi_roadmap": speed_roadmap,
627
+ "risk_register": speed_risks,
628
+ "compliance_impact": speed_compliance,
629
+ "cost_estimate": speed_cost,
630
+ "supply_chain_impact": speed_supply,
631
+ "boundary_tier": _best_tier(assessments),
632
+ "timeline_sprints": 10,
633
+ "timeline_pis": min(2, max(1, len(speed_roadmap))),
634
+ "risk_level": "high",
635
+ "recommended": False,
636
+ "advantages": [
637
+ "Fastest delivery",
638
+ "Lowest initial cost",
639
+ "Quick feedback loop",
640
+ "Early capability delivery",
641
+ ],
642
+ "disadvantages": [
643
+ "Technical debt accumulation",
644
+ "Limited scope — P2/P3 deferred",
645
+ "Higher integration risk",
646
+ "May require significant rework later",
647
+ ],
648
+ }
649
+
650
+ # --- Balanced COA ---
651
+ balanced_items = p1_items + p2_items
652
+ balanced_hours, balanced_breakdown = _sum_tshirt_hours(balanced_items)
653
+ balanced_cost = _cost_estimate(balanced_hours, balanced_breakdown)
654
+ balanced_compliance = _generate_compliance_impact("balanced", assessments)
655
+ balanced_arch = _generate_architecture("balanced", p1_reqs + p2_reqs, balanced_items)
656
+ balanced_roadmap = _generate_pi_roadmap("balanced", reqs_by_priority, balanced_items)
657
+ balanced_risks = _generate_risk_register("balanced", p1_reqs + p2_reqs, assessments)
658
+ balanced_supply = _generate_supply_chain_impact("balanced", p1_reqs + p2_reqs)
659
+
660
+ balanced_data = {
661
+ "coa_type": "balanced",
662
+ "coa_name": "Balanced: Optimal Scope-Risk Tradeoff",
663
+ "scope_description": "P1 + P2 (critical, high, and medium priority) requirements",
664
+ "requirements_included": p1_ids + p2_ids,
665
+ "architecture_summary": balanced_arch,
666
+ "pi_roadmap": balanced_roadmap,
667
+ "risk_register": balanced_risks,
668
+ "compliance_impact": balanced_compliance,
669
+ "cost_estimate": balanced_cost,
670
+ "supply_chain_impact": balanced_supply,
671
+ "boundary_tier": _average_tier(assessments),
672
+ "timeline_sprints": 15,
673
+ "timeline_pis": min(3, max(2, len(balanced_roadmap))),
674
+ "risk_level": "moderate",
675
+ "recommended": True,
676
+ "advantages": [
677
+ "Good scope/risk balance",
678
+ "Reasonable timeline",
679
+ "Adequate compliance coverage",
680
+ "Sustainable development pace",
681
+ ],
682
+ "disadvantages": [
683
+ "Compromises on low-priority items",
684
+ "Moderate complexity",
685
+ ],
686
+ }
687
+
688
+ # --- Comprehensive COA ---
689
+ comp_hours, comp_breakdown = _sum_tshirt_hours(all_items)
690
+ comp_cost = _cost_estimate(comp_hours, comp_breakdown)
691
+ comp_compliance = _generate_compliance_impact("comprehensive", assessments)
692
+ comp_arch = _generate_architecture("comprehensive", reqs, all_items)
693
+ comp_roadmap = _generate_pi_roadmap("comprehensive", reqs_by_priority, all_items)
694
+ comp_risks = _generate_risk_register("comprehensive", reqs, assessments)
695
+ comp_supply = _generate_supply_chain_impact("comprehensive", reqs)
696
+
697
+ comp_data = {
698
+ "coa_type": "comprehensive",
699
+ "coa_name": "Comprehensive: Full Scope Delivery",
700
+ "scope_description": "All requirements (P1 + P2 + P3 — all priorities)",
701
+ "requirements_included": p1_ids + p2_ids + p3_ids,
702
+ "architecture_summary": comp_arch,
703
+ "pi_roadmap": comp_roadmap,
704
+ "risk_register": comp_risks,
705
+ "compliance_impact": comp_compliance,
706
+ "cost_estimate": comp_cost,
707
+ "supply_chain_impact": comp_supply,
708
+ "boundary_tier": _worst_tier(assessments),
709
+ "timeline_sprints": 25,
710
+ "timeline_pis": min(5, max(3, len(comp_roadmap))),
711
+ "risk_level": "low",
712
+ "recommended": False,
713
+ "advantages": [
714
+ "Complete scope coverage",
715
+ "Lowest residual risk",
716
+ "Full compliance coverage",
717
+ "Future-proof architecture",
718
+ ],
719
+ "disadvantages": [
720
+ "Longest timeline",
721
+ "Highest cost",
722
+ "Feature creep risk",
723
+ "Stakeholder patience required",
724
+ ],
725
+ }
726
+
727
+ # Insert all three COAs into the database
728
+ coas = []
729
+ for coa_data in (speed_data, balanced_data, comp_data):
730
+ coa_id = _generate_id("coa")
731
+ coa_data["id"] = coa_id
732
+
733
+ sim_scenario_id = None
734
+ if simulate:
735
+ sim_scenario_id = _create_simulation_for_coa(
736
+ conn, coa_id, session_id, project_id,
737
+ coa_data["coa_type"], coa_data,
738
+ )
739
+ coa_data["simulation_scenario_id"] = sim_scenario_id
740
+
741
+ conn.execute(
742
+ """INSERT INTO coa_definitions
743
+ (id, session_id, project_id, coa_type, coa_name, description,
744
+ architecture_summary, cost_estimate, risk_profile, timeline,
745
+ compliance_impact, supply_chain_impact, boundary_tier,
746
+ simulation_scenario_id, status, classification, created_at, updated_at)
747
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
748
+ (
749
+ coa_id, session_id, project_id,
750
+ coa_data["coa_type"],
751
+ coa_data["coa_name"],
752
+ coa_data["scope_description"],
753
+ json.dumps(coa_data["architecture_summary"]),
754
+ json.dumps(coa_data["cost_estimate"]),
755
+ json.dumps({
756
+ "risk_level": coa_data["risk_level"],
757
+ "risk_register": coa_data["risk_register"],
758
+ "advantages": coa_data["advantages"],
759
+ "disadvantages": coa_data["disadvantages"],
760
+ }),
761
+ json.dumps({
762
+ "timeline_sprints": coa_data["timeline_sprints"],
763
+ "timeline_pis": coa_data["timeline_pis"],
764
+ "pi_roadmap": coa_data["pi_roadmap"],
765
+ "requirements_included": coa_data["requirements_included"],
766
+ }),
767
+ json.dumps(coa_data["compliance_impact"]),
768
+ json.dumps(coa_data["supply_chain_impact"]),
769
+ coa_data["boundary_tier"],
770
+ sim_scenario_id,
771
+ "simulated" if simulate else "draft",
772
+ "CUI", now, now,
773
+ ),
774
+ )
775
+ coas.append(coa_data)
776
+
777
+ conn.commit()
778
+
779
+ # Audit
780
+ if _HAS_AUDIT:
781
+ log_event(
782
+ event_type="coa_generated",
783
+ actor="sparkpilot-simulation-engine",
784
+ action=f"Generated 3 COAs for session {session_id}",
785
+ project_id=project_id,
786
+ details=json.dumps({
787
+ "session_id": session_id,
788
+ "coa_ids": [c["id"] for c in coas],
789
+ "simulated": simulate,
790
+ }),
791
+ )
792
+
793
+ return {
794
+ "session_id": session_id,
795
+ "project_id": project_id,
796
+ "coas": coas,
797
+ "recommendation": "balanced",
798
+ }
799
+
800
+ finally:
801
+ conn.close()
802
+
803
+
804
+ def generate_alternative_coa(session_id, requirement_id, project_id=None, db_path=None):
805
+ """Generate alternative COAs for a RED-tier requirement.
806
+
807
+ Reads boundary assessment and RED alternative patterns, then creates
808
+ COA variants that achieve the same intent within ATO boundaries.
809
+
810
+ Args:
811
+ session_id: The intake session ID.
812
+ requirement_id: The requirement with RED-tier impact.
813
+ project_id: Optional project ID override.
814
+ db_path: Optional database path override.
815
+
816
+ Returns:
817
+ dict with requirement_id, original_intent, and alternatives list.
818
+ """
819
+ conn = get_connection(db_path=db_path)
820
+ try:
821
+ session = _get_session(conn, session_id)
822
+ project_id = project_id or session.get("project_id")
823
+ if not project_id:
824
+ raise ValueError("project_id is required (not found in session)")
825
+
826
+ # Load the requirement
827
+ req_row = conn.execute(
828
+ "SELECT * FROM intake_requirements WHERE id = ?",
829
+ (requirement_id,),
830
+ ).fetchone()
831
+ if not req_row:
832
+ raise ValueError(f"Requirement not found: {requirement_id}")
833
+ req = dict(req_row)
834
+ original_intent = req.get("refined_text") or req.get("raw_text", "")
835
+
836
+ # Load boundary assessment for this requirement
837
+ assessment_rows = conn.execute(
838
+ "SELECT * FROM boundary_impact_assessments WHERE requirement_id = ?",
839
+ (requirement_id,),
840
+ ).fetchall()
841
+ assessments = [dict(r) for r in assessment_rows]
842
+
843
+ if not assessments:
844
+ return {
845
+ "requirement_id": requirement_id,
846
+ "original_intent": original_intent,
847
+ "alternatives": [],
848
+ "message": "No boundary assessment found for this requirement",
849
+ }
850
+
851
+ # Determine applicable categories from assessments
852
+ applicable_categories = set()
853
+ for a in assessments:
854
+ cat = a.get("impact_category", "")
855
+ if cat:
856
+ applicable_categories.add(cat)
857
+
858
+ # Map boundary impact categories to RED alternative pattern triggers
859
+ category_to_trigger = {
860
+ "data_type_change": ["classification_change", "data_sensitivity"],
861
+ "boundary_change": ["boundary_expansion", "scope_increase"],
862
+ "new_interconnection": ["new_interconnection"],
863
+ "architecture": ["boundary_expansion", "scope_increase"],
864
+ "data_flow": ["data_sensitivity", "cross_network"],
865
+ "authentication": ["prohibited_technology"],
866
+ "authorization": ["scope_increase"],
867
+ "network": ["new_interconnection", "cross_network"],
868
+ "encryption": ["classification_change"],
869
+ "logging": ["scope_increase"],
870
+ "component_addition": ["boundary_expansion"],
871
+ }
872
+
873
+ triggers = set()
874
+ for cat in applicable_categories:
875
+ triggers.update(category_to_trigger.get(cat, ["boundary_expansion"]))
876
+
877
+ # Load patterns
878
+ patterns_data = _load_red_alternative_patterns()
879
+ all_patterns = patterns_data.get("alternative_patterns", [])
880
+ selection_criteria = patterns_data.get("selection_criteria", {})
881
+
882
+ # Filter applicable patterns
883
+ applicable_patterns = []
884
+ for pattern in all_patterns:
885
+ pattern_when = set(pattern.get("applicable_when", []))
886
+ if pattern_when.intersection(triggers):
887
+ applicable_patterns.append(pattern)
888
+
889
+ # If no patterns match, include the most generic ones
890
+ if not applicable_patterns:
891
+ applicable_patterns = [
892
+ p for p in all_patterns
893
+ if p.get("id") in ("ALT-PHASE", "ALT-SCOPE-REDUCE")
894
+ ]
895
+
896
+ now = _now_iso()
897
+ alternatives = []
898
+
899
+ # Score and sort patterns
900
+ tier_scores = selection_criteria.get("tier_scores", {
901
+ "GREEN": 1.0, "YELLOW": 0.75, "ORANGE": 0.5, "RED": 0.0,
902
+ })
903
+ cost_scores = selection_criteria.get("cost_scores", {
904
+ "low": 1.0, "medium": 0.6, "high": 0.3,
905
+ })
906
+ weights = selection_criteria.get("scoring_weights", {
907
+ "feasibility": 0.35, "resulting_tier_score": 0.25,
908
+ "timeline_score": 0.20, "cost_score": 0.20,
909
+ })
910
+
911
+ for pattern in applicable_patterns:
912
+ # Compute composite score
913
+ feasibility = pattern.get("feasibility", 0.5)
914
+ resulting_tier = pattern.get("resulting_tier", "YELLOW")
915
+ cost_impact = pattern.get("cost_impact", "medium")
916
+ timeline_days = pattern.get("estimated_timeline_days", 60)
917
+
918
+ tier_s = tier_scores.get(resulting_tier, 0.5)
919
+ cost_s = cost_scores.get(cost_impact, 0.5)
920
+ # Normalize timeline: 0-30 days = 1.0, 120+ days = 0.2
921
+ timeline_s = max(0.2, 1.0 - (timeline_days / 150.0))
922
+
923
+ score = (
924
+ weights.get("feasibility", 0.35) * feasibility
925
+ + weights.get("resulting_tier_score", 0.25) * tier_s
926
+ + weights.get("timeline_score", 0.20) * timeline_s
927
+ + weights.get("cost_score", 0.20) * cost_s
928
+ )
929
+
930
+ coa_id = _generate_id("coa")
931
+ alt_data = {
932
+ "id": coa_id,
933
+ "pattern_id": pattern.get("id"),
934
+ "pattern_name": pattern.get("name"),
935
+ "description": pattern.get("description"),
936
+ "resulting_tier": resulting_tier,
937
+ "feasibility": feasibility,
938
+ "tradeoffs": pattern.get("tradeoffs", []),
939
+ "implementation_steps": pattern.get("implementation_steps", []),
940
+ "estimated_timeline_days": timeline_days,
941
+ "cost_impact": cost_impact,
942
+ "composite_score": round(score, 3),
943
+ }
944
+
945
+ # Insert alternative COA into database
946
+ conn.execute(
947
+ """INSERT INTO coa_definitions
948
+ (id, session_id, project_id, coa_type, coa_name, description,
949
+ architecture_summary, cost_estimate, risk_profile, timeline,
950
+ compliance_impact, supply_chain_impact, boundary_tier,
951
+ status, classification, created_at, updated_at)
952
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
953
+ (
954
+ coa_id, session_id, project_id,
955
+ "alternative",
956
+ f"Alternative: {pattern.get('name', 'Unknown')}",
957
+ pattern.get("description", ""),
958
+ json.dumps({
959
+ "pattern_id": pattern.get("id"),
960
+ "implementation_steps": pattern.get("implementation_steps", []),
961
+ }),
962
+ json.dumps({
963
+ "cost_impact": cost_impact,
964
+ "estimated_timeline_days": timeline_days,
965
+ }),
966
+ json.dumps({
967
+ "risk_level": "varies",
968
+ "feasibility": feasibility,
969
+ "tradeoffs": pattern.get("tradeoffs", []),
970
+ }),
971
+ json.dumps({
972
+ "estimated_timeline_days": timeline_days,
973
+ "requirement_id": requirement_id,
974
+ }),
975
+ json.dumps({
976
+ "original_requirement": requirement_id,
977
+ "original_tier": "RED",
978
+ "resulting_tier": resulting_tier,
979
+ }),
980
+ json.dumps({}),
981
+ resulting_tier,
982
+ "draft", "CUI", now, now,
983
+ ),
984
+ )
985
+ alternatives.append(alt_data)
986
+
987
+ # Sort by composite score descending
988
+ alternatives.sort(key=lambda x: x.get("composite_score", 0), reverse=True)
989
+
990
+ conn.commit()
991
+
992
+ # Audit
993
+ if _HAS_AUDIT:
994
+ log_event(
995
+ event_type="coa_alternative_generated",
996
+ actor="sparkpilot-simulation-engine",
997
+ action=f"Generated {len(alternatives)} alternative COAs for RED-tier requirement {requirement_id}",
998
+ project_id=project_id,
999
+ details=json.dumps({
1000
+ "session_id": session_id,
1001
+ "requirement_id": requirement_id,
1002
+ "alternative_count": len(alternatives),
1003
+ "pattern_ids": [a.get("pattern_id") for a in alternatives],
1004
+ }),
1005
+ )
1006
+
1007
+ return {
1008
+ "requirement_id": requirement_id,
1009
+ "original_intent": original_intent,
1010
+ "alternatives": alternatives,
1011
+ }
1012
+
1013
+ finally:
1014
+ conn.close()
1015
+
1016
+
1017
+ def compare_coas(session_id, db_path=None):
1018
+ """Compare all COAs for a session across multiple dimensions.
1019
+
1020
+ Inserts pairwise comparison records into coa_comparisons.
1021
+
1022
+ Args:
1023
+ session_id: The intake session ID.
1024
+ db_path: Optional database path override.
1025
+
1026
+ Returns:
1027
+ dict with session_id, comparison_matrix, and recommendation.
1028
+ """
1029
+ conn = get_connection(db_path=db_path)
1030
+ try:
1031
+ # Load all COAs for session
1032
+ rows = conn.execute(
1033
+ """SELECT * FROM coa_definitions
1034
+ WHERE session_id = ? AND coa_type IN ('speed', 'balanced', 'comprehensive')
1035
+ ORDER BY coa_type""",
1036
+ (session_id,),
1037
+ ).fetchall()
1038
+ coas = [dict(r) for r in rows]
1039
+
1040
+ if len(coas) < 2:
1041
+ return {
1042
+ "session_id": session_id,
1043
+ "comparison_matrix": [],
1044
+ "recommendation": None,
1045
+ "message": "Need at least 2 COAs to compare",
1046
+ }
1047
+
1048
+ now = _now_iso()
1049
+ dimensions = ["architecture", "compliance", "supply_chain", "schedule", "cost", "risk", "overall"]
1050
+ comparisons = []
1051
+
1052
+ # Score each COA across dimensions
1053
+ coa_scores = {}
1054
+ for coa in coas:
1055
+ cid = coa["id"]
1056
+ ctype = coa["coa_type"]
1057
+ scores = {}
1058
+
1059
+ # Architecture: comprehensive > balanced > speed
1060
+ scores["architecture"] = {"speed": 3.0, "balanced": 7.0, "comprehensive": 9.0}.get(ctype, 5.0)
1061
+
1062
+ # Compliance: higher coverage = better
1063
+ compliance = {}
1064
+ if coa.get("compliance_impact"):
1065
+ try:
1066
+ compliance = json.loads(coa["compliance_impact"]) if isinstance(coa["compliance_impact"], str) else coa["compliance_impact"]
1067
+ except (json.JSONDecodeError, TypeError):
1068
+ pass
1069
+ scores["compliance"] = compliance.get("coverage_pct", 80.0) / 10.0
1070
+
1071
+ # Supply chain: fewer vendors = less risk = higher score
1072
+ supply = {}
1073
+ if coa.get("supply_chain_impact"):
1074
+ try:
1075
+ supply = json.loads(coa["supply_chain_impact"]) if isinstance(coa["supply_chain_impact"], str) else coa["supply_chain_impact"]
1076
+ except (json.JSONDecodeError, TypeError):
1077
+ pass
1078
+ vendor_count = supply.get("estimated_vendor_count", 4)
1079
+ scores["supply_chain"] = max(1.0, 10.0 - vendor_count)
1080
+
1081
+ # Schedule: fewer PIs = faster = higher score
1082
+ timeline = {}
1083
+ if coa.get("timeline"):
1084
+ try:
1085
+ timeline = json.loads(coa["timeline"]) if isinstance(coa["timeline"], str) else coa["timeline"]
1086
+ except (json.JSONDecodeError, TypeError):
1087
+ pass
1088
+ pis = timeline.get("timeline_pis", 3)
1089
+ scores["schedule"] = max(1.0, 10.0 - pis * 1.5)
1090
+
1091
+ # Cost: lower cost = higher score
1092
+ cost = {}
1093
+ if coa.get("cost_estimate"):
1094
+ try:
1095
+ cost = json.loads(coa["cost_estimate"]) if isinstance(coa["cost_estimate"], str) else coa["cost_estimate"]
1096
+ except (json.JSONDecodeError, TypeError):
1097
+ pass
1098
+ hours = cost.get("hours", 200)
1099
+ scores["cost"] = max(1.0, 10.0 - (hours / 200.0))
1100
+
1101
+ # Risk: lower risk = higher score
1102
+ risk = {}
1103
+ if coa.get("risk_profile"):
1104
+ try:
1105
+ risk = json.loads(coa["risk_profile"]) if isinstance(coa["risk_profile"], str) else coa["risk_profile"]
1106
+ except (json.JSONDecodeError, TypeError):
1107
+ pass
1108
+ risk_level = risk.get("risk_level", "moderate")
1109
+ scores["risk"] = {"low": 9.0, "moderate": 6.0, "high": 3.0}.get(risk_level, 5.0)
1110
+
1111
+ # Overall: weighted average
1112
+ overall_weights = {
1113
+ "architecture": 0.15,
1114
+ "compliance": 0.20,
1115
+ "supply_chain": 0.10,
1116
+ "schedule": 0.20,
1117
+ "cost": 0.20,
1118
+ "risk": 0.15,
1119
+ }
1120
+ scores["overall"] = sum(
1121
+ scores.get(d, 5.0) * overall_weights.get(d, 0.15)
1122
+ for d in overall_weights
1123
+ )
1124
+
1125
+ coa_scores[cid] = {"scores": scores, "coa": coa}
1126
+
1127
+ # Generate pairwise comparisons
1128
+ coa_ids = [c["id"] for c in coas]
1129
+ for i in range(len(coa_ids)):
1130
+ for j in range(i + 1, len(coa_ids)):
1131
+ cid_a = coa_ids[i]
1132
+ cid_b = coa_ids[j]
1133
+ scores_a = coa_scores[cid_a]["scores"]
1134
+ scores_b = coa_scores[cid_b]["scores"]
1135
+ coa_a = coa_scores[cid_a]["coa"]
1136
+ coa_b = coa_scores[cid_b]["coa"]
1137
+
1138
+ for dim in dimensions:
1139
+ sa = round(scores_a.get(dim, 5.0), 2)
1140
+ sb = round(scores_b.get(dim, 5.0), 2)
1141
+
1142
+ if sa > sb:
1143
+ winner = "coa_a"
1144
+ elif sb > sa:
1145
+ winner = "coa_b"
1146
+ else:
1147
+ winner = "tie"
1148
+
1149
+ _generate_id("comp")
1150
+
1151
+ conn.execute(
1152
+ """INSERT INTO coa_comparisons
1153
+ (session_id, coa_a_id, coa_b_id, dimension,
1154
+ coa_a_score, coa_b_score, winner, rationale, created_at)
1155
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)""",
1156
+ (
1157
+ session_id, cid_a, cid_b, dim,
1158
+ sa, sb, winner,
1159
+ f"{coa_a['coa_type']}={sa} vs {coa_b['coa_type']}={sb}",
1160
+ now,
1161
+ ),
1162
+ )
1163
+
1164
+ comparisons.append({
1165
+ "coa_a_id": cid_a,
1166
+ "coa_a_type": coa_a["coa_type"],
1167
+ "coa_b_id": cid_b,
1168
+ "coa_b_type": coa_b["coa_type"],
1169
+ "dimension": dim,
1170
+ "coa_a_score": sa,
1171
+ "coa_b_score": sb,
1172
+ "winner": winner,
1173
+ })
1174
+
1175
+ conn.commit()
1176
+
1177
+ # Determine overall recommendation
1178
+ overall_scores = {
1179
+ cid: coa_scores[cid]["scores"].get("overall", 0)
1180
+ for cid in coa_ids
1181
+ }
1182
+ best_cid = max(overall_scores, key=overall_scores.get)
1183
+ recommendation = coa_scores[best_cid]["coa"]["coa_type"]
1184
+
1185
+ # Audit
1186
+ if _HAS_AUDIT:
1187
+ log_event(
1188
+ event_type="coa_compared",
1189
+ actor="sparkpilot-simulation-engine",
1190
+ action=f"Compared {len(coas)} COAs across {len(dimensions)} dimensions",
1191
+ details=json.dumps({
1192
+ "session_id": session_id,
1193
+ "coa_count": len(coas),
1194
+ "comparison_count": len(comparisons),
1195
+ "recommendation": recommendation,
1196
+ }),
1197
+ )
1198
+
1199
+ return {
1200
+ "session_id": session_id,
1201
+ "comparison_matrix": comparisons,
1202
+ "coa_scores": {
1203
+ coa_scores[cid]["coa"]["coa_type"]: round(coa_scores[cid]["scores"]["overall"], 2)
1204
+ for cid in coa_ids
1205
+ },
1206
+ "recommendation": recommendation,
1207
+ }
1208
+
1209
+ finally:
1210
+ conn.close()
1211
+
1212
+
1213
+ def select_coa(coa_id, selected_by, rationale, db_path=None):
1214
+ """Mark a COA as selected and reject all others in the same session.
1215
+
1216
+ Args:
1217
+ coa_id: The COA ID to select.
1218
+ selected_by: Name of the person selecting.
1219
+ rationale: Reason for selection.
1220
+ db_path: Optional database path override.
1221
+
1222
+ Returns:
1223
+ dict with coa_id, coa_type, and selection_status.
1224
+ """
1225
+ conn = get_connection(db_path=db_path)
1226
+ try:
1227
+ now = _now_iso()
1228
+
1229
+ # Load the COA
1230
+ row = conn.execute(
1231
+ "SELECT * FROM coa_definitions WHERE id = ?", (coa_id,)
1232
+ ).fetchone()
1233
+ if not row:
1234
+ raise ValueError(f"COA not found: {coa_id}")
1235
+ coa = dict(row)
1236
+ session_id = coa["session_id"]
1237
+ project_id = coa["project_id"]
1238
+
1239
+ # Reject all other COAs in same session
1240
+ conn.execute(
1241
+ """UPDATE coa_definitions
1242
+ SET status = 'rejected', updated_at = ?
1243
+ WHERE session_id = ? AND id != ? AND status NOT IN ('rejected', 'archived')""",
1244
+ (now, session_id, coa_id),
1245
+ )
1246
+
1247
+ # Select this COA
1248
+ conn.execute(
1249
+ """UPDATE coa_definitions
1250
+ SET status = 'selected', selected_by = ?, selected_at = ?,
1251
+ selection_rationale = ?, updated_at = ?
1252
+ WHERE id = ?""",
1253
+ (selected_by, now, rationale, now, coa_id),
1254
+ )
1255
+
1256
+ conn.commit()
1257
+
1258
+ # Audit
1259
+ if _HAS_AUDIT:
1260
+ log_event(
1261
+ event_type="coa_selected",
1262
+ actor=selected_by,
1263
+ action=f"Selected COA {coa_id} ({coa['coa_type']})",
1264
+ project_id=project_id,
1265
+ details=json.dumps({
1266
+ "coa_id": coa_id,
1267
+ "coa_type": coa["coa_type"],
1268
+ "session_id": session_id,
1269
+ "rationale": rationale,
1270
+ }),
1271
+ )
1272
+
1273
+ return {
1274
+ "coa_id": coa_id,
1275
+ "coa_type": coa["coa_type"],
1276
+ "coa_name": coa["coa_name"],
1277
+ "selection_status": "selected",
1278
+ "selected_by": selected_by,
1279
+ "rationale": rationale,
1280
+ }
1281
+
1282
+ finally:
1283
+ conn.close()
1284
+
1285
+
1286
+ def get_coa(coa_id, db_path=None):
1287
+ """Load a single COA by ID.
1288
+
1289
+ Args:
1290
+ coa_id: The COA ID to retrieve.
1291
+ db_path: Optional database path override.
1292
+
1293
+ Returns:
1294
+ dict with all COA fields (JSON fields parsed).
1295
+ """
1296
+ conn = get_connection(db_path=db_path)
1297
+ try:
1298
+ row = conn.execute(
1299
+ "SELECT * FROM coa_definitions WHERE id = ?", (coa_id,)
1300
+ ).fetchone()
1301
+ if not row:
1302
+ raise ValueError(f"COA not found: {coa_id}")
1303
+ coa = dict(row)
1304
+
1305
+ # Parse JSON fields
1306
+ for field in ("architecture_summary", "cost_estimate", "risk_profile",
1307
+ "timeline", "compliance_impact", "supply_chain_impact"):
1308
+ val = coa.get(field)
1309
+ if val and isinstance(val, str):
1310
+ try:
1311
+ coa[field] = json.loads(val)
1312
+ except json.JSONDecodeError:
1313
+ pass
1314
+
1315
+ return coa
1316
+
1317
+ finally:
1318
+ conn.close()
1319
+
1320
+
1321
+ def list_coas(session_id, db_path=None):
1322
+ """List all COAs for a session.
1323
+
1324
+ Args:
1325
+ session_id: The intake session ID.
1326
+ db_path: Optional database path override.
1327
+
1328
+ Returns:
1329
+ dict with session_id and coas list.
1330
+ """
1331
+ conn = get_connection(db_path=db_path)
1332
+ try:
1333
+ rows = conn.execute(
1334
+ """SELECT id, session_id, project_id, coa_type, coa_name,
1335
+ description, boundary_tier, status,
1336
+ selected_by, selected_at, selection_rationale,
1337
+ mission_fit_pct, created_at, updated_at
1338
+ FROM coa_definitions
1339
+ WHERE session_id = ?
1340
+ ORDER BY
1341
+ CASE coa_type
1342
+ WHEN 'speed' THEN 1
1343
+ WHEN 'balanced' THEN 2
1344
+ WHEN 'comprehensive' THEN 3
1345
+ WHEN 'alternative' THEN 4
1346
+ END,
1347
+ created_at""",
1348
+ (session_id,),
1349
+ ).fetchall()
1350
+ coas = [dict(r) for r in rows]
1351
+
1352
+ return {
1353
+ "session_id": session_id,
1354
+ "count": len(coas),
1355
+ "coas": coas,
1356
+ }
1357
+
1358
+ finally:
1359
+ conn.close()
1360
+
1361
+
1362
+ # ---------------------------------------------------------------------------
1363
+ # CLI
1364
+ # ---------------------------------------------------------------------------
1365
+
1366
+ def main():
1367
+ parser = argparse.ArgumentParser(
1368
+ description="RICOAS COA Generator — Generate and manage Courses of Action"
1369
+ )
1370
+ parser.add_argument("--session-id", help="Intake session ID")
1371
+ parser.add_argument("--project-id", help="Project ID (optional, read from session)")
1372
+ parser.add_argument("--coa-id", help="COA ID (for get/select)")
1373
+ parser.add_argument("--requirement-id", help="Requirement ID (for alternative COA)")
1374
+ parser.add_argument("--db", help="Database path override")
1375
+
1376
+ # Actions
1377
+ parser.add_argument("--generate-3-coas", action="store_true",
1378
+ help="Generate Speed/Balanced/Comprehensive COAs")
1379
+ parser.add_argument("--simulate", action="store_true",
1380
+ help="Also create and run simulations for each COA")
1381
+ parser.add_argument("--generate-alternative", action="store_true",
1382
+ help="Generate alternative COAs for RED-tier requirement")
1383
+ parser.add_argument("--compare", action="store_true",
1384
+ help="Compare all COAs for a session")
1385
+ parser.add_argument("--select", action="store_true",
1386
+ help="Select a COA")
1387
+ parser.add_argument("--selected-by", help="Name of person selecting COA")
1388
+ parser.add_argument("--rationale", help="Selection rationale")
1389
+ parser.add_argument("--list", action="store_true",
1390
+ help="List all COAs for a session")
1391
+ parser.add_argument("--get", action="store_true",
1392
+ help="Get a single COA by ID")
1393
+
1394
+ # Output format
1395
+ parser.add_argument("--json", action="store_true",
1396
+ help="Output as JSON")
1397
+
1398
+ args = parser.parse_args()
1399
+ db_path = Path(args.db) if args.db else None
1400
+
1401
+ try:
1402
+ if args.generate_3_coas:
1403
+ if not args.session_id:
1404
+ parser.error("--session-id is required for --generate-3-coas")
1405
+ result = generate_3_coas(
1406
+ session_id=args.session_id,
1407
+ project_id=args.project_id,
1408
+ simulate=args.simulate,
1409
+ db_path=db_path,
1410
+ )
1411
+ if args.json:
1412
+ print(json.dumps(result, indent=2, default=str))
1413
+ else:
1414
+ print(f"Generated 3 COAs for session: {args.session_id}")
1415
+ print(f" Recommendation: {result['recommendation']}")
1416
+ for coa in result["coas"]:
1417
+ print(f"\n [{coa['coa_type'].upper()}] {coa['coa_name']}")
1418
+ print(f" ID: {coa['id']}")
1419
+ print(f" Scope: {coa['scope_description']}")
1420
+ print(f" Requirements: {len(coa['requirements_included'])}")
1421
+ print(f" Timeline: {coa['timeline_pis']} PIs ({coa['timeline_sprints']} sprints)")
1422
+ ce = coa["cost_estimate"]
1423
+ print(f" Cost: ${ce['cost_range_low']:,.0f} - ${ce['cost_range_high']:,.0f}")
1424
+ print(f" Risk Level: {coa['risk_level']}")
1425
+ print(f" Boundary Tier: {coa['boundary_tier']}")
1426
+ print(f" Recommended: {coa['recommended']}")
1427
+
1428
+ elif args.generate_alternative:
1429
+ if not args.session_id:
1430
+ parser.error("--session-id is required for --generate-alternative")
1431
+ if not args.requirement_id:
1432
+ parser.error("--requirement-id is required for --generate-alternative")
1433
+ result = generate_alternative_coa(
1434
+ session_id=args.session_id,
1435
+ requirement_id=args.requirement_id,
1436
+ project_id=args.project_id,
1437
+ db_path=db_path,
1438
+ )
1439
+ if args.json:
1440
+ print(json.dumps(result, indent=2, default=str))
1441
+ else:
1442
+ print(f"Alternative COAs for requirement: {args.requirement_id}")
1443
+ print(f" Original intent: {result['original_intent'][:100]}...")
1444
+ for alt in result["alternatives"]:
1445
+ print(f"\n [{alt['pattern_id']}] {alt['pattern_name']}")
1446
+ print(f" ID: {alt['id']}")
1447
+ print(f" Resulting Tier: {alt['resulting_tier']}")
1448
+ print(f" Feasibility: {alt['feasibility']:.0%}")
1449
+ print(f" Score: {alt['composite_score']:.3f}")
1450
+ print(f" Timeline: {alt['estimated_timeline_days']} days")
1451
+ print(f" Cost Impact: {alt['cost_impact']}")
1452
+
1453
+ elif args.compare:
1454
+ if not args.session_id:
1455
+ parser.error("--session-id is required for --compare")
1456
+ result = compare_coas(
1457
+ session_id=args.session_id,
1458
+ db_path=db_path,
1459
+ )
1460
+ if args.json:
1461
+ print(json.dumps(result, indent=2, default=str))
1462
+ else:
1463
+ print(f"COA Comparison for session: {args.session_id}")
1464
+ print(f" Recommendation: {result['recommendation']}")
1465
+ if result.get("coa_scores"):
1466
+ print("\n Overall Scores:")
1467
+ for ctype, score in result["coa_scores"].items():
1468
+ marker = " <-- RECOMMENDED" if ctype == result["recommendation"] else ""
1469
+ print(f" {ctype}: {score:.2f}{marker}")
1470
+
1471
+ elif args.select:
1472
+ if not args.coa_id:
1473
+ parser.error("--coa-id is required for --select")
1474
+ if not args.selected_by:
1475
+ parser.error("--selected-by is required for --select")
1476
+ if not args.rationale:
1477
+ parser.error("--rationale is required for --select")
1478
+ result = select_coa(
1479
+ coa_id=args.coa_id,
1480
+ selected_by=args.selected_by,
1481
+ rationale=args.rationale,
1482
+ db_path=db_path,
1483
+ )
1484
+ if args.json:
1485
+ print(json.dumps(result, indent=2, default=str))
1486
+ else:
1487
+ print(f"COA Selected: {result['coa_id']}")
1488
+ print(f" Type: {result['coa_type']}")
1489
+ print(f" Name: {result['coa_name']}")
1490
+ print(f" Selected By: {result['selected_by']}")
1491
+ print(f" Rationale: {result['rationale']}")
1492
+
1493
+ elif args.list:
1494
+ if not args.session_id:
1495
+ parser.error("--session-id is required for --list")
1496
+ result = list_coas(
1497
+ session_id=args.session_id,
1498
+ db_path=db_path,
1499
+ )
1500
+ if args.json:
1501
+ print(json.dumps(result, indent=2, default=str))
1502
+ else:
1503
+ print(f"COAs for session: {args.session_id} ({result['count']} total)")
1504
+ for coa in result["coas"]:
1505
+ status = coa.get("status", "draft")
1506
+ marker = " ***" if status == "selected" else ""
1507
+ print(f"\n [{coa['coa_type'].upper()}] {coa['coa_name']}{marker}")
1508
+ print(f" ID: {coa['id']}")
1509
+ print(f" Status: {status}")
1510
+ print(f" Boundary Tier: {coa.get('boundary_tier', 'N/A')}")
1511
+
1512
+ elif args.get or args.coa_id:
1513
+ if not args.coa_id:
1514
+ parser.error("--coa-id is required for --get")
1515
+ result = get_coa(
1516
+ coa_id=args.coa_id,
1517
+ db_path=db_path,
1518
+ )
1519
+ if args.json:
1520
+ print(json.dumps(result, indent=2, default=str))
1521
+ else:
1522
+ print(f"COA: {result['id']}")
1523
+ print(f" Type: {result['coa_type']}")
1524
+ print(f" Name: {result['coa_name']}")
1525
+ print(f" Status: {result['status']}")
1526
+ print(f" Boundary Tier: {result.get('boundary_tier', 'N/A')}")
1527
+
1528
+ else:
1529
+ parser.print_help()
1530
+ sys.exit(1)
1531
+
1532
+ except (FileNotFoundError, ValueError) as e:
1533
+ print(f"ERROR: {e}", file=sys.stderr)
1534
+ sys.exit(1)
1535
+
1536
+
1537
+ if __name__ == "__main__":
1538
+ main()
1539
+ # [TEMPLATE: CUI // SP-CTI]