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,1649 @@
1
+ #!/usr/bin/env python3
2
+ # CUI // SP-CTI
3
+ """IV&V certification report generator per IEEE 1012.
4
+
5
+ Loads ivv_report_template.md, queries ivv_assessments, ivv_findings, and
6
+ ivv_certifications tables, generates a comprehensive IV&V certification report
7
+ with verification/validation scores and certification recommendation."""
8
+
9
+ import argparse
10
+ import json
11
+ import re
12
+ import sys
13
+ from datetime import datetime, timedelta, timezone
14
+ from pathlib import Path
15
+ from tools.db.storage import get_connection
16
+ DB_PATH = None # Storage layer handles path resolution (D-DB-20)
17
+
18
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
19
+ IVV_TEMPLATE_PATH = BASE_DIR / "context" / "compliance" / "ivv_report_template.md"
20
+ IVV_REQUIREMENTS_PATH = BASE_DIR / "context" / "compliance" / "ivv_requirements.json"
21
+
22
+ # Process areas per IEEE 1012 as defined in ivv_requirements.json
23
+ PROCESS_AREAS = [
24
+ "Requirements Verification",
25
+ "Design Verification",
26
+ "Code Verification",
27
+ "Test Verification",
28
+ "Integration Verification",
29
+ "Traceability Analysis",
30
+ "Security Verification",
31
+ "Build/Deploy Verification",
32
+ "Process Compliance",
33
+ ]
34
+
35
+ # Which process areas contribute to the Verification score
36
+ VERIFICATION_AREAS = [
37
+ "Requirements Verification",
38
+ "Design Verification",
39
+ "Code Verification",
40
+ "Traceability Analysis",
41
+ "Security Verification",
42
+ "Build/Deploy Verification",
43
+ "Process Compliance",
44
+ ]
45
+
46
+ # Which process areas contribute to the Validation score
47
+ VALIDATION_AREAS = [
48
+ "Test Verification",
49
+ "Integration Verification",
50
+ ]
51
+
52
+ # Status weighting for score calculation
53
+ IVV_STATUS_WEIGHTS = {
54
+ "pass": 1.0,
55
+ "partial": 0.5,
56
+ "fail": 0.0,
57
+ "deferred": 0.0,
58
+ "not_assessed": 0.0,
59
+ }
60
+
61
+ # Severity ordering for consistent output
62
+ SEVERITY_ORDER = ["critical", "high", "moderate", "low"]
63
+
64
+ # Finding statuses for summary
65
+ FINDING_STATUSES = ["open", "in_progress", "resolved", "accepted_risk", "deferred"]
66
+
67
+
68
+ # ---------------------------------------------------------------------------
69
+ # Helper functions
70
+ # ---------------------------------------------------------------------------
71
+
72
+
73
+ def _load_template(template_path=None):
74
+ """Load the IV&V report template markdown.
75
+
76
+ If the template file does not exist a minimal built-in template is
77
+ returned so the generator can still produce a useful report.
78
+ """
79
+ path = template_path or IVV_TEMPLATE_PATH
80
+ if path.exists():
81
+ with open(path, "r", encoding="utf-8") as f:
82
+ return f.read()
83
+
84
+ # Fallback minimal template when file is missing
85
+ return _builtin_template()
86
+
87
+
88
+ def _builtin_template():
89
+ """Return a minimal built-in IV&V report template."""
90
+ return (
91
+ "{{cui_banner_top}}\n\n"
92
+ "# Independent Verification & Validation (IV&V) Certification Report\n\n"
93
+ "**Project:** {{project_name}} \n"
94
+ "**Project ID:** {{project_id}} \n"
95
+ "**Classification:** {{classification}} \n"
96
+ "**Assessment Date:** {{assessment_date}} \n"
97
+ "**Report Version:** {{version}} \n"
98
+ "**IV&V Authority:** {{ivv_authority}} \n"
99
+ "**Framework:** IEEE 1012-2016, DoDI 5000.87 \n\n"
100
+ "---\n\n"
101
+ "## 1. Executive Summary\n\n"
102
+ "**Verification Score:** {{verification_score}}% \n"
103
+ "**Validation Score:** {{validation_score}}% \n"
104
+ "**Overall IV&V Score:** {{overall_score}}% \n"
105
+ "**Gate Result:** {{gate_result}} \n"
106
+ "**Certification Recommendation:** {{certification_recommendation}} \n\n"
107
+ "{{executive_summary}}\n\n"
108
+ "---\n\n"
109
+ "## 2. Independence Declaration\n\n"
110
+ "{{independence_declaration}}\n\n"
111
+ "---\n\n"
112
+ "## 3. Verification Results\n\n"
113
+ "### 3.1 Process Area Scores\n\n"
114
+ "{{process_area_scores_table}}\n\n"
115
+ "### 3.2 Process Area Details\n\n"
116
+ "{{process_area_details}}\n\n"
117
+ "---\n\n"
118
+ "## 4. Validation Results\n\n"
119
+ "### 4.1 Test Verification Results\n\n"
120
+ "{{test_verification_results}}\n\n"
121
+ "### 4.2 Integration Verification Results\n\n"
122
+ "{{integration_verification_results}}\n\n"
123
+ "---\n\n"
124
+ "## 5. Requirements Traceability Matrix Summary\n\n"
125
+ "{{rtm_summary}}\n\n"
126
+ "**RTM Coverage:** {{rtm_coverage}}% \n"
127
+ "**Requirements with Full Trace:** {{rtm_full_trace_count}} \n"
128
+ "**Requirements with Gaps:** {{rtm_gap_count}} \n"
129
+ "**Orphan Tests:** {{rtm_orphan_tests}} \n\n"
130
+ "---\n\n"
131
+ "## 6. IV&V Findings\n\n"
132
+ "### 6.1 Critical Findings\n\n"
133
+ "{{critical_findings}}\n\n"
134
+ "### 6.2 High Findings\n\n"
135
+ "{{high_findings}}\n\n"
136
+ "### 6.3 Moderate Findings\n\n"
137
+ "{{moderate_findings}}\n\n"
138
+ "### 6.4 Low Findings\n\n"
139
+ "{{low_findings}}\n\n"
140
+ "### 6.5 Findings Summary\n\n"
141
+ "| Severity | Open | Resolved | Accepted Risk | Deferred | Total |\n"
142
+ "|----------|------|----------|---------------|----------|-------|\n"
143
+ "{{findings_summary_table}}\n\n"
144
+ "---\n\n"
145
+ "## 7. Certification Recommendation\n\n"
146
+ "**Recommendation:** {{certification_recommendation}} \n\n"
147
+ "### Criteria Applied:\n"
148
+ "- **CERTIFY:** Overall score >= 80%, 0 critical findings, all process areas >= 60%\n"
149
+ "- **CONDITIONAL:** Overall score >= 60%, 0 critical findings, conditions listed\n"
150
+ "- **DENY:** Overall score < 60% OR critical findings unresolved\n\n"
151
+ "### Conditions (if applicable):\n\n"
152
+ "{{conditions}}\n\n"
153
+ "---\n\n"
154
+ "## 8. Evidence Index\n\n"
155
+ "{{evidence_index}}\n\n"
156
+ "---\n\n"
157
+ "## 9. Assessment Methodology\n\n"
158
+ "This assessment was conducted using the ICDEV IV&V Assessor tool against "
159
+ "the IEEE 1012 requirements catalog (30 requirements across 9 process areas).\n\n"
160
+ "**Scoring Formula:**\n"
161
+ "- Verification Score = average of process area pass rates\n"
162
+ "- Validation Score = average of Test + Integration area pass rates\n"
163
+ "- Overall Score = 0.6 x Verification + 0.4 x Validation\n\n"
164
+ "**Gate Logic:** PASS if 0 critical findings remain open\n\n"
165
+ "---\n\n"
166
+ "**Prepared by:** {{ivv_authority}} \n"
167
+ "**Date:** {{assessment_date}} \n"
168
+ "**Next Review:** {{next_review_date}} \n\n"
169
+ "{{cui_banner_bottom}}\n"
170
+ )
171
+
172
+
173
+ def _get_project_data(conn, project_id):
174
+ """Load project record from database."""
175
+ row = conn.execute(
176
+ "SELECT * FROM projects WHERE id = ?", (project_id,)
177
+ ).fetchone()
178
+ if not row:
179
+ raise ValueError(f"Project '{project_id}' not found in database.")
180
+ return dict(row)
181
+
182
+
183
+ def _load_cui_config():
184
+ """Load CUI marking configuration.
185
+
186
+ Attempts to import load_cui_config from the cui_marker module;
187
+ falls back to sensible defaults if unavailable.
188
+ """
189
+ try:
190
+ from tools.compliance.cui_marker import load_cui_config as _load
191
+ return _load()
192
+ except Exception:
193
+ pass
194
+
195
+ # Try relative import via file location
196
+ try:
197
+ cui_marker_path = Path(__file__).resolve().parent / "cui_marker.py"
198
+ if cui_marker_path.exists():
199
+ import importlib.util
200
+ spec = importlib.util.spec_from_file_location(
201
+ "cui_marker", cui_marker_path
202
+ )
203
+ mod = importlib.util.module_from_spec(spec)
204
+ spec.loader.exec_module(mod)
205
+ return mod.load_cui_config()
206
+ except Exception:
207
+ pass
208
+
209
+ return {
210
+ "banner_top": "CUI // SP-CTI",
211
+ "banner_bottom": "CUI // SP-CTI",
212
+ "document_header": (
213
+ "////////////////////////////////////////////////////////////////////\n"
214
+ "CONTROLLED UNCLASSIFIED INFORMATION (CUI) // SP-CTI\n"
215
+ "Distribution: Distribution D -- Authorized DoD Personnel Only\n"
216
+ "////////////////////////////////////////////////////////////////////"
217
+ ),
218
+ "document_footer": (
219
+ "////////////////////////////////////////////////////////////////////\n"
220
+ "CUI // SP-CTI | Department of Defense\n"
221
+ "////////////////////////////////////////////////////////////////////"
222
+ ),
223
+ }
224
+
225
+
226
+ def _load_ivv_requirements():
227
+ """Load IV&V requirements catalog from JSON.
228
+
229
+ Returns the full catalog dict with 'metadata' and 'requirements' keys.
230
+ Falls back to an empty catalog if the file is missing.
231
+ """
232
+ if not IVV_REQUIREMENTS_PATH.exists():
233
+ return {"metadata": {}, "requirements": []}
234
+
235
+ with open(IVV_REQUIREMENTS_PATH, "r", encoding="utf-8") as f:
236
+ data = json.load(f)
237
+ return data
238
+
239
+
240
+ # ---------------------------------------------------------------------------
241
+ # Data retrieval
242
+ # ---------------------------------------------------------------------------
243
+
244
+ def _get_ivv_assessments(conn, project_id):
245
+ """Retrieve all IV&V assessment results for a project."""
246
+ rows = conn.execute(
247
+ """SELECT * FROM ivv_assessments
248
+ WHERE project_id = ?
249
+ ORDER BY process_area, requirement_id""",
250
+ (project_id,),
251
+ ).fetchall()
252
+ return [dict(r) for r in rows]
253
+
254
+
255
+ def _get_ivv_findings(conn, project_id):
256
+ """Retrieve all IV&V findings for a project."""
257
+ rows = conn.execute(
258
+ """SELECT * FROM ivv_findings
259
+ WHERE project_id = ?
260
+ ORDER BY severity, finding_id""",
261
+ (project_id,),
262
+ ).fetchall()
263
+ return [dict(r) for r in rows]
264
+
265
+
266
+ def _get_ivv_certification(conn, project_id):
267
+ """Retrieve IV&V certification status for a project."""
268
+ row = conn.execute(
269
+ "SELECT * FROM ivv_certifications WHERE project_id = ?",
270
+ (project_id,),
271
+ ).fetchone()
272
+ return dict(row) if row else {}
273
+
274
+
275
+ # ---------------------------------------------------------------------------
276
+ # Score calculation
277
+ # ---------------------------------------------------------------------------
278
+
279
+ def _calculate_process_area_scores(assessments):
280
+ """Calculate a pass-rate score for each IV&V process area.
281
+
282
+ Score formula per area:
283
+ score = 100 * (pass_count + partial_count * 0.5) / total_scoreable
284
+
285
+ ``not_applicable`` assessments are excluded from the denominator.
286
+
287
+ Returns:
288
+ dict mapping process area name to a dict with ``score``, per-status
289
+ counts, and ``total`` / ``scoreable`` tallies.
290
+ """
291
+ area_data = {area: [] for area in PROCESS_AREAS}
292
+ for a in assessments:
293
+ pa = a.get("process_area")
294
+ if pa in area_data:
295
+ area_data[pa].append(a)
296
+
297
+ results = {}
298
+ for area in PROCESS_AREAS:
299
+ items = area_data[area]
300
+ total = len(items)
301
+
302
+ if total == 0:
303
+ results[area] = {
304
+ "score": 0.0,
305
+ "total": 0,
306
+ "scoreable": 0,
307
+ "pass": 0,
308
+ "partial": 0,
309
+ "fail": 0,
310
+ "deferred": 0,
311
+ "not_assessed": 0,
312
+ "not_applicable": 0,
313
+ }
314
+ continue
315
+
316
+ pass_count = sum(
317
+ 1 for i in items if i.get("status") == "pass"
318
+ )
319
+ partial_count = sum(
320
+ 1 for i in items if i.get("status") == "partial"
321
+ )
322
+ fail_count = sum(
323
+ 1 for i in items if i.get("status") == "fail"
324
+ )
325
+ deferred_count = sum(
326
+ 1 for i in items if i.get("status") == "deferred"
327
+ )
328
+ not_assessed_count = sum(
329
+ 1 for i in items if i.get("status") == "not_assessed"
330
+ )
331
+ not_applicable_count = sum(
332
+ 1 for i in items if i.get("status") == "not_applicable"
333
+ )
334
+
335
+ # Denominator excludes not_applicable
336
+ scoreable = total - not_applicable_count
337
+ if scoreable > 0:
338
+ score = 100.0 * (
339
+ pass_count * IVV_STATUS_WEIGHTS["pass"]
340
+ + partial_count * IVV_STATUS_WEIGHTS["partial"]
341
+ ) / scoreable
342
+ else:
343
+ # All items are N/A — treat as fully compliant
344
+ score = 100.0
345
+
346
+ results[area] = {
347
+ "score": round(score, 1),
348
+ "total": total,
349
+ "scoreable": scoreable,
350
+ "pass": pass_count,
351
+ "partial": partial_count,
352
+ "fail": fail_count,
353
+ "deferred": deferred_count,
354
+ "not_assessed": not_assessed_count,
355
+ "not_applicable": not_applicable_count,
356
+ }
357
+
358
+ return results
359
+
360
+
361
+ def _calculate_verification_score(area_scores):
362
+ """Calculate the aggregate Verification score.
363
+
364
+ Average of the scores for the 7 verification process areas. Areas with
365
+ zero scoreable items are excluded from the average.
366
+ """
367
+ scores = []
368
+ for area in VERIFICATION_AREAS:
369
+ info = area_scores.get(area, {})
370
+ if info.get("scoreable", 0) > 0 or info.get("total", 0) > 0:
371
+ scores.append(info.get("score", 0.0))
372
+
373
+ if not scores:
374
+ return 0.0
375
+ return round(sum(scores) / len(scores), 1)
376
+
377
+
378
+ def _calculate_validation_score(area_scores):
379
+ """Calculate the aggregate Validation score.
380
+
381
+ Average of the scores for Test Verification and Integration Verification.
382
+ Areas with zero scoreable items are excluded from the average.
383
+ """
384
+ scores = []
385
+ for area in VALIDATION_AREAS:
386
+ info = area_scores.get(area, {})
387
+ if info.get("scoreable", 0) > 0 or info.get("total", 0) > 0:
388
+ scores.append(info.get("score", 0.0))
389
+
390
+ if not scores:
391
+ return 0.0
392
+ return round(sum(scores) / len(scores), 1)
393
+
394
+
395
+ def _calculate_overall_score(verification_score, validation_score):
396
+ """Calculate the weighted overall IV&V score.
397
+
398
+ Overall = 0.6 * Verification + 0.4 * Validation
399
+ """
400
+ overall = 0.6 * verification_score + 0.4 * validation_score
401
+ return round(overall, 1)
402
+
403
+
404
+ def _determine_certification_recommendation(overall_score, area_scores, findings):
405
+ """Determine the IV&V certification recommendation.
406
+
407
+ Rules:
408
+ CERTIFY: overall >= 80, 0 critical open findings, all areas >= 60
409
+ CONDITIONAL: overall >= 60, 0 critical open findings
410
+ DENY: overall < 60 OR any critical findings are open
411
+
412
+ Returns:
413
+ tuple of (recommendation_str, reason_str)
414
+ """
415
+ # Count critical open findings
416
+ critical_open = sum(
417
+ 1 for f in findings
418
+ if f.get("severity") == "critical"
419
+ and f.get("status") in ("open", "in_progress")
420
+ )
421
+
422
+ # Check if all areas meet the 60% minimum
423
+ all_areas_above_60 = True
424
+ areas_below_60 = []
425
+ for area in PROCESS_AREAS:
426
+ info = area_scores.get(area, {})
427
+ # Only evaluate areas that have assessments
428
+ if info.get("total", 0) > 0 and info.get("score", 0.0) < 60.0:
429
+ all_areas_above_60 = False
430
+ areas_below_60.append(area)
431
+
432
+ # Decision logic
433
+ if critical_open > 0:
434
+ reason = (
435
+ f"DENY: {critical_open} critical finding(s) remain open. "
436
+ "All critical findings must be resolved before certification."
437
+ )
438
+ return "DENY", reason
439
+
440
+ if overall_score < 60.0:
441
+ reason = (
442
+ f"DENY: Overall score ({overall_score:.1f}%) is below the 60% "
443
+ "minimum threshold required for certification."
444
+ )
445
+ return "DENY", reason
446
+
447
+ if overall_score >= 80.0 and all_areas_above_60:
448
+ reason = (
449
+ f"CERTIFY: Overall score ({overall_score:.1f}%) meets the 80% "
450
+ "threshold, zero critical open findings, and all process areas "
451
+ "meet the 60% minimum."
452
+ )
453
+ return "CERTIFY", reason
454
+
455
+ # Conditional case: overall >= 60 but either < 80 or some areas below 60
456
+ condition_parts = []
457
+ if overall_score < 80.0:
458
+ condition_parts.append(
459
+ f"Overall score ({overall_score:.1f}%) is below the 80% full "
460
+ "certification threshold"
461
+ )
462
+ if not all_areas_above_60:
463
+ area_list = ", ".join(areas_below_60)
464
+ condition_parts.append(
465
+ f"The following process areas are below 60%: {area_list}"
466
+ )
467
+
468
+ reason = "CONDITIONAL: " + "; ".join(condition_parts) + "."
469
+ return "CONDITIONAL", reason
470
+
471
+
472
+ # ---------------------------------------------------------------------------
473
+ # Section builders
474
+ # ---------------------------------------------------------------------------
475
+
476
+ def _build_process_area_scores_table(area_scores):
477
+ """Build a markdown table summarizing per-area IV&V scores."""
478
+ lines = [
479
+ "| Process Area | Score | Total | Pass | Partial | Fail | Deferred | N/A | Not Assessed |",
480
+ "|--------------|------:|------:|-----:|--------:|-----:|---------:|----:|-------------:|",
481
+ ]
482
+ for area in PROCESS_AREAS:
483
+ s = area_scores.get(area, {})
484
+ lines.append(
485
+ f"| {area} "
486
+ f"| {s.get('score', 0.0):.1f}% "
487
+ f"| {s.get('total', 0)} "
488
+ f"| {s.get('pass', 0)} "
489
+ f"| {s.get('partial', 0)} "
490
+ f"| {s.get('fail', 0)} "
491
+ f"| {s.get('deferred', 0)} "
492
+ f"| {s.get('not_applicable', 0)} "
493
+ f"| {s.get('not_assessed', 0)} |"
494
+ )
495
+
496
+ # Totals row
497
+ totals = {
498
+ "total": sum(s.get("total", 0) for s in area_scores.values()),
499
+ "pass": sum(s.get("pass", 0) for s in area_scores.values()),
500
+ "partial": sum(s.get("partial", 0) for s in area_scores.values()),
501
+ "fail": sum(s.get("fail", 0) for s in area_scores.values()),
502
+ "deferred": sum(s.get("deferred", 0) for s in area_scores.values()),
503
+ "not_applicable": sum(
504
+ s.get("not_applicable", 0) for s in area_scores.values()
505
+ ),
506
+ "not_assessed": sum(
507
+ s.get("not_assessed", 0) for s in area_scores.values()
508
+ ),
509
+ }
510
+ lines.append(
511
+ f"| **Total** | -- "
512
+ f"| **{totals['total']}** "
513
+ f"| **{totals['pass']}** "
514
+ f"| **{totals['partial']}** "
515
+ f"| **{totals['fail']}** "
516
+ f"| **{totals['deferred']}** "
517
+ f"| **{totals['not_applicable']}** "
518
+ f"| **{totals['not_assessed']}** |"
519
+ )
520
+ return "\n".join(lines)
521
+
522
+
523
+ def _build_process_area_details(assessments, area_scores):
524
+ """Build markdown detail sections for each process area.
525
+
526
+ Each area gets a sub-heading and a table listing every requirement
527
+ with its status, evidence description, and notes.
528
+ """
529
+ area_data = {area: [] for area in PROCESS_AREAS}
530
+ for a in assessments:
531
+ pa = a.get("process_area")
532
+ if pa in area_data:
533
+ area_data[pa].append(a)
534
+
535
+ sections = []
536
+ for area in PROCESS_AREAS:
537
+ items = area_data[area]
538
+ s = area_scores.get(area, {})
539
+ score = s.get("score", 0.0)
540
+ v_type = "Verification" if area in VERIFICATION_AREAS else "Validation"
541
+
542
+ sections.append(f"#### {area} ({score:.1f}%) — {v_type}")
543
+ sections.append("")
544
+
545
+ if not items:
546
+ sections.append(
547
+ "*No assessments recorded for this process area.*"
548
+ )
549
+ sections.append("")
550
+ continue
551
+
552
+ sections.append(
553
+ "| Req ID | Title | Status | Evidence | Notes |"
554
+ )
555
+ sections.append(
556
+ "|--------|-------|--------|----------|-------|"
557
+ )
558
+ for item in sorted(items, key=lambda x: x.get("requirement_id", "")):
559
+ req_id = item.get("requirement_id", "N/A")
560
+ # Attempt to get the title from the automation_result field
561
+ # which may contain structured data
562
+ title = ""
563
+ auto_result = item.get("automation_result", "")
564
+ if auto_result:
565
+ try:
566
+ auto_data = json.loads(auto_result)
567
+ title = auto_data.get("title", "")
568
+ except (json.JSONDecodeError, TypeError):
569
+ title = ""
570
+ if not title:
571
+ title = req_id # Fallback to the requirement ID
572
+
573
+ status = item.get("status", "not_assessed")
574
+ evidence = (
575
+ (item.get("evidence_description") or "")
576
+ .replace("\n", " ")
577
+ .strip()
578
+ )
579
+ notes = (
580
+ (item.get("notes") or "").replace("\n", " ").strip()
581
+ )
582
+
583
+ # Truncate long fields for table readability
584
+ if len(title) > 50:
585
+ title = title[:47] + "..."
586
+ if len(evidence) > 60:
587
+ evidence = evidence[:57] + "..."
588
+ if len(notes) > 60:
589
+ notes = notes[:57] + "..."
590
+
591
+ # Status badge for readability
592
+ status_badge = _status_badge(status)
593
+
594
+ sections.append(
595
+ f"| {req_id} | {title} | {status_badge} "
596
+ f"| {evidence} | {notes} |"
597
+ )
598
+ sections.append("")
599
+
600
+ return "\n".join(sections)
601
+
602
+
603
+ def _status_badge(status):
604
+ """Return a markdown-friendly status indicator."""
605
+ badges = {
606
+ "pass": "PASS",
607
+ "partial": "PARTIAL",
608
+ "fail": "**FAIL**",
609
+ "deferred": "DEFERRED",
610
+ "not_assessed": "NOT ASSESSED",
611
+ "not_applicable": "N/A",
612
+ }
613
+ return badges.get(status, status.upper() if status else "UNKNOWN")
614
+
615
+
616
+ def _build_findings_by_severity(findings):
617
+ """Build per-severity sections of IV&V findings.
618
+
619
+ Returns a dict mapping severity to a markdown string.
620
+ """
621
+ grouped = {sev: [] for sev in SEVERITY_ORDER}
622
+ for f in findings:
623
+ sev = f.get("severity", "low")
624
+ if sev in grouped:
625
+ grouped[sev].append(f)
626
+
627
+ result = {}
628
+ for sev in SEVERITY_ORDER:
629
+ items = grouped[sev]
630
+ if not items:
631
+ result[sev] = f"*No {sev} findings.*"
632
+ continue
633
+
634
+ lines = [
635
+ "| Finding ID | Process Area | Title | Status | Recommendation |",
636
+ "|------------|-------------|-------|--------|----------------|",
637
+ ]
638
+ for f in sorted(items, key=lambda x: x.get("finding_id", "")):
639
+ fid = f.get("finding_id", "N/A")
640
+ pa = f.get("process_area", "N/A")
641
+ title = (f.get("title") or "").replace("\n", " ").strip()
642
+ status = f.get("status", "open")
643
+ rec = (
644
+ (f.get("recommendation") or "").replace("\n", " ").strip()
645
+ )
646
+
647
+ if len(title) > 50:
648
+ title = title[:47] + "..."
649
+ if len(rec) > 60:
650
+ rec = rec[:57] + "..."
651
+
652
+ lines.append(
653
+ f"| {fid} | {pa} | {title} | {status} | {rec} |"
654
+ )
655
+
656
+ result[sev] = "\n".join(lines)
657
+
658
+ return result
659
+
660
+
661
+ def _build_findings_summary_table(findings):
662
+ """Build a summary table of findings by severity and status.
663
+
664
+ Returns the markdown rows (without header — the template provides the
665
+ header already).
666
+ """
667
+ # Initialize counts grid
668
+ counts = {
669
+ sev: {st: 0 for st in FINDING_STATUSES}
670
+ for sev in SEVERITY_ORDER
671
+ }
672
+
673
+ for f in findings:
674
+ sev = f.get("severity", "low")
675
+ st = f.get("status", "open")
676
+ if sev in counts and st in counts[sev]:
677
+ counts[sev][st] += 1
678
+
679
+ lines = []
680
+ grand_total = 0
681
+ for sev in SEVERITY_ORDER:
682
+ c = counts[sev]
683
+ total = sum(c.values())
684
+ grand_total += total
685
+ lines.append(
686
+ f"| {sev.capitalize()} "
687
+ f"| {c.get('open', 0)} "
688
+ f"| {c.get('resolved', 0)} "
689
+ f"| {c.get('accepted_risk', 0)} "
690
+ f"| {c.get('deferred', 0)} "
691
+ f"| {total} |"
692
+ )
693
+
694
+ # Grand total row
695
+ total_open = sum(counts[s]["open"] for s in SEVERITY_ORDER)
696
+ total_resolved = sum(counts[s]["resolved"] for s in SEVERITY_ORDER)
697
+ total_accepted = sum(
698
+ counts[s]["accepted_risk"] for s in SEVERITY_ORDER
699
+ )
700
+ total_deferred = sum(counts[s]["deferred"] for s in SEVERITY_ORDER)
701
+ lines.append(
702
+ f"| **Total** "
703
+ f"| **{total_open}** "
704
+ f"| **{total_resolved}** "
705
+ f"| **{total_accepted}** "
706
+ f"| **{total_deferred}** "
707
+ f"| **{grand_total}** |"
708
+ )
709
+
710
+ return "\n".join(lines)
711
+
712
+
713
+ def _build_rtm_summary(conn, project_id):
714
+ """Build an RTM summary section by looking for RTM data.
715
+
716
+ Attempts to find RTM JSON output from a previous traceability_matrix.py
717
+ run. Falls back to a placeholder if no data is found.
718
+ """
719
+ # Try to find RTM JSON in the project directory
720
+ try:
721
+ project = _get_project_data(conn, project_id)
722
+ project_dir = project.get("directory_path", "")
723
+ if project_dir:
724
+ rtm_json_path = (
725
+ Path(project_dir) / "compliance" / "rtm" / "rtm-data.json"
726
+ )
727
+ if rtm_json_path.exists():
728
+ with open(rtm_json_path, "r", encoding="utf-8") as f:
729
+ rtm_data = json.load(f)
730
+
731
+ coverage = rtm_data.get("coverage", 0.0)
732
+ traced = rtm_data.get("traced", 0)
733
+ total = rtm_data.get("total_requirements", 0)
734
+ gaps = rtm_data.get("gaps", {})
735
+ gap_count = gaps.get("gap_count", 0)
736
+ orphan_count = len(gaps.get("orphan_tests", []))
737
+
738
+ lines = [
739
+ f"RTM data loaded from: `{rtm_json_path}`",
740
+ "",
741
+ f"- **Total Requirements:** {total}",
742
+ f"- **Fully Traced:** {traced}",
743
+ f"- **Coverage:** {coverage:.1f}%",
744
+ f"- **Gap Count:** {gap_count}",
745
+ f"- **Orphan Tests:** {orphan_count}",
746
+ ]
747
+ return (
748
+ "\n".join(lines),
749
+ coverage,
750
+ traced,
751
+ gap_count,
752
+ orphan_count,
753
+ )
754
+ except Exception:
755
+ pass
756
+
757
+ # Fallback — no RTM data found
758
+ placeholder = (
759
+ "*No Requirements Traceability Matrix data found. "
760
+ "Run `python tools/compliance/traceability_matrix.py "
761
+ f"--project-id {project_id}` to generate RTM.*"
762
+ )
763
+ return placeholder, 0.0, 0, 0, 0
764
+
765
+
766
+ def _build_independence_declaration():
767
+ """Return the standard IEEE 1012 independence statement.
768
+
769
+ This is the boilerplate independence declaration required by IEEE 1012
770
+ for any IV&V assessment to be considered independent.
771
+ """
772
+ return (
773
+ "This Independent Verification and Validation assessment was "
774
+ "conducted separately from the development team per IEEE 1012 and "
775
+ "DoD requirements. The IV&V engine operates with:\n\n"
776
+ "- **Organizational Independence:** Separate assessment authority "
777
+ "from development\n"
778
+ "- **Technical Independence:** Independent analysis tools and "
779
+ "criteria\n"
780
+ "- **Financial Independence:** Assessment budget separate from "
781
+ "development\n"
782
+ "- **Authority:** Gate authority to block releases based on findings\n"
783
+ "\n"
784
+ "The IV&V assessor has no reporting relationship to the development "
785
+ "organization and maintains independent access to all project "
786
+ "artifacts, source code, test results, and configuration data. "
787
+ "Assessment criteria are derived from IEEE 1012-2016, DoDI 5000.87, "
788
+ "and NIST 800-53 Rev 5 security controls."
789
+ )
790
+
791
+
792
+ def _build_conditions(recommendation, area_scores, findings):
793
+ """Build conditions text for CONDITIONAL recommendations.
794
+
795
+ Returns a markdown string describing what must be remediated for full
796
+ certification.
797
+ """
798
+ if recommendation == "CERTIFY":
799
+ return "*No conditions — full certification recommended.*"
800
+
801
+ if recommendation == "DENY":
802
+ # List the blocking issues
803
+ lines = ["**Blocking Issues (must be resolved before resubmission):**", ""]
804
+ critical_open = [
805
+ f for f in findings
806
+ if f.get("severity") == "critical"
807
+ and f.get("status") in ("open", "in_progress")
808
+ ]
809
+ if critical_open:
810
+ lines.append(
811
+ f"1. **{len(critical_open)} critical finding(s) "
812
+ "must be resolved:**"
813
+ )
814
+ for f in critical_open:
815
+ fid = f.get("finding_id", "N/A")
816
+ title = f.get("title", "N/A")
817
+ lines.append(f" - {fid}: {title}")
818
+ lines.append("")
819
+
820
+ areas_below_60 = [
821
+ area for area in PROCESS_AREAS
822
+ if area_scores.get(area, {}).get("total", 0) > 0
823
+ and area_scores.get(area, {}).get("score", 0.0) < 60.0
824
+ ]
825
+ if areas_below_60:
826
+ lines.append(
827
+ "2. **Process areas below 60% minimum:**"
828
+ )
829
+ for area in areas_below_60:
830
+ score = area_scores[area]["score"]
831
+ lines.append(f" - {area}: {score:.1f}%")
832
+ lines.append("")
833
+
834
+ return "\n".join(lines)
835
+
836
+ # CONDITIONAL — list what needs improvement
837
+ lines = [
838
+ "**Conditions for Full Certification:**",
839
+ "",
840
+ "The following conditions must be met within 90 days for the "
841
+ "conditional certification to be elevated to full certification:",
842
+ "",
843
+ ]
844
+
845
+ condition_num = 1
846
+
847
+ # Areas below 60%
848
+ areas_below_60 = [
849
+ area for area in PROCESS_AREAS
850
+ if area_scores.get(area, {}).get("total", 0) > 0
851
+ and area_scores.get(area, {}).get("score", 0.0) < 60.0
852
+ ]
853
+ if areas_below_60:
854
+ for area in areas_below_60:
855
+ score = area_scores[area]["score"]
856
+ lines.append(
857
+ f"{condition_num}. Raise **{area}** score from "
858
+ f"{score:.1f}% to at least 60%."
859
+ )
860
+ condition_num += 1
861
+
862
+ # Areas between 60% and 80% (advisory)
863
+ areas_below_80 = [
864
+ area for area in PROCESS_AREAS
865
+ if area_scores.get(area, {}).get("total", 0) > 0
866
+ and 60.0 <= area_scores.get(area, {}).get("score", 0.0) < 80.0
867
+ ]
868
+ if areas_below_80:
869
+ for area in areas_below_80:
870
+ score = area_scores[area]["score"]
871
+ lines.append(
872
+ f"{condition_num}. Improve **{area}** score from "
873
+ f"{score:.1f}% toward 80% target."
874
+ )
875
+ condition_num += 1
876
+
877
+ # Open high findings
878
+ high_open = [
879
+ f for f in findings
880
+ if f.get("severity") == "high"
881
+ and f.get("status") in ("open", "in_progress")
882
+ ]
883
+ if high_open:
884
+ lines.append(
885
+ f"{condition_num}. Resolve {len(high_open)} open high-severity "
886
+ "finding(s)."
887
+ )
888
+ condition_num += 1
889
+
890
+ # Open moderate findings (advisory)
891
+ moderate_open = [
892
+ f for f in findings
893
+ if f.get("severity") == "moderate"
894
+ and f.get("status") in ("open", "in_progress")
895
+ ]
896
+ if moderate_open:
897
+ lines.append(
898
+ f"{condition_num}. Address {len(moderate_open)} open "
899
+ "moderate-severity finding(s)."
900
+ )
901
+ condition_num += 1
902
+
903
+ if condition_num == 1:
904
+ lines.append(
905
+ "1. Raise overall IV&V score to 80% or above for full "
906
+ "certification."
907
+ )
908
+
909
+ lines.append("")
910
+ lines.append(
911
+ "**Review Date:** A follow-up review will be scheduled within "
912
+ "90 calendar days to verify condition completion."
913
+ )
914
+
915
+ return "\n".join(lines)
916
+
917
+
918
+ def _build_evidence_index(assessments):
919
+ """Build an evidence index table from assessment evidence paths.
920
+
921
+ Lists all assessments that have an evidence_path recorded.
922
+ """
923
+ with_evidence = [
924
+ a for a in assessments if a.get("evidence_path")
925
+ ]
926
+
927
+ if not with_evidence:
928
+ return "*No evidence artifacts recorded in assessments.*"
929
+
930
+ lines = [
931
+ "| Req ID | Process Area | Evidence Path |",
932
+ "|--------|-------------|---------------|",
933
+ ]
934
+ for a in sorted(with_evidence, key=lambda x: x.get("requirement_id", "")):
935
+ req_id = a.get("requirement_id", "N/A")
936
+ pa = a.get("process_area", "N/A")
937
+ path = a.get("evidence_path", "N/A")
938
+ lines.append(f"| {req_id} | {pa} | `{path}` |")
939
+
940
+ # Summary
941
+ total = len(assessments)
942
+ with_count = len(with_evidence)
943
+ without_count = total - with_count
944
+ coverage = (
945
+ f"{100.0 * with_count / total:.0f}%"
946
+ if total > 0
947
+ else "N/A"
948
+ )
949
+ lines.append("")
950
+ lines.append(
951
+ f"**Evidence Coverage:** {with_count}/{total} assessments "
952
+ f"have evidence artifacts ({coverage})"
953
+ )
954
+ if without_count > 0:
955
+ missing = [
956
+ a for a in assessments if not a.get("evidence_path")
957
+ ]
958
+ missing_ids = [
959
+ a.get("requirement_id", "?") for a in missing
960
+ ]
961
+ if len(missing_ids) <= 10:
962
+ lines.append(
963
+ f"**Missing Evidence:** {', '.join(missing_ids)}"
964
+ )
965
+ else:
966
+ lines.append(
967
+ f"**Missing Evidence:** {', '.join(missing_ids[:10])} "
968
+ f"(and {len(missing_ids) - 10} more)"
969
+ )
970
+
971
+ return "\n".join(lines)
972
+
973
+
974
+ def _build_executive_summary(
975
+ verification_score,
976
+ validation_score,
977
+ overall_score,
978
+ recommendation,
979
+ reason,
980
+ area_scores,
981
+ findings,
982
+ assessments,
983
+ ):
984
+ """Build the executive summary paragraph."""
985
+ total_assessments = len(assessments)
986
+ total_findings = len(findings)
987
+ critical_open = sum(
988
+ 1 for f in findings
989
+ if f.get("severity") == "critical"
990
+ and f.get("status") in ("open", "in_progress")
991
+ )
992
+ high_open = sum(
993
+ 1 for f in findings
994
+ if f.get("severity") == "high"
995
+ and f.get("status") in ("open", "in_progress")
996
+ )
997
+
998
+ # Count assessments by status
999
+ sum(
1000
+ 1 for a in assessments if a.get("status") == "pass"
1001
+ )
1002
+ sum(
1003
+ 1 for a in assessments if a.get("status") == "fail"
1004
+ )
1005
+
1006
+ lines = []
1007
+ lines.append(
1008
+ f"This IV&V assessment evaluated {total_assessments} requirements "
1009
+ f"across {len(PROCESS_AREAS)} process areas per IEEE 1012-2016 and "
1010
+ f"DoDI 5000.87. The verification score is **{verification_score:.1f}%** "
1011
+ f"and the validation score is **{validation_score:.1f}%**, yielding an "
1012
+ f"overall weighted score of **{overall_score:.1f}%**."
1013
+ )
1014
+ lines.append("")
1015
+
1016
+ if total_findings > 0:
1017
+ lines.append(
1018
+ f"The assessment identified **{total_findings} finding(s)**: "
1019
+ f"{critical_open} critical open, {high_open} high open. "
1020
+ )
1021
+ else:
1022
+ lines.append("No findings were identified during this assessment.")
1023
+
1024
+ lines.append("")
1025
+ lines.append(
1026
+ f"**Certification Recommendation: {recommendation}** — {reason}"
1027
+ )
1028
+
1029
+ # Highlight strongest and weakest areas
1030
+ scored_areas = [
1031
+ (area, area_scores[area]["score"])
1032
+ for area in PROCESS_AREAS
1033
+ if area_scores.get(area, {}).get("total", 0) > 0
1034
+ ]
1035
+ if scored_areas:
1036
+ scored_areas.sort(key=lambda x: x[1], reverse=True)
1037
+ strongest = scored_areas[0]
1038
+ weakest = scored_areas[-1]
1039
+ if strongest[0] != weakest[0]:
1040
+ lines.append("")
1041
+ lines.append(
1042
+ f"**Strongest Area:** {strongest[0]} ({strongest[1]:.1f}%) \n"
1043
+ f"**Weakest Area:** {weakest[0]} ({weakest[1]:.1f}%)"
1044
+ )
1045
+
1046
+ return "\n".join(lines)
1047
+
1048
+
1049
+ def _build_area_subset_details(assessments, area_scores, area_list, label):
1050
+ """Build detail tables for a subset of process areas (used for
1051
+ validation area breakouts in sections 4.1 and 4.2)."""
1052
+ area_data = {area: [] for area in area_list}
1053
+ for a in assessments:
1054
+ pa = a.get("process_area")
1055
+ if pa in area_data:
1056
+ area_data[pa].append(a)
1057
+
1058
+ sections = []
1059
+ for area in area_list:
1060
+ items = area_data[area]
1061
+ s = area_scores.get(area, {})
1062
+ score = s.get("score", 0.0)
1063
+
1064
+ sections.append(f"**{area}** — Score: {score:.1f}%")
1065
+ sections.append("")
1066
+
1067
+ if not items:
1068
+ sections.append(
1069
+ "*No assessments recorded for this area.*"
1070
+ )
1071
+ sections.append("")
1072
+ continue
1073
+
1074
+ sections.append("| Req ID | Status | Evidence | Notes |")
1075
+ sections.append("|--------|--------|----------|-------|")
1076
+ for item in sorted(items, key=lambda x: x.get("requirement_id", "")):
1077
+ req_id = item.get("requirement_id", "N/A")
1078
+ status = _status_badge(item.get("status", "not_assessed"))
1079
+ evidence = (
1080
+ (item.get("evidence_description") or "")
1081
+ .replace("\n", " ")
1082
+ .strip()
1083
+ )
1084
+ notes = (
1085
+ (item.get("notes") or "").replace("\n", " ").strip()
1086
+ )
1087
+ if len(evidence) > 60:
1088
+ evidence = evidence[:57] + "..."
1089
+ if len(notes) > 60:
1090
+ notes = notes[:57] + "..."
1091
+ sections.append(
1092
+ f"| {req_id} | {status} | {evidence} | {notes} |"
1093
+ )
1094
+ sections.append("")
1095
+
1096
+ return "\n".join(sections)
1097
+
1098
+
1099
+ def _determine_gate_result(findings):
1100
+ """Determine the IV&V gate result.
1101
+
1102
+ PASS if zero critical findings are open; FAIL otherwise.
1103
+ """
1104
+ critical_open = sum(
1105
+ 1 for f in findings
1106
+ if f.get("severity") == "critical"
1107
+ and f.get("status") in ("open", "in_progress")
1108
+ )
1109
+ if critical_open > 0:
1110
+ return "FAIL", critical_open
1111
+ return "PASS", 0
1112
+
1113
+
1114
+ # ---------------------------------------------------------------------------
1115
+ # Variable substitution & CUI markings
1116
+ # ---------------------------------------------------------------------------
1117
+
1118
+ def _apply_cui_markings(content, cui_config):
1119
+ """Apply CUI header and footer banners to the report content."""
1120
+ header = cui_config.get("document_header", "").strip()
1121
+ footer = cui_config.get("document_footer", "").strip()
1122
+ banner_top = cui_config.get("banner_top", "CUI // SP-CTI")
1123
+
1124
+ # If the content already contains the banner, skip
1125
+ if banner_top in content:
1126
+ return content
1127
+
1128
+ return f"{header}\n\n{content.strip()}\n\n{footer}\n"
1129
+
1130
+
1131
+ def _substitute_variables(template, variables):
1132
+ """Replace {{variable_name}} placeholders in the template."""
1133
+ def replacer(match):
1134
+ key = match.group(1).strip()
1135
+ return str(variables.get(key, match.group(0)))
1136
+ return re.sub(r"\{\{(\w+)\}\}", replacer, template)
1137
+
1138
+
1139
+ # ---------------------------------------------------------------------------
1140
+ # Audit logging
1141
+ # ---------------------------------------------------------------------------
1142
+
1143
+ def _log_audit_event(conn, project_id, action, details, file_path):
1144
+ """Log an audit trail event for IV&V report generation.
1145
+
1146
+ Uses 'compliance_check' as the event_type since IV&V report generation
1147
+ falls under compliance verification activities.
1148
+ """
1149
+ try:
1150
+ conn.execute(
1151
+ """INSERT INTO audit_trail
1152
+ (project_id, event_type, actor, action, details,
1153
+ affected_files, classification)
1154
+ VALUES (?, ?, ?, ?, ?, ?, ?)""",
1155
+ (
1156
+ project_id,
1157
+ "compliance_check",
1158
+ "icdev-ivv-engine",
1159
+ action,
1160
+ json.dumps(details),
1161
+ json.dumps([str(file_path)]),
1162
+ "CUI",
1163
+ ),
1164
+ )
1165
+ conn.commit()
1166
+ except Exception as e:
1167
+ print(
1168
+ f"Warning: Could not log audit event: {e}", file=sys.stderr
1169
+ )
1170
+
1171
+
1172
+ # ---------------------------------------------------------------------------
1173
+ # Main generator
1174
+ # ---------------------------------------------------------------------------
1175
+
1176
+ def generate_ivv_report(project_id, output_path=None, db_path=None):
1177
+ """Generate an IV&V certification report for a project.
1178
+
1179
+ Workflow:
1180
+ 1. Connect, load project, template, requirements
1181
+ 2. Query all 3 IV&V tables
1182
+ 3. Calculate scores (verification, validation, overall)
1183
+ 4. Determine certification recommendation
1184
+ 5. Build all sections
1185
+ 6. Apply {{variable}} substitution
1186
+ 7. Apply CUI markings
1187
+ 8. Write to: {project_dir}/compliance/ivv-report-v{version}.md
1188
+ 9. Update ivv_certifications table with scores and recommendation
1189
+ 10. Audit: "compliance_check" (IV&V report generated)
1190
+ 11. Return result dict
1191
+
1192
+ Args:
1193
+ project_id: The project identifier.
1194
+ output_path: Override output directory or file path.
1195
+ db_path: Override database path.
1196
+
1197
+ Returns:
1198
+ dict with ``file_path`` and metadata about the generated report.
1199
+ """
1200
+ conn = get_connection(db_path=db_path)
1201
+ try:
1202
+ # 1. Load project data
1203
+ project = _get_project_data(conn, project_id)
1204
+ project_name = project.get("name", project_id)
1205
+
1206
+ # 2. Load template
1207
+ template = _load_template()
1208
+
1209
+ # 3. Load IV&V requirements catalog
1210
+ ivv_catalog = _load_ivv_requirements()
1211
+ _requirements_list = ivv_catalog.get("requirements", [])
1212
+
1213
+ # 4. Query all IV&V tables
1214
+ assessments = _get_ivv_assessments(conn, project_id)
1215
+ findings = _get_ivv_findings(conn, project_id)
1216
+ certification = _get_ivv_certification(conn, project_id)
1217
+
1218
+ # 5. Calculate scores
1219
+ area_scores = _calculate_process_area_scores(assessments)
1220
+ verification_score = _calculate_verification_score(area_scores)
1221
+ validation_score = _calculate_validation_score(area_scores)
1222
+ overall_score = _calculate_overall_score(
1223
+ verification_score, validation_score
1224
+ )
1225
+
1226
+ # 6. Determine certification recommendation
1227
+ recommendation, reason = _determine_certification_recommendation(
1228
+ overall_score, area_scores, findings
1229
+ )
1230
+
1231
+ # 7. Determine gate result
1232
+ gate_result, critical_open_count = _determine_gate_result(findings)
1233
+
1234
+ # 8. Build all report sections
1235
+ process_area_scores_table = _build_process_area_scores_table(
1236
+ area_scores
1237
+ )
1238
+ process_area_details = _build_process_area_details(
1239
+ assessments, area_scores
1240
+ )
1241
+ findings_by_severity = _build_findings_by_severity(findings)
1242
+ findings_summary_table = _build_findings_summary_table(findings)
1243
+
1244
+ rtm_summary, rtm_coverage, rtm_traced, rtm_gaps, rtm_orphans = (
1245
+ _build_rtm_summary(conn, project_id)
1246
+ )
1247
+
1248
+ independence_declaration = _build_independence_declaration()
1249
+ conditions = _build_conditions(
1250
+ recommendation, area_scores, findings
1251
+ )
1252
+ evidence_index = _build_evidence_index(assessments)
1253
+
1254
+ # Build validation area breakouts for sections 4.1 and 4.2
1255
+ test_verification_results = _build_area_subset_details(
1256
+ assessments, area_scores, ["Test Verification"],
1257
+ "Test Verification"
1258
+ )
1259
+ integration_verification_results = _build_area_subset_details(
1260
+ assessments, area_scores, ["Integration Verification"],
1261
+ "Integration Verification"
1262
+ )
1263
+
1264
+ # Build executive summary
1265
+ executive_summary = _build_executive_summary(
1266
+ verification_score,
1267
+ validation_score,
1268
+ overall_score,
1269
+ recommendation,
1270
+ reason,
1271
+ area_scores,
1272
+ findings,
1273
+ assessments,
1274
+ )
1275
+
1276
+ # Load CUI config for banner variables
1277
+ cui_config = _load_cui_config()
1278
+
1279
+ # Determine version number from prior audit events
1280
+ report_count_row = conn.execute(
1281
+ """SELECT COUNT(*) as cnt FROM audit_trail
1282
+ WHERE project_id = ? AND event_type = 'compliance_check'
1283
+ AND action LIKE '%IV&V report%'""",
1284
+ (project_id,),
1285
+ ).fetchone()
1286
+ report_count = report_count_row["cnt"] if report_count_row else 0
1287
+ new_version = f"{report_count + 1}.0"
1288
+
1289
+ now = datetime.now(timezone.utc)
1290
+
1291
+ # 9. Build the complete variable substitution dict
1292
+ variables = {
1293
+ # Project info
1294
+ "project_name": project_name,
1295
+ "project_id": project_id,
1296
+ "classification": project.get("classification", "CUI"),
1297
+ "system_type": project.get("type", "webapp"),
1298
+
1299
+ # Report metadata
1300
+ "version": new_version,
1301
+ "report_version": new_version,
1302
+ "assessment_date": now.strftime("%Y-%m-%d"),
1303
+ "date_prepared": now.strftime("%Y-%m-%d"),
1304
+ "generation_timestamp": now.strftime("%Y-%m-%d %H:%M UTC"),
1305
+ "icdev_version": "1.0",
1306
+ "ivv_authority": certification.get(
1307
+ "ivv_authority", "ICDEV IV&V Engine"
1308
+ ),
1309
+
1310
+ # Scores
1311
+ "verification_score": f"{verification_score:.1f}",
1312
+ "validation_score": f"{validation_score:.1f}",
1313
+ "overall_score": f"{overall_score:.1f}",
1314
+
1315
+ # Gate result
1316
+ "gate_result": gate_result,
1317
+
1318
+ # Certification recommendation
1319
+ "certification_recommendation": recommendation,
1320
+ "certification_reason": reason,
1321
+
1322
+ # Executive summary
1323
+ "executive_summary": executive_summary,
1324
+
1325
+ # Independence declaration
1326
+ "independence_declaration": independence_declaration,
1327
+
1328
+ # Process area tables
1329
+ "process_area_scores_table": process_area_scores_table,
1330
+ "process_area_details": process_area_details,
1331
+
1332
+ # Validation breakouts
1333
+ "test_verification_results": test_verification_results,
1334
+ "integration_verification_results": (
1335
+ integration_verification_results
1336
+ ),
1337
+
1338
+ # RTM summary
1339
+ "rtm_summary": rtm_summary,
1340
+ "rtm_coverage": f"{rtm_coverage:.1f}" if rtm_coverage else "0.0",
1341
+ "rtm_full_trace_count": str(rtm_traced),
1342
+ "rtm_gap_count": str(rtm_gaps),
1343
+ "rtm_orphan_tests": str(rtm_orphans),
1344
+
1345
+ # Findings by severity
1346
+ "critical_findings": findings_by_severity.get(
1347
+ "critical", "*No critical findings.*"
1348
+ ),
1349
+ "high_findings": findings_by_severity.get(
1350
+ "high", "*No high findings.*"
1351
+ ),
1352
+ "moderate_findings": findings_by_severity.get(
1353
+ "moderate", "*No moderate findings.*"
1354
+ ),
1355
+ "low_findings": findings_by_severity.get(
1356
+ "low", "*No low findings.*"
1357
+ ),
1358
+ "findings_summary_table": findings_summary_table,
1359
+
1360
+ # Conditions
1361
+ "conditions": conditions,
1362
+
1363
+ # Evidence index
1364
+ "evidence_index": evidence_index,
1365
+
1366
+ # Next review date (90 days from now if not set)
1367
+ "next_review_date": certification.get(
1368
+ "next_review_date",
1369
+ (now + timedelta(days=90)).strftime("%Y-%m-%d"),
1370
+ ),
1371
+
1372
+ # Certification info from existing record
1373
+ "certification_status": certification.get(
1374
+ "status", "in_progress"
1375
+ ),
1376
+ "certified_date": certification.get("certified_date", "N/A"),
1377
+ "expiration_date": certification.get("expiration_date", "N/A"),
1378
+ "open_findings_count": str(
1379
+ sum(
1380
+ 1 for f in findings
1381
+ if f.get("status") in ("open", "in_progress")
1382
+ )
1383
+ ),
1384
+ "critical_findings_count": str(critical_open_count),
1385
+
1386
+ # Assessment totals
1387
+ "total_assessments": str(len(assessments)),
1388
+ "total_findings": str(len(findings)),
1389
+ "assessments_pass": str(
1390
+ sum(1 for a in assessments if a.get("status") == "pass")
1391
+ ),
1392
+ "assessments_fail": str(
1393
+ sum(1 for a in assessments if a.get("status") == "fail")
1394
+ ),
1395
+
1396
+ # CUI banners
1397
+ "cui_banner_top": cui_config.get(
1398
+ "document_header",
1399
+ cui_config.get("banner_top", "CUI // SP-CTI"),
1400
+ ),
1401
+ "cui_banner_bottom": cui_config.get(
1402
+ "document_footer",
1403
+ cui_config.get("banner_bottom", "CUI // SP-CTI"),
1404
+ ),
1405
+ }
1406
+
1407
+ # Per-area score variables (e.g., requirements_verification_score)
1408
+ for area in PROCESS_AREAS:
1409
+ key_prefix = area.lower().replace(" ", "_").replace("/", "_")
1410
+ s = area_scores.get(area, {})
1411
+ variables[f"{key_prefix}_score"] = f"{s.get('score', 0.0):.1f}"
1412
+ variables[f"{key_prefix}_total"] = str(s.get("total", 0))
1413
+ variables[f"{key_prefix}_pass"] = str(s.get("pass", 0))
1414
+ variables[f"{key_prefix}_fail"] = str(s.get("fail", 0))
1415
+
1416
+ # 10. Substitute variables in template
1417
+ report_content = _substitute_variables(template, variables)
1418
+
1419
+ # 11. Apply CUI markings
1420
+ report_content = _apply_cui_markings(report_content, cui_config)
1421
+
1422
+ # 12. Determine output file path
1423
+ if output_path:
1424
+ out_path = Path(output_path)
1425
+ if (
1426
+ out_path.is_dir()
1427
+ or str(output_path).endswith("/")
1428
+ or str(output_path).endswith("\\")
1429
+ ):
1430
+ out_dir = out_path
1431
+ out_file = out_dir / f"ivv-report-v{new_version}.md"
1432
+ else:
1433
+ out_file = out_path
1434
+ else:
1435
+ dir_path = project.get("directory_path", "")
1436
+ if dir_path:
1437
+ out_dir = Path(dir_path) / "compliance"
1438
+ else:
1439
+ out_dir = (
1440
+ BASE_DIR / "projects" / project_name / "compliance"
1441
+ )
1442
+ out_file = out_dir / f"ivv-report-v{new_version}.md"
1443
+
1444
+ out_file.parent.mkdir(parents=True, exist_ok=True)
1445
+
1446
+ with open(out_file, "w", encoding="utf-8") as f:
1447
+ f.write(report_content)
1448
+
1449
+ # 13. Update ivv_certifications table with scores and recommendation
1450
+ try:
1451
+ # Map recommendation to DB status
1452
+ status_map = {
1453
+ "CERTIFY": "certified",
1454
+ "CONDITIONAL": "conditional",
1455
+ "DENY": "denied",
1456
+ }
1457
+ cert_status = status_map.get(recommendation, "in_progress")
1458
+
1459
+ # Count open and critical findings
1460
+ open_count = sum(
1461
+ 1 for f in findings
1462
+ if f.get("status") in ("open", "in_progress")
1463
+ )
1464
+
1465
+ conn.execute(
1466
+ """INSERT OR REPLACE INTO ivv_certifications
1467
+ (project_id, certification_type, status,
1468
+ verification_score, validation_score, overall_score,
1469
+ ivv_authority, independence_declaration,
1470
+ conditions, open_findings_count,
1471
+ critical_findings_count, next_review_date,
1472
+ updated_at)
1473
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
1474
+ (
1475
+ project_id,
1476
+ "IV&V",
1477
+ cert_status,
1478
+ verification_score,
1479
+ validation_score,
1480
+ overall_score,
1481
+ certification.get(
1482
+ "ivv_authority", "ICDEV IV&V Engine"
1483
+ ),
1484
+ "IEEE 1012 Independent Assessment",
1485
+ conditions if recommendation == "CONDITIONAL" else None,
1486
+ open_count,
1487
+ critical_open_count,
1488
+ (now + timedelta(days=90)).strftime("%Y-%m-%d"),
1489
+ now.strftime("%Y-%m-%d %H:%M:%S"),
1490
+ ),
1491
+ )
1492
+ conn.commit()
1493
+ except Exception as e:
1494
+ print(
1495
+ f"Warning: Could not update ivv_certifications: {e}",
1496
+ file=sys.stderr,
1497
+ )
1498
+
1499
+ # 14. Log audit event
1500
+ audit_details = {
1501
+ "report_type": "IV&V Certification Report",
1502
+ "version": new_version,
1503
+ "verification_score": verification_score,
1504
+ "validation_score": validation_score,
1505
+ "overall_score": overall_score,
1506
+ "gate_result": gate_result,
1507
+ "recommendation": recommendation,
1508
+ "total_assessments": len(assessments),
1509
+ "total_findings": len(findings),
1510
+ "critical_open": critical_open_count,
1511
+ "output_file": str(out_file),
1512
+ }
1513
+ _log_audit_event(
1514
+ conn,
1515
+ project_id,
1516
+ f"IV&V report v{new_version} generated — {recommendation}",
1517
+ audit_details,
1518
+ out_file,
1519
+ )
1520
+
1521
+ # 15. Print summary
1522
+ print("IV&V certification report generated successfully:")
1523
+ print(f" File: {out_file}")
1524
+ print(f" Version: {new_version}")
1525
+ print(f" Project: {project_name}")
1526
+ print(f" Verification: {verification_score:.1f}%")
1527
+ print(f" Validation: {validation_score:.1f}%")
1528
+ print(f" Overall Score: {overall_score:.1f}%")
1529
+ print(f" Gate Result: {gate_result}")
1530
+ print(f" Recommendation: {recommendation}")
1531
+ print(f" Assessments: {len(assessments)}")
1532
+ print(f" Findings: {len(findings)}")
1533
+ print(f" Critical Open: {critical_open_count}")
1534
+
1535
+ # 16. Return result dict
1536
+ return {
1537
+ "file_path": str(out_file),
1538
+ "version": new_version,
1539
+ "project_id": project_id,
1540
+ "project_name": project_name,
1541
+ "verification_score": verification_score,
1542
+ "validation_score": validation_score,
1543
+ "overall_score": overall_score,
1544
+ "gate_result": gate_result,
1545
+ "recommendation": recommendation,
1546
+ "reason": reason,
1547
+ "process_area_scores": {
1548
+ area: area_scores[area]["score"]
1549
+ for area in PROCESS_AREAS
1550
+ },
1551
+ "total_assessments": len(assessments),
1552
+ "total_findings": len(findings),
1553
+ "critical_open_findings": critical_open_count,
1554
+ "rtm_coverage": rtm_coverage,
1555
+ "generated_at": now.isoformat(),
1556
+ }
1557
+
1558
+ finally:
1559
+ conn.close()
1560
+
1561
+
1562
+ # ---------------------------------------------------------------------------
1563
+ # CLI entry point
1564
+ # ---------------------------------------------------------------------------
1565
+
1566
+ def _format_json_output(result):
1567
+ """Format result as JSON for machine-readable output."""
1568
+ return json.dumps(result, indent=2, default=str)
1569
+
1570
+
1571
+ def _format_text_output(result):
1572
+ """Format result as human-readable text."""
1573
+ lines = [
1574
+ "=" * 60,
1575
+ "IV&V CERTIFICATION REPORT SUMMARY",
1576
+ "=" * 60,
1577
+ "",
1578
+ f" File: {result['file_path']}",
1579
+ f" Version: {result['version']}",
1580
+ f" Project: {result['project_name']} ({result['project_id']})",
1581
+ "",
1582
+ " SCORES:",
1583
+ f" Verification: {result['verification_score']:.1f}%",
1584
+ f" Validation: {result['validation_score']:.1f}%",
1585
+ f" Overall: {result['overall_score']:.1f}%",
1586
+ "",
1587
+ f" Gate Result: {result['gate_result']}",
1588
+ f" Recommendation: {result['recommendation']}",
1589
+ "",
1590
+ " PROCESS AREA SCORES:",
1591
+ ]
1592
+ for area, score in result.get("process_area_scores", {}).items():
1593
+ lines.append(f" {area:30s} {score:.1f}%")
1594
+ lines.extend([
1595
+ "",
1596
+ f" Total Assessments: {result['total_assessments']}",
1597
+ f" Total Findings: {result['total_findings']}",
1598
+ f" Critical Open: {result['critical_open_findings']}",
1599
+ f" RTM Coverage: {result['rtm_coverage']:.1f}%",
1600
+ f" Generated: {result['generated_at']}",
1601
+ "",
1602
+ "=" * 60,
1603
+ ])
1604
+ return "\n".join(lines)
1605
+
1606
+
1607
+ if __name__ == "__main__":
1608
+ parser = argparse.ArgumentParser(
1609
+ description="Generate IV&V certification report per IEEE 1012"
1610
+ )
1611
+ parser.add_argument(
1612
+ "--project-id",
1613
+ required=True,
1614
+ help="Project ID to generate IV&V report for",
1615
+ )
1616
+ parser.add_argument(
1617
+ "--output-dir",
1618
+ help="Output directory (default: {project_dir}/compliance/)",
1619
+ )
1620
+ parser.add_argument(
1621
+ "--db-path",
1622
+ type=Path,
1623
+ default=DB_PATH,
1624
+ help="Database path (default: data/icdev.db)",
1625
+ )
1626
+ parser.add_argument(
1627
+ "--format",
1628
+ choices=["text", "json"],
1629
+ default="text",
1630
+ help="Output format for CLI summary (default: text)",
1631
+ )
1632
+
1633
+ parser.add_argument("--json", action="store_true", dest="json_output", help="JSON output")
1634
+ args = parser.parse_args()
1635
+
1636
+ try:
1637
+ result = generate_ivv_report(
1638
+ args.project_id, args.output_dir, args.db_path
1639
+ )
1640
+ if args.format == "json":
1641
+ print(_format_json_output(result))
1642
+ else:
1643
+ print(_format_text_output(result))
1644
+ except FileNotFoundError as e:
1645
+ print(f"ERROR: {e}", file=sys.stderr)
1646
+ sys.exit(1)
1647
+ except ValueError as e:
1648
+ print(f"ERROR: {e}", file=sys.stderr)
1649
+ sys.exit(1)